diff --git a/.env.sample.goerli b/.env.sample.goerli new file mode 100644 index 00000000..52bf51b5 --- /dev/null +++ b/.env.sample.goerli @@ -0,0 +1,7 @@ +ROLLUP_CREATOR_ADDRESS="" +ARBISCAN_API_KEY="" +## deployer key +DEVNET_PRIVKEY="" + +## optional - address of already deployed ERC20 token which shall be used as rollup's fee token +FEE_TOKEN_ADDRESS="" diff --git a/.github/workflows/audit-ci.yml b/.github/workflows/audit-ci.yml new file mode 100644 index 00000000..40ff63c2 --- /dev/null +++ b/.github/workflows/audit-ci.yml @@ -0,0 +1,48 @@ +name: Audit NPM packages + +on: + workflow_dispatch: + pull_request: + merge_group: + push: + branches: + - main + - develop + +jobs: + install: + name: 'Install' + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16, 18, 20] + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Install node_modules + uses: OffchainLabs/actions/node-modules/install@main + + yarn-audit: + name: Audit + runs-on: ubuntu-latest + needs: install + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + + - name: Restore node_modules + uses: OffchainLabs/actions/node-modules/restore@main + + - name: Run audit + run: yarn audit:ci diff --git a/.github/workflows/contract-tests.yml b/.github/workflows/contract-tests.yml index 61b0c747..5637607f 100644 --- a/.github/workflows/contract-tests.yml +++ b/.github/workflows/contract-tests.yml @@ -10,6 +10,31 @@ on: - develop jobs: + test-unit: + name: Test unit + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Setup node/yarn + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: 'yarn' + cache-dependency-path: '**/yarn.lock' + + - name: Install packages + run: yarn + + - name: Build + run: forge test tests: name: Contract tests runs-on: ubuntu-8 @@ -19,14 +44,26 @@ jobs: steps: - name: Checkout uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly - name: Setup nodejs uses: actions/setup-node@v2 with: - node-version: '16' + node-version: '18' cache: 'yarn' cache-dependency-path: '**/yarn.lock' + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install dependencies run: yarn install @@ -37,7 +74,7 @@ jobs: run: yarn lint:test - name: Build - run: yarn build + run: yarn build:all - name: Run tests run: yarn hardhat --network hardhat test test/contract/*.spec.ts @@ -45,9 +82,15 @@ jobs: - name: Interface compatibility run: yarn run test:compatibility + - name: Forge build + run: forge build + - name: Test Storage Layouts run: yarn run test:storage + - name: Test function signatures + run: yarn run test:signatures + - name: Run coverage run: yarn hardhat coverage --testfiles "test/contract/*.spec.ts" @@ -58,3 +101,37 @@ jobs: files: ./contracts/coverage.json verbose: false token: ${{ secrets.CODECOV_TOKEN }} + test-4844: + name: 4844 tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - uses: OffchainLabs/actions/run-nitro-test-node@test-node-args + with: + nitro-testnode-ref: deneb-integration + args: --pos + no-token-bridge: true + + - name: Setup nodejs + uses: actions/setup-node@v2 + with: + node-version: '18' + cache: 'yarn' + cache-dependency-path: '**/yarn.lock' + + - name: Install dependencies + run: yarn install + + - name: Build + run: yarn build:all + + - name: Test 4844 + run: yarn test:4844 diff --git a/.github/workflows/slither.yml b/.github/workflows/slither.yml new file mode 100644 index 00000000..c225a927 --- /dev/null +++ b/.github/workflows/slither.yml @@ -0,0 +1,24 @@ +name: Slither Analysis + +on: + workflow_dispatch: + pull_request: + +jobs: + analyze: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Run Slither + uses: crytic/slither-action@v0.3.1 + id: slither + with: + sarif: results.sarif + fail-on: medium + + - name: Upload SARIF file + if: always() + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: ${{ steps.slither.outputs.sarif }} diff --git a/.gitignore b/.gitignore index 4d219b57..62617e35 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,9 @@ node_modules/ deployments/ /test/prover/proofs/*.json /test/prover/spec-proofs/*.json -/test/storage/*-old.dot +/test/storage/*-old +/test/signatures/*-old scripts/config.ts +forge-cache/ +out/ +.env \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..888d42dc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/.prettierignore b/.prettierignore index 44285698..24c191bd 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,3 +5,5 @@ coverage/** deployments/** src/lib/abi/** .nyc_output +out/** +lib/** diff --git a/.prettierrc.js b/.prettierrc.js index b08bd49d..5392936b 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -14,7 +14,7 @@ module.exports = { printWidth: 100, singleQuote: false, bracketSpacing: false, - compiler: '0.8.6', + compiler: '0.8.9', }, }, ], diff --git a/.solhint.json b/.solhint.json index 3ab96cfe..ee37a04c 100644 --- a/.solhint.json +++ b/.solhint.json @@ -11,7 +11,7 @@ "no-empty-blocks": "off", "reason-string": ["warn", { "maxLength": 128 }], "not-rely-on-time": "off", - "max-states-count": ["warn", 30], + "max-states-count": ["warn", 40], "no-inline-assembly": "off" }, "plugins": ["prettier"] diff --git a/LICENSE b/LICENSE.md similarity index 78% rename from LICENSE rename to LICENSE.md index 8217feee..a4e5a7f6 100644 --- a/LICENSE +++ b/LICENSE.md @@ -10,27 +10,29 @@ Parameters Licensor: Offchain Labs Licensed Work: Arbitrum Nitro Contracts - The Licensed Work is (c) 2021-2023 Offchain Labs + The Licensed Work is (c) 2021-2024 Offchain Labs Additional Use Grant: You may use the Licensed Work in a production environment solely to provide a point of interface to permit end users or applications utilizing the Covered Arbitrum Chains to interact and query the state of a Covered Arbitrum Chain, including without limitation - validating the correctness of the posted chain state. For purposes - of this Additional Use Grant, the "Covered Arbitrum Chains" are - means (a) Arbitrum One (chainid:42161), Arbitrum Nova (chainid:42170), - Arbitrum Rinkeby testnet/Rinkarby (chainid:421611), and - Arbitrum Nitro Goerli testnet (chainid:421613) (b) any future - blockchains authorized to be designated as Covered Arbitrum Chains - by the decentralized autonomous organization governing the Arbitrum - network; and (c) any โ€œLayer 3โ€ Arbitrum-based blockchain that is built - on and settles to another Covered Arbitrum Chain. - - - - - -Change Date: Dec 31, 2027 + validating the correctness of the posted chain state, or to deploy + and operate (x) a blockchain that settles to a Covered Arbitrum Chain + or (y) a blockchain in accordance with, and subject to, the [Arbitrum + Expansion Program Term of Use](https://docs.arbitrum.foundation/assets/files/Arbitrum%20Expansion%20Program%20Jan182024-4f08b0c2cb476a55dc153380fa3e64b0.pdf). For purposes of this + Additional Use Grant, the "Covered Arbitrum Chains" are + (a) Arbitrum One (chainid:42161), Arbitrum Nova (chainid:42170), + rbitrum Rinkeby testnet/Rinkarby (chainid:421611),Arbitrum Nitro + Goerli testnet (chainid:421613), and Arbitrum Sepolia Testnet + (chainid:421614); (b) any future blockchains authorized to be + designated as Covered Arbitrum Chains by the decentralized autonomous + organization governing the Arbitrum network; and (c) any โ€œLayer 3โ€ + Arbitrum-based blockchain that is built on and settles to another + Covered Arbitrum Chain. + + + +Change Date: Dec 31, 2028 Change License: Apache License Version 2.0 diff --git a/README.md b/README.md index 8fc3d98c..4ddbf31a 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,17 @@ cd nitro-contracts yarn install yarn build ``` + +## License + +Nitro is currently licensed under a [Business Source License](./LICENSE), similar to our friends at Uniswap and Aave, with an "Additional Use Grant" to ensure that everyone can have full comfort using and running nodes on all public Arbitrum chains. + +The Additional Use Grant also permits the deployment of the Nitro software, in a permissionless fashion and without cost, as a new blockchain provided that the chain settles to either Arbitrum One or Arbitrum Nova. + +For those that prefer to deploy the Nitro software either directly on Ethereum (i.e. an L2) or have it settle to another Layer-2 on top of Ethereum, the [Arbitrum Expansion Program (the "AEP")](https://docs.arbitrum.foundation/assets/files/Arbitrum%20Expansion%20Program%20Jan182024-4f08b0c2cb476a55dc153380fa3e64b0.pdf) was recently established. The AEP allows for the permissionless deployment in the aforementioned fashion provided that 10% of net revenue is contributed back to the Arbitrum community in accordance with the requirements of the AEP. + +## Contact + +Discord - [Arbitrum](https://discord.com/invite/5KE54JwyTs) + +Twitter: [Arbitrum](https://twitter.com/arbitrum) diff --git a/audit-ci.jsonc b/audit-ci.jsonc new file mode 100644 index 00000000..3c89eb61 --- /dev/null +++ b/audit-ci.jsonc @@ -0,0 +1,52 @@ +{ + "$schema": "https://github.com/IBM/audit-ci/raw/main/docs/schema.json", + "low": true, + "allowlist": [ + // OpenZeppelin Contracts's SignatureChecker may revert on invalid EIP-1271 signers + "GHSA-4g63-c64m-25w9", + // OpenZeppelin Contracts's GovernorVotesQuorumFraction updates to quorum may affect past defeated proposals + "GHSA-xrc4-737v-9q75", + // OpenZeppelin Contracts's ERC165Checker may revert instead of returning false + "GHSA-qh9x-gcfh-pcrw", + // OpenZeppelin Contracts vulnerable to ECDSA signature malleability. Only an issue for the functions that take a single `bytes` argument, and not the functions that take `r, v, s` or `r, vs` as separate arguments. + "GHSA-4h98-2769-gh6h", + // GovernorCompatibilityBravo may trim proposal calldata + "GHSA-93hq-5wgc-jc82", + // OpenZeppelin Contracts ERC165Checker unbounded gas consumption + "GHSA-7grf-83vw-6f5x", + // OpenZeppelin: Using ERC2771Context with a custom forwarder can yield address(0) + "GHSA-g4vp-m682-qqmp", + // OpenZeppelin Contracts TransparentUpgradeableProxy clashing selector calls may not be delegated + "GHSA-mx2q-35m2-x2rh", + // OpenZeppelin Contracts's governor proposal creation may be blocked by frontrunning + "GHSA-5h3x-9wvq-w4m2", + // axios cookies data-privacy issue; used only in hardhat-deploy and sol2uml (dev deps) + "GHSA-wf5p-g6vw-rhxx", + // flat vulnerable to Prototype Pollution + "GHSA-2j2x-2gpw-g8fm", + // regular expression DoS in debug + "GHSA-gxpj-cx7g-858c", + // tough-cookie Prototype Pollution vulnerability; used only via eth-gas-reporter + "GHSA-72xf-g2v4-qvf3", + // minimatch ReDoS vulnerability + "GHSA-f8q6-p94x-37v3", + // Server-Side Request Forgery in Request + "GHSA-p8p7-x288-28g6", + // OpenZeppelin Contracts using MerkleProof multiproofs may allow proving arbitrary leaves for specific trees; unused + "GHSA-wprv-93r4-jj2p", + // follow-redirects improperly handles URLs in the url.parse() function + "GHSA-jchw-25xp-jwwc", + // yargs-parser Vulnerable to Prototype Pollution + "GHSA-p9pc-299p-vxgp", + // Axios vulnerable to Server-Side Request Forgery + "GHSA-4w2v-q235-vp99", + // axios Inefficient Regular Expression Complexity vulnerability + "GHSA-cph5-m8f7-6c5x", + // Exposure of Sensitive Information to an Unauthorized Actor in follow-redirects + "GHSA-pw2r-vq6v-hr8c", + // Exposure of sensitive information in follow-redirects + "GHSA-74fj-2j2h-c42q", + // Open Zeppelin: Base64 encoding may read from potentially dirty memory + "GHSA-9vx6-7xxf-x967" + ] +} diff --git a/deploy/SequencerInbox.js b/deploy/SequencerInbox.js index 4c9ef912..d90135a9 100644 --- a/deploy/SequencerInbox.js +++ b/deploy/SequencerInbox.js @@ -3,7 +3,10 @@ module.exports = async hre => { const { deploy } = deployments const { deployer } = await getNamedAccounts() - await deploy('SequencerInbox', { from: deployer, args: [] }) + const blobBasefeeReader = await ethers.getContract('BlobBasefeeReader') + const dataHashReader = await ethers.getContract('DataHashReader') + + await deploy('SequencerInbox', { from: deployer, args: [117964] }) } module.exports.tags = ['SequencerInbox'] diff --git a/deploy/SequencerInboxStubCreator.js b/deploy/SequencerInboxStubCreator.js index 72ee8202..e61a227c 100644 --- a/deploy/SequencerInboxStubCreator.js +++ b/deploy/SequencerInboxStubCreator.js @@ -1,9 +1,14 @@ +import { Toolkit4844 } from '../test/contract/toolkit4844' + module.exports = async hre => { - const { deployments, getNamedAccounts, ethers } = hre + const { deployments, getSigners, getNamedAccounts, ethers } = hre const { deploy } = deployments const { deployer } = await getNamedAccounts() const bridge = await ethers.getContract('BridgeStub') + const reader4844 = await Toolkit4844.deployReader4844( + await ethers.getSigner(deployer) + ) const maxTime = { delayBlocks: 10000, futureBlocks: 10000, @@ -12,7 +17,14 @@ module.exports = async hre => { } await deploy('SequencerInboxStub', { from: deployer, - args: [bridge.address, deployer, maxTime], + args: [ + bridge.address, + deployer, + maxTime, + 117964, + reader4844.address, + false, + ], }) } diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 00000000..7ba3e2bb --- /dev/null +++ b/foundry.toml @@ -0,0 +1,21 @@ +[profile.default] +src = 'src/' +out = 'out' +libs = ['node_modules', 'lib'] +test = 'test/foundry' +cache_path = 'forge-cache/sol' +optimizer = true +optimizer_runs = 100 +via_ir = false +solc_version = '0.8.9' + +[profile.yul] +src = 'yul' +out = 'out/yul' +libs = ['node_modules', 'lib'] +cache_path = 'forge-cache/yul' + +[fmt] +number_underscore = 'thousands' +line_length = 100 +# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file diff --git a/hardhat.config.ts b/hardhat.config.ts index 76929c70..401a29b3 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -5,6 +5,11 @@ import '@nomiclabs/hardhat-etherscan' import '@typechain/hardhat' import 'solidity-coverage' import 'hardhat-gas-reporter' +import 'hardhat-ignore-warnings' +// import '@tovarishfin/hardhat-yul'; +import dotenv from 'dotenv' + +dotenv.config() const solidity = { compilers: [ @@ -112,6 +117,12 @@ module.exports = { ? [process.env['DEVNET_PRIVKEY']] : [], }, + arbSepolia: { + url: 'https://sepolia-rollup.arbitrum.io/rpc', + accounts: process.env['DEVNET_PRIVKEY'] + ? [process.env['DEVNET_PRIVKEY']] + : [], + }, arb1: { url: 'https://arb1.arbitrum.io/rpc', accounts: process.env['MAINNET_PRIVKEY'] @@ -138,6 +149,7 @@ module.exports = { arbitrumTestnet: process.env['ARBISCAN_API_KEY'], nova: process.env['NOVA_ARBISCAN_API_KEY'], arbGoerliRollup: process.env['ARBISCAN_API_KEY'], + arbSepolia: process.env['ARBISCAN_API_KEY'], }, customChains: [ { @@ -156,6 +168,14 @@ module.exports = { browserURL: 'https://goerli.arbiscan.io/', }, }, + { + network: 'arbSepolia', + chainId: 421614, + urls: { + apiURL: 'https://sepolia-explorer.arbitrum.io/api', + browserURL: 'https://sepolia-explorer.arbitrum.io/', + }, + }, ], }, mocha: { diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 00000000..e8a047e3 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit e8a047e3f40f13fa37af6fe14e6e06283d9a060e diff --git a/package.json b/package.json index 152ddab6..6db0b0c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@arbitrum/nitro-contracts", - "version": "1.0.2", + "version": "1.2.1", "description": "Layer 2 precompiles and rollup for Arbitrum Nitro", "author": "Offchain Labs, Inc.", "license": "BUSL-1.1", @@ -9,35 +9,55 @@ "url": "git+https://github.com/offchainlabs/nitro-contracts.git" }, "files": [ - "src/" + "src/", + "build/contracts/src", + "build/contracts/@openzeppelin", + "out/yul/Reader4844.yul/Reader4844.json" ], "bugs": { "url": "https://github.com/offchainlabs/nitro-contracts/issues" }, "scripts": { + "audit:ci": "audit-ci --config ./audit-ci.jsonc", + "audit:fix": "yarn-audit-fix", + "prepublishOnly": "hardhat clean && forge clean && hardhat compile && yarn build:forge:yul", + "build:all": "yarn build && yarn build:forge", "build": "hardhat compile", + "build:forge:sol": "forge build --skip *.yul", + "build:forge:yul": "FOUNDRY_PROFILE=yul forge build --skip *.sol", + "build:forge": "yarn build:forge:sol && yarn build:forge:yul", "lint:test": "eslint ./test", "solhint": "solhint -f table src/**/*.sol", "prettier:solidity": "prettier --write src/**/*.sol", - "format": "prettier './**/*.{js,json,md,ts,yml,sol}' --write && yarn run lint:test --fix", + "format": "prettier './**/*.{js,json,ts,yml,sol}' --write && yarn run lint:test --fix", "build:0.6": "INTERFACE_TESTER_SOLC_VERSION=0.6.9 yarn run build", "build:0.7": "INTERFACE_TESTER_SOLC_VERSION=0.7.0 yarn run build", + "test": "DISABLE_GAS_REPORTER=true hardhat --network hardhat test test/contract/*.spec.ts", + "test:4844": "DISABLE_GAS_REPORTER=true hardhat --network hardhat test test/contract/*.spec.4844.ts", "test:compatibility": "yarn run build:0.6 && yarn run build:0.7", "test:storage": "./test/storage/test.bash", + "test:signatures": "./test/signatures/test-sigs.bash", + "test:e2e": "hardhat test test/e2e/*.ts", "postinstall": "patch-package", "deploy-factory": "hardhat run scripts/deployment.ts", - "deploy-rollup": "hardhat run scripts/rollupCreation.ts" + "deploy-eth-rollup": "hardhat run scripts/createEthRollup.ts", + "deploy-erc20-rollup": "hardhat run scripts/createERC20Rollup.ts" }, "dependencies": { + "@offchainlabs/upgrade-executor": "1.1.0-beta.0", "@openzeppelin/contracts": "4.5.0", "@openzeppelin/contracts-upgradeable": "4.5.2", - "patch-package": "^6.4.7" + "patch-package": "^6.4.7", + "solady": "0.0.182" }, "private": false, "devDependencies": { + "@arbitrum/sdk": "^3.1.3", + "@ethersproject/providers": "^5.7.2", "@nomiclabs/hardhat-ethers": "npm:hardhat-deploy-ethers@^0.3.0-beta.13", "@nomiclabs/hardhat-etherscan": "^3.1.0", "@nomiclabs/hardhat-waffle": "^2.0.1", + "@tovarishfin/hardhat-yul": "^3.0.5", "@typechain/ethers-v5": "^10.0.0", "@typechain/hardhat": "^6.0.0", "@types/chai": "^4.3.0", @@ -46,28 +66,29 @@ "@typescript-eslint/eslint-plugin": "^5.14.0", "@typescript-eslint/eslint-plugin-tslint": "^5.27.1", "@typescript-eslint/parser": "^5.14.0", + "audit-ci": "^6.6.1", "chai": "^4.3.4", + "dotenv": "^16.3.1", "eslint": "^8.23.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "^4.0.0", - "ethereum-waffle": "^3.4.0", - "ethers": "^5.5.2", - "hardhat": "^2.6.6", - "hardhat-deploy": "^0.11.4", - "hardhat-gas-reporter": "^1.0.8", + "ethereum-waffle": "^4.0.10", + "ethers": "^5.5.4", + "hardhat": "^2.17.2", + "hardhat-deploy": "^0.11.37", + "hardhat-gas-reporter": "^1.0.9", + "hardhat-ignore-warnings": "^0.2.9", "postinstall-postinstall": "^2.1.0", "prettier": "^2.5.1", "prettier-plugin-solidity": "^1.0.0-beta.19", "solhint": "^3.3.7", "solhint-plugin-prettier": "^0.0.5", - "solidity-coverage": "^0.7.20", - "tslint": "^6.1.3", + "solidity-coverage": "^0.8.4", "ts-node": "^10.4.0", - "typechain": "^8.0.0", - "typescript": "^4.5.4" - }, - "optionalDependencies": { - "sol2uml": "2.2.0" + "tslint": "^6.1.3", + "typechain": "^8.3.2", + "typescript": "^4.5.4", + "yarn-audit-fix": "^10.0.7" } } diff --git a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch b/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch deleted file mode 100644 index 9156511d..00000000 --- a/patches/@nomiclabs+hardhat-etherscan+3.1.0.patch +++ /dev/null @@ -1,263 +0,0 @@ -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -index 02997fe..ea8a589 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.d.ts -@@ -1,6 +1,7 @@ - export declare const pluginName = "@nomiclabs/hardhat-etherscan"; - export declare const TASK_VERIFY = "verify"; - export declare const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export declare const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export declare const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - export declare const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - export declare const TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -index 3c39b90..3ea23f9 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/constants.js -@@ -1,9 +1,10 @@ - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); --exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; -+exports.TASK_VERIFY_GET_LIBRARIES = exports.TASK_VERIFY_VERIFY = exports.TASK_VERIFY_VERIFY_MINIMUM_BUILD = exports.TASK_VERIFY_GET_CONTRACT_INFORMATION = exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = exports.TASK_VERIFY_GET_COMPILER_VERSIONS = exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = exports.TASK_VERIFY_GET_FULL_BUILD = exports.TASK_VERIFY_GET_MINIMUM_BUILD = exports.TASK_VERIFY = exports.pluginName = void 0; - exports.pluginName = "@nomiclabs/hardhat-etherscan"; - exports.TASK_VERIFY = "verify"; - exports.TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+exports.TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - exports.TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = "verify:get-constructor-arguments"; - exports.TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; - exports.TASK_VERIFY_GET_ETHERSCAN_ENDPOINT = "verify:get-etherscan-endpoint"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -index 0f8a4d5..3502c2c 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -+++ b/node_modules/@nomiclabs/hardhat-etherscan/dist/src/index.js -@@ -140,9 +140,18 @@ Possible causes are: - const solcFullVersion = deployedBytecode.isOvmInferred() - ? contractInformation.solcVersion - : await (0, version_1.getLongVersion)(contractInformation.solcVersion); -- const minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild; -+ try { -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } -+ catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...'); -+ minimumBuild = await run(constants_1.TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - const success = await run(constants_1.TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, - contractInformation, -@@ -276,6 +285,44 @@ const getMinimumBuild = async function ({ sourceName }, { run }) { - }); - return build; - }; -+const getFullBuild = async function ({ sourceName }, { run }) { -+ const sourcePaths = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS); -+ const sourceNames = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, { -+ sourcePaths, -+ }); -+ const dependencyGraph = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, { sourceNames }); -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant(resolvedFiles.length === 1, `The plugin found an unexpected number of files for this contract.`); -+ const compilationJobsCreationResult = await run(task_names_1.TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(task_names_1.TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ const mergedCompilationJobs = await run(task_names_1.TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, { compilationJobs: compilationJobs }); -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return (cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ const build = await run(task_names_1.TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); -+ return build; -+}; - async function inferContract(artifacts, network, matchingCompilerVersions, deployedBytecode) { - const contractMatches = await (0, bytecode_1.lookupMatchingBytecode)(artifacts, matchingCompilerVersions, deployedBytecode); - if (contractMatches.length === 0) { -@@ -429,6 +476,9 @@ This means that unrelated contracts may be displayed on Etherscan... - (0, config_1.subtask)(constants_1.TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, config_1.types.string) - .setAction(getMinimumBuild); -+(0, config_1.subtask)(constants_1.TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, config_1.types.string) -+ .setAction(getFullBuild); - (0, config_1.task)(constants_1.TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam("address", "Address of the smart contract to verify") - .addOptionalParam("constructorArgs", "File path to a javascript module that exports the list of arguments.", undefined, config_1.types.inputFile) -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -index cb029e2..0e5341d 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/constants.ts -@@ -1,6 +1,7 @@ - export const pluginName = "@nomiclabs/hardhat-etherscan"; - export const TASK_VERIFY = "verify"; - export const TASK_VERIFY_GET_MINIMUM_BUILD = "verify:get-minimum-build"; -+export const TASK_VERIFY_GET_FULL_BUILD = "verify:get-full-build"; - export const TASK_VERIFY_GET_CONSTRUCTOR_ARGUMENTS = - "verify:get-constructor-arguments"; - export const TASK_VERIFY_GET_COMPILER_VERSIONS = "verify:get-compiler-versions"; -diff --git a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -index e55c99b..5661415 100644 ---- a/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -+++ b/node_modules/@nomiclabs/hardhat-etherscan/src/index.ts -@@ -1,8 +1,14 @@ - import { - TASK_COMPILE, - TASK_COMPILE_SOLIDITY_COMPILE_JOB, -+ TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, - TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOB_FOR_FILE, - TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS, -+ TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, - } from "hardhat/builtin-tasks/task-names"; - import { extendConfig, subtask, task, types } from "hardhat/config"; - import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -@@ -10,6 +16,7 @@ import { - ActionType, - Artifacts, - CompilationJob, -+ CompilationJobsCreationResult, - CompilerInput, - CompilerOutput, - DependencyGraph, -@@ -33,6 +40,7 @@ import { - TASK_VERIFY_GET_ETHERSCAN_ENDPOINT, - TASK_VERIFY_GET_LIBRARIES, - TASK_VERIFY_GET_MINIMUM_BUILD, -+ TASK_VERIFY_GET_FULL_BUILD, - TASK_VERIFY_VERIFY, - TASK_VERIFY_VERIFY_MINIMUM_BUILD, - } from "./constants"; -@@ -292,9 +300,17 @@ Possible causes are: - ? contractInformation.solcVersion - : await getLongVersion(contractInformation.solcVersion); - -- const minimumBuild: Build = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -- sourceName: contractInformation.sourceName, -- }); -+ let minimumBuild: Build; -+ try { -+ minimumBuild = await run(TASK_VERIFY_GET_MINIMUM_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } catch (error) { -+ console.warn('Unable to produce minimum build, proceeding to use full build...') -+ minimumBuild = await run(TASK_VERIFY_GET_FULL_BUILD, { -+ sourceName: contractInformation.sourceName, -+ }); -+ } - - const success: boolean = await run(TASK_VERIFY_VERIFY_MINIMUM_BUILD, { - minimumBuild, -@@ -531,7 +547,74 @@ const getMinimumBuild: ActionType = async function ( - emitsArtifacts: false, - quiet: true, - }); -+ return build; -+}; -+ -+const getFullBuild: ActionType = async function ( -+ { sourceName }, -+ { run } -+): Promise { -+ const sourcePaths: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS -+ ); -+ -+ const sourceNames: string[] = await run( -+ TASK_COMPILE_SOLIDITY_GET_SOURCE_NAMES, -+ { -+ sourcePaths, -+ } -+ ); -+ -+ const dependencyGraph: DependencyGraph = await run( -+ TASK_COMPILE_SOLIDITY_GET_DEPENDENCY_GRAPH, -+ { sourceNames } -+ ); -+ -+ const resolvedFiles = dependencyGraph -+ .getResolvedFiles() -+ .filter((resolvedFile) => { -+ return resolvedFile.sourceName === sourceName; -+ }); -+ assertHardhatPluginInvariant( -+ resolvedFiles.length === 1, -+ `The plugin found an unexpected number of files for this contract.` -+ ); -+ -+ const compilationJobsCreationResult: CompilationJobsCreationResult = -+ await run(TASK_COMPILE_SOLIDITY_GET_COMPILATION_JOBS, { -+ dependencyGraph, -+ }); -+ await run(TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES, { -+ compilationJobsCreationErrors: compilationJobsCreationResult.errors, -+ }); -+ -+ const compilationJobs = compilationJobsCreationResult.jobs; -+ -+ // const filteredCompilationJobs: CompilationJob[] = await run( -+ // TASK_COMPILE_SOLIDITY_FILTER_COMPILATION_JOBS, -+ // { compilationJobs, force: false } -+ // ); -+ -+ const mergedCompilationJobs: CompilationJob[] = await run( -+ TASK_COMPILE_SOLIDITY_MERGE_COMPILATION_JOBS, -+ { compilationJobs: compilationJobs } -+ ); - -+ const targetCompilationJobs = mergedCompilationJobs.filter((cj) => { -+ return ( -+ cj.getResolvedFiles().filter((f) => f.sourceName === sourceName).length > -+ 0 -+ ); -+ }); -+ const compilationJob = targetCompilationJobs[0]; -+ -+ const build: Build = await run(TASK_COMPILE_SOLIDITY_COMPILE_JOB, { -+ compilationJob, -+ compilationJobs: [compilationJob], -+ compilationJobIndex: 0, -+ emitsArtifacts: false, -+ quiet: true, -+ }); - return build; - }; - -@@ -807,6 +890,10 @@ subtask(TASK_VERIFY_GET_MINIMUM_BUILD) - .addParam("sourceName", undefined, undefined, types.string) - .setAction(getMinimumBuild); - -+subtask(TASK_VERIFY_GET_FULL_BUILD) -+ .addParam("sourceName", undefined, undefined, types.string) -+ .setAction(getFullBuild); -+ - task(TASK_VERIFY, "Verifies contract on Etherscan") - .addOptionalPositionalParam( - "address", diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 00000000..f02afee2 --- /dev/null +++ b/remappings.txt @@ -0,0 +1,5 @@ +ds-test/=lib/forge-std/lib/ds-test/src/ +forge-std/=lib/forge-std/src/ + +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ \ No newline at end of file diff --git a/scripts/config.ts.example b/scripts/config.ts.example index 7f911710..cf5d8704 100644 --- a/scripts/config.ts.example +++ b/scripts/config.ts.example @@ -1,5 +1,9 @@ import { ethers } from 'ethers' +// 90% of Geth's 128KB tx size limit, leaving ~13KB for proving +// This need to be adjusted for Orbit chains +export const maxDataSize = 117964 + export const config = { rollupConfig: { confirmPeriodBlocks: ethers.BigNumber.from('45818'), diff --git a/scripts/createERC20Rollup.ts b/scripts/createERC20Rollup.ts new file mode 100644 index 00000000..604fa17e --- /dev/null +++ b/scripts/createERC20Rollup.ts @@ -0,0 +1,41 @@ +import { ethers } from 'hardhat' +import '@nomiclabs/hardhat-ethers' +import { Signer } from 'ethers' +import { createRollup } from './rollupCreation' +import { TestToken__factory } from '../build/types' + +async function deployERC20Token(deployer: Signer): Promise { + const factory = await new TestToken__factory(deployer).deploy( + ethers.utils.parseEther('1000000000') + ) + const feeToken = await factory.deployed() + + return feeToken.address +} + +async function main() { + const [deployer] = await ethers.getSigners() + + let customFeeTokenAddress = process.env.FEE_TOKEN_ADDRESS + if (!customFeeTokenAddress) { + console.log( + 'FEE_TOKEN_ADDRESS env var not provided, deploying new ERC20 token' + ) + customFeeTokenAddress = await deployERC20Token(deployer) + } + if (!ethers.utils.isAddress(customFeeTokenAddress)) { + throw new Error( + 'Fee token address ' + customFeeTokenAddress + ' is not a valid address!' + ) + } + + console.log('Creating new rollup with', customFeeTokenAddress, 'as fee token') + await createRollup(customFeeTokenAddress) +} + +main() + .then(() => process.exit(0)) + .catch((error: Error) => { + console.error(error) + process.exit(1) + }) diff --git a/scripts/createEthRollup.ts b/scripts/createEthRollup.ts new file mode 100644 index 00000000..eb11e83d --- /dev/null +++ b/scripts/createEthRollup.ts @@ -0,0 +1,13 @@ +import '@nomiclabs/hardhat-ethers' +import { createRollup } from './rollupCreation' + +async function main() { + await createRollup() +} + +main() + .then(() => process.exit(0)) + .catch((error: Error) => { + console.error(error) + process.exit(1) + }) diff --git a/scripts/deployment.ts b/scripts/deployment.ts index 9a5bf94f..fdb51877 100644 --- a/scripts/deployment.ts +++ b/scripts/deployment.ts @@ -1,100 +1,6 @@ import { ethers } from 'hardhat' -import { ContractFactory, Contract } from 'ethers' import '@nomiclabs/hardhat-ethers' -import { run } from 'hardhat' - -// Define a verification function -async function verifyContract( - contractName: string, - contractAddress: string, - constructorArguments: any[] = [], - contractPathAndName?: string // optional -): Promise { - try { - // Define the verification options with possible 'contract' property - const verificationOptions: { - contract?: string - address: string - constructorArguments: any[] - } = { - address: contractAddress, - constructorArguments: constructorArguments, - } - - // if contractPathAndName is provided, add it to the verification options - if (contractPathAndName) { - verificationOptions.contract = contractPathAndName - } - - await run('verify:verify', verificationOptions) - console.log(`Verified contract ${contractName} successfully.`) - } catch (error: any) { - if (error.message.includes('Already Verified')) { - console.log(`Contract ${contractName} is already verified.`) - } else { - console.error( - `Verification for ${contractName} failed with the following error: ${error.message}` - ) - } - } -} - -// Function to handle contract deployment -async function deployContract( - contractName: string, - signer: any, - constructorArgs: any[] = [] -): Promise { - const factory: ContractFactory = await ethers.getContractFactory(contractName) - const connectedFactory: ContractFactory = factory.connect(signer) - const contract: Contract = await connectedFactory.deploy(...constructorArgs) - await contract.deployTransaction.wait() - console.log(`New ${contractName} created at address:`, contract.address) - - await verifyContract(contractName, contract.address, constructorArgs) - - return contract -} - -// Function to handle all deployments of core contracts using deployContract function -async function deployAllContracts( - signer: any -): Promise> { - const bridgeCreator = await deployContract('BridgeCreator', signer) - const prover0 = await deployContract('OneStepProver0', signer) - const proverMem = await deployContract('OneStepProverMemory', signer) - const proverMath = await deployContract('OneStepProverMath', signer) - const proverHostIo = await deployContract('OneStepProverHostIo', signer) - const osp: Contract = await deployContract('OneStepProofEntry', signer, [ - prover0.address, - proverMem.address, - proverMath.address, - proverHostIo.address, - ]) - const challengeManager = await deployContract('ChallengeManager', signer) - const rollupAdmin = await deployContract('RollupAdminLogic', signer) - const rollupUser = await deployContract('RollupUserLogic', signer) - const validatorUtils = await deployContract('ValidatorUtils', signer) - const validatorWalletCreator = await deployContract( - 'ValidatorWalletCreator', - signer - ) - const rollupCreator = await deployContract('RollupCreator', signer) - return { - bridgeCreator, - prover0, - proverMem, - proverMath, - proverHostIo, - osp, - challengeManager, - rollupAdmin, - rollupUser, - validatorUtils, - validatorWalletCreator, - rollupCreator, - } -} +import { deployAllContracts } from './deploymentUtils' async function main() { const [signer] = await ethers.getSigners() @@ -111,42 +17,12 @@ async function main() { contracts.challengeManager.address, contracts.rollupAdmin.address, contracts.rollupUser.address, + contracts.upgradeExecutor.address, contracts.validatorUtils.address, - contracts.validatorWalletCreator.address + contracts.validatorWalletCreator.address, + contracts.deployHelper.address ) console.log('Template is set on the Rollup Creator') - - const bridgeAddress = await contracts.bridgeCreator.bridgeTemplate() - const sequencerInboxAddress = - await contracts.bridgeCreator.sequencerInboxTemplate() - const inboxAddress = await contracts.bridgeCreator.inboxTemplate() - const outboxAddress = await contracts.bridgeCreator.outboxTemplate() - - console.log( - `"bridge implementation contract" created at address:`, - bridgeAddress - ) - await verifyContract( - 'Bridge', - bridgeAddress, - [], - 'src/bridge/Bridge.sol:Bridge' - ) - console.log( - `"sequencerInbox implementation contract" created at address:`, - sequencerInboxAddress - ) - await verifyContract('SequencerInbox', sequencerInboxAddress, []) - console.log( - `"inbox implementation contract" created at address:`, - inboxAddress - ) - await verifyContract('Inbox', inboxAddress, []) - console.log( - `"outbox implementation contract" created at address:`, - outboxAddress - ) - await verifyContract('Outbox', outboxAddress, []) } catch (error) { console.error( 'Deployment failed:', diff --git a/scripts/deploymentUtils.ts b/scripts/deploymentUtils.ts new file mode 100644 index 00000000..2df51be6 --- /dev/null +++ b/scripts/deploymentUtils.ts @@ -0,0 +1,191 @@ +import { ethers } from 'hardhat' +import { ContractFactory, Contract, Overrides } from 'ethers' +import '@nomiclabs/hardhat-ethers' +import { run } from 'hardhat' +import { + abi as UpgradeExecutorABI, + bytecode as UpgradeExecutorBytecode, +} from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' +import { maxDataSize } from './config' +import { Toolkit4844 } from '../test/contract/toolkit4844' +import { ArbSys__factory } from '../build/types' +import { ARB_SYS_ADDRESS } from '@arbitrum/sdk/dist/lib/dataEntities/constants' + +// Define a verification function +export async function verifyContract( + contractName: string, + contractAddress: string, + constructorArguments: any[] = [], + contractPathAndName?: string // optional +): Promise { + try { + if (process.env.DISABLE_VERIFICATION) return + // Define the verification options with possible 'contract' property + const verificationOptions: { + contract?: string + address: string + constructorArguments: any[] + } = { + address: contractAddress, + constructorArguments: constructorArguments, + } + + // if contractPathAndName is provided, add it to the verification options + if (contractPathAndName) { + verificationOptions.contract = contractPathAndName + } + + await run('verify:verify', verificationOptions) + console.log(`Verified contract ${contractName} successfully.`) + } catch (error: any) { + if (error.message.includes('Already Verified')) { + console.log(`Contract ${contractName} is already verified.`) + } else { + console.error( + `Verification for ${contractName} failed with the following error: ${error.message}` + ) + } + } +} + +// Function to handle contract deployment +export async function deployContract( + contractName: string, + signer: any, + constructorArgs: any[] = [], + verify: boolean = true, + overrides?: Overrides +): Promise { + const factory: ContractFactory = await ethers.getContractFactory(contractName) + const connectedFactory: ContractFactory = factory.connect(signer) + + let deploymentArgs = [...constructorArgs] + if (overrides) { + deploymentArgs.push(overrides) + } + + const contract: Contract = await connectedFactory.deploy(...deploymentArgs) + await contract.deployTransaction.wait() + console.log(`New ${contractName} created at address:`, contract.address) + + if (verify) + await verifyContract(contractName, contract.address, constructorArgs) + + return contract +} + +// Deploy upgrade executor from imported bytecode +export async function deployUpgradeExecutor(signer: any): Promise { + const upgradeExecutorFac = await ethers.getContractFactory( + UpgradeExecutorABI, + UpgradeExecutorBytecode + ) + const connectedFactory: ContractFactory = upgradeExecutorFac.connect(signer) + const upgradeExecutor = await connectedFactory.deploy() + return upgradeExecutor +} + +// Function to handle all deployments of core contracts using deployContract function +export async function deployAllContracts( + signer: any +): Promise> { + const isOnArb = await _isRunningOnArbitrum(signer) + + const ethBridge = await deployContract('Bridge', signer, []) + const reader4844 = isOnArb + ? ethers.constants.AddressZero + : (await Toolkit4844.deployReader4844(signer)).address + + const ethSequencerInbox = await deployContract('SequencerInbox', signer, [ + maxDataSize, + reader4844, + false, + ]) + + const ethInbox = await deployContract('Inbox', signer, [maxDataSize]) + const ethRollupEventInbox = await deployContract( + 'RollupEventInbox', + signer, + [] + ) + const ethOutbox = await deployContract('Outbox', signer, []) + + const erc20Bridge = await deployContract('ERC20Bridge', signer, []) + const erc20SequencerInbox = await deployContract('SequencerInbox', signer, [ + maxDataSize, + reader4844, + true, + ]) + const erc20Inbox = await deployContract('ERC20Inbox', signer, [maxDataSize]) + const erc20RollupEventInbox = await deployContract( + 'ERC20RollupEventInbox', + signer, + [] + ) + const erc20Outbox = await deployContract('ERC20Outbox', signer, []) + + const bridgeCreator = await deployContract('BridgeCreator', signer, [ + [ + ethBridge.address, + ethSequencerInbox.address, + ethInbox.address, + ethRollupEventInbox.address, + ethOutbox.address, + ], + [ + erc20Bridge.address, + erc20SequencerInbox.address, + erc20Inbox.address, + erc20RollupEventInbox.address, + erc20Outbox.address, + ], + ]) + const prover0 = await deployContract('OneStepProver0', signer) + const proverMem = await deployContract('OneStepProverMemory', signer) + const proverMath = await deployContract('OneStepProverMath', signer) + const proverHostIo = await deployContract('OneStepProverHostIo', signer) + const osp: Contract = await deployContract('OneStepProofEntry', signer, [ + prover0.address, + proverMem.address, + proverMath.address, + proverHostIo.address, + ]) + const challengeManager = await deployContract('ChallengeManager', signer) + const rollupAdmin = await deployContract('RollupAdminLogic', signer) + const rollupUser = await deployContract('RollupUserLogic', signer) + const upgradeExecutor = await deployUpgradeExecutor(signer) + const validatorUtils = await deployContract('ValidatorUtils', signer) + const validatorWalletCreator = await deployContract( + 'ValidatorWalletCreator', + signer + ) + const rollupCreator = await deployContract('RollupCreator', signer) + const deployHelper = await deployContract('DeployHelper', signer) + return { + bridgeCreator, + prover0, + proverMem, + proverMath, + proverHostIo, + osp, + challengeManager, + rollupAdmin, + rollupUser, + upgradeExecutor, + validatorUtils, + validatorWalletCreator, + rollupCreator, + deployHelper, + } +} + +// Check if we're deploying to an Arbitrum chain +async function _isRunningOnArbitrum(signer: any): Promise { + const arbSys = ArbSys__factory.connect(ARB_SYS_ADDRESS, signer) + try { + await arbSys.arbOSVersion() + return true + } catch (error) { + return false + } +} diff --git a/scripts/genNetwork.ts b/scripts/genNetwork.ts new file mode 100644 index 00000000..992e4597 --- /dev/null +++ b/scripts/genNetwork.ts @@ -0,0 +1,17 @@ +import { setupNetworks, config } from './testSetup' +import * as fs from 'fs' + +async function main() { + const { l1Network, l2Network } = await setupNetworks( + config.ethUrl, + config.arbUrl + ) + + fs.writeFileSync( + './files/local/network.json', + JSON.stringify({ l1Network, l2Network }, null, 2) + ) + console.log('network.json updated') +} + +main().then(() => console.log('Done.')) diff --git a/scripts/rollupCreation.ts b/scripts/rollupCreation.ts index 2c9af885..82e40cb5 100644 --- a/scripts/rollupCreation.ts +++ b/scripts/rollupCreation.ts @@ -2,7 +2,13 @@ import { ethers } from 'hardhat' import '@nomiclabs/hardhat-ethers' import { run } from 'hardhat' import { abi as rollupCreatorAbi } from '../build/contracts/src/rollup/RollupCreator.sol/RollupCreator.json' -import { config } from './config' +import { config, maxDataSize } from './config' +import { BigNumber } from 'ethers' +import { IERC20__factory } from '../build/types' +import { sleep } from './testSetup' + +// 1 gwei +const MAX_FER_PER_GAS = BigNumber.from('1000000000') interface RollupCreatedEvent { event: string @@ -21,7 +27,7 @@ interface RollupCreatedEvent { } } -async function main() { +export async function createRollup(feeToken?: string) { const rollupCreatorAddress = process.env.ROLLUP_CREATOR_ADDRESS if (!rollupCreatorAddress) { @@ -39,24 +45,51 @@ async function main() { const [signer] = await ethers.getSigners() - const rollupCreator = await new ethers.Contract( + const rollupCreator = new ethers.Contract( rollupCreatorAddress, rollupCreatorAbi, signer ) + if (!feeToken) { + feeToken = ethers.constants.AddressZero + } + try { let vals: boolean[] = [] for (let i = 0; i < config.validators.length; i++) { vals.push(true) } + + //// funds for deploying L2 factories + + // 0.13 ETH is enough to deploy L2 factories via retryables. Excess is refunded + let feeCost = ethers.utils.parseEther('0.13') + if (feeToken != ethers.constants.AddressZero) { + // in case fees are paid via fee token, then approve rollup cretor to spend required amount + await ( + await IERC20__factory.connect(feeToken, signer).approve( + rollupCreator.address, + feeCost + ) + ).wait() + feeCost = BigNumber.from(0) + } + // Call the createRollup function console.log('Calling createRollup to generate a new rollup ...') - const createRollupTx = await rollupCreator.createRollup( - config.rollupConfig, - config.batchPoster, - config.validators - ) + const deployParams = { + config: config.rollupConfig, + batchPoster: config.batchPoster, + validators: config.validators, + maxDataSize: maxDataSize, + nativeToken: feeToken, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FER_PER_GAS, + } + const createRollupTx = await rollupCreator.createRollup(deployParams, { + value: feeCost, + }) const createRollupReceipt = await createRollupTx.wait() const rollupCreatedEvent = createRollupReceipt.events?.find( @@ -81,6 +114,8 @@ async function main() { console.log("Congratulations! ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰ All DONE! Here's your addresses:") console.log('RollupProxy Contract created at address:', rollupAddress) + console.log('Wait a minute before starting the contract verification') + await sleep(1 * 60 * 1000) console.log( `Attempting to verify Rollup contract at address ${rollupAddress}...` ) @@ -130,10 +165,3 @@ async function main() { ) } } - -main() - .then(() => process.exit(0)) - .catch((error: Error) => { - console.error(error) - process.exit(1) - }) diff --git a/scripts/testSetup.ts b/scripts/testSetup.ts new file mode 100644 index 00000000..2c11e769 --- /dev/null +++ b/scripts/testSetup.ts @@ -0,0 +1,132 @@ +import { JsonRpcProvider } from '@ethersproject/providers' +import { L1Network, L2Network, addCustomNetwork } from '@arbitrum/sdk' +import { execSync } from 'child_process' +import { Bridge__factory } from '@arbitrum/sdk/dist/lib/abi/factories/Bridge__factory' +import { RollupAdminLogic__factory } from '@arbitrum/sdk/dist/lib/abi/factories/RollupAdminLogic__factory' + +export const config = { + arbUrl: 'http://localhost:8547', + ethUrl: 'http://localhost:8545', +} + +export const getCustomNetworks = async ( + l1Url: string, + l2Url: string +): Promise<{ + l1Network: L1Network + l2Network: Omit & { nativeToken: string } +}> => { + const l1Provider = new JsonRpcProvider(l1Url) + const l2Provider = new JsonRpcProvider(l2Url) + let deploymentData: string + + let sequencerContainer = execSync( + 'docker ps --filter "name=sequencer" --format "{{.Names}}"' + ) + .toString() + .trim() + + deploymentData = execSync( + `docker exec ${sequencerContainer} cat /config/deployment.json` + ).toString() + + const parsedDeploymentData = JSON.parse(deploymentData) as { + bridge: string + inbox: string + ['sequencer-inbox']: string + rollup: string + ['native-erc20-token']: string + } + + const rollup = RollupAdminLogic__factory.connect( + parsedDeploymentData.rollup, + l1Provider + ) + const confirmPeriodBlocks = await rollup.confirmPeriodBlocks() + + const bridge = Bridge__factory.connect( + parsedDeploymentData.bridge, + l1Provider + ) + const outboxAddr = await bridge.allowedOutboxList(0) + + const l1NetworkInfo = await l1Provider.getNetwork() + const l2NetworkInfo = await l2Provider.getNetwork() + + const l1Network: L1Network = { + blockTime: 10, + chainID: l1NetworkInfo.chainId, + explorerUrl: '', + isCustom: true, + name: 'EthLocal', + partnerChainIDs: [l2NetworkInfo.chainId], + isArbitrum: false, + } + + const l2Network: Omit & { nativeToken: string } = { + chainID: l2NetworkInfo.chainId, + confirmPeriodBlocks: confirmPeriodBlocks.toNumber(), + ethBridge: { + bridge: parsedDeploymentData.bridge, + inbox: parsedDeploymentData.inbox, + outbox: outboxAddr, + rollup: parsedDeploymentData.rollup, + sequencerInbox: parsedDeploymentData['sequencer-inbox'], + }, + nativeToken: parsedDeploymentData['native-erc20-token'], + explorerUrl: '', + isArbitrum: true, + isCustom: true, + name: 'ArbLocal', + partnerChainID: l1NetworkInfo.chainId, + retryableLifetimeSeconds: 7 * 24 * 60 * 60, + nitroGenesisBlock: 0, + nitroGenesisL1Block: 0, + depositTimeout: 900000, + } + return { + l1Network, + l2Network, + } +} + +export const setupNetworks = async (l1Url: string, l2Url: string) => { + const { l1Network, l2Network: coreL2Network } = await getCustomNetworks( + l1Url, + l2Url + ) + const l2Network: L2Network & { nativeToken: string } = { + ...coreL2Network, + tokenBridge: { + l1CustomGateway: '', + l1ERC20Gateway: '', + l1GatewayRouter: '', + l1MultiCall: '', + l1ProxyAdmin: '', + l1Weth: '', + l1WethGateway: '', + + l2CustomGateway: '', + l2ERC20Gateway: '', + l2GatewayRouter: '', + l2Multicall: '', + l2ProxyAdmin: '', + l2Weth: '', + l2WethGateway: '', + }, + } + + addCustomNetwork({ + customL1Network: l1Network, + customL2Network: l2Network, + }) + + return { + l1Network, + l2Network, + } +} + +export function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)) +} diff --git a/scripts/upgrade/deploy4844.ts b/scripts/upgrade/deploy4844.ts new file mode 100644 index 00000000..986636e5 --- /dev/null +++ b/scripts/upgrade/deploy4844.ts @@ -0,0 +1,107 @@ +import { ethers } from 'hardhat' +import { ContractFactory, Contract, Overrides } from 'ethers' +import '@nomiclabs/hardhat-ethers' +import { IReader4844__factory } from '../../build/types' +import { bytecode as Reader4844Bytecode } from '../../out/yul/Reader4844.yul/Reader4844.json' +import { deployContract, verifyContract } from '../deploymentUtils' +import { maxDataSize, isUsingFeeToken } from '../config' + +async function main() { + const [signer] = await ethers.getSigners() + const overrides: Overrides = { + maxFeePerGas: ethers.utils.parseUnits('30', 'gwei'), + maxPriorityFeePerGas: ethers.utils.parseUnits('0.001', 'gwei'), + } + + const contractFactory = new ContractFactory( + IReader4844__factory.abi, + Reader4844Bytecode, + signer + ) + const reader4844 = await contractFactory.deploy(overrides) + await reader4844.deployed() + console.log(`Reader4844 deployed at ${reader4844.address}`) + + // skip verification on deployment + const sequencerInbox = await deployContract( + 'SequencerInbox', + signer, + [maxDataSize, reader4844.address, isUsingFeeToken], + false, + overrides + ) + // SequencerInbox logic do not need to be initialized + const prover0 = await deployContract( + 'OneStepProver0', + signer, + [], + false, + overrides + ) + const proverMem = await deployContract( + 'OneStepProverMemory', + signer, + [], + false, + overrides + ) + const proverMath = await deployContract( + 'OneStepProverMath', + signer, + [], + false, + overrides + ) + const proverHostIo = await deployContract( + 'OneStepProverHostIo', + signer, + [], + false, + overrides + ) + const osp: Contract = await deployContract( + 'OneStepProofEntry', + signer, + [ + prover0.address, + proverMem.address, + proverMath.address, + proverHostIo.address, + ], + false, + overrides + ) + const challengeManager = await deployContract( + 'ChallengeManager', + signer, + [], + false, + overrides + ) + // ChallengeManager logic do not need to be initialized + + // verify + await verifyContract('SequencerInbox', sequencerInbox.address, [ + maxDataSize, + reader4844.address, + isUsingFeeToken, + ]) + await verifyContract('OneStepProver0', prover0.address, []) + await verifyContract('OneStepProverMemory', proverMem.address, []) + await verifyContract('OneStepProverMath', proverMath.address, []) + await verifyContract('OneStepProverHostIo', proverHostIo.address, []) + await verifyContract('OneStepProofEntry', osp.address, [ + prover0.address, + proverMem.address, + proverMath.address, + proverHostIo.address, + ]) + await verifyContract('ChallengeManager', challengeManager.address, []) +} + +main() + .then(() => process.exit(0)) + .catch((error: Error) => { + console.error(error) + process.exit(1) + }) diff --git a/slither.config.json b/slither.config.json new file mode 100644 index 00000000..61fe000e --- /dev/null +++ b/slither.config.json @@ -0,0 +1,7 @@ +{ + "exclude_dependencies": true, + "exclude_informational": true, + "exclude_low": true, + "exclude_optimization": true, + "filter_paths": "src/test-helpers/|src/mocks/|node_modules/" +} diff --git a/slither.db.json b/slither.db.json new file mode 100644 index 00000000..ea24c334 --- /dev/null +++ b/slither.db.json @@ -0,0 +1,13099 @@ +[ + { + "elements": [ + { + "type": "function", + "name": "refundsGas", + "source_mapping": { + "start": 721, + "length": 2143, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefundEnabled", + "source_mapping": { + "start": 309, + "length": 2557, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "refundsGas(IGasRefunder,IReader4844)" + } + }, + { + "type": "node", + "name": "calldataWords = (calldataSize + 31) / 32", + "source_mapping": { + "start": 960, + "length": 48, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [22], + "starting_column": 13, + "ending_column": 61 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "refundsGas", + "source_mapping": { + "start": 721, + "length": 2143, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefundEnabled", + "source_mapping": { + "start": 309, + "length": 2557, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "refundsGas(IGasRefunder,IReader4844)" + } + } + } + }, + { + "type": "node", + "name": "startGasLeft += calldataWords * 6 + (calldataWords ** 2) / 512", + "source_mapping": { + "start": 1130, + "length": 60, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [24], + "starting_column": 13, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "refundsGas", + "source_mapping": { + "start": 721, + "length": 2143, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefundEnabled", + "source_mapping": { + "start": 309, + "length": 2557, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "refundsGas(IGasRefunder,IReader4844)" + } + } + } + } + ], + "description": "GasRefundEnabled.refundsGas(IGasRefunder,IReader4844) (src/libraries/GasRefundEnabled.sol#17-51) performs a multiplication on the result of a division:\n\t- calldataWords = (calldataSize + 31) / 32 (src/libraries/GasRefundEnabled.sol#22)\n\t- startGasLeft += calldataWords * 6 + (calldataWords ** 2) / 512 (src/libraries/GasRefundEnabled.sol#24)\n", + "markdown": "[GasRefundEnabled.refundsGas(IGasRefunder,IReader4844)](src/libraries/GasRefundEnabled.sol#L17-L51) performs a multiplication on the result of a division:\n\t- [calldataWords = (calldataSize + 31) / 32](src/libraries/GasRefundEnabled.sol#L22)\n\t- [startGasLeft += calldataWords * 6 + (calldataWords ** 2) / 512](src/libraries/GasRefundEnabled.sol#L24)\n", + "first_markdown_element": "src/libraries/GasRefundEnabled.sol#L17-L51", + "id": "bb26256ad08f6833c6e0395d78c4b8a1182860d966d17803ac727cde7719e8b6", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "node", + "name": "_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas)", + "source_mapping": { + "start": 10207, + "length": 201, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [96, 97, 98, 99, 100, 101, 102, 103], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "perform", + "source_mapping": { + "start": 10012, + "length": 1157, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "perform(address,address,uint256)" + } + } + } + }, + { + "type": "node", + "name": "_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas)", + "source_mapping": { + "start": 10207, + "length": 201, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [96, 97, 98, 99, 100, 101, 102, 103], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "perform", + "source_mapping": { + "start": 10012, + "length": 1157, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "perform(address,address,uint256)" + } + } + } + } + ], + "description": "Multiple retryable tickets created in the same function:\n\t -_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas) (src/rollup/DeployHelper.sol#96-103)\n\t -_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas) (src/rollup/DeployHelper.sol#96-103)\n", + "markdown": "Multiple retryable tickets created in the same function:\n\t -[_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas)](src/rollup/DeployHelper.sol#L96-L103)\n\t -[_fundAndDeploy(_inbox,NICK_CREATE2_VALUE,NICK_CREATE2_DEPLOYER,NICK_CREATE2_PAYLOAD,isUsingFeeToken,_maxFeePerGas)](src/rollup/DeployHelper.sol#L96-L103)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L96-L103", + "id": "5d40acc11dbb925c7e8ac930729d7231aea71007192a71ca36b451cad7a17520", + "check": "out-of-order-retryable", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_executeLowLevelCall", + "source_mapping": { + "start": 1379, + "length": 299, + "filename_relative": "src/bridge/Bridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/Bridge.sol", + "filename_short": "src/bridge/Bridge.sol", + "is_dependency": false, + "lines": [42, 43, 44, 45, 46, 47, 48, 49], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Bridge", + "source_mapping": { + "start": 702, + "length": 1090, + "filename_relative": "src/bridge/Bridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/Bridge.sol", + "filename_short": "src/bridge/Bridge.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_executeLowLevelCall(address,uint256,bytes)" + } + }, + { + "type": "node", + "name": "(success,returnData) = to.call{value: value}(data)", + "source_mapping": { + "start": 1620, + "length": 51, + "filename_relative": "src/bridge/Bridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/Bridge.sol", + "filename_short": "src/bridge/Bridge.sol", + "is_dependency": false, + "lines": [48], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_executeLowLevelCall", + "source_mapping": { + "start": 1379, + "length": 299, + "filename_relative": "src/bridge/Bridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/Bridge.sol", + "filename_short": "src/bridge/Bridge.sol", + "is_dependency": false, + "lines": [42, 43, 44, 45, 46, 47, 48, 49], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Bridge", + "source_mapping": { + "start": 702, + "length": 1090, + "filename_relative": "src/bridge/Bridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/Bridge.sol", + "filename_short": "src/bridge/Bridge.sol", + "is_dependency": false, + "lines": [ + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_executeLowLevelCall(address,uint256,bytes)" + } + } + } + } + ], + "description": "Bridge._executeLowLevelCall(address,uint256,bytes) (src/bridge/Bridge.sol#42-49) sends eth to arbitrary user\n\tDangerous calls:\n\t- (success,returnData) = to.call{value: value}(data) (src/bridge/Bridge.sol#48)\n", + "markdown": "[Bridge._executeLowLevelCall(address,uint256,bytes)](src/bridge/Bridge.sol#L42-L49) sends eth to arbitrary user\n\tDangerous calls:\n\t- [(success,returnData) = to.call{value: value}(data)](src/bridge/Bridge.sol#L48)\n", + "first_markdown_element": "src/bridge/Bridge.sol#L42-L49", + "id": "52aa149e251bcbda3478032a3845253462c6d80e50cde35746a072dd6dd226a6", + "check": "arbitrary-send-eth", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + }, + { + "type": "node", + "name": "IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:})", + "source_mapping": { + "start": 9483, + "length": 399, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83], + "starting_column": 13, + "ending_column": 15 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + } + } + } + ], + "description": "DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256) (src/rollup/DeployHelper.sol#46-87) sends eth to arbitrary user\n\tDangerous calls:\n\t- IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:}) (src/rollup/DeployHelper.sol#74-83)\n", + "markdown": "[DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256)](src/rollup/DeployHelper.sol#L46-L87) sends eth to arbitrary user\n\tDangerous calls:\n\t- [IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:})](src/rollup/DeployHelper.sol#L74-L83)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L46-L87", + "id": "e0479a62ad4830e7fe86da8c84b5e23beb3117b4fad5a10981cccab1ed4d7fef", + "check": "arbitrary-send-eth", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "perform", + "source_mapping": { + "start": 10012, + "length": 1157, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "perform(address,address,uint256)" + } + }, + { + "type": "node", + "name": "address(msg.sender).transfer(address(this).balance)", + "source_mapping": { + "start": 11101, + "length": 51, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [131], + "starting_column": 13, + "ending_column": 64 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "perform", + "source_mapping": { + "start": 10012, + "length": 1157, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "perform(address,address,uint256)" + } + } + } + } + ], + "description": "DeployHelper.perform(address,address,uint256) (src/rollup/DeployHelper.sol#89-133) sends eth to arbitrary user\n\tDangerous calls:\n\t- address(msg.sender).transfer(address(this).balance) (src/rollup/DeployHelper.sol#131)\n", + "markdown": "[DeployHelper.perform(address,address,uint256)](src/rollup/DeployHelper.sol#L89-L133) sends eth to arbitrary user\n\tDangerous calls:\n\t- [address(msg.sender).transfer(address(this).balance)](src/rollup/DeployHelper.sol#L131)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L89-L133", + "id": "9ffb800c52b7ebc92a4117369762770d49beb52d8f7f0c4c53742745d88e75c4", + "check": "arbitrary-send-eth", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_deployFactories", + "source_mapping": { + "start": 10566, + "length": 1163, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_deployFactories(address,address,uint256)" + } + }, + { + "type": "node", + "name": "l2FactoriesDeployer.perform{value: cost}(_inbox,_nativeToken,_maxFeePerGas)", + "source_mapping": { + "start": 10973, + "length": 77, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [268], + "starting_column": 13, + "ending_column": 90 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_deployFactories", + "source_mapping": { + "start": 10566, + "length": 1163, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_deployFactories(address,address,uint256)" + } + } + } + }, + { + "type": "node", + "name": "(sent) = msg.sender.call{value: address(this).balance}()", + "source_mapping": { + "start": 11161, + "length": 65, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [272], + "starting_column": 13, + "ending_column": 78 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_deployFactories", + "source_mapping": { + "start": 10566, + "length": 1163, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_deployFactories(address,address,uint256)" + } + } + } + } + ], + "description": "RollupCreator._deployFactories(address,address,uint256) (src/rollup/RollupCreator.sol#255-285) sends eth to arbitrary user\n\tDangerous calls:\n\t- l2FactoriesDeployer.perform{value: cost}(_inbox,_nativeToken,_maxFeePerGas) (src/rollup/RollupCreator.sol#268)\n\t- (sent) = msg.sender.call{value: address(this).balance}() (src/rollup/RollupCreator.sol#272)\n", + "markdown": "[RollupCreator._deployFactories(address,address,uint256)](src/rollup/RollupCreator.sol#L255-L285) sends eth to arbitrary user\n\tDangerous calls:\n\t- [l2FactoriesDeployer.perform{value: cost}(_inbox,_nativeToken,_maxFeePerGas)](src/rollup/RollupCreator.sol#L268)\n\t- [(sent) = msg.sender.call{value: address(this).balance}()](src/rollup/RollupCreator.sol#L272)\n", + "first_markdown_element": "src/rollup/RollupCreator.sol#L255-L285", + "id": "76dc4e58fa8c5850af786b5521aa4b4047660ca4b5cfdc3ec6d2b34a27bf414d", + "check": "arbitrary-send-eth", + "impact": "High", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "calculateRoot", + "source_mapping": { + "start": 987, + "length": 872, + "filename_relative": "src/libraries/MerkleLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/MerkleLib.sol", + "filename_short": "src/libraries/MerkleLib.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "MerkleLib", + "source_mapping": { + "start": 254, + "length": 1607, + "filename_relative": "src/libraries/MerkleLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/MerkleLib.sol", + "filename_short": "src/libraries/MerkleLib.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "calculateRoot(bytes32[],uint256,bytes32)" + } + }, + { + "type": "node", + "name": "(route & (1 << i)) == 0", + "source_mapping": { + "start": 1371, + "length": 23, + "filename_relative": "src/libraries/MerkleLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/MerkleLib.sol", + "filename_short": "src/libraries/MerkleLib.sol", + "is_dependency": false, + "lines": [38], + "starting_column": 17, + "ending_column": 40 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "calculateRoot", + "source_mapping": { + "start": 987, + "length": 872, + "filename_relative": "src/libraries/MerkleLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/MerkleLib.sol", + "filename_short": "src/libraries/MerkleLib.sol", + "is_dependency": false, + "lines": [ + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "MerkleLib", + "source_mapping": { + "start": 254, + "length": 1607, + "filename_relative": "src/libraries/MerkleLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/MerkleLib.sol", + "filename_short": "src/libraries/MerkleLib.sol", + "is_dependency": false, + "lines": [ + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "calculateRoot(bytes32[],uint256,bytes32)" + } + } + } + } + ], + "description": "MerkleLib.calculateRoot(bytes32[],uint256,bytes32) (src/libraries/MerkleLib.sol#28-56) contains an incorrect shift operation: (route & (1 << i)) == 0 (src/libraries/MerkleLib.sol#38)\n", + "markdown": "[MerkleLib.calculateRoot(bytes32[],uint256,bytes32)](src/libraries/MerkleLib.sol#L28-L56) contains an incorrect shift operation: [(route & (1 << i)) == 0](src/libraries/MerkleLib.sol#L38)\n", + "first_markdown_element": "src/libraries/MerkleLib.sol#L28-L56", + "id": "5c3db261bcf096a853ed1cbf065868696b577e437b35616c25ee3da2af6bc0d7", + "check": "incorrect-shift", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "confirmPeriodBlocks", + "source_mapping": { + "start": 848, + "length": 33, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [30], + "starting_column": 5, + "ending_column": 38 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "_validatorIsAfk", + "source_mapping": { + "start": 1426, + "length": 349, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_validatorIsAfk()" + } + }, + { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + }, + { + "type": "function", + "name": "addStaker", + "source_mapping": { + "start": 16226, + "length": 666, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "addStaker(uint64,address)" + } + }, + { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + ], + "description": "RollupCore.confirmPeriodBlocks (src/rollup/RollupCore.sol#30) is never initialized. It is used in:\n\t- AbsRollupUserLogic._validatorIsAfk() (src/rollup/RollupUserLogic.sol#47-54)\n\t- AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256) (src/rollup/RollupUserLogic.sol#477-523)\n\t- RollupCore.addStaker(uint64,address) (src/rollup/RollupCore.sol#449-465)\n\t- RollupCore.createNewNode(Assertion,uint64,uint256,bytes32) (src/rollup/RollupCore.sol#563-677)\n", + "markdown": "[RollupCore.confirmPeriodBlocks](src/rollup/RollupCore.sol#L30) is never initialized. It is used in:\n\t- [AbsRollupUserLogic._validatorIsAfk()](src/rollup/RollupUserLogic.sol#L47-L54)\n\t- [AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256)](src/rollup/RollupUserLogic.sol#L477-L523)\n\t- [RollupCore.addStaker(uint64,address)](src/rollup/RollupCore.sol#L449-L465)\n\t- [RollupCore.createNewNode(Assertion,uint64,uint256,bytes32)](src/rollup/RollupCore.sol#L563-L677)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L30", + "id": "a4b24bce5aba1839e99647d1a79bb6ee736796ffa0b26da1ff6de3bf0cad25a2", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "extraChallengeTimeBlocks", + "source_mapping": { + "start": 887, + "length": 38, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [31], + "starting_column": 5, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "createChallenge", + "source_mapping": { + "start": 12264, + "length": 3131, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])" + } + } + ], + "description": "RollupCore.extraChallengeTimeBlocks (src/rollup/RollupCore.sol#31) is never initialized. It is used in:\n\t- AbsRollupUserLogic.createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2]) (src/rollup/RollupUserLogic.sol#291-364)\n", + "markdown": "[RollupCore.extraChallengeTimeBlocks](src/rollup/RollupCore.sol#L31) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])](src/rollup/RollupUserLogic.sol#L291-L364)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L31", + "id": "da3953abca5cd200b13fe48850b6aa7652681e329be2738fada97e811ccf823c", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "baseStake", + "source_mapping": { + "start": 959, + "length": 24, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [33], + "starting_column": 5, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + } + ], + "description": "RollupCore.baseStake (src/rollup/RollupCore.sol#33) is never initialized. It is used in:\n\t- AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256) (src/rollup/RollupUserLogic.sol#477-523)\n", + "markdown": "[RollupCore.baseStake](src/rollup/RollupCore.sol#L33) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256)](src/rollup/RollupUserLogic.sol#L477-L523)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L33", + "id": "e38524abb8244a635c7bb2fbd1c2e3be4f6f4c45b66589d5c431018eaec19736", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "wasmModuleRoot", + "source_mapping": { + "start": 989, + "length": 29, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [34], + "starting_column": 5, + "ending_column": 34 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + ], + "description": "RollupCore.wasmModuleRoot (src/rollup/RollupCore.sol#34) is never initialized. It is used in:\n\t- RollupCore.createNewNode(Assertion,uint64,uint256,bytes32) (src/rollup/RollupCore.sol#563-677)\n", + "markdown": "[RollupCore.wasmModuleRoot](src/rollup/RollupCore.sol#L34) is never initialized. It is used in:\n\t- [RollupCore.createNewNode(Assertion,uint64,uint256,bytes32)](src/rollup/RollupCore.sol#L563-L677)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L34", + "id": "ba1b0a9663907f65e34f85d9522781abdfd536250f5ca9c3ce00e5d5fd99e0e5", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "bridge", + "source_mapping": { + "start": 1054, + "length": 21, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [37], + "starting_column": 5, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + ], + "description": "RollupCore.bridge (src/rollup/RollupCore.sol#37) is never initialized. It is used in:\n\t- RollupCore.createNewNode(Assertion,uint64,uint256,bytes32) (src/rollup/RollupCore.sol#563-677)\n", + "markdown": "[RollupCore.bridge](src/rollup/RollupCore.sol#L37) is never initialized. It is used in:\n\t- [RollupCore.createNewNode(Assertion,uint64,uint256,bytes32)](src/rollup/RollupCore.sol#L563-L677)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L37", + "id": "083aba2c7a6498e3f6b62bd57041243e85867ce1e7deb7e73af230c8a3fda57c", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "outbox", + "source_mapping": { + "start": 1081, + "length": 21, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [38], + "starting_column": 5, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "confirmNode", + "source_mapping": { + "start": 10760, + "length": 573, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "confirmNode(uint64,bytes32,bytes32)" + } + } + ], + "description": "RollupCore.outbox (src/rollup/RollupCore.sol#38) is never initialized. It is used in:\n\t- RollupCore.confirmNode(uint64,bytes32,bytes32) (src/rollup/RollupCore.sol#306-322)\n", + "markdown": "[RollupCore.outbox](src/rollup/RollupCore.sol#L38) is never initialized. It is used in:\n\t- [RollupCore.confirmNode(uint64,bytes32,bytes32)](src/rollup/RollupCore.sol#L306-L322)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L38", + "id": "0e386868f4529a31d9469b3b0f8148977860a53590d8f94171666883bbbe4c3d", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "challengeManager", + "source_mapping": { + "start": 1198, + "length": 50, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [41], + "starting_column": 5, + "ending_column": 55 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "createChallengeHelper", + "source_mapping": { + "start": 15401, + "length": 672, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallengeHelper(address[2],MachineStatus[2],GlobalState[2],uint64,bytes32[2],uint256,uint256)" + } + }, + { + "type": "function", + "name": "completeChallenge", + "source_mapping": { + "start": 16300, + "length": 484, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [393, 394, 395, 396, 397, 398, 399, 400, 401, 402], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "completeChallenge(uint256,address,address)" + } + } + ], + "description": "RollupCore.challengeManager (src/rollup/RollupCore.sol#41) is never initialized. It is used in:\n\t- AbsRollupUserLogic.createChallengeHelper(address[2],MachineStatus[2],GlobalState[2],uint64,bytes32[2],uint256,uint256) (src/rollup/RollupUserLogic.sol#366-386)\n\t- AbsRollupUserLogic.completeChallenge(uint256,address,address) (src/rollup/RollupUserLogic.sol#393-402)\n", + "markdown": "[RollupCore.challengeManager](src/rollup/RollupCore.sol#L41) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.createChallengeHelper(address[2],MachineStatus[2],GlobalState[2],uint64,bytes32[2],uint256,uint256)](src/rollup/RollupUserLogic.sol#L366-L386)\n\t- [AbsRollupUserLogic.completeChallenge(uint256,address,address)](src/rollup/RollupUserLogic.sol#L393-L402)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L41", + "id": "22c612a6037a18832e2adecba9cb92ae47a8af1b6ad06cd807e2930e95704f7f", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "loserStakeEscrow", + "source_mapping": { + "start": 1485, + "length": 31, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [48], + "starting_column": 5, + "ending_column": 36 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "completeChallengeImpl", + "source_mapping": { + "start": 16790, + "length": 1104, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "completeChallengeImpl(address,address)" + } + } + ], + "description": "RollupCore.loserStakeEscrow (src/rollup/RollupCore.sol#48) is never initialized. It is used in:\n\t- AbsRollupUserLogic.completeChallengeImpl(address,address) (src/rollup/RollupUserLogic.sol#404-423)\n", + "markdown": "[RollupCore.loserStakeEscrow](src/rollup/RollupCore.sol#L48) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.completeChallengeImpl(address,address)](src/rollup/RollupUserLogic.sol#L404-L423)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L48", + "id": "c7bcdadad2017983801efa1f09090e62d03f763f4327a3ff8eae213d33849120", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "stakeToken", + "source_mapping": { + "start": 1522, + "length": 25, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [49], + "starting_column": 5, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "isERC20Enabled", + "source_mapping": { + "start": 2244, + "length": 110, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [68, 69, 70], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "isERC20Enabled()" + } + } + ], + "description": "RollupCore.stakeToken (src/rollup/RollupCore.sol#49) is never initialized. It is used in:\n\t- AbsRollupUserLogic.isERC20Enabled() (src/rollup/RollupUserLogic.sol#68-70)\n", + "markdown": "[RollupCore.stakeToken](src/rollup/RollupCore.sol#L49) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.isERC20Enabled()](src/rollup/RollupUserLogic.sol#L68-L70)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L49", + "id": "762ea8af9375f2dee07c120ca7a44b367b72fbd357f74ed8397e8540a17d87b6", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "minimumAssertionPeriod", + "source_mapping": { + "start": 1553, + "length": 37, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [50], + "starting_column": 5, + "ending_column": 42 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "stakeOnNewNode", + "source_mapping": { + "start": 7704, + "length": 1684, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "stakeOnNewNode(Assertion,bytes32,uint256)" + } + } + ], + "description": "RollupCore.minimumAssertionPeriod (src/rollup/RollupCore.sol#50) is never initialized. It is used in:\n\t- AbsRollupUserLogic.stakeOnNewNode(Assertion,bytes32,uint256) (src/rollup/RollupUserLogic.sol#198-233)\n", + "markdown": "[RollupCore.minimumAssertionPeriod](src/rollup/RollupCore.sol#L50) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.stakeOnNewNode(Assertion,bytes32,uint256)](src/rollup/RollupUserLogic.sol#L198-L233)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L50", + "id": "01fe9c1889403593f4723665fd7724b4e31b63dd3689c5816cb6d147d16dbf42", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "isValidator", + "source_mapping": { + "start": 1597, + "length": 43, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [52], + "starting_column": 5, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + } + ], + "description": "RollupCore.isValidator (src/rollup/RollupCore.sol#52) is never initialized. It is used in:\n", + "markdown": "[RollupCore.isValidator](src/rollup/RollupCore.sol#L52) is never initialized. It is used in:\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L52", + "id": "f316200e22d3febd4d78fe211de5d864b1b65169f67e03191ea884e8b60055ae", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "stakeToken", + "source_mapping": { + "start": 1522, + "length": 25, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [49], + "starting_column": 5, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "function", + "name": "isERC20Enabled", + "source_mapping": { + "start": 2244, + "length": 110, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [68, 69, 70], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "isERC20Enabled()" + } + }, + { + "type": "function", + "name": "withdrawStakerFunds", + "source_mapping": { + "start": 30568, + "length": 400, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20RollupUserLogic", + "source_mapping": { + "start": 28020, + "length": 3167, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, + 766, 767, 768, 769 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "withdrawStakerFunds()" + } + }, + { + "type": "function", + "name": "receiveTokens", + "source_mapping": { + "start": 30974, + "length": 211, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [763, 764, 765, 766, 767, 768], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20RollupUserLogic", + "source_mapping": { + "start": 28020, + "length": 3167, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, + 766, 767, 768, 769 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "receiveTokens(uint256)" + } + } + ], + "description": "RollupCore.stakeToken (src/rollup/RollupCore.sol#49) is never initialized. It is used in:\n\t- AbsRollupUserLogic.isERC20Enabled() (src/rollup/RollupUserLogic.sol#68-70)\n\t- ERC20RollupUserLogic.withdrawStakerFunds() (src/rollup/RollupUserLogic.sol#750-761)\n\t- ERC20RollupUserLogic.receiveTokens(uint256) (src/rollup/RollupUserLogic.sol#763-768)\n", + "markdown": "[RollupCore.stakeToken](src/rollup/RollupCore.sol#L49) is never initialized. It is used in:\n\t- [AbsRollupUserLogic.isERC20Enabled()](src/rollup/RollupUserLogic.sol#L68-L70)\n\t- [ERC20RollupUserLogic.withdrawStakerFunds()](src/rollup/RollupUserLogic.sol#L750-L761)\n\t- [ERC20RollupUserLogic.receiveTokens(uint256)](src/rollup/RollupUserLogic.sol#L763-L768)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L49", + "id": "388304453678fb7cb187225ae4a8eef1f46c80d072185688bad31640b221fb6d", + "check": "uninitialized-state", + "impact": "High", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "extractChallengeSegment", + "source_mapping": { + "start": 3040, + "length": 682, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ChallengeLib", + "source_mapping": { + "start": 272, + "length": 4325, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "extractChallengeSegment(ChallengeLib.SegmentSelection)" + } + }, + { + "type": "node", + "name": "segmentLength = selection.oldSegmentsLength / oldChallengeDegree", + "source_mapping": { + "start": 3287, + "length": 64, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [102], + "starting_column": 9, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "extractChallengeSegment", + "source_mapping": { + "start": 3040, + "length": 682, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ChallengeLib", + "source_mapping": { + "start": 272, + "length": 4325, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "extractChallengeSegment(ChallengeLib.SegmentSelection)" + } + } + } + }, + { + "type": "node", + "name": "segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition", + "source_mapping": { + "start": 3460, + "length": 87, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [104], + "starting_column": 9, + "ending_column": 96 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "extractChallengeSegment", + "source_mapping": { + "start": 3040, + "length": 682, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ChallengeLib", + "source_mapping": { + "start": 272, + "length": 4325, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "extractChallengeSegment(ChallengeLib.SegmentSelection)" + } + } + } + } + ], + "description": "ChallengeLib.extractChallengeSegment(ChallengeLib.SegmentSelection) (src/challenge/ChallengeLib.sol#96-108) performs a multiplication on the result of a division:\n\t- segmentLength = selection.oldSegmentsLength / oldChallengeDegree (src/challenge/ChallengeLib.sol#102)\n\t- segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition (src/challenge/ChallengeLib.sol#104)\n", + "markdown": "[ChallengeLib.extractChallengeSegment(ChallengeLib.SegmentSelection)](src/challenge/ChallengeLib.sol#L96-L108) performs a multiplication on the result of a division:\n\t- [segmentLength = selection.oldSegmentsLength / oldChallengeDegree](src/challenge/ChallengeLib.sol#L102)\n\t- [segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition](src/challenge/ChallengeLib.sol#L104)\n", + "first_markdown_element": "src/challenge/ChallengeLib.sol#L96-L108", + "id": "e1c80d5388c10fc3c7985b252a3988308fb524570c5772733ff6da1f68ae3665", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "executeReadPreImage", + "source_mapping": { + "start": 4302, + "length": 5772, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes)" + } + }, + { + "type": "node", + "name": "rootOfUnityPower = (1 << 32) / fieldElementsPerBlob", + "source_mapping": { + "start": 9080, + "length": 59, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [224], + "starting_column": 17, + "ending_column": 76 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeReadPreImage", + "source_mapping": { + "start": 4302, + "length": 5772, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + }, + { + "type": "node", + "name": "rootOfUnityPower *= bitReversedIndex", + "source_mapping": { + "start": 9307, + "length": 36, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [227], + "starting_column": 17, + "ending_column": 53 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeReadPreImage", + "source_mapping": { + "start": 4302, + "length": 5772, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes) (src/osp/OneStepProverHostIo.sol#123-245) performs a multiplication on the result of a division:\n\t- rootOfUnityPower = (1 << 32) / fieldElementsPerBlob (src/osp/OneStepProverHostIo.sol#224)\n\t- rootOfUnityPower *= bitReversedIndex (src/osp/OneStepProverHostIo.sol#227)\n", + "markdown": "[OneStepProverHostIo.executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes)](src/osp/OneStepProverHostIo.sol#L123-L245) performs a multiplication on the result of a division:\n\t- [rootOfUnityPower = (1 << 32) / fieldElementsPerBlob](src/osp/OneStepProverHostIo.sol#L224)\n\t- [rootOfUnityPower *= bitReversedIndex](src/osp/OneStepProverHostIo.sol#L227)\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L123-L245", + "id": "544b092c0dd6ff4838cb1cbaa7af3a7e9ba4011548b519524ea1c0f49488ba8a", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + }, + { + "type": "node", + "name": "multiplier = withNumerator / denominators[periodsPassed % 10]", + "source_mapping": { + "start": 21553, + "length": 69, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [518], + "starting_column": 9, + "ending_column": 78 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + } + } + }, + { + "type": "node", + "name": "baseStake * multiplier", + "source_mapping": { + "start": 21701, + "length": 29, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [522], + "starting_column": 9, + "ending_column": 38 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + } + } + } + ], + "description": "AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256) (src/rollup/RollupUserLogic.sol#477-523) performs a multiplication on the result of a division:\n\t- multiplier = withNumerator / denominators[periodsPassed % 10] (src/rollup/RollupUserLogic.sol#518)\n\t- baseStake * multiplier (src/rollup/RollupUserLogic.sol#522)\n", + "markdown": "[AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256)](src/rollup/RollupUserLogic.sol#L477-L523) performs a multiplication on the result of a division:\n\t- [multiplier = withNumerator / denominators[periodsPassed % 10]](src/rollup/RollupUserLogic.sol#L518)\n\t- [baseStake * multiplier](src/rollup/RollupUserLogic.sol#L522)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L477-L523", + "id": "d8acf03a6b7c6bb0b8a091fbcc3c5657b15d7180c1edc798c1b2b66b27895d5d", + "check": "divide-before-multiply", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "onGasSpent", + "source_mapping": { + "start": 5994, + "length": 3002, + "filename_relative": "src/bridge/GasRefunder.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/GasRefunder.sol", + "filename_short": "src/bridge/GasRefunder.sol", + "is_dependency": false, + "lines": [ + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefunder", + "source_mapping": { + "start": 916, + "length": 8082, + "filename_relative": "src/bridge/GasRefunder.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/GasRefunder.sol", + "filename_short": "src/bridge/GasRefunder.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "onGasSpent(address,uint256,uint256)" + } + }, + { + "type": "node", + "name": "ownBalance == 0", + "source_mapping": { + "start": 6260, + "length": 15, + "filename_relative": "src/bridge/GasRefunder.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/GasRefunder.sol", + "filename_short": "src/bridge/GasRefunder.sol", + "is_dependency": false, + "lines": [183], + "starting_column": 13, + "ending_column": 28 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "onGasSpent", + "source_mapping": { + "start": 5994, + "length": 3002, + "filename_relative": "src/bridge/GasRefunder.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/GasRefunder.sol", + "filename_short": "src/bridge/GasRefunder.sol", + "is_dependency": false, + "lines": [ + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefunder", + "source_mapping": { + "start": 916, + "length": 8082, + "filename_relative": "src/bridge/GasRefunder.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/GasRefunder.sol", + "filename_short": "src/bridge/GasRefunder.sol", + "is_dependency": false, + "lines": [ + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "onGasSpent(address,uint256,uint256)" + } + } + } + } + ], + "description": "GasRefunder.onGasSpent(address,uint256,uint256) (src/bridge/GasRefunder.sol#174-256) uses a dangerous strict equality:\n\t- ownBalance == 0 (src/bridge/GasRefunder.sol#183)\n", + "markdown": "[GasRefunder.onGasSpent(address,uint256,uint256)](src/bridge/GasRefunder.sol#L174-L256) uses a dangerous strict equality:\n\t- [ownBalance == 0](src/bridge/GasRefunder.sol#L183)\n", + "first_markdown_element": "src/bridge/GasRefunder.sol#L174-L256", + "id": "7130559f3bef7fa36dc1a06a74ba5036fede4a8f9a9b7aa15356ff38ae92691a", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "getKeysetCreationBlock", + "source_mapping": { + "start": 30911, + "length": 262, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [800, 801, 802, 803, 804], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "getKeysetCreationBlock(bytes32)" + } + }, + { + "type": "node", + "name": "ksInfo.creationBlock == 0", + "source_mapping": { + "start": 31066, + "length": 25, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [802], + "starting_column": 13, + "ending_column": 38 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "getKeysetCreationBlock", + "source_mapping": { + "start": 30911, + "length": 262, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [800, 801, 802, 803, 804], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "getKeysetCreationBlock(bytes32)" + } + } + } + } + ], + "description": "SequencerInbox.getKeysetCreationBlock(bytes32) (src/bridge/SequencerInbox.sol#800-804) uses a dangerous strict equality:\n\t- ksInfo.creationBlock == 0 (src/bridge/SequencerInbox.sol#802)\n", + "markdown": "[SequencerInbox.getKeysetCreationBlock(bytes32)](src/bridge/SequencerInbox.sol#L800-L804) uses a dangerous strict equality:\n\t- [ksInfo.creationBlock == 0](src/bridge/SequencerInbox.sol#L802)\n", + "first_markdown_element": "src/bridge/SequencerInbox.sol#L800-L804", + "id": "8d08f988c853ddc93c73c73c2ffb4eab98ae44f427249e22931a28dd9e0d9616", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + }, + { + "type": "node", + "name": "require(bool,string)(RollupLib.stateHash(assertion.beforeState,prevNodeInboxMaxCount) == memoryFrame.prevNode.stateHash,PREV_STATE_HASH)", + "source_mapping": { + "start": 21393, + "length": 193, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [582, 583, 584, 585, 586], + "starting_column": 13, + "ending_column": 14 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + } + } + ], + "description": "RollupCore.createNewNode(Assertion,uint64,uint256,bytes32) (src/rollup/RollupCore.sol#563-677) uses a dangerous strict equality:\n\t- require(bool,string)(RollupLib.stateHash(assertion.beforeState,prevNodeInboxMaxCount) == memoryFrame.prevNode.stateHash,PREV_STATE_HASH) (src/rollup/RollupCore.sol#582-586)\n", + "markdown": "[RollupCore.createNewNode(Assertion,uint64,uint256,bytes32)](src/rollup/RollupCore.sol#L563-L677) uses a dangerous strict equality:\n\t- [require(bool,string)(RollupLib.stateHash(assertion.beforeState,prevNodeInboxMaxCount) == memoryFrame.prevNode.stateHash,PREV_STATE_HASH)](src/rollup/RollupCore.sol#L582-L586)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L563-L677", + "id": "d127dddc177369c36ad1c5bef7eb43c1a61fc683b55406bc72a59dc5596e864b", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + }, + { + "type": "node", + "name": "require(bool,string)(newNodeHash == expectedNodeHash || expectedNodeHash == bytes32(0),UNEXPECTED_NODE_HASH)", + "source_mapping": { + "start": 23847, + "length": 144, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [635, 636, 637, 638], + "starting_column": 13, + "ending_column": 14 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + } + } + ], + "description": "RollupCore.createNewNode(Assertion,uint64,uint256,bytes32) (src/rollup/RollupCore.sol#563-677) uses a dangerous strict equality:\n\t- require(bool,string)(newNodeHash == expectedNodeHash || expectedNodeHash == bytes32(0),UNEXPECTED_NODE_HASH) (src/rollup/RollupCore.sol#635-638)\n", + "markdown": "[RollupCore.createNewNode(Assertion,uint64,uint256,bytes32)](src/rollup/RollupCore.sol#L563-L677) uses a dangerous strict equality:\n\t- [require(bool,string)(newNodeHash == expectedNodeHash || expectedNodeHash == bytes32(0),UNEXPECTED_NODE_HASH)](src/rollup/RollupCore.sol#L635-L638)\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L563-L677", + "id": "dfac2423a21baf2a37b1dd8b95efc0128475cfb15a4f40d0cc542e69ff413c79", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "_validatorIsAfk", + "source_mapping": { + "start": 1426, + "length": 349, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_validatorIsAfk()" + } + }, + { + "type": "node", + "name": "latestNode.createdAtBlock == 0", + "source_mapping": { + "start": 1566, + "length": 30, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [49], + "starting_column": 13, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_validatorIsAfk", + "source_mapping": { + "start": 1426, + "length": 349, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [47, 48, 49, 50, 51, 52, 53, 54], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_validatorIsAfk()" + } + } + } + } + ], + "description": "AbsRollupUserLogic._validatorIsAfk() (src/rollup/RollupUserLogic.sol#47-54) uses a dangerous strict equality:\n\t- latestNode.createdAtBlock == 0 (src/rollup/RollupUserLogic.sol#49)\n", + "markdown": "[AbsRollupUserLogic._validatorIsAfk()](src/rollup/RollupUserLogic.sol#L47-L54) uses a dangerous strict equality:\n\t- [latestNode.createdAtBlock == 0](src/rollup/RollupUserLogic.sol#L49)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L47-L54", + "id": "27da8dd2563854302dbb23b92013f4ff6bae23b8f09a7843b7bd073905bc04e7", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + }, + { + "type": "node", + "name": "multiplier == 0", + "source_mapping": { + "start": 21636, + "length": 15, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [519], + "starting_column": 13, + "ending_column": 28 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "currentRequiredStake", + "source_mapping": { + "start": 20210, + "length": 1527, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "currentRequiredStake(uint256,uint64,uint256)" + } + } + } + } + ], + "description": "AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256) (src/rollup/RollupUserLogic.sol#477-523) uses a dangerous strict equality:\n\t- multiplier == 0 (src/rollup/RollupUserLogic.sol#519)\n", + "markdown": "[AbsRollupUserLogic.currentRequiredStake(uint256,uint64,uint256)](src/rollup/RollupUserLogic.sol#L477-L523) uses a dangerous strict equality:\n\t- [multiplier == 0](src/rollup/RollupUserLogic.sol#L519)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L477-L523", + "id": "46c10604345612b1526f352cacc87cc039daedff5beba654f8f07a5fdc228a45", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "requireUnchallengedStaker", + "source_mapping": { + "start": 25419, + "length": 212, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [616, 617, 618, 619], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "requireUnchallengedStaker(address)" + } + }, + { + "type": "node", + "name": "require(bool,string)(currentChallenge(stakerAddress) == NO_CHAL_INDEX,IN_CHAL)", + "source_mapping": { + "start": 25556, + "length": 68, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [618], + "starting_column": 9, + "ending_column": 77 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "requireUnchallengedStaker", + "source_mapping": { + "start": 25419, + "length": 212, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [616, 617, 618, 619], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "requireUnchallengedStaker(address)" + } + } + } + } + ], + "description": "AbsRollupUserLogic.requireUnchallengedStaker(address) (src/rollup/RollupUserLogic.sol#616-619) uses a dangerous strict equality:\n\t- require(bool,string)(currentChallenge(stakerAddress) == NO_CHAL_INDEX,IN_CHAL) (src/rollup/RollupUserLogic.sol#618)\n", + "markdown": "[AbsRollupUserLogic.requireUnchallengedStaker(address)](src/rollup/RollupUserLogic.sol#L616-L619) uses a dangerous strict equality:\n\t- [require(bool,string)(currentChallenge(stakerAddress) == NO_CHAL_INDEX,IN_CHAL)](src/rollup/RollupUserLogic.sol#L618)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L616-L619", + "id": "1e95eacfdcf4026b8e9c94f14922ed3f0a0ec1b366b7d354316a8dbcdb09add8", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "stakeOnExistingNode", + "source_mapping": { + "start": 6908, + "length": 583, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "stakeOnExistingNode(uint64,bytes32)" + } + }, + { + "type": "node", + "name": "require(bool,string)(latestStakedNode(msg.sender) == node.prevNum,NOT_STAKED_PREV)", + "source_mapping": { + "start": 7370, + "length": 72, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [189], + "starting_column": 9, + "ending_column": 81 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "stakeOnExistingNode", + "source_mapping": { + "start": 6908, + "length": 583, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "stakeOnExistingNode(uint64,bytes32)" + } + } + } + } + ], + "description": "AbsRollupUserLogic.stakeOnExistingNode(uint64,bytes32) (src/rollup/RollupUserLogic.sol#176-191) uses a dangerous strict equality:\n\t- require(bool,string)(latestStakedNode(msg.sender) == node.prevNum,NOT_STAKED_PREV) (src/rollup/RollupUserLogic.sol#189)\n", + "markdown": "[AbsRollupUserLogic.stakeOnExistingNode(uint64,bytes32)](src/rollup/RollupUserLogic.sol#L176-L191) uses a dangerous strict equality:\n\t- [require(bool,string)(latestStakedNode(msg.sender) == node.prevNum,NOT_STAKED_PREV)](src/rollup/RollupUserLogic.sol#L189)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L176-L191", + "id": "4507b4ce50a7c39ed1ba1cdbee0a87e257d071a80d56ccf457734f2c8f166b64", + "check": "incorrect-equality", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "function", + "name": "addSequencerL2BatchImpl", + "source_mapping": { + "start": 26211, + "length": 1103, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, + 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, + 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, + 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256)" + } + }, + { + "type": "node", + "name": "(seqMessageIndex,beforeAcc,delayedAcc,acc) = bridge.enqueueSequencerMessage(dataHash,afterDelayedMessagesRead,prevMessageCount,newMessageCount)", + "source_mapping": { + "start": 26792, + "length": 207, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [692, 693, 694, 695, 696, 697], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "addSequencerL2BatchImpl", + "source_mapping": { + "start": 26211, + "length": 1103, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "totalDelayedMessagesRead = afterDelayedMessagesRead", + "source_mapping": { + "start": 27010, + "length": 51, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [699], + "starting_column": 9, + "ending_column": 60 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "addSequencerL2BatchImpl", + "source_mapping": { + "start": 26211, + "length": 1103, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "totalDelayedMessagesRead" + } + } + ], + "description": "Reentrancy in SequencerInbox.addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256) (src/bridge/SequencerInbox.sol#674-705):\n\tExternal calls:\n\t- (seqMessageIndex,beforeAcc,delayedAcc,acc) = bridge.enqueueSequencerMessage(dataHash,afterDelayedMessagesRead,prevMessageCount,newMessageCount) (src/bridge/SequencerInbox.sol#692-697)\n\tState variables written after the call(s):\n\t- totalDelayedMessagesRead = afterDelayedMessagesRead (src/bridge/SequencerInbox.sol#699)\n\tSequencerInbox.totalDelayedMessagesRead (src/bridge/SequencerInbox.sol#58) can be used in cross function reentrancies:\n\t- SequencerInbox.addSequencerL2Batch(uint256,bytes,uint256,IGasRefunder,uint256,uint256) (src/bridge/SequencerInbox.sol#468-519)\n\t- SequencerInbox.addSequencerL2BatchFromBlobs(uint256,uint256,IGasRefunder,uint256,uint256) (src/bridge/SequencerInbox.sol#407-466)\n\t- SequencerInbox.addSequencerL2BatchFromOrigin(uint256,bytes,uint256,IGasRefunder,uint256,uint256) (src/bridge/SequencerInbox.sol#355-405)\n\t- SequencerInbox.addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256) (src/bridge/SequencerInbox.sol#674-705)\n\t- SequencerInbox.forceInclusion(uint256,uint8,uint64[2],uint256,address,bytes32) (src/bridge/SequencerInbox.sol#284-343)\n\t- SequencerInbox.totalDelayedMessagesRead (src/bridge/SequencerInbox.sol#58)\n", + "markdown": "Reentrancy in [SequencerInbox.addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256)](src/bridge/SequencerInbox.sol#L674-L705):\n\tExternal calls:\n\t- [(seqMessageIndex,beforeAcc,delayedAcc,acc) = bridge.enqueueSequencerMessage(dataHash,afterDelayedMessagesRead,prevMessageCount,newMessageCount)](src/bridge/SequencerInbox.sol#L692-L697)\n\tState variables written after the call(s):\n\t- [totalDelayedMessagesRead = afterDelayedMessagesRead](src/bridge/SequencerInbox.sol#L699)\n\t[SequencerInbox.totalDelayedMessagesRead](src/bridge/SequencerInbox.sol#L58) can be used in cross function reentrancies:\n\t- [SequencerInbox.addSequencerL2Batch(uint256,bytes,uint256,IGasRefunder,uint256,uint256)](src/bridge/SequencerInbox.sol#L468-L519)\n\t- [SequencerInbox.addSequencerL2BatchFromBlobs(uint256,uint256,IGasRefunder,uint256,uint256)](src/bridge/SequencerInbox.sol#L407-L466)\n\t- [SequencerInbox.addSequencerL2BatchFromOrigin(uint256,bytes,uint256,IGasRefunder,uint256,uint256)](src/bridge/SequencerInbox.sol#L355-L405)\n\t- [SequencerInbox.addSequencerL2BatchImpl(bytes32,uint256,uint256,uint256,uint256)](src/bridge/SequencerInbox.sol#L674-L705)\n\t- [SequencerInbox.forceInclusion(uint256,uint8,uint64[2],uint256,address,bytes32)](src/bridge/SequencerInbox.sol#L284-L343)\n\t- [SequencerInbox.totalDelayedMessagesRead](src/bridge/SequencerInbox.sol#L58)\n", + "first_markdown_element": "src/bridge/SequencerInbox.sol#L674-L705", + "id": "b38d9bf0df554a08cf1b8bb6d468b87dd156690f340b399262fff373086c5825", + "check": "reentrancy-no-eth", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "createChallenge", + "source_mapping": { + "start": 12264, + "length": 3131, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])" + } + }, + { + "type": "node", + "name": "challengeIndex = createChallengeHelper(stakers,machineStatuses,globalStates,numBlocks,wasmModuleRoots,(commonEndBlock - proposedBlocks[0]) * ETH_POS_BLOCK_TIME,(commonEndBlock - proposedBlocks[1]) * ETH_POS_BLOCK_TIME)", + "source_mapping": { + "start": 14807, + "length": 398, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [350, 351, 352, 353, 354, 355, 356, 357, 358, 359], + "starting_column": 9, + "ending_column": 10 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createChallenge", + "source_mapping": { + "start": 12264, + "length": 3131, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "challengeManager.createChallenge(wasmModuleRoots[0],machineStatuses,globalStates,numBlocks,stakers[0],stakers[1],asserterTimeLeft,challengerTimeLeft)", + "source_mapping": { + "start": 15749, + "length": 317, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385], + "starting_column": 9, + "ending_column": 14 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createChallengeHelper", + "source_mapping": { + "start": 15401, + "length": 672, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallengeHelper(address[2],MachineStatus[2],GlobalState[2],uint64,bytes32[2],uint256,uint256)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "challengeStarted(stakers[0],stakers[1],challengeIndex)", + "source_mapping": { + "start": 15241, + "length": 56, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [361], + "starting_column": 9, + "ending_column": 65 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createChallenge", + "source_mapping": { + "start": 12264, + "length": 3131, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsRollupUserLogic", + "source_mapping": { + "start": 501, + "length": 25132, + "filename_relative": "src/rollup/RollupUserLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupUserLogic.sol", + "filename_short": "src/rollup/RollupUserLogic.sol", + "is_dependency": false, + "lines": [ + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + }, + { + "type": "node", + "name": "_stakerMap[staker1].currentChallenge = challenge", + "source_mapping": { + "start": 13576, + "length": 48, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [383], + "starting_column": 9, + "ending_column": 57 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "challengeStarted", + "source_mapping": { + "start": 13449, + "length": 240, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [378, 379, 380, 381, 382, 383, 384, 385], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "challengeStarted(address,address,uint64)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + }, + { + "type": "node", + "name": "_stakerMap[staker2].currentChallenge = challenge", + "source_mapping": { + "start": 13634, + "length": 48, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [384], + "starting_column": 9, + "ending_column": 57 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "challengeStarted", + "source_mapping": { + "start": 13449, + "length": 240, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [378, 379, 380, 381, 382, 383, 384, 385], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "challengeStarted(address,address,uint64)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + } + ], + "description": "Reentrancy in AbsRollupUserLogic.createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2]) (src/rollup/RollupUserLogic.sol#291-364):\n\tExternal calls:\n\t- challengeIndex = createChallengeHelper(stakers,machineStatuses,globalStates,numBlocks,wasmModuleRoots,(commonEndBlock - proposedBlocks[0]) * ETH_POS_BLOCK_TIME,(commonEndBlock - proposedBlocks[1]) * ETH_POS_BLOCK_TIME) (src/rollup/RollupUserLogic.sol#350-359)\n\t\t- challengeManager.createChallenge(wasmModuleRoots[0],machineStatuses,globalStates,numBlocks,stakers[0],stakers[1],asserterTimeLeft,challengerTimeLeft) (src/rollup/RollupUserLogic.sol#375-385)\n\tState variables written after the call(s):\n\t- challengeStarted(stakers[0],stakers[1],challengeIndex) (src/rollup/RollupUserLogic.sol#361)\n\t\t- _stakerMap[staker1].currentChallenge = challenge (src/rollup/RollupCore.sol#383)\n\t\t- _stakerMap[staker2].currentChallenge = challenge (src/rollup/RollupCore.sol#384)\n\tRollupCore._stakerMap (src/rollup/RollupCore.sol#68) can be used in cross function reentrancies:\n\t- RollupCore._stakerMap (src/rollup/RollupCore.sol#68)\n\t- RollupCore.amountStaked(address) (src/rollup/RollupCore.sol#185-187)\n\t- RollupCore.challengeStarted(address,address,uint64) (src/rollup/RollupCore.sol#378-385)\n\t- RollupCore.clearChallenge(address) (src/rollup/RollupCore.sol#367-370)\n\t- RollupCore.currentChallenge(address) (src/rollup/RollupCore.sol#176-178)\n\t- RollupCore.deleteStaker(address) (src/rollup/RollupCore.sol#542-550)\n\t- RollupCore.getStaker(address) (src/rollup/RollupCore.sol#194-196)\n\t- RollupCore.inChallenge(address,address) (src/rollup/RollupCore.sol#350-361)\n\t- RollupCore.increaseStakeBy(address,uint256) (src/rollup/RollupCore.sol#392-398)\n\t- RollupCore.isStaked(address) (src/rollup/RollupCore.sol#148-150)\n\t- RollupCore.isStakedOnLatestConfirmed(address) (src/rollup/RollupCore.sol#158-160)\n\t- RollupCore.latestStakedNode(address) (src/rollup/RollupCore.sol#167-169)\n\t- RollupCore.reduceStakeTo(address,uint256) (src/rollup/RollupCore.sol#406-415)\n\t- RollupCore.stakeOnNode(address,uint64) (src/rollup/RollupCore.sol#507-511)\n\t- RollupCore.turnIntoZombie(address) (src/rollup/RollupCore.sol#421-425)\n\t- RollupCore.withdrawStaker(address) (src/rollup/RollupCore.sol#488-500)\n", + "markdown": "Reentrancy in [AbsRollupUserLogic.createChallenge(address[2],uint64[2],MachineStatus[2],GlobalState[2],uint64,bytes32,uint256[2],bytes32[2])](src/rollup/RollupUserLogic.sol#L291-L364):\n\tExternal calls:\n\t- [challengeIndex = createChallengeHelper(stakers,machineStatuses,globalStates,numBlocks,wasmModuleRoots,(commonEndBlock - proposedBlocks[0]) * ETH_POS_BLOCK_TIME,(commonEndBlock - proposedBlocks[1]) * ETH_POS_BLOCK_TIME)](src/rollup/RollupUserLogic.sol#L350-L359)\n\t\t- [challengeManager.createChallenge(wasmModuleRoots[0],machineStatuses,globalStates,numBlocks,stakers[0],stakers[1],asserterTimeLeft,challengerTimeLeft)](src/rollup/RollupUserLogic.sol#L375-L385)\n\tState variables written after the call(s):\n\t- [challengeStarted(stakers[0],stakers[1],challengeIndex)](src/rollup/RollupUserLogic.sol#L361)\n\t\t- [_stakerMap[staker1].currentChallenge = challenge](src/rollup/RollupCore.sol#L383)\n\t\t- [_stakerMap[staker2].currentChallenge = challenge](src/rollup/RollupCore.sol#L384)\n\t[RollupCore._stakerMap](src/rollup/RollupCore.sol#L68) can be used in cross function reentrancies:\n\t- [RollupCore._stakerMap](src/rollup/RollupCore.sol#L68)\n\t- [RollupCore.amountStaked(address)](src/rollup/RollupCore.sol#L185-L187)\n\t- [RollupCore.challengeStarted(address,address,uint64)](src/rollup/RollupCore.sol#L378-L385)\n\t- [RollupCore.clearChallenge(address)](src/rollup/RollupCore.sol#L367-L370)\n\t- [RollupCore.currentChallenge(address)](src/rollup/RollupCore.sol#L176-L178)\n\t- [RollupCore.deleteStaker(address)](src/rollup/RollupCore.sol#L542-L550)\n\t- [RollupCore.getStaker(address)](src/rollup/RollupCore.sol#L194-L196)\n\t- [RollupCore.inChallenge(address,address)](src/rollup/RollupCore.sol#L350-L361)\n\t- [RollupCore.increaseStakeBy(address,uint256)](src/rollup/RollupCore.sol#L392-L398)\n\t- [RollupCore.isStaked(address)](src/rollup/RollupCore.sol#L148-L150)\n\t- [RollupCore.isStakedOnLatestConfirmed(address)](src/rollup/RollupCore.sol#L158-L160)\n\t- [RollupCore.latestStakedNode(address)](src/rollup/RollupCore.sol#L167-L169)\n\t- [RollupCore.reduceStakeTo(address,uint256)](src/rollup/RollupCore.sol#L406-L415)\n\t- [RollupCore.stakeOnNode(address,uint64)](src/rollup/RollupCore.sol#L507-L511)\n\t- [RollupCore.turnIntoZombie(address)](src/rollup/RollupCore.sol#L421-L425)\n\t- [RollupCore.withdrawStaker(address)](src/rollup/RollupCore.sol#L488-L500)\n", + "first_markdown_element": "src/rollup/RollupUserLogic.sol#L291-L364", + "id": "af65892a907a109b6f58d5895c29425a5794647abc20793593b6461989e07fb6", + "check": "reentrancy-no-eth", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "executeTransactionImpl", + "source_mapping": { + "start": 7336, + "length": 990, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsOutbox", + "source_mapping": { + "start": 698, + "length": 11504, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes)" + } + }, + { + "type": "node", + "name": "executeBridgeCall(to,value,data)", + "source_mapping": { + "start": 8253, + "length": 34, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [222], + "starting_column": 9, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeTransactionImpl", + "source_mapping": { + "start": 7336, + "length": 990, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsOutbox", + "source_mapping": { + "start": 698, + "length": 11504, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "(success,returndata) = bridge.executeCall(to,value,data)", + "source_mapping": { + "start": 9954, + "length": 77, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [275], + "starting_column": 9, + "ending_column": 86 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeBridgeCall", + "source_mapping": { + "start": 9832, + "length": 594, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsOutbox", + "source_mapping": { + "start": 698, + "length": 11504, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeBridgeCall(address,uint256,bytes)" + } + } + }, + "additional_fields": { "underlying_type": "external_calls_sending_eth" } + }, + { + "type": "node", + "name": "context = prevContext", + "source_mapping": { + "start": 8298, + "length": 21, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [224], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeTransactionImpl", + "source_mapping": { + "start": 7336, + "length": 990, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsOutbox", + "source_mapping": { + "start": 698, + "length": 11504, + "filename_relative": "src/bridge/AbsOutbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsOutbox.sol", + "filename_short": "src/bridge/AbsOutbox.sol", + "is_dependency": false, + "lines": [ + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "context" + } + } + ], + "description": "Reentrancy in AbsOutbox.executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes) (src/bridge/AbsOutbox.sol#196-225):\n\tExternal calls:\n\t- executeBridgeCall(to,value,data) (src/bridge/AbsOutbox.sol#222)\n\t\t- (success,returndata) = bridge.executeCall(to,value,data) (src/bridge/AbsOutbox.sol#275)\n\tState variables written after the call(s):\n\t- context = prevContext (src/bridge/AbsOutbox.sol#224)\n\tAbsOutbox.context (src/bridge/AbsOutbox.sol#51) can be used in cross function reentrancies:\n\t- AbsOutbox.executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes) (src/bridge/AbsOutbox.sol#196-225)\n\t- AbsOutbox.initialize(IBridge) (src/bridge/AbsOutbox.sol#63-79)\n\t- AbsOutbox.l2ToL1Block() (src/bridge/AbsOutbox.sol#118-123)\n\t- AbsOutbox.l2ToL1EthBlock() (src/bridge/AbsOutbox.sol#126-131)\n\t- AbsOutbox.l2ToL1OutputId() (src/bridge/AbsOutbox.sol#147-152)\n\t- AbsOutbox.l2ToL1Sender() (src/bridge/AbsOutbox.sol#110-115)\n\t- AbsOutbox.l2ToL1Timestamp() (src/bridge/AbsOutbox.sol#134-139)\n\t- AbsOutbox.postUpgradeInit() (src/bridge/AbsOutbox.sol#81-92)\n", + "markdown": "Reentrancy in [AbsOutbox.executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes)](src/bridge/AbsOutbox.sol#L196-L225):\n\tExternal calls:\n\t- [executeBridgeCall(to,value,data)](src/bridge/AbsOutbox.sol#L222)\n\t\t- [(success,returndata) = bridge.executeCall(to,value,data)](src/bridge/AbsOutbox.sol#L275)\n\tState variables written after the call(s):\n\t- [context = prevContext](src/bridge/AbsOutbox.sol#L224)\n\t[AbsOutbox.context](src/bridge/AbsOutbox.sol#L51) can be used in cross function reentrancies:\n\t- [AbsOutbox.executeTransactionImpl(uint256,address,address,uint256,uint256,uint256,uint256,bytes)](src/bridge/AbsOutbox.sol#L196-L225)\n\t- [AbsOutbox.initialize(IBridge)](src/bridge/AbsOutbox.sol#L63-L79)\n\t- [AbsOutbox.l2ToL1Block()](src/bridge/AbsOutbox.sol#L118-L123)\n\t- [AbsOutbox.l2ToL1EthBlock()](src/bridge/AbsOutbox.sol#L126-L131)\n\t- [AbsOutbox.l2ToL1OutputId()](src/bridge/AbsOutbox.sol#L147-L152)\n\t- [AbsOutbox.l2ToL1Sender()](src/bridge/AbsOutbox.sol#L110-L115)\n\t- [AbsOutbox.l2ToL1Timestamp()](src/bridge/AbsOutbox.sol#L134-L139)\n\t- [AbsOutbox.postUpgradeInit()](src/bridge/AbsOutbox.sol#L81-L92)\n", + "first_markdown_element": "src/bridge/AbsOutbox.sol#L196-L225", + "id": "426e61b097c321e642232d0d55da1f37bdf8bba9a4d0f425a61dc187192ef9ed", + "check": "reentrancy-no-eth", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "forceResolveChallenge", + "source_mapping": { + "start": 10412, + "length": 631, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupAdminLogic", + "source_mapping": { + "start": 590, + "length": 14555, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "forceResolveChallenge(address[],address[])" + } + }, + { + "type": "node", + "name": "challengeManager.clearChallenge(chall)", + "source_mapping": { + "start": 10950, + "length": 38, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [271], + "starting_column": 13, + "ending_column": 51 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "forceResolveChallenge", + "source_mapping": { + "start": 10412, + "length": 631, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupAdminLogic", + "source_mapping": { + "start": 590, + "length": 14555, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "forceResolveChallenge(address[],address[])" + } + } + }, + "additional_fields": { "underlying_type": "external_calls" } + }, + { + "type": "node", + "name": "clearChallenge(stakerA[i])", + "source_mapping": { + "start": 10870, + "length": 26, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [269], + "starting_column": 13, + "ending_column": 39 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "forceResolveChallenge", + "source_mapping": { + "start": 10412, + "length": 631, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupAdminLogic", + "source_mapping": { + "start": 590, + "length": 14555, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "forceResolveChallenge(address[],address[])" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + }, + { + "type": "node", + "name": "staker.currentChallenge = NO_CHAL_INDEX", + "source_mapping": { + "start": 13136, + "length": 39, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [369], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "clearChallenge", + "source_mapping": { + "start": 13011, + "length": 171, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [367, 368, 369, 370], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "clearChallenge(address)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + }, + { + "type": "node", + "name": "clearChallenge(stakerB[i])", + "source_mapping": { + "start": 10910, + "length": 26, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [270], + "starting_column": 13, + "ending_column": 39 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "forceResolveChallenge", + "source_mapping": { + "start": 10412, + "length": 631, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupAdminLogic", + "source_mapping": { + "start": 590, + "length": 14555, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "forceResolveChallenge(address[],address[])" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + }, + { + "type": "node", + "name": "staker.currentChallenge = NO_CHAL_INDEX", + "source_mapping": { + "start": 13136, + "length": 39, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [369], + "starting_column": 9, + "ending_column": 48 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "clearChallenge", + "source_mapping": { + "start": 13011, + "length": 171, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [367, 368, 369, 370], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "clearChallenge(address)" + } + } + }, + "additional_fields": { + "underlying_type": "variables_written", + "variable_name": "_stakerMap" + } + } + ], + "description": "Reentrancy in RollupAdminLogic.forceResolveChallenge(address[],address[]) (src/rollup/RollupAdminLogic.sol#258-274):\n\tExternal calls:\n\t- challengeManager.clearChallenge(chall) (src/rollup/RollupAdminLogic.sol#271)\n\tState variables written after the call(s):\n\t- clearChallenge(stakerA[i]) (src/rollup/RollupAdminLogic.sol#269)\n\t\t- staker.currentChallenge = NO_CHAL_INDEX (src/rollup/RollupCore.sol#369)\n\tRollupCore._stakerMap (src/rollup/RollupCore.sol#68) can be used in cross function reentrancies:\n\t- RollupCore._stakerMap (src/rollup/RollupCore.sol#68)\n\t- RollupCore.amountStaked(address) (src/rollup/RollupCore.sol#185-187)\n\t- RollupCore.clearChallenge(address) (src/rollup/RollupCore.sol#367-370)\n\t- RollupCore.currentChallenge(address) (src/rollup/RollupCore.sol#176-178)\n\t- RollupCore.deleteStaker(address) (src/rollup/RollupCore.sol#542-550)\n\t- RollupAdminLogic.forceRefundStaker(address[]) (src/rollup/RollupAdminLogic.sol#276-284)\n\t- RollupCore.getStaker(address) (src/rollup/RollupCore.sol#194-196)\n\t- RollupCore.inChallenge(address,address) (src/rollup/RollupCore.sol#350-361)\n\t- RollupCore.isStaked(address) (src/rollup/RollupCore.sol#148-150)\n\t- RollupCore.isStakedOnLatestConfirmed(address) (src/rollup/RollupCore.sol#158-160)\n\t- RollupCore.latestStakedNode(address) (src/rollup/RollupCore.sol#167-169)\n\t- RollupCore.reduceStakeTo(address,uint256) (src/rollup/RollupCore.sol#406-415)\n\t- RollupCore.turnIntoZombie(address) (src/rollup/RollupCore.sol#421-425)\n\t- clearChallenge(stakerB[i]) (src/rollup/RollupAdminLogic.sol#270)\n\t\t- staker.currentChallenge = NO_CHAL_INDEX (src/rollup/RollupCore.sol#369)\n\tRollupCore._stakerMap (src/rollup/RollupCore.sol#68) can be used in cross function reentrancies:\n\t- RollupCore._stakerMap (src/rollup/RollupCore.sol#68)\n\t- RollupCore.amountStaked(address) (src/rollup/RollupCore.sol#185-187)\n\t- RollupCore.clearChallenge(address) (src/rollup/RollupCore.sol#367-370)\n\t- RollupCore.currentChallenge(address) (src/rollup/RollupCore.sol#176-178)\n\t- RollupCore.deleteStaker(address) (src/rollup/RollupCore.sol#542-550)\n\t- RollupAdminLogic.forceRefundStaker(address[]) (src/rollup/RollupAdminLogic.sol#276-284)\n\t- RollupCore.getStaker(address) (src/rollup/RollupCore.sol#194-196)\n\t- RollupCore.inChallenge(address,address) (src/rollup/RollupCore.sol#350-361)\n\t- RollupCore.isStaked(address) (src/rollup/RollupCore.sol#148-150)\n\t- RollupCore.isStakedOnLatestConfirmed(address) (src/rollup/RollupCore.sol#158-160)\n\t- RollupCore.latestStakedNode(address) (src/rollup/RollupCore.sol#167-169)\n\t- RollupCore.reduceStakeTo(address,uint256) (src/rollup/RollupCore.sol#406-415)\n\t- RollupCore.turnIntoZombie(address) (src/rollup/RollupCore.sol#421-425)\n", + "markdown": "Reentrancy in [RollupAdminLogic.forceResolveChallenge(address[],address[])](src/rollup/RollupAdminLogic.sol#L258-L274):\n\tExternal calls:\n\t- [challengeManager.clearChallenge(chall)](src/rollup/RollupAdminLogic.sol#L271)\n\tState variables written after the call(s):\n\t- [clearChallenge(stakerA[i])](src/rollup/RollupAdminLogic.sol#L269)\n\t\t- [staker.currentChallenge = NO_CHAL_INDEX](src/rollup/RollupCore.sol#L369)\n\t[RollupCore._stakerMap](src/rollup/RollupCore.sol#L68) can be used in cross function reentrancies:\n\t- [RollupCore._stakerMap](src/rollup/RollupCore.sol#L68)\n\t- [RollupCore.amountStaked(address)](src/rollup/RollupCore.sol#L185-L187)\n\t- [RollupCore.clearChallenge(address)](src/rollup/RollupCore.sol#L367-L370)\n\t- [RollupCore.currentChallenge(address)](src/rollup/RollupCore.sol#L176-L178)\n\t- [RollupCore.deleteStaker(address)](src/rollup/RollupCore.sol#L542-L550)\n\t- [RollupAdminLogic.forceRefundStaker(address[])](src/rollup/RollupAdminLogic.sol#L276-L284)\n\t- [RollupCore.getStaker(address)](src/rollup/RollupCore.sol#L194-L196)\n\t- [RollupCore.inChallenge(address,address)](src/rollup/RollupCore.sol#L350-L361)\n\t- [RollupCore.isStaked(address)](src/rollup/RollupCore.sol#L148-L150)\n\t- [RollupCore.isStakedOnLatestConfirmed(address)](src/rollup/RollupCore.sol#L158-L160)\n\t- [RollupCore.latestStakedNode(address)](src/rollup/RollupCore.sol#L167-L169)\n\t- [RollupCore.reduceStakeTo(address,uint256)](src/rollup/RollupCore.sol#L406-L415)\n\t- [RollupCore.turnIntoZombie(address)](src/rollup/RollupCore.sol#L421-L425)\n\t- [clearChallenge(stakerB[i])](src/rollup/RollupAdminLogic.sol#L270)\n\t\t- [staker.currentChallenge = NO_CHAL_INDEX](src/rollup/RollupCore.sol#L369)\n\t[RollupCore._stakerMap](src/rollup/RollupCore.sol#L68) can be used in cross function reentrancies:\n\t- [RollupCore._stakerMap](src/rollup/RollupCore.sol#L68)\n\t- [RollupCore.amountStaked(address)](src/rollup/RollupCore.sol#L185-L187)\n\t- [RollupCore.clearChallenge(address)](src/rollup/RollupCore.sol#L367-L370)\n\t- [RollupCore.currentChallenge(address)](src/rollup/RollupCore.sol#L176-L178)\n\t- [RollupCore.deleteStaker(address)](src/rollup/RollupCore.sol#L542-L550)\n\t- [RollupAdminLogic.forceRefundStaker(address[])](src/rollup/RollupAdminLogic.sol#L276-L284)\n\t- [RollupCore.getStaker(address)](src/rollup/RollupCore.sol#L194-L196)\n\t- [RollupCore.inChallenge(address,address)](src/rollup/RollupCore.sol#L350-L361)\n\t- [RollupCore.isStaked(address)](src/rollup/RollupCore.sol#L148-L150)\n\t- [RollupCore.isStakedOnLatestConfirmed(address)](src/rollup/RollupCore.sol#L158-L160)\n\t- [RollupCore.latestStakedNode(address)](src/rollup/RollupCore.sol#L167-L169)\n\t- [RollupCore.reduceStakeTo(address,uint256)](src/rollup/RollupCore.sol#L406-L415)\n\t- [RollupCore.turnIntoZombie(address)](src/rollup/RollupCore.sol#L421-L425)\n", + "first_markdown_element": "src/rollup/RollupAdminLogic.sol#L258-L274", + "id": "2e21893be44131693ea2dfb272622853fa44deea082e4c78e0bbd132c84af93e", + "check": "reentrancy-no-eth", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "u64Vals", + "source_mapping": { + "start": 6924, + "length": 24, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [226], + "starting_column": 9, + "ending_column": 33 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "globalState", + "source_mapping": { + "start": 6617, + "length": 684, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Deserialize", + "source_mapping": { + "start": 450, + "length": 9161, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "globalState(bytes,uint256)" + } + } + } + } + ], + "description": "Deserialize.globalState(bytes,uint256).u64Vals (src/state/Deserialize.sol#226) is a local variable never initialized\n", + "markdown": "[Deserialize.globalState(bytes,uint256).u64Vals](src/state/Deserialize.sol#L226) is a local variable never initialized\n", + "first_markdown_element": "src/state/Deserialize.sol#L226", + "id": "b49e20832cf227724d4b048fc859ce00efa36bda00bb2d354df6861b1e5b65c8", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "funcIdx", + "source_mapping": { + "start": 6151, + "length": 14, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [194], + "starting_column": 9, + "ending_column": 23 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCallIndirect", + "source_mapping": { + "start": 5971, + "length": 3565, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCallIndirect(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProver0.executeCallIndirect(Machine,Module,Instruction,bytes).funcIdx (src/osp/OneStepProver0.sol#194) is a local variable never initialized\n", + "markdown": "[OneStepProver0.executeCallIndirect(Machine,Module,Instruction,bytes).funcIdx](src/osp/OneStepProver0.sol#L194) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProver0.sol#L194", + "id": "0b3ea27e34dd552b3d33e544c7732699f56da1be9d675526040264c6f35cf115", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "sourceBits", + "source_mapping": { + "start": 12021, + "length": 16, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [400], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeExtendSameType", + "source_mapping": { + "start": 11827, + "length": 1476, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMath", + "source_mapping": { + "start": 362, + "length": 16325, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeExtendSameType(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMath.executeExtendSameType(Machine,Module,Instruction,bytes).sourceBits (src/osp/OneStepProverMath.sol#400) is a local variable never initialized\n", + "markdown": "[OneStepProverMath.executeExtendSameType(Machine,Module,Instruction,bytes).sourceBits](src/osp/OneStepProverMath.sol#L400) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMath.sol#L400", + "id": "7e6b4db4655b21a377a13a4c03fdcc62f8c4e56c5ecdf979c82afb0985a1fac5", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "part", + "source_mapping": { + "start": 1123, + "length": 17, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [38], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "proveWithFullPreimage", + "source_mapping": { + "start": 954, + "length": 572, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [ + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "HashProofHelper", + "source_mapping": { + "start": 388, + "length": 5264, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [ + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "proveWithFullPreimage(bytes,uint64)" + } + } + } + } + ], + "description": "HashProofHelper.proveWithFullPreimage(bytes,uint64).part (src/osp/HashProofHelper.sol#38) is a local variable never initialized\n", + "markdown": "[HashProofHelper.proveWithFullPreimage(bytes,uint64).part](src/osp/HashProofHelper.sol#L38) is a local variable never initialized\n", + "first_markdown_element": "src/osp/HashProofHelper.sol#L38", + "id": "9f6b190b96895f4cfb0f3db956545a55f4132aa16c8af057e7257d7fd2c5de43", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "ty", + "source_mapping": { + "start": 1685, + "length": 12, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [49], + "starting_column": 9, + "ending_column": 21 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).ty (src/osp/OneStepProverMemory.sol#49) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).ty](src/osp/OneStepProverMemory.sol#L49) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L49", + "id": "d44b109a885f9f18431fcbd810bf7f45b9f86b4749430739056c0786ab2d150e", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "impl", + "source_mapping": { + "start": 11151, + "length": 120, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [296, 297, 298], + "starting_column": 9, + "ending_column": 22 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeOneStep", + "source_mapping": { + "start": 10780, + "length": 1055, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl (src/osp/OneStepProverMemory.sol#296-298) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl](src/osp/OneStepProverMemory.sol#L296-L298) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L296-L298", + "id": "c0081c68be4899b530be0e0720e9713a3d42b71364ad4392c42fd165ec162d1e", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "beforeAcc", + "source_mapping": { + "start": 11222, + "length": 17, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [278], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "validateDelayedInbox", + "source_mapping": { + "start": 10970, + "length": 916, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateDelayedInbox(ExecutionContext,uint64,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.validateDelayedInbox(ExecutionContext,uint64,bytes).beforeAcc (src/osp/OneStepProverHostIo.sol#278) is a local variable never initialized\n", + "markdown": "[OneStepProverHostIo.validateDelayedInbox(ExecutionContext,uint64,bytes).beforeAcc](src/osp/OneStepProverHostIo.sol#L278) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L278", + "id": "dab8df6b27e88ad0e415842d20e13cd455e0d5f0c84fa74d2906eefd6d1e06f0", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "impl", + "source_mapping": { + "start": 14734, + "length": 120, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [477, 478, 479], + "starting_column": 9, + "ending_column": 22 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeOneStep", + "source_mapping": { + "start": 14363, + "length": 2322, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMath", + "source_mapping": { + "start": 362, + "length": 16325, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMath.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl (src/osp/OneStepProverMath.sol#477-479) is a local variable never initialized\n", + "markdown": "[OneStepProverMath.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl](src/osp/OneStepProverMath.sol#L477-L479) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMath.sol#L477-L479", + "id": "7bb129f3bd93db0e9c1579c8ab353fe86d0d54b40d421f4a568ab9279ce8b6cb", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "internalStack", + "source_mapping": { + "start": 1959, + "length": 31, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [63], + "starting_column": 9, + "ending_column": 40 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "getStartMachineHash", + "source_mapping": { + "start": 1364, + "length": 1078, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ChallengeLib", + "source_mapping": { + "start": 272, + "length": 4325, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "getStartMachineHash(bytes32,bytes32)" + } + } + } + } + ], + "description": "ChallengeLib.getStartMachineHash(bytes32,bytes32).internalStack (src/challenge/ChallengeLib.sol#63) is a local variable never initialized\n", + "markdown": "[ChallengeLib.getStartMachineHash(bytes32,bytes32).internalStack](src/challenge/ChallengeLib.sol#L63) is a local variable never initialized\n", + "first_markdown_element": "src/challenge/ChallengeLib.sol#L63", + "id": "2b6e1af0735464f525ca02dac16210c75f5e60fdd4f5020e646e82eccdf94e2a", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "frameStack", + "source_mapping": { + "start": 2000, + "length": 34, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [64], + "starting_column": 9, + "ending_column": 43 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "getStartMachineHash", + "source_mapping": { + "start": 1364, + "length": 1078, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ChallengeLib", + "source_mapping": { + "start": 272, + "length": 4325, + "filename_relative": "src/challenge/ChallengeLib.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/challenge/ChallengeLib.sol", + "filename_short": "src/challenge/ChallengeLib.sol", + "is_dependency": false, + "lines": [ + 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "getStartMachineHash(bytes32,bytes32)" + } + } + } + } + ], + "description": "ChallengeLib.getStartMachineHash(bytes32,bytes32).frameStack (src/challenge/ChallengeLib.sol#64) is a local variable never initialized\n", + "markdown": "[ChallengeLib.getStartMachineHash(bytes32,bytes32).frameStack](src/challenge/ChallengeLib.sol#L64) is a local variable never initialized\n", + "first_markdown_element": "src/challenge/ChallengeLib.sol#L64", + "id": "e2c13e88a674b7d15f66c38811493b28e3d768158293153c3761365faf8e45c7", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "signed", + "source_mapping": { + "start": 1734, + "length": 11, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [51], + "starting_column": 9, + "ending_column": 20 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).signed (src/osp/OneStepProverMemory.sol#51) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).signed](src/osp/OneStepProverMemory.sol#L51) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L51", + "id": "494ad26e42522ed318b7143deadf6e22863a94ac35e1bc7e431f680c09e99249", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "extracted", + "source_mapping": { + "start": 5123, + "length": 22, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [147], + "starting_column": 9, + "ending_column": 31 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeReadPreImage", + "source_mapping": { + "start": 4302, + "length": 5772, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes).extracted (src/osp/OneStepProverHostIo.sol#147) is a local variable never initialized\n", + "markdown": "[OneStepProverHostIo.executeReadPreImage(ExecutionContext,Machine,Module,Instruction,bytes).extracted](src/osp/OneStepProverHostIo.sol#L147) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L147", + "id": "b8f149ef07d9b5bf6a4fd2772d951ef00e1136d5728509097c74a6d35fb7419a", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "delayedAcc", + "source_mapping": { + "start": 10502, + "length": 18, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [258], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "validateSequencerInbox", + "source_mapping": { + "start": 10080, + "length": 884, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateSequencerInbox(ExecutionContext,uint64,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes).delayedAcc (src/osp/OneStepProverHostIo.sol#258) is a local variable never initialized\n", + "markdown": "[OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes).delayedAcc](src/osp/OneStepProverHostIo.sol#L258) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L258", + "id": "a4af275d7732b756f493da186504395ee7b6705d359094ed504be4cb2382a71f", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "state256", + "source_mapping": { + "start": 4683, + "length": 27, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [127], + "starting_column": 13, + "ending_column": 40 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "keccakUpdate", + "source_mapping": { + "start": 3663, + "length": 1486, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [ + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "HashProofHelper", + "source_mapping": { + "start": 388, + "length": 5264, + "filename_relative": "src/osp/HashProofHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/HashProofHelper.sol", + "filename_short": "src/osp/HashProofHelper.sol", + "is_dependency": false, + "lines": [ + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "keccakUpdate(HashProofHelper.KeccakState,bytes,bool)" + } + } + } + } + ], + "description": "HashProofHelper.keccakUpdate(HashProofHelper.KeccakState,bytes,bool).state256 (src/osp/HashProofHelper.sol#127) is a local variable never initialized\n", + "markdown": "[HashProofHelper.keccakUpdate(HashProofHelper.KeccakState,bytes,bool).state256](src/osp/HashProofHelper.sol#L127) is a local variable never initialized\n", + "first_markdown_element": "src/osp/HashProofHelper.sol#L127", + "id": "b10eafcd668276e8f081740d67fa003ef0534d1520e371c18e96833214fc3ff2", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "beforeAcc", + "source_mapping": { + "start": 10475, + "length": 17, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [257], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "validateSequencerInbox", + "source_mapping": { + "start": 10080, + "length": 884, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateSequencerInbox(ExecutionContext,uint64,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes).beforeAcc (src/osp/OneStepProverHostIo.sol#257) is a local variable never initialized\n", + "markdown": "[OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes).beforeAcc](src/osp/OneStepProverHostIo.sol#L257) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L257", + "id": "93458ecce4030168b57a5b4b9bddf11e556bda0b87b21572901703776f8a4a4d", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "memoryFrame", + "source_mapping": { + "start": 21082, + "length": 38, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [575], + "starting_column": 9, + "ending_column": 47 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createNewNode", + "source_mapping": { + "start": 20652, + "length": 4618, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCore", + "source_mapping": { + "start": 685, + "length": 24587, + "filename_relative": "src/rollup/RollupCore.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCore.sol", + "filename_short": "src/rollup/RollupCore.sol", + "is_dependency": false, + "lines": [ + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNewNode(Assertion,uint64,uint256,bytes32)" + } + } + } + } + ], + "description": "RollupCore.createNewNode(Assertion,uint64,uint256,bytes32).memoryFrame (src/rollup/RollupCore.sol#575) is a local variable never initialized\n", + "markdown": "[RollupCore.createNewNode(Assertion,uint64,uint256,bytes32).memoryFrame](src/rollup/RollupCore.sol#L575) is a local variable never initialized\n", + "first_markdown_element": "src/rollup/RollupCore.sol#L575", + "id": "22d3572f5fd9e44b1a0e455ebf3a57c571e31a392c713a5313ed78cdb5bdd79d", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "bounds", + "source_mapping": { + "start": 7906, + "length": 32, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [214], + "starting_column": 9, + "ending_column": 41 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "getTimeBounds", + "source_mapping": { + "start": 7813, + "length": 740, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "SequencerInbox", + "source_mapping": { + "start": 1909, + "length": 29266, + "filename_relative": "src/bridge/SequencerInbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/SequencerInbox.sol", + "filename_short": "src/bridge/SequencerInbox.sol", + "is_dependency": false, + "lines": [ + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, + 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, + 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, + 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, + 797, 798, 799, 800, 801, 802, 803, 804, 805 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "getTimeBounds()" + } + } + } + } + ], + "description": "SequencerInbox.getTimeBounds().bounds (src/bridge/SequencerInbox.sol#214) is a local variable never initialized\n", + "markdown": "[SequencerInbox.getTimeBounds().bounds](src/bridge/SequencerInbox.sol#L214) is a local variable never initialized\n", + "first_markdown_element": "src/bridge/SequencerInbox.sol#L214", + "id": "a9ab2d44723c17809429f069881bb97a07e53966e1c848cc3083baebb7d26ceb", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "ty", + "source_mapping": { + "start": 6351, + "length": 12, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [171], + "starting_column": 13, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryStore", + "source_mapping": { + "start": 6107, + "length": 3663, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryStore(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).ty (src/osp/OneStepProverMemory.sol#171) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).ty](src/osp/OneStepProverMemory.sol#L171) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L171", + "id": "565f5e19fbe1a69065e4ef47ec789739a56008570ac09324d5995e298652f2be", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "ty", + "source_mapping": { + "start": 1158, + "length": 12, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [44], + "starting_column": 9, + "ending_column": 21 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeConstPush", + "source_mapping": { + "start": 954, + "length": 732, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeConstPush(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProver0.executeConstPush(Machine,Module,Instruction,bytes).ty (src/osp/OneStepProver0.sol#44) is a local variable never initialized\n", + "markdown": "[OneStepProver0.executeConstPush(Machine,Module,Instruction,bytes).ty](src/osp/OneStepProver0.sol#L44) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProver0.sol#L44", + "id": "f3a4bd8740f9565ecd548a3027588ef6a9ab1fab50a47ee9989dff0a450c0d81", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "emptyGlobalState", + "source_mapping": { + "start": 3120, + "length": 35, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [78], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createInitialNode", + "source_mapping": { + "start": 3046, + "length": 662, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupAdminLogic", + "source_mapping": { + "start": 590, + "length": 14555, + "filename_relative": "src/rollup/RollupAdminLogic.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupAdminLogic.sol", + "filename_short": "src/rollup/RollupAdminLogic.sol", + "is_dependency": false, + "lines": [ + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createInitialNode()" + } + } + } + } + ], + "description": "RollupAdminLogic.createInitialNode().emptyGlobalState (src/rollup/RollupAdminLogic.sol#78) is a local variable never initialized\n", + "markdown": "[RollupAdminLogic.createInitialNode().emptyGlobalState](src/rollup/RollupAdminLogic.sol#L78) is a local variable never initialized\n", + "first_markdown_element": "src/rollup/RollupAdminLogic.sol#L78", + "id": "b104a1c9b21db741f0eff33cad88bcd28b01251cf7cb2ac69372f55f19cc56b2", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "lastProvedLeafContents", + "source_mapping": { + "start": 4304, + "length": 30, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [121], + "starting_column": 9, + "ending_column": 39 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).lastProvedLeafContents (src/osp/OneStepProverMemory.sol#121) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).lastProvedLeafContents](src/osp/OneStepProverMemory.sol#L121) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L121", + "id": "162cb33b9534bc21104309b21e51a798ebe240718727aed3b174e3802daec4c1", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "bytes32Vals", + "source_mapping": { + "start": 6885, + "length": 29, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [225], + "starting_column": 9, + "ending_column": 38 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "globalState", + "source_mapping": { + "start": 6617, + "length": 684, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Deserialize", + "source_mapping": { + "start": 450, + "length": 9161, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "globalState(bytes,uint256)" + } + } + } + } + ], + "description": "Deserialize.globalState(bytes,uint256).bytes32Vals (src/state/Deserialize.sol#225) is a local variable never initialized\n", + "markdown": "[Deserialize.globalState(bytes,uint256).bytes32Vals](src/state/Deserialize.sol#L225) is a local variable never initialized\n", + "first_markdown_element": "src/state/Deserialize.sol#L225", + "id": "347c23c28d92854b0181184cb13878043e27048bb6b0d14e6f9f24d733477f80", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "status", + "source_mapping": { + "start": 7495, + "length": 20, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [243], + "starting_column": 9, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "machine", + "source_mapping": { + "start": 7307, + "length": 1811, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "Deserialize", + "source_mapping": { + "start": 450, + "length": 9161, + "filename_relative": "src/state/Deserialize.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/state/Deserialize.sol", + "filename_short": "src/state/Deserialize.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "machine(bytes,uint256)" + } + } + } + } + ], + "description": "Deserialize.machine(bytes,uint256).status (src/state/Deserialize.sol#243) is a local variable never initialized\n", + "markdown": "[Deserialize.machine(bytes,uint256).status](src/state/Deserialize.sol#L243) is a local variable never initialized\n", + "first_markdown_element": "src/state/Deserialize.sol#L243", + "id": "b0bb66b3aaa5e859564fcf69ddd9c518a2dff55461b2e23469e57954ece88023", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "sourceTy", + "source_mapping": { + "start": 13504, + "length": 18, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [443], + "starting_column": 9, + "ending_column": 27 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeReinterpret", + "source_mapping": { + "start": 13309, + "length": 1048, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMath", + "source_mapping": { + "start": 362, + "length": 16325, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReinterpret(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMath.executeReinterpret(Machine,Module,Instruction,bytes).sourceTy (src/osp/OneStepProverMath.sol#443) is a local variable never initialized\n", + "markdown": "[OneStepProverMath.executeReinterpret(Machine,Module,Instruction,bytes).sourceTy](src/osp/OneStepProverMath.sol#L443) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMath.sol#L443", + "id": "19cc2967641f968047d8174e2ba3152038af798b63c42b1bb55dd59287a923a7", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "writeBytes", + "source_mapping": { + "start": 6286, + "length": 17, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [168], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryStore", + "source_mapping": { + "start": 6107, + "length": 3663, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryStore(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).writeBytes (src/osp/OneStepProverMemory.sol#168) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).writeBytes](src/osp/OneStepProverMemory.sol#L168) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L168", + "id": "f573681c354f3fdccf310c43fad70c2f0994cf3b3de20432e01071bd6a3981de", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "destTy", + "source_mapping": { + "start": 13478, + "length": 16, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [442], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeReinterpret", + "source_mapping": { + "start": 13309, + "length": 1048, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMath", + "source_mapping": { + "start": 362, + "length": 16325, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeReinterpret(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMath.executeReinterpret(Machine,Module,Instruction,bytes).destTy (src/osp/OneStepProverMath.sol#442) is a local variable never initialized\n", + "markdown": "[OneStepProverMath.executeReinterpret(Machine,Module,Instruction,bytes).destTy](src/osp/OneStepProverMath.sol#L442) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMath.sol#L442", + "id": "0c40a87502e42085a3fc0a61f202e687aed2386c6fe161376f0f0b2f16a4c9c5", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "ty", + "source_mapping": { + "start": 11999, + "length": 12, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [399], + "starting_column": 9, + "ending_column": 21 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeExtendSameType", + "source_mapping": { + "start": 11827, + "length": 1476, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMath", + "source_mapping": { + "start": 362, + "length": 16325, + "filename_relative": "src/osp/OneStepProverMath.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMath.sol", + "filename_short": "src/osp/OneStepProverMath.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeExtendSameType(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMath.executeExtendSameType(Machine,Module,Instruction,bytes).ty (src/osp/OneStepProverMath.sol#399) is a local variable never initialized\n", + "markdown": "[OneStepProverMath.executeExtendSameType(Machine,Module,Instruction,bytes).ty](src/osp/OneStepProverMath.sol#L399) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMath.sol#L399", + "id": "d5801e7c2f23eb0d6bc004590ab2e75879037d149be714c34ab3b066e1c4b819", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "readBytes", + "source_mapping": { + "start": 1707, + "length": 17, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [50], + "starting_column": 9, + "ending_column": 26 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).readBytes (src/osp/OneStepProverMemory.sol#50) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes).readBytes](src/osp/OneStepProverMemory.sol#L50) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L50", + "id": "09c1e38d961440cc644e890e7e165ecd2073dd96901441ae9b2b9c939257cc6f", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "frame", + "source_mapping": { + "start": 1824, + "length": 28, + "filename_relative": "src/rollup/BridgeCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/BridgeCreator.sol", + "filename_short": "src/rollup/BridgeCreator.sol", + "is_dependency": false, + "lines": [58], + "starting_column": 9, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_createBridge", + "source_mapping": { + "start": 1674, + "length": 1017, + "filename_relative": "src/rollup/BridgeCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/BridgeCreator.sol", + "filename_short": "src/rollup/BridgeCreator.sol", + "is_dependency": false, + "lines": [ + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "BridgeCreator", + "source_mapping": { + "start": 676, + "length": 3074, + "filename_relative": "src/rollup/BridgeCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/BridgeCreator.sol", + "filename_short": "src/rollup/BridgeCreator.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_createBridge(address,BridgeCreator.BridgeContracts)" + } + } + } + } + ], + "description": "BridgeCreator._createBridge(address,BridgeCreator.BridgeContracts).frame (src/rollup/BridgeCreator.sol#58) is a local variable never initialized\n", + "markdown": "[BridgeCreator._createBridge(address,BridgeCreator.BridgeContracts).frame](src/rollup/BridgeCreator.sol#L58) is a local variable never initialized\n", + "first_markdown_element": "src/rollup/BridgeCreator.sol#L58", + "id": "4c4998aea345771ab95ff74b35dc261d24cfbcc254dff7368e71dcded4e6b088", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "impl", + "source_mapping": { + "start": 14921, + "length": 120, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [444, 445, 446], + "starting_column": 9, + "ending_column": 22 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeOneStep", + "source_mapping": { + "start": 14550, + "length": 2514, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProver0.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl (src/osp/OneStepProver0.sol#444-446) is a local variable never initialized\n", + "markdown": "[OneStepProver0.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl](src/osp/OneStepProver0.sol#L444-L446) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProver0.sol#L444-L446", + "id": "bf9df19313618417269a105ecd5b4cf0c22530264701877ed554d77b7886b033", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "impl", + "source_mapping": { + "start": 16165, + "length": 193, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [425, 426, 427, 428, 429, 430, 431], + "starting_column": 9, + "ending_column": 29 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeOneStep", + "source_mapping": { + "start": 15786, + "length": 1210, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl (src/osp/OneStepProverHostIo.sol#425-431) is a local variable never initialized\n", + "markdown": "[OneStepProverHostIo.executeOneStep(ExecutionContext,Machine,Module,Instruction,bytes).impl](src/osp/OneStepProverHostIo.sol#L425-L431) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L425-L431", + "id": "fd4baa84dfad7402f9c850b2abb8c959fa89f0a0f27d7a4d985504eafa596460", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "node", + "source_mapping": { + "start": 2394, + "length": 16, + "filename_relative": "src/rollup/Node.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/Node.sol", + "filename_short": "src/rollup/Node.sol", + "is_dependency": false, + "lines": [69], + "starting_column": 9, + "ending_column": 25 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createNode", + "source_mapping": { + "start": 2149, + "length": 636, + "filename_relative": "src/rollup/Node.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/Node.sol", + "filename_short": "src/rollup/Node.sol", + "is_dependency": false, + "lines": [ + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "NodeLib", + "source_mapping": { + "start": 1752, + "length": 2186, + "filename_relative": "src/rollup/Node.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/Node.sol", + "filename_short": "src/rollup/Node.sol", + "is_dependency": false, + "lines": [ + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createNode(bytes32,bytes32,bytes32,uint64,uint64,bytes32)" + } + } + } + } + ], + "description": "NodeLib.createNode(bytes32,bytes32,bytes32,uint64,uint64,bytes32).node (src/rollup/Node.sol#69) is a local variable never initialized\n", + "markdown": "[NodeLib.createNode(bytes32,bytes32,bytes32,uint64,uint64,bytes32).node](src/rollup/Node.sol#L69) is a local variable never initialized\n", + "first_markdown_element": "src/rollup/Node.sol#L69", + "id": "2fbc6226a17bd364563caa94e1c97858f74f9cd682e6c1096bb46cf3ce114daf", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "lastProvedMerkle", + "source_mapping": { + "start": 8359, + "length": 35, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [220], + "starting_column": 9, + "ending_column": 44 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryStore", + "source_mapping": { + "start": 6107, + "length": 3663, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryStore(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).lastProvedMerkle (src/osp/OneStepProverMemory.sol#220) is a local variable never initialized\n", + "markdown": "[OneStepProverMemory.executeMemoryStore(Machine,Module,Instruction,bytes).lastProvedMerkle](src/osp/OneStepProverMemory.sol#L220) is a local variable never initialized\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L220", + "id": "970df6569838c064f8c23181f94aa7553a41b5a23c53e802d29cd0162f7d4f2b", + "check": "uninitialized-local", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "initialize", + "source_mapping": { + "start": 969, + "length": 447, + "filename_relative": "src/bridge/ERC20Inbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/ERC20Inbox.sol", + "filename_short": "src/bridge/ERC20Inbox.sol", + "is_dependency": false, + "lines": [27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20Inbox", + "source_mapping": { + "start": 789, + "length": 4172, + "filename_relative": "src/bridge/ERC20Inbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/ERC20Inbox.sol", + "filename_short": "src/bridge/ERC20Inbox.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "initialize(IBridge,ISequencerInbox)" + } + }, + { + "type": "node", + "name": "IERC20(nativeToken).approve(address(bridge),type()(uint256).max)", + "source_mapping": { + "start": 1346, + "length": 63, + "filename_relative": "src/bridge/ERC20Inbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/ERC20Inbox.sol", + "filename_short": "src/bridge/ERC20Inbox.sol", + "is_dependency": false, + "lines": [36], + "starting_column": 9, + "ending_column": 72 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "initialize", + "source_mapping": { + "start": 969, + "length": 447, + "filename_relative": "src/bridge/ERC20Inbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/ERC20Inbox.sol", + "filename_short": "src/bridge/ERC20Inbox.sol", + "is_dependency": false, + "lines": [27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "ERC20Inbox", + "source_mapping": { + "start": 789, + "length": 4172, + "filename_relative": "src/bridge/ERC20Inbox.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/ERC20Inbox.sol", + "filename_short": "src/bridge/ERC20Inbox.sol", + "is_dependency": false, + "lines": [ + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "initialize(IBridge,ISequencerInbox)" + } + } + } + } + ], + "description": "ERC20Inbox.initialize(IBridge,ISequencerInbox) (src/bridge/ERC20Inbox.sol#27-37) ignores return value by IERC20(nativeToken).approve(address(bridge),type()(uint256).max) (src/bridge/ERC20Inbox.sol#36)\n", + "markdown": "[ERC20Inbox.initialize(IBridge,ISequencerInbox)](src/bridge/ERC20Inbox.sol#L27-L37) ignores return value by [IERC20(nativeToken).approve(address(bridge),type()(uint256).max)](src/bridge/ERC20Inbox.sol#L36)\n", + "first_markdown_element": "src/bridge/ERC20Inbox.sol#L27-L37", + "id": "02a7ce9e0718ec474776a6c6466ec2120335f60d5d537c682d2d0b48b02e328e", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "refundsGas", + "source_mapping": { + "start": 721, + "length": 2143, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefundEnabled", + "source_mapping": { + "start": 309, + "length": 2557, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "refundsGas(IGasRefunder,IReader4844)" + } + }, + { + "type": "node", + "name": "gasRefunder.onGasSpent(address(msg.sender),startGasLeft - gasleft()(),calldataSize)", + "source_mapping": { + "start": 2764, + "length": 83, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [49], + "starting_column": 13, + "ending_column": 96 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "refundsGas", + "source_mapping": { + "start": 721, + "length": 2143, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "GasRefundEnabled", + "source_mapping": { + "start": 309, + "length": 2557, + "filename_relative": "src/libraries/GasRefundEnabled.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/GasRefundEnabled.sol", + "filename_short": "src/libraries/GasRefundEnabled.sol", + "is_dependency": false, + "lines": [ + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "refundsGas(IGasRefunder,IReader4844)" + } + } + } + } + ], + "description": "GasRefundEnabled.refundsGas(IGasRefunder,IReader4844) (src/libraries/GasRefundEnabled.sol#17-51) ignores return value by gasRefunder.onGasSpent(address(msg.sender),startGasLeft - gasleft()(),calldataSize) (src/libraries/GasRefundEnabled.sol#49)\n", + "markdown": "[GasRefundEnabled.refundsGas(IGasRefunder,IReader4844)](src/libraries/GasRefundEnabled.sol#L17-L51) ignores return value by [gasRefunder.onGasSpent(address(msg.sender),startGasLeft - gasleft()(),calldataSize)](src/libraries/GasRefundEnabled.sol#L49)\n", + "first_markdown_element": "src/libraries/GasRefundEnabled.sol#L17-L51", + "id": "dd7d7f9070537fa235923aa2a3f52a440202d201a28033828f3cfb6418df3676", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "executeDrop", + "source_mapping": { + "start": 1692, + "length": 185, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [60, 61, 62, 63, 64, 65, 66, 67], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeDrop(Machine,Module,Instruction,bytes)" + } + }, + { + "type": "node", + "name": "mach.valueStack.pop()", + "source_mapping": { + "start": 1849, + "length": 21, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [66], + "starting_column": 9, + "ending_column": 30 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeDrop", + "source_mapping": { + "start": 1692, + "length": 185, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [60, 61, 62, 63, 64, 65, 66, 67], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeDrop(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProver0.executeDrop(Machine,Module,Instruction,bytes) (src/osp/OneStepProver0.sol#60-67) ignores return value by mach.valueStack.pop() (src/osp/OneStepProver0.sol#66)\n", + "markdown": "[OneStepProver0.executeDrop(Machine,Module,Instruction,bytes)](src/osp/OneStepProver0.sol#L60-L67) ignores return value by [mach.valueStack.pop()](src/osp/OneStepProver0.sol#L66)\n", + "first_markdown_element": "src/osp/OneStepProver0.sol#L60-L67", + "id": "12bf5611aeaa1ce8c4037f42705c38eef1245905dff7bc27604a5c8290de634b", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "validateSequencerInbox", + "source_mapping": { + "start": 10080, + "length": 884, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateSequencerInbox(ExecutionContext,uint64,bytes)" + } + }, + { + "type": "node", + "name": "(afterDelayedMsg,None) = Deserialize.u64(message,32)", + "source_mapping": { + "start": 10365, + "length": 50, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [255], + "starting_column": 9, + "ending_column": 59 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "validateSequencerInbox", + "source_mapping": { + "start": 10080, + "length": 884, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateSequencerInbox(ExecutionContext,uint64,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes) (src/osp/OneStepProverHostIo.sol#247-269) ignores return value by (afterDelayedMsg,None) = Deserialize.u64(message,32) (src/osp/OneStepProverHostIo.sol#255)\n", + "markdown": "[OneStepProverHostIo.validateSequencerInbox(ExecutionContext,uint64,bytes)](src/osp/OneStepProverHostIo.sol#L247-L269) ignores return value by [(afterDelayedMsg,None) = Deserialize.u64(message,32)](src/osp/OneStepProverHostIo.sol#L255)\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L247-L269", + "id": "8e9dac288df9bcd5afd57ce5afd7d08f223411c09b70bf9486fbdce8c99e8a4e", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "validateDelayedInbox", + "source_mapping": { + "start": 10970, + "length": 916, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateDelayedInbox(ExecutionContext,uint64,bytes)" + } + }, + { + "type": "node", + "name": "(sender,None) = Deserialize.u256(message,1)", + "source_mapping": { + "start": 11493, + "length": 41, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [287], + "starting_column": 9, + "ending_column": 50 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "validateDelayedInbox", + "source_mapping": { + "start": 10970, + "length": 916, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverHostIo", + "source_mapping": { + "start": 433, + "length": 16565, + "filename_relative": "src/osp/OneStepProverHostIo.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverHostIo.sol", + "filename_short": "src/osp/OneStepProverHostIo.sol", + "is_dependency": false, + "lines": [ + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "validateDelayedInbox(ExecutionContext,uint64,bytes)" + } + } + } + } + ], + "description": "OneStepProverHostIo.validateDelayedInbox(ExecutionContext,uint64,bytes) (src/osp/OneStepProverHostIo.sol#271-296) ignores return value by (sender,None) = Deserialize.u256(message,1) (src/osp/OneStepProverHostIo.sol#287)\n", + "markdown": "[OneStepProverHostIo.validateDelayedInbox(ExecutionContext,uint64,bytes)](src/osp/OneStepProverHostIo.sol#L271-L296) ignores return value by [(sender,None) = Deserialize.u256(message,1)](src/osp/OneStepProverHostIo.sol#L287)\n", + "first_markdown_element": "src/osp/OneStepProverHostIo.sol#L271-L296", + "id": "06e60ad1cf7b2c761d007d2174aab9de589f5fb917c2547582fac31386b8bf17", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + }, + { + "type": "node", + "name": "(lastProvedLeafContents,proofOffset,None) = ModuleMemoryLib.proveLeaf(mod.moduleMemory,leafIdx,proof,proofOffset)", + "source_mapping": { + "start": 4658, + "length": 212, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [128, 129, 130, 131, 132, 133], + "starting_column": 17, + "ending_column": 18 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeMemoryLoad", + "source_mapping": { + "start": 1507, + "length": 4594, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProverMemory", + "source_mapping": { + "start": 368, + "length": 11469, + "filename_relative": "src/osp/OneStepProverMemory.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProverMemory.sol", + "filename_short": "src/osp/OneStepProverMemory.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeMemoryLoad(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes) (src/osp/OneStepProverMemory.sol#43-160) ignores return value by (lastProvedLeafContents,proofOffset,None) = ModuleMemoryLib.proveLeaf(mod.moduleMemory,leafIdx,proof,proofOffset) (src/osp/OneStepProverMemory.sol#128-133)\n", + "markdown": "[OneStepProverMemory.executeMemoryLoad(Machine,Module,Instruction,bytes)](src/osp/OneStepProverMemory.sol#L43-L160) ignores return value by [(lastProvedLeafContents,proofOffset,None) = ModuleMemoryLib.proveLeaf(mod.moduleMemory,leafIdx,proof,proofOffset)](src/osp/OneStepProverMemory.sol#L128-L133)\n", + "first_markdown_element": "src/osp/OneStepProverMemory.sol#L43-L160", + "id": "ab8910cb7fbab9ad8b4fcabf66567df3327f36c637f318ceaf3df0ea258b2a1d", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + }, + { + "type": "node", + "name": "IERC20Inbox(inbox).createRetryableTicket({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,tokenTotalFeeAmount:feeAmount,data:})", + "source_mapping": { + "start": 9018, + "length": 434, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72], + "starting_column": 13, + "ending_column": 15 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + } + } + } + ], + "description": "DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256) (src/rollup/DeployHelper.sol#46-87) ignores return value by IERC20Inbox(inbox).createRetryableTicket({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,tokenTotalFeeAmount:feeAmount,data:}) (src/rollup/DeployHelper.sol#62-72)\n", + "markdown": "[DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256)](src/rollup/DeployHelper.sol#L46-L87) ignores return value by [IERC20Inbox(inbox).createRetryableTicket({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,tokenTotalFeeAmount:feeAmount,data:})](src/rollup/DeployHelper.sol#L62-L72)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L46-L87", + "id": "b577066c87e9c3fd8db423a41c6f80870945020f8f55d5dd38041b1894b9af5a", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + }, + { + "type": "node", + "name": "IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:})", + "source_mapping": { + "start": 9483, + "length": 399, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [74, 75, 76, 77, 78, 79, 80, 81, 82, 83], + "starting_column": 13, + "ending_column": 15 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + } + } + } + ], + "description": "DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256) (src/rollup/DeployHelper.sol#46-87) ignores return value by IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:}) (src/rollup/DeployHelper.sol#74-83)\n", + "markdown": "[DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256)](src/rollup/DeployHelper.sol#L46-L87) ignores return value by [IInbox(inbox).createRetryableTicket{value: feeAmount}({to:_l2Address,l2CallValue:_value,maxSubmissionCost:submissionCost,excessFeeRefundAddress:msg.sender,callValueRefundAddress:msg.sender,gasLimit:GASLIMIT,maxFeePerGas:maxFeePerGas,data:})](src/rollup/DeployHelper.sol#L74-L83)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L46-L87", + "id": "08d31a6c6d79a1ee2e015f8b5e35c4ed5b9293c91824de95a577f6e382ac73bd", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + }, + { + "type": "node", + "name": "IInboxBase(inbox).sendL2Message(payload)", + "source_mapping": { + "start": 9959, + "length": 40, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [86], + "starting_column": 9, + "ending_column": 49 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_fundAndDeploy", + "source_mapping": { + "start": 8513, + "length": 1493, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DeployHelper", + "source_mapping": { + "start": 513, + "length": 11093, + "filename_relative": "src/rollup/DeployHelper.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/DeployHelper.sol", + "filename_short": "src/rollup/DeployHelper.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_fundAndDeploy(address,uint256,address,bytes,bool,uint256)" + } + } + } + } + ], + "description": "DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256) (src/rollup/DeployHelper.sol#46-87) ignores return value by IInboxBase(inbox).sendL2Message(payload) (src/rollup/DeployHelper.sol#86)\n", + "markdown": "[DeployHelper._fundAndDeploy(address,uint256,address,bytes,bool,uint256)](src/rollup/DeployHelper.sol#L46-L87) ignores return value by [IInboxBase(inbox).sendL2Message(payload)](src/rollup/DeployHelper.sol#L86)\n", + "first_markdown_element": "src/rollup/DeployHelper.sol#L46-L87", + "id": "b4a84cbb13a9ec2260cb5bdf5bf9641492e27e04195d23e819c7abac1a906e14", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "_upgradeSecondaryToAndCall", + "source_mapping": { + "start": 2306, + "length": 313, + "filename_relative": "src/libraries/AdminFallbackProxy.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/AdminFallbackProxy.sol", + "filename_short": "src/libraries/AdminFallbackProxy.sol", + "is_dependency": false, + "lines": [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DoubleLogicERC1967Upgrade", + "source_mapping": { + "start": 525, + "length": 3364, + "filename_relative": "src/libraries/AdminFallbackProxy.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/AdminFallbackProxy.sol", + "filename_short": "src/libraries/AdminFallbackProxy.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_upgradeSecondaryToAndCall(address,bytes,bool)" + } + }, + { + "type": "node", + "name": "Address.functionDelegateCall(newImplementation,data)", + "source_mapping": { + "start": 2549, + "length": 53, + "filename_relative": "src/libraries/AdminFallbackProxy.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/AdminFallbackProxy.sol", + "filename_short": "src/libraries/AdminFallbackProxy.sol", + "is_dependency": false, + "lines": [67], + "starting_column": 13, + "ending_column": 66 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "_upgradeSecondaryToAndCall", + "source_mapping": { + "start": 2306, + "length": 313, + "filename_relative": "src/libraries/AdminFallbackProxy.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/AdminFallbackProxy.sol", + "filename_short": "src/libraries/AdminFallbackProxy.sol", + "is_dependency": false, + "lines": [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "DoubleLogicERC1967Upgrade", + "source_mapping": { + "start": 525, + "length": 3364, + "filename_relative": "src/libraries/AdminFallbackProxy.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/libraries/AdminFallbackProxy.sol", + "filename_short": "src/libraries/AdminFallbackProxy.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "_upgradeSecondaryToAndCall(address,bytes,bool)" + } + } + } + } + ], + "description": "DoubleLogicERC1967Upgrade._upgradeSecondaryToAndCall(address,bytes,bool) (src/libraries/AdminFallbackProxy.sol#60-69) ignores return value by Address.functionDelegateCall(newImplementation,data) (src/libraries/AdminFallbackProxy.sol#67)\n", + "markdown": "[DoubleLogicERC1967Upgrade._upgradeSecondaryToAndCall(address,bytes,bool)](src/libraries/AdminFallbackProxy.sol#L60-L69) ignores return value by [Address.functionDelegateCall(newImplementation,data)](src/libraries/AdminFallbackProxy.sol#L67)\n", + "first_markdown_element": "src/libraries/AdminFallbackProxy.sol#L60-L69", + "id": "47e0b452924c566df231e1282a84ce0091600869b7eac2442aebf277bfcb6455", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "createRollup", + "source_mapping": { + "start": 4904, + "length": 5018, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createRollup(RollupCreator.RollupDeploymentParams)" + } + }, + { + "type": "node", + "name": "(ethSequencerInbox,ethInbox) = bridgeCreator.ethBasedTemplates()", + "source_mapping": { + "start": 5121, + "length": 115, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [117, 118], + "starting_column": 13, + "ending_column": 37 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createRollup", + "source_mapping": { + "start": 4904, + "length": 5018, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createRollup(RollupCreator.RollupDeploymentParams)" + } + } + } + } + ], + "description": "RollupCreator.createRollup(RollupCreator.RollupDeploymentParams) (src/rollup/RollupCreator.sol#110-233) ignores return value by (ethSequencerInbox,ethInbox) = bridgeCreator.ethBasedTemplates() (src/rollup/RollupCreator.sol#117-118)\n", + "markdown": "[RollupCreator.createRollup(RollupCreator.RollupDeploymentParams)](src/rollup/RollupCreator.sol#L110-L233) ignores return value by [(ethSequencerInbox,ethInbox) = bridgeCreator.ethBasedTemplates()](src/rollup/RollupCreator.sol#L117-L118)\n", + "first_markdown_element": "src/rollup/RollupCreator.sol#L110-L233", + "id": "ab1f7532bdfa2da03ac0035addb1594f2610bdbf697232a9b6207e2345bfd5a7", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "function", + "name": "createRollup", + "source_mapping": { + "start": 4904, + "length": 5018, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createRollup(RollupCreator.RollupDeploymentParams)" + } + }, + { + "type": "node", + "name": "(erc20SequencerInbox,erc20Inbox) = bridgeCreator.erc20BasedTemplates()", + "source_mapping": { + "start": 5509, + "length": 121, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [125, 126], + "starting_column": 13, + "ending_column": 39 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "createRollup", + "source_mapping": { + "start": 4904, + "length": 5018, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "RollupCreator", + "source_mapping": { + "start": 703, + "length": 11028, + "filename_relative": "src/rollup/RollupCreator.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/rollup/RollupCreator.sol", + "filename_short": "src/rollup/RollupCreator.sol", + "is_dependency": false, + "lines": [ + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "createRollup(RollupCreator.RollupDeploymentParams)" + } + } + } + } + ], + "description": "RollupCreator.createRollup(RollupCreator.RollupDeploymentParams) (src/rollup/RollupCreator.sol#110-233) ignores return value by (erc20SequencerInbox,erc20Inbox) = bridgeCreator.erc20BasedTemplates() (src/rollup/RollupCreator.sol#125-126)\n", + "markdown": "[RollupCreator.createRollup(RollupCreator.RollupDeploymentParams)](src/rollup/RollupCreator.sol#L110-L233) ignores return value by [(erc20SequencerInbox,erc20Inbox) = bridgeCreator.erc20BasedTemplates()](src/rollup/RollupCreator.sol#L125-L126)\n", + "first_markdown_element": "src/rollup/RollupCreator.sol#L110-L233", + "id": "66c2e2cbe1d68bc0695a2c75ad2b2ad0c7a15d7d1455bb4ae31a64aeece91d52", + "check": "unused-return", + "impact": "Medium", + "confidence": "Medium" + }, + { + "elements": [ + { + "type": "variable", + "name": "_activeOutbox", + "source_mapping": { + "start": 1410, + "length": 30, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [45], + "starting_column": 5, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsBridge", + "source_mapping": { + "start": 995, + "length": 9716, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [ + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308 + ], + "starting_column": 1, + "ending_column": 2 + } + } + } + }, + { + "type": "node", + "name": "_activeOutbox = msg.sender", + "source_mapping": { + "start": 6961, + "length": 26, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [218], + "starting_column": 9, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCall", + "source_mapping": { + "start": 6606, + "length": 870, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [ + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsBridge", + "source_mapping": { + "start": 995, + "length": 9716, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [ + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCall(address,uint256,bytes)" + } + } + } + }, + { + "type": "node", + "name": "_activeOutbox = prevOutbox", + "source_mapping": { + "start": 7380, + "length": 26, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [225], + "starting_column": 9, + "ending_column": 35 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCall", + "source_mapping": { + "start": 6606, + "length": 870, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [ + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "AbsBridge", + "source_mapping": { + "start": 995, + "length": 9716, + "filename_relative": "src/bridge/AbsBridge.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/bridge/AbsBridge.sol", + "filename_short": "src/bridge/AbsBridge.sol", + "is_dependency": false, + "lines": [ + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCall(address,uint256,bytes)" + } + } + } + } + ], + "description": "AbsBridge._activeOutbox (src/bridge/AbsBridge.sol#45) is written in both\n\t_activeOutbox = msg.sender (src/bridge/AbsBridge.sol#218)\n\t_activeOutbox = prevOutbox (src/bridge/AbsBridge.sol#225)\n", + "markdown": "[AbsBridge._activeOutbox](src/bridge/AbsBridge.sol#L45) is written in both\n\t[_activeOutbox = msg.sender](src/bridge/AbsBridge.sol#L218)\n\t[_activeOutbox = prevOutbox](src/bridge/AbsBridge.sol#L225)\n", + "first_markdown_element": "src/bridge/AbsBridge.sol#L45", + "id": "b37c58023a3ec214b040ae7619219597fa970084995f29f74c24648d6f1ba59f", + "check": "write-after-write", + "impact": "Medium", + "confidence": "High" + }, + { + "elements": [ + { + "type": "variable", + "name": "offset", + "source_mapping": { + "start": 6391, + "length": 18, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [201], + "starting_column": 13, + "ending_column": 31 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCallIndirect", + "source_mapping": { + "start": 5971, + "length": 3565, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCallIndirect(Machine,Module,Instruction,bytes)" + } + } + } + }, + { + "type": "node", + "name": "(elemFuncTypeHash,offset) = Deserialize.b32(proof,offset)", + "source_mapping": { + "start": 7998, + "length": 59, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [237], + "starting_column": 13, + "ending_column": 72 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCallIndirect", + "source_mapping": { + "start": 5971, + "length": 3565, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCallIndirect(Machine,Module,Instruction,bytes)" + } + } + } + }, + { + "type": "node", + "name": "(functionPointer,offset) = Deserialize.value(proof,offset)", + "source_mapping": { + "start": 8071, + "length": 60, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [238], + "starting_column": 13, + "ending_column": 73 + }, + "type_specific_fields": { + "parent": { + "type": "function", + "name": "executeCallIndirect", + "source_mapping": { + "start": 5971, + "length": 3565, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274 + ], + "starting_column": 5, + "ending_column": 6 + }, + "type_specific_fields": { + "parent": { + "type": "contract", + "name": "OneStepProver0", + "source_mapping": { + "start": 362, + "length": 16704, + "filename_relative": "src/osp/OneStepProver0.sol", + "filename_absolute": "/Users/goran/repos/offchain/nitro-contracts/src/osp/OneStepProver0.sol", + "filename_short": "src/osp/OneStepProver0.sol", + "is_dependency": false, + "lines": [ + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494 + ], + "starting_column": 1, + "ending_column": 2 + } + }, + "signature": "executeCallIndirect(Machine,Module,Instruction,bytes)" + } + } + } + } + ], + "description": "OneStepProver0.executeCallIndirect(Machine,Module,Instruction,bytes).offset (src/osp/OneStepProver0.sol#201) is written in both\n\t(elemFuncTypeHash,offset) = Deserialize.b32(proof,offset) (src/osp/OneStepProver0.sol#237)\n\t(functionPointer,offset) = Deserialize.value(proof,offset) (src/osp/OneStepProver0.sol#238)\n", + "markdown": "[OneStepProver0.executeCallIndirect(Machine,Module,Instruction,bytes).offset](src/osp/OneStepProver0.sol#L201) is written in both\n\t[(elemFuncTypeHash,offset) = Deserialize.b32(proof,offset)](src/osp/OneStepProver0.sol#L237)\n\t[(functionPointer,offset) = Deserialize.value(proof,offset)](src/osp/OneStepProver0.sol#L238)\n", + "first_markdown_element": "src/osp/OneStepProver0.sol#L201", + "id": "a2b254b166a5aad9092374dafd67aae05d0d84bd0d8079074f9addfc91926e56", + "check": "write-after-write", + "impact": "Medium", + "confidence": "High" + } +] diff --git a/src/bridge/AbsBridge.sol b/src/bridge/AbsBridge.sol new file mode 100644 index 00000000..bafd56f9 --- /dev/null +++ b/src/bridge/AbsBridge.sol @@ -0,0 +1,308 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; + +import { + NotContract, + NotRollupOrOwner, + NotDelayedInbox, + NotSequencerInbox, + NotOutbox, + InvalidOutboxSet, + BadSequencerMessageNumber +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./Messages.sol"; +import "../libraries/DelegateCallAware.sol"; + +import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Holds the inbox accumulator for sequenced and delayed messages. + * Since the escrow is held here, this contract also contains a list of allowed + * outboxes that can make calls from here and withdraw this escrow. + */ +abstract contract AbsBridge is Initializable, DelegateCallAware, IBridge { + using AddressUpgradeable for address; + + struct InOutInfo { + uint256 index; + bool allowed; + } + + mapping(address => InOutInfo) private allowedDelayedInboxesMap; + mapping(address => InOutInfo) private allowedOutboxesMap; + + address[] public allowedDelayedInboxList; + address[] public allowedOutboxList; + + address internal _activeOutbox; + + /// @inheritdoc IBridge + bytes32[] public delayedInboxAccs; + + /// @inheritdoc IBridge + bytes32[] public sequencerInboxAccs; + + IOwnable public rollup; + address public sequencerInbox; + + uint256 public override sequencerReportedSubMessageCount; + + address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); + + modifier onlyRollupOrOwner() { + if (msg.sender != address(rollup)) { + address rollupOwner = rollup.owner(); + if (msg.sender != rollupOwner) { + revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); + } + } + _; + } + + /// @notice Allows the rollup owner to set another rollup address + function updateRollupAddress(IOwnable _rollup) external onlyRollupOrOwner { + rollup = _rollup; + emit RollupUpdated(address(_rollup)); + } + + /// @dev returns the address of current active Outbox, or zero if no outbox is active + function activeOutbox() public view returns (address) { + address outbox = _activeOutbox; + // address zero is returned if no outbox is set, but the value used in storage + // is non-zero to save users some gas (as storage refunds are usually maxed out) + // EIP-1153 would help here. + // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api + if (outbox == EMPTY_ACTIVEOUTBOX) return address(0); + return outbox; + } + + function allowedDelayedInboxes(address inbox) public view returns (bool) { + return allowedDelayedInboxesMap[inbox].allowed; + } + + function allowedOutboxes(address outbox) public view returns (bool) { + return allowedOutboxesMap[outbox].allowed; + } + + modifier onlySequencerInbox() { + if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender); + _; + } + + function enqueueSequencerMessage( + bytes32 dataHash, + uint256 afterDelayedMessagesRead, + uint256 prevMessageCount, + uint256 newMessageCount + ) + external + onlySequencerInbox + returns ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 acc + ) + { + if ( + sequencerReportedSubMessageCount != prevMessageCount && + prevMessageCount != 0 && + sequencerReportedSubMessageCount != 0 + ) { + revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); + } + sequencerReportedSubMessageCount = newMessageCount; + seqMessageIndex = sequencerInboxAccs.length; + if (sequencerInboxAccs.length > 0) { + beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; + } + if (afterDelayedMessagesRead > 0) { + delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; + } + acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + sequencerInboxAccs.push(acc); + } + + /// @inheritdoc IBridge + function submitBatchSpendingReport(address sender, bytes32 messageDataHash) + external + onlySequencerInbox + returns (uint256) + { + return + addMessageToDelayedAccumulator( + L1MessageType_batchPostingReport, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time, + block.basefee, + messageDataHash + ); + } + + function _enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 amount + ) internal returns (uint256) { + if (!allowedDelayedInboxes(msg.sender)) revert NotDelayedInbox(msg.sender); + + uint256 messageCount = addMessageToDelayedAccumulator( + kind, + sender, + uint64(block.number), + uint64(block.timestamp), // solhint-disable-line not-rely-on-time + _baseFeeToReport(), + messageDataHash + ); + + _transferFunds(amount); + + return messageCount; + } + + function addMessageToDelayedAccumulator( + uint8 kind, + address sender, + uint64 blockNumber, + uint64 blockTimestamp, + uint256 baseFeeL1, + bytes32 messageDataHash + ) internal returns (uint256) { + uint256 count = delayedInboxAccs.length; + bytes32 messageHash = Messages.messageHash( + kind, + sender, + blockNumber, + blockTimestamp, + count, + baseFeeL1, + messageDataHash + ); + bytes32 prevAcc = 0; + if (count > 0) { + prevAcc = delayedInboxAccs[count - 1]; + } + delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); + emit MessageDelivered( + count, + prevAcc, + msg.sender, + kind, + sender, + messageDataHash, + baseFeeL1, + blockTimestamp + ); + return count; + } + + /// @inheritdoc IBridge + function executeCall( + address to, + uint256 value, + bytes calldata data + ) external returns (bool success, bytes memory returnData) { + if (!allowedOutboxes(msg.sender)) revert NotOutbox(msg.sender); + if (data.length > 0 && !to.isContract()) revert NotContract(to); + address prevOutbox = _activeOutbox; + _activeOutbox = msg.sender; + // We set and reset active outbox around external call so activeOutbox remains valid during call + + // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller + // rather than reverting on failure as well as allow contract and non-contract calls + (success, returnData) = _executeLowLevelCall(to, value, data); + + _activeOutbox = prevOutbox; + emit BridgeCallTriggered(msg.sender, to, value, data); + } + + function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner { + sequencerInbox = _sequencerInbox; + emit SequencerInboxUpdated(_sequencerInbox); + } + + function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner { + InOutInfo storage info = allowedDelayedInboxesMap[inbox]; + bool alreadyEnabled = info.allowed; + emit InboxToggle(inbox, enabled); + if (alreadyEnabled == enabled) { + return; + } + if (enabled) { + allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); + allowedDelayedInboxList.push(inbox); + } else { + allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ + allowedDelayedInboxList.length - 1 + ]; + allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; + allowedDelayedInboxList.pop(); + delete allowedDelayedInboxesMap[inbox]; + } + } + + function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner { + if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox); + + InOutInfo storage info = allowedOutboxesMap[outbox]; + bool alreadyEnabled = info.allowed; + emit OutboxToggle(outbox, enabled); + if (alreadyEnabled == enabled) { + return; + } + if (enabled) { + allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true); + allowedOutboxList.push(outbox); + } else { + allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1]; + allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index; + allowedOutboxList.pop(); + delete allowedOutboxesMap[outbox]; + } + } + + function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner { + sequencerReportedSubMessageCount = newMsgCount; + } + + function delayedMessageCount() external view override returns (uint256) { + return delayedInboxAccs.length; + } + + function sequencerMessageCount() external view returns (uint256) { + return sequencerInboxAccs.length; + } + + /// @dev For the classic -> nitro migration. TODO: remove post-migration. + function acceptFundsFromOldBridge() external payable {} + + /// @dev transfer funds provided to pay for crosschain msg + function _transferFunds(uint256 amount) internal virtual; + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal virtual returns (bool success, bytes memory returnData); + + /// @dev get base fee which is emitted in `MessageDelivered` event and then picked up and + /// used in ArbOs to calculate the submission fee for retryable ticket + function _baseFeeToReport() internal view virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[40] private __gap; +} diff --git a/src/bridge/AbsInbox.sol b/src/bridge/AbsInbox.sol new file mode 100644 index 00000000..35256220 --- /dev/null +++ b/src/bridge/AbsInbox.sol @@ -0,0 +1,356 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import { + DataTooLarge, + GasLimitTooLarge, + InsufficientValue, + InsufficientSubmissionCost, + L1Forked, + NotAllowedOrigin, + NotOrigin, + NotRollupOrOwner, + RetryableData +} from "../libraries/Error.sol"; +import "./IInboxBase.sol"; +import "./ISequencerInbox.sol"; +import "./IBridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import "../libraries/DelegateCallAware.sol"; +import { + L1MessageType_submitRetryableTx, + L2MessageType_unsignedContractTx, + L2MessageType_unsignedEOATx, + L2_MSG +} from "../libraries/MessageTypes.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import "@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"; + +/** + * @title Inbox for user and contract originated messages + * @notice Messages created via this inbox are enqueued in the delayed accumulator + * to await inclusion in the SequencerInbox + */ +abstract contract AbsInbox is DelegateCallAware, PausableUpgradeable, IInboxBase { + /// @dev Storage slot with the admin of the contract. + /// This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. + bytes32 internal constant _ADMIN_SLOT = + 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + + /// @inheritdoc IInboxBase + IBridge public bridge; + /// @inheritdoc IInboxBase + ISequencerInbox public sequencerInbox; + + /// ------------------------------------ allow list start ------------------------------------ /// + + /// @inheritdoc IInboxBase + bool public allowListEnabled; + + /// @inheritdoc IInboxBase + mapping(address => bool) public isAllowed; + + event AllowListAddressSet(address indexed user, bool val); + event AllowListEnabledUpdated(bool isEnabled); + + /// @inheritdoc IInboxBase + function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { + require(user.length == val.length, "INVALID_INPUT"); + + for (uint256 i = 0; i < user.length; i++) { + isAllowed[user[i]] = val[i]; + emit AllowListAddressSet(user[i], val[i]); + } + } + + /// @inheritdoc IInboxBase + function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { + require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); + allowListEnabled = _allowListEnabled; + emit AllowListEnabledUpdated(_allowListEnabled); + } + + /// @dev this modifier checks the tx.origin instead of msg.sender for convenience (ie it allows + /// allowed users to interact with the token bridge without needing the token bridge to be allowList aware). + /// this modifier is not intended to use to be used for security (since this opens the allowList to + /// a smart contract phishing risk). + modifier onlyAllowed() { + // solhint-disable-next-line avoid-tx-origin + if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin); + _; + } + + /// ------------------------------------ allow list end ------------------------------------ /// + + modifier onlyRollupOrOwner() { + IOwnable rollup = bridge.rollup(); + if (msg.sender != address(rollup)) { + address rollupOwner = rollup.owner(); + if (msg.sender != rollupOwner) { + revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); + } + } + _; + } + + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving + uint256 public immutable maxDataSize; + uint256 internal immutable deployTimeChainId = block.chainid; + + constructor(uint256 _maxDataSize) { + maxDataSize = _maxDataSize; + } + + function _chainIdChanged() internal view returns (bool) { + return deployTimeChainId != block.chainid; + } + + /// @inheritdoc IInboxBase + function pause() external onlyRollupOrOwner { + _pause(); + } + + /// @inheritdoc IInboxBase + function unpause() external onlyRollupOrOwner { + _unpause(); + } + + /* solhint-disable func-name-mixedcase */ + function __AbsInbox_init(IBridge _bridge, ISequencerInbox _sequencerInbox) + internal + onlyInitializing + { + bridge = _bridge; + sequencerInbox = _sequencerInbox; + allowListEnabled = false; + __Pausable_init(); + } + + /// @inheritdoc IInboxBase + function sendL2MessageFromOrigin(bytes calldata messageData) + external + whenNotPaused + onlyAllowed + returns (uint256) + { + if (_chainIdChanged()) revert L1Forked(); + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) revert NotOrigin(); + if (messageData.length > maxDataSize) revert DataTooLarge(messageData.length, maxDataSize); + uint256 msgNum = _deliverToBridge(L2_MSG, msg.sender, keccak256(messageData), 0); + emit InboxMessageDeliveredFromOrigin(msgNum); + return msgNum; + } + + /// @inheritdoc IInboxBase + function sendL2Message(bytes calldata messageData) + external + whenNotPaused + onlyAllowed + returns (uint256) + { + if (_chainIdChanged()) revert L1Forked(); + return _deliverMessage(L2_MSG, msg.sender, messageData, 0); + } + + /// @inheritdoc IInboxBase + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + // arbos will discard unsigned tx with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + return + _deliverMessage( + L2_MSG, + msg.sender, + abi.encodePacked( + L2MessageType_unsignedEOATx, + gasLimit, + maxFeePerGas, + nonce, + uint256(uint160(to)), + value, + data + ), + 0 + ); + } + + /// @inheritdoc IInboxBase + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + // arbos will discard unsigned tx with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + return + _deliverMessage( + L2_MSG, + msg.sender, + abi.encodePacked( + L2MessageType_unsignedContractTx, + gasLimit, + maxFeePerGas, + uint256(uint160(to)), + value, + data + ), + 0 + ); + } + + /// @inheritdoc IInboxBase + function getProxyAdmin() external view returns (address) { + return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; + } + + function _createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 amount, + bytes calldata data + ) internal returns (uint256) { + // ensure the user's deposit alone will make submission succeed + if (amount < (maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas)) { + revert InsufficientValue( + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + amount + ); + } + + // if a refund address is a contract, we apply the alias to it + // so that it can access its funds on the L2 + // since the beneficiary and other refund addresses don't get rewritten by arb-os + if (AddressUpgradeable.isContract(excessFeeRefundAddress)) { + excessFeeRefundAddress = AddressAliasHelper.applyL1ToL2Alias(excessFeeRefundAddress); + } + if (AddressUpgradeable.isContract(callValueRefundAddress)) { + // this is the beneficiary. be careful since this is the address that can cancel the retryable in the L2 + callValueRefundAddress = AddressAliasHelper.applyL1ToL2Alias(callValueRefundAddress); + } + + // gas limit is validated to be within uint64 in unsafeCreateRetryableTicket + return + _unsafeCreateRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + amount, + data + ); + } + + function _unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 amount, + bytes calldata data + ) internal returns (uint256) { + // gas price and limit of 1 should never be a valid input, so instead they are used as + // magic values to trigger a revert in eth calls that surface data without requiring a tx trace + if (gasLimit == 1 || maxFeePerGas == 1) + revert RetryableData( + msg.sender, + to, + l2CallValue, + amount, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + data + ); + + // arbos will discard retryable with gas limit too large + if (gasLimit > type(uint64).max) { + revert GasLimitTooLarge(); + } + + uint256 submissionFee = calculateRetryableSubmissionFee(data.length, block.basefee); + if (maxSubmissionCost < submissionFee) + revert InsufficientSubmissionCost(submissionFee, maxSubmissionCost); + + return + _deliverMessage( + L1MessageType_submitRetryableTx, + msg.sender, + abi.encodePacked( + uint256(uint160(to)), + l2CallValue, + amount, + maxSubmissionCost, + uint256(uint160(excessFeeRefundAddress)), + uint256(uint160(callValueRefundAddress)), + gasLimit, + maxFeePerGas, + data.length, + data + ), + amount + ); + } + + function _deliverMessage( + uint8 _kind, + address _sender, + bytes memory _messageData, + uint256 amount + ) internal returns (uint256) { + if (_messageData.length > maxDataSize) + revert DataTooLarge(_messageData.length, maxDataSize); + uint256 msgNum = _deliverToBridge(_kind, _sender, keccak256(_messageData), amount); + emit InboxMessageDelivered(msgNum, _messageData); + return msgNum; + } + + function _deliverToBridge( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 amount + ) internal virtual returns (uint256); + + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + public + view + virtual + returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[47] private __gap; +} diff --git a/src/bridge/AbsOutbox.sol b/src/bridge/AbsOutbox.sol new file mode 100644 index 00000000..4dabf9ff --- /dev/null +++ b/src/bridge/AbsOutbox.sol @@ -0,0 +1,326 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import { + AlreadyInit, + NotRollup, + ProofTooLong, + PathNotMinimal, + UnknownRoot, + AlreadySpent, + BridgeCallFailed, + HadZeroInit, + BadPostUpgradeInit, + RollupNotChanged +} from "../libraries/Error.sol"; +import "./IBridge.sol"; +import "./IOutbox.sol"; +import "../libraries/MerkleLib.sol"; +import "../libraries/DelegateCallAware.sol"; + +/// @dev this error is thrown since certain functions are only expected to be used in simulations, not in actual txs +error SimulationOnlyEntrypoint(); + +abstract contract AbsOutbox is DelegateCallAware, IOutbox { + address public rollup; // the rollup contract + IBridge public bridge; // the bridge contract + + mapping(uint256 => bytes32) public spent; // packed spent bitmap + mapping(bytes32 => bytes32) public roots; // maps root hashes => L2 block hash + + // we're packing this struct into 4 storage slots + // 1st slot: timestamp, l2Block (128 bits each, max ~3.4*10^38) + // 2nd slot: outputId (256 bits) + // 3rd slot: l1Block (96 bits, max ~7.9*10^28), sender (address 160 bits) + // 4th slot: withdrawalAmount (256 bits) + struct L2ToL1Context { + uint128 l2Block; + uint128 timestamp; + bytes32 outputId; + address sender; + uint96 l1Block; + uint256 withdrawalAmount; + } + + // Note, these variables are set and then wiped during a single transaction. + // Therefore their values don't need to be maintained, and their slots will + // hold default values (which are interpreted as empty values) outside of transactions + L2ToL1Context internal context; + + // default context values to be used in storage instead of zero, to save on storage refunds + // it is assumed that arb-os never assigns these values to a valid leaf to be redeemed + uint128 private constant L2BLOCK_DEFAULT_CONTEXT = type(uint128).max; + uint96 private constant L1BLOCK_DEFAULT_CONTEXT = type(uint96).max; + uint128 private constant TIMESTAMP_DEFAULT_CONTEXT = type(uint128).max; + bytes32 private constant OUTPUTID_DEFAULT_CONTEXT = bytes32(type(uint256).max); + address private constant SENDER_DEFAULT_CONTEXT = address(type(uint160).max); + + uint128 public constant OUTBOX_VERSION = 2; + + function initialize(IBridge _bridge) external onlyDelegated { + if (address(_bridge) == address(0)) revert HadZeroInit(); + if (address(bridge) != address(0)) revert AlreadyInit(); + // address zero is returned if no context is set, but the values used in storage + // are non-zero to save users some gas (as storage refunds are usually maxed out) + // EIP-1153 would help here + context = L2ToL1Context({ + l2Block: L2BLOCK_DEFAULT_CONTEXT, + l1Block: L1BLOCK_DEFAULT_CONTEXT, + timestamp: TIMESTAMP_DEFAULT_CONTEXT, + outputId: OUTPUTID_DEFAULT_CONTEXT, + sender: SENDER_DEFAULT_CONTEXT, + withdrawalAmount: _defaultContextAmount() + }); + bridge = _bridge; + rollup = address(_bridge.rollup()); + } + + function postUpgradeInit() external onlyDelegated onlyProxyOwner { + // prevent postUpgradeInit within a withdrawal + if (context.l2Block != L2BLOCK_DEFAULT_CONTEXT) revert BadPostUpgradeInit(); + context = L2ToL1Context({ + l2Block: L2BLOCK_DEFAULT_CONTEXT, + l1Block: L1BLOCK_DEFAULT_CONTEXT, + timestamp: TIMESTAMP_DEFAULT_CONTEXT, + outputId: OUTPUTID_DEFAULT_CONTEXT, + sender: SENDER_DEFAULT_CONTEXT, + withdrawalAmount: _defaultContextAmount() + }); + } + + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); + address newRollup = address(bridge.rollup()); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; + } + + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { + if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); + roots[root] = l2BlockHash; + emit SendRootUpdated(root, l2BlockHash); + } + + /// @inheritdoc IOutbox + function l2ToL1Sender() external view returns (address) { + address sender = context.sender; + // we don't return the default context value to avoid a breaking change in the API + if (sender == SENDER_DEFAULT_CONTEXT) return address(0); + return sender; + } + + /// @inheritdoc IOutbox + function l2ToL1Block() external view returns (uint256) { + uint128 l2Block = context.l2Block; + // we don't return the default context value to avoid a breaking change in the API + if (l2Block == L2BLOCK_DEFAULT_CONTEXT) return uint256(0); + return uint256(l2Block); + } + + /// @inheritdoc IOutbox + function l2ToL1EthBlock() external view returns (uint256) { + uint96 l1Block = context.l1Block; + // we don't return the default context value to avoid a breaking change in the API + if (l1Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); + return uint256(l1Block); + } + + /// @inheritdoc IOutbox + function l2ToL1Timestamp() external view returns (uint256) { + uint128 timestamp = context.timestamp; + // we don't return the default context value to avoid a breaking change in the API + if (timestamp == TIMESTAMP_DEFAULT_CONTEXT) return uint256(0); + return uint256(timestamp); + } + + /// @notice batch number is deprecated and now always returns 0 + function l2ToL1BatchNum() external pure returns (uint256) { + return 0; + } + + /// @inheritdoc IOutbox + function l2ToL1OutputId() external view returns (bytes32) { + bytes32 outputId = context.outputId; + // we don't return the default context value to avoid a breaking change in the API + if (outputId == OUTPUTID_DEFAULT_CONTEXT) return bytes32(0); + return outputId; + } + + /// @inheritdoc IOutbox + function executeTransaction( + bytes32[] calldata proof, + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external { + bytes32 userTx = calculateItemHash( + l2Sender, + to, + l2Block, + l1Block, + l2Timestamp, + value, + data + ); + + recordOutputAsSpent(proof, index, userTx); + + executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); + } + + /// @inheritdoc IOutbox + function executeTransactionSimulation( + uint256 index, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) external { + if (msg.sender != address(0)) revert SimulationOnlyEntrypoint(); + executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); + } + + function executeTransactionImpl( + uint256 outputId, + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) internal { + emit OutBoxTransactionExecuted(to, l2Sender, 0, outputId); + + // we temporarily store the previous values so the outbox can naturally + // unwind itself when there are nested calls to `executeTransaction` + L2ToL1Context memory prevContext = context; + + context = L2ToL1Context({ + sender: l2Sender, + l2Block: uint128(l2Block), + l1Block: uint96(l1Block), + timestamp: uint128(l2Timestamp), + outputId: bytes32(outputId), + withdrawalAmount: _amountToSetInContext(value) + }); + + // set and reset vars around execution so they remain valid during call + executeBridgeCall(to, value, data); + + context = prevContext; + } + + function _calcSpentIndexOffset(uint256 index) + internal + view + returns ( + uint256, + uint256, + bytes32 + ) + { + uint256 spentIndex = index / 255; // Note: Reserves the MSB. + uint256 bitOffset = index % 255; + bytes32 replay = spent[spentIndex]; + return (spentIndex, bitOffset, replay); + } + + function _isSpent(uint256 bitOffset, bytes32 replay) internal pure returns (bool) { + return ((replay >> bitOffset) & bytes32(uint256(1))) != bytes32(0); + } + + /// @inheritdoc IOutbox + function isSpent(uint256 index) external view returns (bool) { + (, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); + return _isSpent(bitOffset, replay); + } + + function recordOutputAsSpent( + bytes32[] memory proof, + uint256 index, + bytes32 item + ) internal { + if (proof.length >= 256) revert ProofTooLong(proof.length); + if (index >= 2**proof.length) revert PathNotMinimal(index, 2**proof.length); + + // Hash the leaf an extra time to prove it's a leaf + bytes32 calcRoot = calculateMerkleRoot(proof, index, item); + if (roots[calcRoot] == bytes32(0)) revert UnknownRoot(calcRoot); + + (uint256 spentIndex, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); + + if (_isSpent(bitOffset, replay)) revert AlreadySpent(index); + spent[spentIndex] = (replay | bytes32(1 << bitOffset)); + } + + function executeBridgeCall( + address to, + uint256 value, + bytes memory data + ) internal { + (bool success, bytes memory returndata) = bridge.executeCall(to, value, data); + if (!success) { + if (returndata.length > 0) { + // solhint-disable-next-line no-inline-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert BridgeCallFailed(); + } + } + } + + function calculateItemHash( + address l2Sender, + address to, + uint256 l2Block, + uint256 l1Block, + uint256 l2Timestamp, + uint256 value, + bytes calldata data + ) public pure returns (bytes32) { + return + keccak256(abi.encodePacked(l2Sender, to, l2Block, l1Block, l2Timestamp, value, data)); + } + + function calculateMerkleRoot( + bytes32[] memory proof, + uint256 path, + bytes32 item + ) public pure returns (bytes32) { + return MerkleLib.calculateRoot(proof, path, keccak256(abi.encodePacked(item))); + } + + /// @notice default value to be used for 'amount' field in L2ToL1Context outside of transaction execution. + /// @return default 'amount' in case of ERC20-based rollup is type(uint256).max, or 0 in case of ETH-based rollup + function _defaultContextAmount() internal pure virtual returns (uint256); + + /// @notice value to be set for 'amount' field in L2ToL1Context during L2 to L1 transaction execution. + /// In case of ERC20-based rollup this is the amount of native token being withdrawn. In case of standard ETH-based + /// rollup this amount shall always be 0, because amount of ETH being withdrawn can be read from msg.value. + /// @return amount of native token being withdrawn in case of ERC20-based rollup, or 0 in case of ETH-based rollup + function _amountToSetInContext(uint256 value) internal pure virtual returns (uint256); + + /** + * @dev This empty reserved space is put in place to allow future versions to add new + * variables without shifting down storage in the inheritance chain. + * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps + */ + uint256[42] private __gap; +} diff --git a/src/bridge/Bridge.sol b/src/bridge/Bridge.sol index 31b41554..d46fa4ed 100644 --- a/src/bridge/Bridge.sol +++ b/src/bridge/Bridge.sol @@ -6,17 +6,8 @@ pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; - -import { - NotContract, - NotRollupOrOwner, - NotDelayedInbox, - NotSequencerInbox, - NotOutbox, - InvalidOutboxSet, - BadSequencerMessageNumber -} from "../libraries/Error.sol"; -import "./IBridge.sol"; +import "./AbsBridge.sol"; +import "./IEthBridge.sol"; import "./Messages.sol"; import "../libraries/DelegateCallAware.sol"; @@ -24,260 +15,40 @@ import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; /** * @title Staging ground for incoming and outgoing messages - * @notice Holds the inbox accumulator for sequenced and delayed messages. - * It is also the ETH escrow for value sent with these messages. - * Since the escrow is held here, this contract also contains a list of allowed - * outboxes that can make calls from here and withdraw this escrow. + * @notice It is also the ETH escrow for value sent with these messages. */ -contract Bridge is Initializable, DelegateCallAware, IBridge { +contract Bridge is AbsBridge, IEthBridge { using AddressUpgradeable for address; - struct InOutInfo { - uint256 index; - bool allowed; - } - - mapping(address => InOutInfo) private allowedDelayedInboxesMap; - mapping(address => InOutInfo) private allowedOutboxesMap; - - address[] public allowedDelayedInboxList; - address[] public allowedOutboxList; - - address internal _activeOutbox; - - /// @inheritdoc IBridge - bytes32[] public delayedInboxAccs; - - /// @inheritdoc IBridge - bytes32[] public sequencerInboxAccs; - - IOwnable public rollup; - address public sequencerInbox; - - uint256 public override sequencerReportedSubMessageCount; - - address internal constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max); - + /// @inheritdoc IEthBridge function initialize(IOwnable rollup_) external initializer onlyDelegated { _activeOutbox = EMPTY_ACTIVEOUTBOX; rollup = rollup_; } - modifier onlyRollupOrOwner() { - if (msg.sender != address(rollup)) { - address rollupOwner = rollup.owner(); - if (msg.sender != rollupOwner) { - revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); - } - } - _; - } - - /// @dev returns the address of current active Outbox, or zero if no outbox is active - function activeOutbox() public view returns (address) { - address outbox = _activeOutbox; - // address zero is returned if no outbox is set, but the value used in storage - // is non-zero to save users some gas (as storage refunds are usually maxed out) - // EIP-1153 would help here. - // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api - if (outbox == EMPTY_ACTIVEOUTBOX) return address(0); - return outbox; - } - - function allowedDelayedInboxes(address inbox) external view returns (bool) { - return allowedDelayedInboxesMap[inbox].allowed; - } - - function allowedOutboxes(address outbox) external view returns (bool) { - return allowedOutboxesMap[outbox].allowed; - } - - modifier onlySequencerInbox() { - if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender); - _; - } - - function enqueueSequencerMessage( - bytes32 dataHash, - uint256 afterDelayedMessagesRead, - uint256 prevMessageCount, - uint256 newMessageCount - ) - external - onlySequencerInbox - returns ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 acc - ) - { - if ( - sequencerReportedSubMessageCount != prevMessageCount && - prevMessageCount != 0 && - sequencerReportedSubMessageCount != 0 - ) { - revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount); - } - sequencerReportedSubMessageCount = newMessageCount; - seqMessageIndex = sequencerInboxAccs.length; - if (sequencerInboxAccs.length > 0) { - beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1]; - } - if (afterDelayedMessagesRead > 0) { - delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1]; - } - acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); - sequencerInboxAccs.push(acc); - } - - /// @inheritdoc IBridge - function submitBatchSpendingReport(address sender, bytes32 messageDataHash) - external - onlySequencerInbox - returns (uint256) - { - return - addMessageToDelayedAccumulator( - L1MessageType_batchPostingReport, - sender, - uint64(block.number), - uint64(block.timestamp), // solhint-disable-line not-rely-on-time, - block.basefee, - messageDataHash - ); - } - - /// @inheritdoc IBridge + /// @inheritdoc IEthBridge function enqueueDelayedMessage( uint8 kind, address sender, bytes32 messageDataHash ) external payable returns (uint256) { - if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender); - return - addMessageToDelayedAccumulator( - kind, - sender, - uint64(block.number), - uint64(block.timestamp), // solhint-disable-line not-rely-on-time - block.basefee, - messageDataHash - ); + return _enqueueDelayedMessage(kind, sender, messageDataHash, msg.value); } - function addMessageToDelayedAccumulator( - uint8 kind, - address sender, - uint64 blockNumber, - uint64 blockTimestamp, - uint256 baseFeeL1, - bytes32 messageDataHash - ) internal returns (uint256) { - uint256 count = delayedInboxAccs.length; - bytes32 messageHash = Messages.messageHash( - kind, - sender, - blockNumber, - blockTimestamp, - count, - baseFeeL1, - messageDataHash - ); - bytes32 prevAcc = 0; - if (count > 0) { - prevAcc = delayedInboxAccs[count - 1]; - } - delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash)); - emit MessageDelivered( - count, - prevAcc, - msg.sender, - kind, - sender, - messageDataHash, - baseFeeL1, - blockTimestamp - ); - return count; + function _transferFunds(uint256) internal override { + // do nothing as Eth transfer is part of TX execution } - function executeCall( + function _executeLowLevelCall( address to, uint256 value, - bytes calldata data - ) external returns (bool success, bytes memory returnData) { - if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender); - if (data.length > 0 && !to.isContract()) revert NotContract(to); - address prevOutbox = _activeOutbox; - _activeOutbox = msg.sender; - // We set and reset active outbox around external call so activeOutbox remains valid during call - - // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller - // rather than reverting on failure as well as allow contract and non-contract calls + bytes memory data + ) internal override returns (bool success, bytes memory returnData) { // solhint-disable-next-line avoid-low-level-calls (success, returnData) = to.call{value: value}(data); - _activeOutbox = prevOutbox; - emit BridgeCallTriggered(msg.sender, to, value, data); - } - - function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner { - sequencerInbox = _sequencerInbox; - emit SequencerInboxUpdated(_sequencerInbox); } - function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner { - InOutInfo storage info = allowedDelayedInboxesMap[inbox]; - bool alreadyEnabled = info.allowed; - emit InboxToggle(inbox, enabled); - if (alreadyEnabled == enabled) { - return; - } - if (enabled) { - allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true); - allowedDelayedInboxList.push(inbox); - } else { - allowedDelayedInboxList[info.index] = allowedDelayedInboxList[ - allowedDelayedInboxList.length - 1 - ]; - allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index; - allowedDelayedInboxList.pop(); - delete allowedDelayedInboxesMap[inbox]; - } + function _baseFeeToReport() internal view override returns (uint256) { + return block.basefee; } - - function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner { - if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox); - - InOutInfo storage info = allowedOutboxesMap[outbox]; - bool alreadyEnabled = info.allowed; - emit OutboxToggle(outbox, enabled); - if (alreadyEnabled == enabled) { - return; - } - if (enabled) { - allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true); - allowedOutboxList.push(outbox); - } else { - allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1]; - allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index; - allowedOutboxList.pop(); - delete allowedOutboxesMap[outbox]; - } - } - - function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner { - sequencerReportedSubMessageCount = newMsgCount; - } - - function delayedMessageCount() external view override returns (uint256) { - return delayedInboxAccs.length; - } - - function sequencerMessageCount() external view returns (uint256) { - return sequencerInboxAccs.length; - } - - /// @dev For the classic -> nitro migration. TODO: remove post-migration. - function acceptFundsFromOldBridge() external payable {} } diff --git a/src/bridge/ERC20Bridge.sol b/src/bridge/ERC20Bridge.sol new file mode 100644 index 00000000..c67e1ba0 --- /dev/null +++ b/src/bridge/ERC20Bridge.sol @@ -0,0 +1,91 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsBridge.sol"; +import "./IERC20Bridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import {InvalidTokenSet, CallTargetNotAllowed, CallNotAllowed} from "../libraries/Error.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Staging ground for incoming and outgoing messages + * @notice Unlike the standard Eth bridge, native token bridge escrows the custom ERC20 token which is + * used as native currency on L2. + * @dev Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert + */ +contract ERC20Bridge is AbsBridge, IERC20Bridge { + using SafeERC20 for IERC20; + + /// @inheritdoc IERC20Bridge + address public nativeToken; + + /// @inheritdoc IERC20Bridge + function initialize(IOwnable rollup_, address nativeToken_) external initializer onlyDelegated { + if (nativeToken_ == address(0)) revert InvalidTokenSet(nativeToken_); + nativeToken = nativeToken_; + _activeOutbox = EMPTY_ACTIVEOUTBOX; + rollup = rollup_; + } + + /// @inheritdoc IERC20Bridge + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256) { + return _enqueueDelayedMessage(kind, sender, messageDataHash, tokenFeeAmount); + } + + function _transferFunds(uint256 amount) internal override { + // fetch native token from Inbox + IERC20(nativeToken).safeTransferFrom(msg.sender, address(this), amount); + } + + function _executeLowLevelCall( + address to, + uint256 value, + bytes memory data + ) internal override returns (bool success, bytes memory returnData) { + address _nativeToken = nativeToken; + + // we don't allow outgoing calls to native token contract because it could + // result in loss of native tokens which are escrowed by ERC20Bridge + if (to == _nativeToken) { + revert CallTargetNotAllowed(_nativeToken); + } + + // first release native token + IERC20(_nativeToken).safeTransfer(to, value); + success = true; + + // if there's data do additional contract call. Make sure that call is not used to + // decrease bridge contract's balance of the native token + if (data.length > 0) { + uint256 bridgeBalanceBefore = IERC20(_nativeToken).balanceOf(address(this)); + + // solhint-disable-next-line avoid-low-level-calls + (success, returnData) = to.call(data); + + uint256 bridgeBalanceAfter = IERC20(_nativeToken).balanceOf(address(this)); + if (bridgeBalanceAfter < bridgeBalanceBefore) { + revert CallNotAllowed(); + } + } + } + + function _baseFeeToReport() internal pure override returns (uint256) { + // ArbOs uses formula 'l1BaseFee * (1400 + 6 * calldataLengthInBytes)' to calculate retryable ticket's + // submission fee. When custom ERC20 token is used to pay for fees, submission fee shall be 0. That's + // why baseFee is reported as 0 here. + return 0; + } +} diff --git a/src/bridge/ERC20Inbox.sol b/src/bridge/ERC20Inbox.sol new file mode 100644 index 00000000..ddcfff15 --- /dev/null +++ b/src/bridge/ERC20Inbox.sol @@ -0,0 +1,144 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsInbox.sol"; +import "./IERC20Inbox.sol"; +import "./IERC20Bridge.sol"; +import "../libraries/AddressAliasHelper.sol"; +import {L1MessageType_ethDeposit} from "../libraries/MessageTypes.sol"; +import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; + +/** + * @title Inbox for user and contract originated messages + * @notice Messages created via this inbox are enqueued in the delayed accumulator + * to await inclusion in the SequencerInbox + */ +contract ERC20Inbox is AbsInbox, IERC20Inbox { + using SafeERC20 for IERC20; + + constructor(uint256 _maxDataSize) AbsInbox(_maxDataSize) {} + + /// @inheritdoc IInboxBase + function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) + external + initializer + onlyDelegated + { + __AbsInbox_init(_bridge, _sequencerInbox); + + // inbox holds native token in transit used to pay for retryable tickets, approve bridge to use it + address nativeToken = IERC20Bridge(address(bridge)).nativeToken(); + IERC20(nativeToken).approve(address(bridge), type(uint256).max); + } + + /// @inheritdoc IERC20Inbox + function depositERC20(uint256 amount) public whenNotPaused onlyAllowed returns (uint256) { + address dest = msg.sender; + + // solhint-disable-next-line avoid-tx-origin + if (AddressUpgradeable.isContract(msg.sender) || tx.origin != msg.sender) { + // isContract check fails if this function is called during a contract's constructor. + dest = AddressAliasHelper.applyL1ToL2Alias(msg.sender); + } + + return + _deliverMessage( + L1MessageType_ethDeposit, + msg.sender, + abi.encodePacked(dest, amount), + amount + ); + } + + /// @inheritdoc IERC20Inbox + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external whenNotPaused onlyAllowed returns (uint256) { + return + _createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ); + } + + /// @inheritdoc IERC20Inbox + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) public whenNotPaused onlyAllowed returns (uint256) { + return + _unsafeCreateRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ); + } + + /// @inheritdoc IInboxBase + function calculateRetryableSubmissionFee(uint256, uint256) + public + pure + override(AbsInbox, IInboxBase) + returns (uint256) + { + // retryable ticket's submission fee is not charged when ERC20 token is used to pay for fees + return 0; + } + + function _deliverToBridge( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenAmount + ) internal override returns (uint256) { + // Fetch native token from sender if inbox doesn't already hold enough tokens to pay for fees. + // Inbox might have been pre-funded in prior call, ie. as part of token bridging flow. + address nativeToken = IERC20Bridge(address(bridge)).nativeToken(); + uint256 inboxNativeTokenBalance = IERC20(nativeToken).balanceOf(address(this)); + if (inboxNativeTokenBalance < tokenAmount) { + uint256 diff = tokenAmount - inboxNativeTokenBalance; + IERC20(nativeToken).safeTransferFrom(msg.sender, address(this), diff); + } + + return + IERC20Bridge(address(bridge)).enqueueDelayedMessage( + kind, + AddressAliasHelper.applyL1ToL2Alias(sender), + messageDataHash, + tokenAmount + ); + } +} diff --git a/src/bridge/ERC20Outbox.sol b/src/bridge/ERC20Outbox.sol new file mode 100644 index 00000000..fcc08ef8 --- /dev/null +++ b/src/bridge/ERC20Outbox.sol @@ -0,0 +1,30 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.4; + +import "./AbsOutbox.sol"; + +contract ERC20Outbox is AbsOutbox { + // it is assumed that arb-os never assigns this value to a valid leaf to be redeemed + uint256 private constant AMOUNT_DEFAULT_CONTEXT = type(uint256).max; + + function l2ToL1WithdrawalAmount() external view returns (uint256) { + uint256 amount = context.withdrawalAmount; + if (amount == AMOUNT_DEFAULT_CONTEXT) return 0; + return amount; + } + + /// @inheritdoc AbsOutbox + function _defaultContextAmount() internal pure override returns (uint256) { + // we use type(uint256).max as representation of 0 native token withdrawal amount + return AMOUNT_DEFAULT_CONTEXT; + } + + /// @inheritdoc AbsOutbox + function _amountToSetInContext(uint256 value) internal pure override returns (uint256) { + // native token withdrawal amount which can be fetched from context + return value; + } +} diff --git a/src/bridge/GasRefunder.sol b/src/bridge/GasRefunder.sol new file mode 100644 index 00000000..5f85e9f2 --- /dev/null +++ b/src/bridge/GasRefunder.sol @@ -0,0 +1,257 @@ +// SPDX-License-Identifier: Apache-2.0 + +/* + * Copyright 2021, Offchain Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +pragma solidity ^0.8.7; + +import "../libraries/IGasRefunder.sol"; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +/** + * @notice DEPRECATED - only for classic version, see new repo (https://github.com/OffchainLabs/nitro/tree/master/contracts) + * for new updates + */ +contract GasRefunder is IGasRefunder, Ownable { + mapping(address => bool) public allowedContracts; + mapping(address => bool) public allowedRefundees; + address public disallower; + + struct CommonParameters { + uint128 maxRefundeeBalance; + uint32 extraGasMargin; + uint8 calldataCost; + uint64 maxGasTip; + uint64 maxGasCost; + uint32 maxSingleGasUsage; + } + + CommonParameters public commonParams; + + enum CommonParameterKey { + MAX_REFUNDEE_BALANCE, + EXTRA_GAS_MARGIN, + CALLDATA_COST, + MAX_GAS_TIP, + MAX_GAS_COST, + MAX_SINGLE_GAS_USAGE + } + + enum RefundDenyReason { + CONTRACT_NOT_ALLOWED, + REFUNDEE_NOT_ALLOWED, + REFUNDEE_ABOVE_MAX_BALANCE, + OUT_OF_FUNDS + } + + event RefundedGasCosts( + address indexed refundee, + address indexed contractAddress, + bool indexed success, + uint256 gas, + uint256 gasPrice, + uint256 amountPaid + ); + event RefundGasCostsDenied( + address indexed refundee, + address indexed contractAddress, + RefundDenyReason indexed reason, + uint256 gas + ); + event Deposited(address sender, uint256 amount); + event Withdrawn(address initiator, address destination, uint256 amount); + event ContractAllowedSet(address indexed addr, bool indexed allowed); + event RefundeeAllowedSet(address indexed addr, bool indexed allowed); + event DisallowerSet(address indexed addr); + event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value); + + constructor() Ownable() { + commonParams = CommonParameters({ + maxRefundeeBalance: 0, // no limit + extraGasMargin: 4000, // 4k gas + calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes + maxGasTip: 2 gwei, + maxGasCost: 120 gwei, + maxSingleGasUsage: 2e6 // 2 million gas + }); + } + + function setDisallower(address addr) external onlyOwner { + disallower = addr; + emit DisallowerSet(addr); + } + + function allowContracts(address[] calldata addresses) external onlyOwner { + setContractsAllowedImpl(addresses, true); + } + + function disallowContracts(address[] calldata addresses) external { + require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED"); + setContractsAllowedImpl(addresses, false); + } + + function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal { + for (uint256 i = 0; i < addresses.length; i++) { + address addr = addresses[i]; + allowedContracts[addr] = allow; + emit ContractAllowedSet(addr, allow); + } + } + + function allowRefundees(address[] calldata addresses) external onlyOwner { + setRefundeesAllowedImpl(addresses, true); + } + + function disallowRefundees(address[] calldata addresses) external { + require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED"); + setRefundeesAllowedImpl(addresses, false); + } + + function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal { + for (uint256 i = 0; i < addresses.length; i++) { + address addr = addresses[i]; + allowedRefundees[addr] = allow; + emit RefundeeAllowedSet(addr, allow); + } + } + + function setMaxRefundeeBalance(uint128 newValue) external onlyOwner { + commonParams.maxRefundeeBalance = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue); + } + + function setExtraGasMargin(uint32 newValue) external onlyOwner { + commonParams.extraGasMargin = newValue; + emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue); + } + + function setCalldataCost(uint8 newValue) external onlyOwner { + commonParams.calldataCost = newValue; + emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue); + } + + function setMaxGasTip(uint64 newValue) external onlyOwner { + commonParams.maxGasTip = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue); + } + + function setMaxGasCost(uint64 newValue) external onlyOwner { + commonParams.maxGasCost = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue); + } + + function setMaxSingleGasUsage(uint32 newValue) external onlyOwner { + commonParams.maxSingleGasUsage = newValue; + emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue); + } + + receive() external payable { + emit Deposited(msg.sender, msg.value); + } + + function withdraw(address payable destination, uint256 amount) external onlyOwner { + // It's expected that destination is an EOA + // solhint-disable-next-line avoid-low-level-calls + (bool success, ) = destination.call{value: amount}(""); + require(success, "WITHDRAW_FAILED"); + emit Withdrawn(msg.sender, destination, amount); + } + + function onGasSpent( + address payable refundee, + uint256 gasUsed, + uint256 calldataSize + ) external override returns (bool success) { + uint256 startGasLeft = gasleft(); + + uint256 ownBalance = address(this).balance; + + if (ownBalance == 0) { + emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed); + return false; + } + + if (!allowedContracts[msg.sender]) { + emit RefundGasCostsDenied( + refundee, + msg.sender, + RefundDenyReason.CONTRACT_NOT_ALLOWED, + gasUsed + ); + return false; + } + if (!allowedRefundees[refundee]) { + emit RefundGasCostsDenied( + refundee, + msg.sender, + RefundDenyReason.REFUNDEE_NOT_ALLOWED, + gasUsed + ); + return false; + } + + uint256 estGasPrice = block.basefee + commonParams.maxGasTip; + if (tx.gasprice < estGasPrice) { + estGasPrice = tx.gasprice; + } + if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) { + estGasPrice = commonParams.maxGasCost; + } + + // Retrieve these variables before measuring gasleft() + uint256 refundeeBalance = refundee.balance; + uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance; + uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage; + + // Add in a bit of a buffer for the tx costs not measured with gasleft + gasUsed += + startGasLeft + + commonParams.extraGasMargin + + (calldataSize * commonParams.calldataCost); + // Split this up into two statements so that gasleft() comes after the storage loads + gasUsed -= gasleft(); + + if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) { + gasUsed = maxSingleGasUsage; + } + + uint256 refundAmount = estGasPrice * gasUsed; + if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) { + if (refundeeBalance > maxRefundeeBalance) { + // The refundee is already above their max balance + // emit RefundGasCostsDenied( + // refundee, + // msg.sender, + // RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE, + // gasUsed + // ); + return false; + } else { + refundAmount = maxRefundeeBalance - refundeeBalance; + } + } + + if (refundAmount > ownBalance) { + refundAmount = ownBalance; + } + + // It's expected that refundee is an EOA + // solhint-disable-next-line avoid-low-level-calls + (success, ) = refundee.call{value: refundAmount}(""); + emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount); + } +} diff --git a/src/bridge/IBridge.sol b/src/bridge/IBridge.sol index f1fff13c..1137fcd3 100644 --- a/src/bridge/IBridge.sol +++ b/src/bridge/IBridge.sol @@ -8,6 +8,28 @@ pragma solidity >=0.6.9 <0.9.0; import "./IOwnable.sol"; interface IBridge { + /// @dev This is an instruction to offchain readers to inform them where to look + /// for sequencer inbox batch data. This is not the type of data (eg. das, brotli encoded, or blob versioned hash) + /// and this enum is not used in the state transition function, rather it informs an offchain + /// reader where to find the data so that they can supply it to the replay binary + enum BatchDataLocation { + /// @notice The data can be found in the transaction call data + TxInput, + /// @notice The data can be found in an event emitted during the transaction + SeparateBatchEvent, + /// @notice This batch contains no data + NoData, + /// @notice The data can be found in the 4844 data blobs on this transaction + Blob + } + + struct TimeBounds { + uint64 minTimestamp; + uint64 maxTimestamp; + uint64 minBlockNumber; + uint64 maxBlockNumber; + } + event MessageDelivered( uint256 indexed messageIndex, bytes32 indexed beforeInboxAcc, @@ -32,6 +54,8 @@ interface IBridge { event SequencerInboxUpdated(address newSequencerInbox); + event RollupUpdated(address rollup); + function allowedDelayedInboxList(uint256) external returns (address); function allowedOutboxList(uint256) external returns (address); @@ -54,17 +78,6 @@ interface IBridge { function sequencerReportedSubMessageCount() external view returns (uint256); - /** - * @dev Enqueue a message in the delayed inbox accumulator. - * These messages are later sequenced in the SequencerInbox, either - * by the sequencer as part of a normal batch, or by force inclusion. - */ - function enqueueDelayedMessage( - uint8 kind, - address sender, - bytes32 messageDataHash - ) external payable returns (uint256); - function executeCall( address to, uint256 value, @@ -109,7 +122,5 @@ interface IBridge { function setOutbox(address inbox, bool enabled) external; - // ---------- initializer ---------- - - function initialize(IOwnable rollup_) external; + function updateRollupAddress(IOwnable _rollup) external; } diff --git a/src/bridge/IERC20Bridge.sol b/src/bridge/IERC20Bridge.sol new file mode 100644 index 00000000..b2b4551d --- /dev/null +++ b/src/bridge/IERC20Bridge.sol @@ -0,0 +1,37 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IERC20Bridge is IBridge { + /** + * @dev token that is escrowed in bridge on L1 side and minted on L2 as native currency. + * Fees are paid in this token. There are certain restrictions on the native token: + * - The token can't be rebasing or have a transfer fee + * - The token must only be transferrable via a call to the token address itself + * - The token must only be able to set allowance via a call to the token address itself + * - The token must not have a callback on transfer, and more generally a user must not be able to make a transfer to themselves revert + */ + function nativeToken() external view returns (address); + + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 tokenFeeAmount + ) external returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_, address nativeToken_) external; +} diff --git a/src/bridge/IERC20Inbox.sol b/src/bridge/IERC20Inbox.sol new file mode 100644 index 00000000..53182553 --- /dev/null +++ b/src/bridge/IERC20Inbox.sol @@ -0,0 +1,75 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IInboxBase.sol"; + +interface IERC20Inbox is IInboxBase { + /** + * @notice Deposit native token from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract + * @dev This does not trigger the fallback function when receiving in the L2 side. + * Look into retryable tickets if you are interested in this functionality. + * @dev This function should not be called inside contract constructors + */ + function depositERC20(uint256 amount) external returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev all tokenTotalFeeAmount will be deposited to callValueRefundAddress on L2 + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param tokenTotalFeeAmount amount of fees to be deposited in native token to cover for retryable ticket cost + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function createRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts + * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds + * come from the deposit alone, rather than falling back on the user's L2 balance + * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress). + * createRetryableTicket method is the recommended standard. + * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error + * @param to destination L2 contract address + * @param l2CallValue call value for retryable L2 message + * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee + * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance + * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled + * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error) + * @param tokenTotalFeeAmount amount of fees to be deposited in native token to cover for retryable ticket cost + * @param data ABI encoded data of L2 message + * @return unique message number of the retryable transaction + */ + function unsafeCreateRetryableTicket( + address to, + uint256 l2CallValue, + uint256 maxSubmissionCost, + address excessFeeRefundAddress, + address callValueRefundAddress, + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 tokenTotalFeeAmount, + bytes calldata data + ) external returns (uint256); +} diff --git a/src/bridge/IEthBridge.sol b/src/bridge/IEthBridge.sol new file mode 100644 index 00000000..aa52d75c --- /dev/null +++ b/src/bridge/IEthBridge.sol @@ -0,0 +1,26 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IOwnable.sol"; +import "./IBridge.sol"; + +interface IEthBridge is IBridge { + /** + * @dev Enqueue a message in the delayed inbox accumulator. + * These messages are later sequenced in the SequencerInbox, either + * by the sequencer as part of a normal batch, or by force inclusion. + */ + function enqueueDelayedMessage( + uint8 kind, + address sender, + bytes32 messageDataHash + ) external payable returns (uint256); + + // ---------- initializer ---------- + + function initialize(IOwnable rollup_) external; +} diff --git a/src/bridge/IInbox.sol b/src/bridge/IInbox.sol index 95c3128c..2c7672d7 100644 --- a/src/bridge/IInbox.sol +++ b/src/bridge/IInbox.sol @@ -1,35 +1,14 @@ // Copyright 2021-2022, Offchain Labs, Inc. -// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// For license information, see https://github.com/nitro/blob/master/LICENSE // SPDX-License-Identifier: BUSL-1.1 // solhint-disable-next-line compiler-version pragma solidity >=0.6.9 <0.9.0; import "./IBridge.sol"; -import "./IDelayedMessageProvider.sol"; -import "./ISequencerInbox.sol"; - -interface IInbox is IDelayedMessageProvider { - function bridge() external view returns (IBridge); - - function sequencerInbox() external view returns (ISequencerInbox); - - /** - * @notice Send a generic L2 message to the chain - * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input - * This method will be disabled upon L1 fork to prevent replay attacks on L2 - * @param messageData Data of the message being sent - */ - function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); - - /** - * @notice Send a generic L2 message to the chain - * @dev This method can be used to send any type of message that doesn't require L1 validation - * This method will be disabled upon L1 fork to prevent replay attacks on L2 - * @param messageData Data of the message being sent - */ - function sendL2Message(bytes calldata messageData) external returns (uint256); +import "./IInboxBase.sol"; +interface IInbox is IInboxBase { function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -45,23 +24,6 @@ interface IInbox is IDelayedMessageProvider { bytes calldata data ) external payable returns (uint256); - function sendUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - - function sendContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - uint256 value, - bytes calldata data - ) external returns (uint256); - /** * @dev This method can only be called upon L1 fork and will not alias the caller * This method will revert if not called from origin @@ -100,18 +62,6 @@ interface IInbox is IDelayedMessageProvider { address withdrawTo ) external returns (uint256); - /** - * @notice Get the L1 fee for submitting a retryable - * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value - * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! - * @param dataLength The length of the retryable's calldata, in bytes - * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used - */ - function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) - external - view - returns (uint256); - /** * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract * @dev This does not trigger the fallback function when receiving in the L2 side. @@ -173,14 +123,6 @@ interface IInbox is IDelayedMessageProvider { bytes calldata data ) external payable returns (uint256); - // ---------- onlyRollupOrOwner functions ---------- - - /// @notice pauses all inbox functionality - function pause() external; - - /// @notice unpauses all inbox functionality - function unpause() external; - // ---------- initializer ---------- /** @@ -188,6 +130,4 @@ interface IInbox is IDelayedMessageProvider { * this is used to fix the storage slots */ function postUpgradeInit(IBridge _bridge) external; - - function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; } diff --git a/src/bridge/IInboxBase.sol b/src/bridge/IInboxBase.sol new file mode 100644 index 00000000..c9775a36 --- /dev/null +++ b/src/bridge/IInboxBase.sol @@ -0,0 +1,86 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity >=0.6.9 <0.9.0; + +import "./IBridge.sol"; +import "./IDelayedMessageProvider.sol"; +import "./ISequencerInbox.sol"; + +interface IInboxBase is IDelayedMessageProvider { + function bridge() external view returns (IBridge); + + function sequencerInbox() external view returns (ISequencerInbox); + + function maxDataSize() external view returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input + * @param messageData Data of the message being sent + */ + function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256); + + /** + * @notice Send a generic L2 message to the chain + * @dev This method can be used to send any type of message that doesn't require L1 validation + * @param messageData Data of the message being sent + */ + function sendL2Message(bytes calldata messageData) external returns (uint256); + + function sendUnsignedTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + uint256 nonce, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + function sendContractTransaction( + uint256 gasLimit, + uint256 maxFeePerGas, + address to, + uint256 value, + bytes calldata data + ) external returns (uint256); + + /** + * @notice Get the L1 fee for submitting a retryable + * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value + * @dev This formula may change in the future, to future proof your code query this method instead of inlining!! + * @param dataLength The length of the retryable's calldata, in bytes + * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used + */ + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + external + view + returns (uint256); + + // ---------- onlyRollupOrOwner functions ---------- + + /// @notice pauses all inbox functionality + function pause() external; + + /// @notice unpauses all inbox functionality + function unpause() external; + + /// @notice add or remove users from allowList + function setAllowList(address[] memory user, bool[] memory val) external; + + /// @notice enable or disable allowList + function setAllowListEnabled(bool _allowListEnabled) external; + + /// @notice check if user is in allowList + function isAllowed(address user) external view returns (bool); + + /// @notice check if allowList is enabled + function allowListEnabled() external view returns (bool); + + function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external; + + /// @notice returns the current admin + function getProxyAdmin() external view returns (address); +} diff --git a/src/bridge/IOutbox.sol b/src/bridge/IOutbox.sol index 3a551ce6..41d0b594 100644 --- a/src/bridge/IOutbox.sol +++ b/src/bridge/IOutbox.sol @@ -16,6 +16,8 @@ interface IOutbox { uint256 transactionIndex ); + function initialize(IBridge _bridge) external; + function rollup() external view returns (address); // the rollup contract function bridge() external view returns (IBridge); // the bridge contract @@ -29,6 +31,8 @@ interface IOutbox { function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external; + function updateRollupAddress() external; + /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account /// When the return value is zero, that means this is a system message /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies @@ -117,4 +121,10 @@ interface IOutbox { uint256 path, bytes32 item ) external pure returns (bytes32); + + /** + * @dev function to be called one time during the outbox upgrade process + * this is used to fix the storage slots + */ + function postUpgradeInit() external; } diff --git a/src/bridge/ISequencerInbox.sol b/src/bridge/ISequencerInbox.sol index 5f19471e..47db30f0 100644 --- a/src/bridge/ISequencerInbox.sol +++ b/src/bridge/ISequencerInbox.sol @@ -18,27 +18,14 @@ interface ISequencerInbox is IDelayedMessageProvider { uint256 futureSeconds; } - struct TimeBounds { - uint64 minTimestamp; - uint64 maxTimestamp; - uint64 minBlockNumber; - uint64 maxBlockNumber; - } - - enum BatchDataLocation { - TxInput, - SeparateBatchEvent, - NoData - } - event SequencerBatchDelivered( uint256 indexed batchSequenceNumber, bytes32 indexed beforeAcc, bytes32 indexed afterAcc, bytes32 delayedAcc, uint256 afterDelayedMessagesRead, - TimeBounds timeBounds, - BatchDataLocation dataLocation + IBridge.TimeBounds timeBounds, + IBridge.BatchDataLocation dataLocation ); event OwnerFunctionCalled(uint256 indexed id); @@ -61,29 +48,67 @@ interface ISequencerInbox is IDelayedMessageProvider { function HEADER_LENGTH() external view returns (uint256); /// @dev If the first batch data byte after the header has this bit set, - /// the sequencer inbox has authenticated the data. Currently not used. + /// the sequencer inbox has authenticated the data. Currently only used for 4844 blob support. + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go // solhint-disable-next-line func-name-mixedcase function DATA_AUTHENTICATED_FLAG() external view returns (bytes1); + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is to be found in 4844 data blobs + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DATA_BLOB_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data is a das message that employs a merklesization strategy + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function TREE_DAS_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data has been brotli compressed + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function BROTLI_MESSAGE_HEADER_FLAG() external view returns (bytes1); + + /// @dev If the first data byte after the header has this bit set, + /// then the batch data uses a zero heavy encoding + /// See: https://github.com/OffchainLabs/nitro/blob/69de0603abf6f900a4128cab7933df60cad54ded/arbstate/das_reader.go + // solhint-disable-next-line func-name-mixedcase + function ZERO_HEAVY_MESSAGE_HEADER_FLAG() external view returns (bytes1); + function rollup() external view returns (IOwnable); function isBatchPoster(address) external view returns (bool); function isSequencer(address) external view returns (bool); + function maxDataSize() external view returns (uint256); + + /// @notice The batch poster manager has the ability to change the batch poster addresses + /// This enables the batch poster to do key rotation + function batchPosterManager() external view returns (address); + struct DasKeySetInfo { bool isValidKeyset; uint64 creationBlock; } + /// @dev returns 4 uint256 to be compatible with older version function maxTimeVariation() external view returns ( - uint256, - uint256, - uint256, - uint256 + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds ); function dasKeySetInfo(bytes32) external view returns (bool, uint64); @@ -128,6 +153,15 @@ interface ISequencerInbox is IDelayedMessageProvider { IGasRefunder gasRefunder ) external; + function addSequencerL2BatchFromOrigin( + uint256 sequenceNumber, + bytes calldata data, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external; + function addSequencerL2Batch( uint256 sequenceNumber, bytes calldata data, @@ -137,6 +171,14 @@ interface ISequencerInbox is IDelayedMessageProvider { uint256 newMessageCount ) external; + function addSequencerL2BatchFromBlobs( + uint256 sequenceNumber, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external; + // ---------- onlyRollupOrOwner functions ---------- /** @@ -172,6 +214,15 @@ interface ISequencerInbox is IDelayedMessageProvider { */ function setIsSequencer(address addr, bool isSequencer_) external; + /** + * @notice Updates the batch poster manager, the address which has the ability to rotate batch poster keys + * @param newBatchPosterManager The new batch poster manager to be set + */ + function setBatchPosterManager(address newBatchPosterManager) external; + + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external; + // ---------- initializer ---------- function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external; diff --git a/src/bridge/Inbox.sol b/src/bridge/Inbox.sol index 9e718b66..f080e76e 100644 --- a/src/bridge/Inbox.sol +++ b/src/bridge/Inbox.sol @@ -5,28 +5,20 @@ pragma solidity ^0.8.4; import { - AlreadyInit, NotOrigin, DataTooLarge, - AlreadyPaused, - AlreadyUnpaused, - Paused, InsufficientValue, InsufficientSubmissionCost, - NotAllowedOrigin, RetryableData, - NotRollupOrOwner, L1Forked, NotForked, GasLimitTooLarge } from "../libraries/Error.sol"; +import "./AbsInbox.sol"; import "./IInbox.sol"; -import "./ISequencerInbox.sol"; import "./IBridge.sol"; - -import "./Messages.sol"; +import "./IEthBridge.sol"; import "../libraries/AddressAliasHelper.sol"; -import "../libraries/DelegateCallAware.sol"; import { L2_MSG, L1MessageType_L2FundedByL1, @@ -35,125 +27,31 @@ import { L2MessageType_unsignedEOATx, L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; -import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; import "../precompiles/ArbSys.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; /** * @title Inbox for user and contract originated messages * @notice Messages created via this inbox are enqueued in the delayed accumulator * to await inclusion in the SequencerInbox */ -contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { - IBridge public bridge; - ISequencerInbox public sequencerInbox; - - /// ------------------------------------ allow list start ------------------------------------ /// - - bool public allowListEnabled; - mapping(address => bool) public isAllowed; - - event AllowListAddressSet(address indexed user, bool val); - event AllowListEnabledUpdated(bool isEnabled); - - function setAllowList(address[] memory user, bool[] memory val) external onlyRollupOrOwner { - require(user.length == val.length, "INVALID_INPUT"); - - for (uint256 i = 0; i < user.length; i++) { - isAllowed[user[i]] = val[i]; - emit AllowListAddressSet(user[i], val[i]); - } - } - - function setAllowListEnabled(bool _allowListEnabled) external onlyRollupOrOwner { - require(_allowListEnabled != allowListEnabled, "ALREADY_SET"); - allowListEnabled = _allowListEnabled; - emit AllowListEnabledUpdated(_allowListEnabled); - } - - /// @dev this modifier checks the tx.origin instead of msg.sender for convenience (ie it allows - /// allowed users to interact with the token bridge without needing the token bridge to be allowList aware). - /// this modifier is not intended to use to be used for security (since this opens the allowList to - /// a smart contract phishing risk). - modifier onlyAllowed() { - // solhint-disable-next-line avoid-tx-origin - if (allowListEnabled && !isAllowed[tx.origin]) revert NotAllowedOrigin(tx.origin); - _; - } - - /// ------------------------------------ allow list end ------------------------------------ /// - - modifier onlyRollupOrOwner() { - IOwnable rollup = bridge.rollup(); - if (msg.sender != address(rollup)) { - address rollupOwner = rollup.owner(); - if (msg.sender != rollupOwner) { - revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner); - } - } - _; - } - - uint256 internal immutable deployTimeChainId = block.chainid; - - function _chainIdChanged() internal view returns (bool) { - return deployTimeChainId != block.chainid; - } - - /// @inheritdoc IInbox - function pause() external onlyRollupOrOwner { - _pause(); - } - - /// @inheritdoc IInbox - function unpause() external onlyRollupOrOwner { - _unpause(); - } +contract Inbox is AbsInbox, IInbox { + constructor(uint256 _maxDataSize) AbsInbox(_maxDataSize) {} + /// @inheritdoc IInboxBase function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external initializer onlyDelegated { - bridge = _bridge; - sequencerInbox = _sequencerInbox; - allowListEnabled = false; - __Pausable_init(); + __AbsInbox_init(_bridge, _sequencerInbox); } /// @inheritdoc IInbox function postUpgradeInit(IBridge) external onlyDelegated onlyProxyOwner {} /// @inheritdoc IInbox - function sendL2MessageFromOrigin(bytes calldata messageData) - external - whenNotPaused - onlyAllowed - returns (uint256) - { - if (_chainIdChanged()) revert L1Forked(); - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(messageData.length, MAX_DATA_SIZE); - uint256 msgNum = deliverToBridge(L2_MSG, msg.sender, keccak256(messageData)); - emit InboxMessageDeliveredFromOrigin(msgNum); - return msgNum; - } - - /// @inheritdoc IInbox - function sendL2Message(bytes calldata messageData) - external - whenNotPaused - onlyAllowed - returns (uint256) - { - if (_chainIdChanged()) revert L1Forked(); - return _deliverMessage(L2_MSG, msg.sender, messageData); - } - function sendL1FundedUnsignedTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -177,10 +75,12 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) + ), + msg.value ); } + /// @inheritdoc IInbox function sendL1FundedContractTransaction( uint256 gasLimit, uint256 maxFeePerGas, @@ -202,61 +102,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) - ); - } - - function sendUnsignedTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - uint256 nonce, - address to, - uint256 value, - bytes calldata data - ) external whenNotPaused onlyAllowed returns (uint256) { - // arbos will discard unsigned tx with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - return - _deliverMessage( - L2_MSG, - msg.sender, - abi.encodePacked( - L2MessageType_unsignedEOATx, - gasLimit, - maxFeePerGas, - nonce, - uint256(uint160(to)), - value, - data - ) - ); - } - - function sendContractTransaction( - uint256 gasLimit, - uint256 maxFeePerGas, - address to, - uint256 value, - bytes calldata data - ) external whenNotPaused onlyAllowed returns (uint256) { - // arbos will discard unsigned tx with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - return - _deliverMessage( - L2_MSG, - msg.sender, - abi.encodePacked( - L2MessageType_unsignedContractTx, - gasLimit, - maxFeePerGas, - uint256(uint160(to)), - value, - data - ) + ), + msg.value ); } @@ -288,7 +135,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), msg.value, data - ) + ), + msg.value ); } @@ -321,7 +169,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(to)), value, data - ) + ), + 0 ); } @@ -353,20 +202,11 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256(uint160(address(100))), // ArbSys address value, abi.encodeWithSelector(ArbSys.withdrawEth.selector, withdrawTo) - ) + ), + 0 ); } - /// @inheritdoc IInbox - function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) - public - view - returns (uint256) - { - // Use current block basefee if baseFee parameter is 0 - return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); - } - /// @inheritdoc IInbox function depositEth() public payable whenNotPaused onlyAllowed returns (uint256) { address dest = msg.sender; @@ -381,7 +221,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { _deliverMessage( L1MessageType_ethDeposit, msg.sender, - abi.encodePacked(dest, msg.value) + abi.encodePacked(dest, msg.value), + msg.value ); } @@ -439,28 +280,8 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256 maxFeePerGas, bytes calldata data ) external payable whenNotPaused onlyAllowed returns (uint256) { - // ensure the user's deposit alone will make submission succeed - if (msg.value < (maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas)) { - revert InsufficientValue( - maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, - msg.value - ); - } - - // if a refund address is a contract, we apply the alias to it - // so that it can access its funds on the L2 - // since the beneficiary and other refund addresses don't get rewritten by arb-os - if (AddressUpgradeable.isContract(excessFeeRefundAddress)) { - excessFeeRefundAddress = AddressAliasHelper.applyL1ToL2Alias(excessFeeRefundAddress); - } - if (AddressUpgradeable.isContract(callValueRefundAddress)) { - // this is the beneficiary. be careful since this is the address that can cancel the retryable in the L2 - callValueRefundAddress = AddressAliasHelper.applyL1ToL2Alias(callValueRefundAddress); - } - - // gas limit is validated to be within uint64 in unsafeCreateRetryableTicket return - unsafeCreateRetryableTicket( + _createRetryableTicket( to, l2CallValue, maxSubmissionCost, @@ -468,6 +289,7 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { callValueRefundAddress, gasLimit, maxFeePerGas, + msg.value, data ); } @@ -483,69 +305,39 @@ contract Inbox is DelegateCallAware, PausableUpgradeable, IInbox { uint256 maxFeePerGas, bytes calldata data ) public payable whenNotPaused onlyAllowed returns (uint256) { - // gas price and limit of 1 should never be a valid input, so instead they are used as - // magic values to trigger a revert in eth calls that surface data without requiring a tx trace - if (gasLimit == 1 || maxFeePerGas == 1) - revert RetryableData( - msg.sender, + return + _unsafeCreateRetryableTicket( to, l2CallValue, - msg.value, maxSubmissionCost, excessFeeRefundAddress, callValueRefundAddress, gasLimit, maxFeePerGas, + msg.value, data ); - - // arbos will discard retryable with gas limit too large - if (gasLimit > type(uint64).max) { - revert GasLimitTooLarge(); - } - - uint256 submissionFee = calculateRetryableSubmissionFee(data.length, block.basefee); - if (maxSubmissionCost < submissionFee) - revert InsufficientSubmissionCost(submissionFee, maxSubmissionCost); - - return - _deliverMessage( - L1MessageType_submitRetryableTx, - msg.sender, - abi.encodePacked( - uint256(uint160(to)), - l2CallValue, - msg.value, - maxSubmissionCost, - uint256(uint160(excessFeeRefundAddress)), - uint256(uint160(callValueRefundAddress)), - gasLimit, - maxFeePerGas, - data.length, - data - ) - ); } - function _deliverMessage( - uint8 _kind, - address _sender, - bytes memory _messageData - ) internal returns (uint256) { - if (_messageData.length > MAX_DATA_SIZE) - revert DataTooLarge(_messageData.length, MAX_DATA_SIZE); - uint256 msgNum = deliverToBridge(_kind, _sender, keccak256(_messageData)); - emit InboxMessageDelivered(msgNum, _messageData); - return msgNum; + /// @inheritdoc IInboxBase + function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee) + public + view + override(AbsInbox, IInboxBase) + returns (uint256) + { + // Use current block basefee if baseFee parameter is 0 + return (1400 + 6 * dataLength) * (baseFee == 0 ? block.basefee : baseFee); } - function deliverToBridge( + function _deliverToBridge( uint8 kind, address sender, - bytes32 messageDataHash - ) internal returns (uint256) { + bytes32 messageDataHash, + uint256 amount + ) internal override returns (uint256) { return - bridge.enqueueDelayedMessage{value: msg.value}( + IEthBridge(address(bridge)).enqueueDelayedMessage{value: amount}( kind, AddressAliasHelper.applyL1ToL2Alias(sender), messageDataHash diff --git a/src/bridge/Outbox.sol b/src/bridge/Outbox.sol index 9020e660..8ae873df 100644 --- a/src/bridge/Outbox.sol +++ b/src/bridge/Outbox.sol @@ -4,273 +4,20 @@ pragma solidity ^0.8.4; -import { - AlreadyInit, - NotRollup, - ProofTooLong, - PathNotMinimal, - UnknownRoot, - AlreadySpent, - BridgeCallFailed, - HadZeroInit -} from "../libraries/Error.sol"; -import "./IBridge.sol"; -import "./IOutbox.sol"; -import "../libraries/MerkleLib.sol"; -import "../libraries/DelegateCallAware.sol"; +import "./AbsOutbox.sol"; -/// @dev this error is thrown since certain functions are only expected to be used in simulations, not in actual txs -error SimulationOnlyEntrypoint(); - -contract Outbox is DelegateCallAware, IOutbox { - address public rollup; // the rollup contract - IBridge public bridge; // the bridge contract - - mapping(uint256 => bytes32) public spent; // packed spent bitmap - mapping(bytes32 => bytes32) public roots; // maps root hashes => L2 block hash - - struct L2ToL1Context { - uint128 l2Block; - uint128 l1Block; - uint128 timestamp; - bytes32 outputId; - address sender; - } - // Note, these variables are set and then wiped during a single transaction. - // Therefore their values don't need to be maintained, and their slots will - // be empty outside of transactions - L2ToL1Context internal context; - - // default context values to be used in storage instead of zero, to save on storage refunds - // it is assumed that arb-os never assigns these values to a valid leaf to be redeemed - uint128 private constant L2BLOCK_DEFAULT_CONTEXT = type(uint128).max; - uint128 private constant L1BLOCK_DEFAULT_CONTEXT = type(uint128).max; - uint128 private constant TIMESTAMP_DEFAULT_CONTEXT = type(uint128).max; - bytes32 private constant OUTPUTID_DEFAULT_CONTEXT = bytes32(type(uint256).max); - address private constant SENDER_DEFAULT_CONTEXT = address(type(uint160).max); - - uint128 public constant OUTBOX_VERSION = 2; - - function initialize(IBridge _bridge) external onlyDelegated { - if (address(_bridge) == address(0)) revert HadZeroInit(); - if (address(bridge) != address(0)) revert AlreadyInit(); - // address zero is returned if no context is set, but the values used in storage - // are non-zero to save users some gas (as storage refunds are usually maxed out) - // EIP-1153 would help here - context = L2ToL1Context({ - l2Block: L2BLOCK_DEFAULT_CONTEXT, - l1Block: L1BLOCK_DEFAULT_CONTEXT, - timestamp: TIMESTAMP_DEFAULT_CONTEXT, - outputId: OUTPUTID_DEFAULT_CONTEXT, - sender: SENDER_DEFAULT_CONTEXT - }); - bridge = _bridge; - rollup = address(_bridge.rollup()); - } - - function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external { - if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); - roots[root] = l2BlockHash; - emit SendRootUpdated(root, l2BlockHash); - } - - /// @inheritdoc IOutbox - function l2ToL1Sender() external view returns (address) { - address sender = context.sender; - // we don't return the default context value to avoid a breaking change in the API - if (sender == SENDER_DEFAULT_CONTEXT) return address(0); - return sender; - } - - /// @inheritdoc IOutbox - function l2ToL1Block() external view returns (uint256) { - uint128 l2Block = context.l2Block; - // we don't return the default context value to avoid a breaking change in the API - if (l2Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); - return uint256(l2Block); - } - - /// @inheritdoc IOutbox - function l2ToL1EthBlock() external view returns (uint256) { - uint128 l1Block = context.l1Block; - // we don't return the default context value to avoid a breaking change in the API - if (l1Block == L1BLOCK_DEFAULT_CONTEXT) return uint256(0); - return uint256(l1Block); - } - - /// @inheritdoc IOutbox - function l2ToL1Timestamp() external view returns (uint256) { - uint128 timestamp = context.timestamp; - // we don't return the default context value to avoid a breaking change in the API - if (timestamp == TIMESTAMP_DEFAULT_CONTEXT) return uint256(0); - return uint256(timestamp); - } - - /// @notice batch number is deprecated and now always returns 0 - function l2ToL1BatchNum() external pure returns (uint256) { +contract Outbox is AbsOutbox { + /// @inheritdoc AbsOutbox + function _defaultContextAmount() internal pure override returns (uint256) { + // In ETH-based chains withdrawal amount can be read from msg.value. For that reason + // amount slot in context will never be accessed and it has 0 default value return 0; } - /// @inheritdoc IOutbox - function l2ToL1OutputId() external view returns (bytes32) { - bytes32 outputId = context.outputId; - // we don't return the default context value to avoid a breaking change in the API - if (outputId == OUTPUTID_DEFAULT_CONTEXT) return bytes32(0); - return outputId; - } - - /// @inheritdoc IOutbox - function executeTransaction( - bytes32[] calldata proof, - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external { - bytes32 userTx = calculateItemHash( - l2Sender, - to, - l2Block, - l1Block, - l2Timestamp, - value, - data - ); - - recordOutputAsSpent(proof, index, userTx); - - executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); - } - - /// @inheritdoc IOutbox - function executeTransactionSimulation( - uint256 index, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) external { - if (msg.sender != address(0)) revert SimulationOnlyEntrypoint(); - executeTransactionImpl(index, l2Sender, to, l2Block, l1Block, l2Timestamp, value, data); - } - - function executeTransactionImpl( - uint256 outputId, - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) internal { - emit OutBoxTransactionExecuted(to, l2Sender, 0, outputId); - - // we temporarily store the previous values so the outbox can naturally - // unwind itself when there are nested calls to `executeTransaction` - L2ToL1Context memory prevContext = context; - - context = L2ToL1Context({ - sender: l2Sender, - l2Block: uint128(l2Block), - l1Block: uint128(l1Block), - timestamp: uint128(l2Timestamp), - outputId: bytes32(outputId) - }); - - // set and reset vars around execution so they remain valid during call - executeBridgeCall(to, value, data); - - context = prevContext; - } - - function _calcSpentIndexOffset(uint256 index) - internal - view - returns ( - uint256, - uint256, - bytes32 - ) - { - uint256 spentIndex = index / 255; // Note: Reserves the MSB. - uint256 bitOffset = index % 255; - bytes32 replay = spent[spentIndex]; - return (spentIndex, bitOffset, replay); - } - - function _isSpent(uint256 bitOffset, bytes32 replay) internal pure returns (bool) { - return ((replay >> bitOffset) & bytes32(uint256(1))) != bytes32(0); - } - - /// @inheritdoc IOutbox - function isSpent(uint256 index) external view returns (bool) { - (, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); - return _isSpent(bitOffset, replay); - } - - function recordOutputAsSpent( - bytes32[] memory proof, - uint256 index, - bytes32 item - ) internal { - if (proof.length >= 256) revert ProofTooLong(proof.length); - if (index >= 2**proof.length) revert PathNotMinimal(index, 2**proof.length); - - // Hash the leaf an extra time to prove it's a leaf - bytes32 calcRoot = calculateMerkleRoot(proof, index, item); - if (roots[calcRoot] == bytes32(0)) revert UnknownRoot(calcRoot); - - (uint256 spentIndex, uint256 bitOffset, bytes32 replay) = _calcSpentIndexOffset(index); - - if (_isSpent(bitOffset, replay)) revert AlreadySpent(index); - spent[spentIndex] = (replay | bytes32(1 << bitOffset)); - } - - function executeBridgeCall( - address to, - uint256 value, - bytes memory data - ) internal { - (bool success, bytes memory returndata) = bridge.executeCall(to, value, data); - if (!success) { - if (returndata.length > 0) { - // solhint-disable-next-line no-inline-assembly - assembly { - let returndata_size := mload(returndata) - revert(add(32, returndata), returndata_size) - } - } else { - revert BridgeCallFailed(); - } - } - } - - function calculateItemHash( - address l2Sender, - address to, - uint256 l2Block, - uint256 l1Block, - uint256 l2Timestamp, - uint256 value, - bytes calldata data - ) public pure returns (bytes32) { - return - keccak256(abi.encodePacked(l2Sender, to, l2Block, l1Block, l2Timestamp, value, data)); - } - - function calculateMerkleRoot( - bytes32[] memory proof, - uint256 path, - bytes32 item - ) public pure returns (bytes32) { - return MerkleLib.calculateRoot(proof, path, keccak256(abi.encodePacked(item))); + /// @inheritdoc AbsOutbox + function _amountToSetInContext(uint256) internal pure override returns (uint256) { + // In ETH-based chains withdrawal amount can be read from msg.value. For that reason + // amount slot in context will never be accessed, we keep it as 0 all the time + return 0; } } diff --git a/src/bridge/SequencerInbox.sol b/src/bridge/SequencerInbox.sol index 2ba25c16..16a65e77 100644 --- a/src/bridge/SequencerInbox.sol +++ b/src/bridge/SequencerInbox.sol @@ -7,9 +7,9 @@ pragma solidity ^0.8.0; import { AlreadyInit, HadZeroInit, + BadPostUpgradeInit, NotOrigin, DataTooLarge, - NotRollup, DelayedBackwards, DelayedTooFar, ForceIncludeBlockTooSoon, @@ -17,31 +17,42 @@ import { IncorrectMessagePreimage, NotBatchPoster, BadSequencerNumber, - DataNotAuthenticated, AlreadyValidDASKeyset, NoSuchKeyset, - NotForked + NotForked, + NotBatchPosterManager, + RollupNotChanged, + DataBlobsNotSupported, + InitParamZero, + MissingDataHashes, + NotOwner, + InvalidHeaderFlag, + NativeTokenMismatch, + BadMaxTimeVariation, + Deprecated } from "../libraries/Error.sol"; import "./IBridge.sol"; -import "./IInbox.sol"; +import "./IInboxBase.sol"; import "./ISequencerInbox.sol"; import "../rollup/IRollupLogic.sol"; import "./Messages.sol"; import "../precompiles/ArbGasInfo.sol"; import "../precompiles/ArbSys.sol"; +import "../libraries/IReader4844.sol"; import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol"; -import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol"; import "../libraries/DelegateCallAware.sol"; +import {IGasRefunder} from "../libraries/IGasRefunder.sol"; +import {GasRefundEnabled} from "../libraries/GasRefundEnabled.sol"; import "../libraries/ArbitrumChecker.sol"; -import {MAX_DATA_SIZE} from "../libraries/Constants.sol"; +import {IERC20Bridge} from "./IERC20Bridge.sol"; /** - * @title Accepts batches from the sequencer and adds them to the rollup inbox. + * @title Accepts batches from the sequencer and adds them to the rollup inbox. * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup. - * As part of submitting a batch the sequencer is also expected to include items enqueued - * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a - * sequencer within a time limit they can be force included into the rollup inbox by anyone. + * As part of submitting a batch the sequencer is also expected to include items enqueued + * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a + * sequencer within a time limit they can be force included into the rollup inbox by anyone. */ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox { uint256 public totalDelayedMessagesRead; @@ -54,61 +65,219 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox /// @inheritdoc ISequencerInbox bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40; + /// @inheritdoc ISequencerInbox + bytes1 public constant DATA_BLOB_HEADER_FLAG = DATA_AUTHENTICATED_FLAG | 0x10; + + /// @inheritdoc ISequencerInbox + bytes1 public constant DAS_MESSAGE_HEADER_FLAG = 0x80; + + /// @inheritdoc ISequencerInbox + bytes1 public constant TREE_DAS_MESSAGE_HEADER_FLAG = 0x08; + + /// @inheritdoc ISequencerInbox + bytes1 public constant BROTLI_MESSAGE_HEADER_FLAG = 0x00; + + /// @inheritdoc ISequencerInbox + bytes1 public constant ZERO_HEAVY_MESSAGE_HEADER_FLAG = 0x20; + + // GAS_PER_BLOB from EIP-4844 + uint256 internal constant GAS_PER_BLOB = 1 << 17; + IOwnable public rollup; + mapping(address => bool) public isBatchPoster; - ISequencerInbox.MaxTimeVariation public maxTimeVariation; + + // we previously stored the max time variation in a (uint,uint,uint,uint) struct here + // solhint-disable-next-line var-name-mixedcase + ISequencerInbox.MaxTimeVariation private __LEGACY_MAX_TIME_VARIATION; mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo; modifier onlyRollupOwner() { - if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup)); + if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, rollup.owner()); _; } - uint256 internal immutable deployTimeChainId = block.chainid; + modifier onlyRollupOwnerOrBatchPosterManager() { + if (msg.sender != rollup.owner() && msg.sender != batchPosterManager) { + revert NotBatchPosterManager(msg.sender); + } + _; + } mapping(address => bool) public isSequencer; + IReader4844 public immutable reader4844; + + // see ISequencerInbox.MaxTimeVariation + uint64 internal delayBlocks; + uint64 internal futureBlocks; + uint64 internal delaySeconds; + uint64 internal futureSeconds; + /// @inheritdoc ISequencerInbox + address public batchPosterManager; + + // On L1 this should be set to 117964: 90% of Geth's 128KB tx size limit, leaving ~13KB for proving + uint256 public immutable maxDataSize; + uint256 internal immutable deployTimeChainId = block.chainid; // If the chain this SequencerInbox is deployed on is an Arbitrum chain. bool internal immutable hostChainIsArbitrum = ArbitrumChecker.runningOnArbitrum(); + // True if the chain this SequencerInbox is deployed on uses custom fee token + bool public immutable isUsingFeeToken; + + constructor( + uint256 _maxDataSize, + IReader4844 reader4844_, + bool _isUsingFeeToken + ) { + maxDataSize = _maxDataSize; + if (hostChainIsArbitrum) { + if (reader4844_ != IReader4844(address(0))) revert DataBlobsNotSupported(); + } else { + if (reader4844_ == IReader4844(address(0))) revert InitParamZero("Reader4844"); + } + reader4844 = reader4844_; + isUsingFeeToken = _isUsingFeeToken; + } function _chainIdChanged() internal view returns (bool) { return deployTimeChainId != block.chainid; } + function postUpgradeInit() external onlyDelegated onlyProxyOwner { + // Assuming we would not upgrade from a version that have MaxTimeVariation all set to zero + // If that is the case, postUpgradeInit do not need to be called + if ( + __LEGACY_MAX_TIME_VARIATION.delayBlocks == 0 && + __LEGACY_MAX_TIME_VARIATION.futureBlocks == 0 && + __LEGACY_MAX_TIME_VARIATION.delaySeconds == 0 && + __LEGACY_MAX_TIME_VARIATION.futureSeconds == 0 + ) { + revert AlreadyInit(); + } + + if ( + __LEGACY_MAX_TIME_VARIATION.delayBlocks > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION.futureBlocks > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION.delaySeconds > type(uint64).max || + __LEGACY_MAX_TIME_VARIATION.futureSeconds > type(uint64).max + ) { + revert BadPostUpgradeInit(); + } + + delayBlocks = uint64(__LEGACY_MAX_TIME_VARIATION.delayBlocks); + futureBlocks = uint64(__LEGACY_MAX_TIME_VARIATION.futureBlocks); + delaySeconds = uint64(__LEGACY_MAX_TIME_VARIATION.delaySeconds); + futureSeconds = uint64(__LEGACY_MAX_TIME_VARIATION.futureSeconds); + + __LEGACY_MAX_TIME_VARIATION.delayBlocks = 0; + __LEGACY_MAX_TIME_VARIATION.futureBlocks = 0; + __LEGACY_MAX_TIME_VARIATION.delaySeconds = 0; + __LEGACY_MAX_TIME_VARIATION.futureSeconds = 0; + } + function initialize( IBridge bridge_, ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_ ) external onlyDelegated { if (bridge != IBridge(address(0))) revert AlreadyInit(); if (bridge_ == IBridge(address(0))) revert HadZeroInit(); + + // Make sure logic contract was created by proper value for 'isUsingFeeToken'. + // Bridge in ETH based chains doesn't implement nativeToken(). In future it might implement it and return address(0) + bool actualIsUsingFeeToken = false; + try IERC20Bridge(address(bridge_)).nativeToken() returns (address feeToken) { + if (feeToken != address(0)) { + actualIsUsingFeeToken = true; + } + } catch {} + if (isUsingFeeToken != actualIsUsingFeeToken) { + revert NativeTokenMismatch(); + } + bridge = bridge_; rollup = bridge_.rollup(); - maxTimeVariation = maxTimeVariation_; + + _setMaxTimeVariation(maxTimeVariation_); } - function getTimeBounds() internal view virtual returns (TimeBounds memory) { - TimeBounds memory bounds; - if (block.timestamp > maxTimeVariation.delaySeconds) { - bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); + IOwnable newRollup = bridge.rollup(); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; + } + + function getTimeBounds() internal view virtual returns (IBridge.TimeBounds memory) { + IBridge.TimeBounds memory bounds; + ( + uint64 delayBlocks_, + uint64 futureBlocks_, + uint64 delaySeconds_, + uint64 futureSeconds_ + ) = maxTimeVariationInternal(); + if (block.timestamp > delaySeconds_) { + bounds.minTimestamp = uint64(block.timestamp) - delaySeconds_; } - bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); - if (block.number > maxTimeVariation.delayBlocks) { - bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + bounds.maxTimestamp = uint64(block.timestamp) + futureSeconds_; + if (block.number > delayBlocks_) { + bounds.minBlockNumber = uint64(block.number) - delayBlocks_; } - bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bounds.maxBlockNumber = uint64(block.number) + futureBlocks_; return bounds; } /// @inheritdoc ISequencerInbox function removeDelayAfterFork() external { if (!_chainIdChanged()) revert NotForked(); - maxTimeVariation = ISequencerInbox.MaxTimeVariation({ - delayBlocks: 1, - futureBlocks: 1, - delaySeconds: 1, - futureSeconds: 1 - }); + delayBlocks = 1; + futureBlocks = 1; + delaySeconds = 1; + futureSeconds = 1; + } + + function maxTimeVariation() + external + view + returns ( + uint256, + uint256, + uint256, + uint256 + ) + { + ( + uint64 delayBlocks_, + uint64 futureBlocks_, + uint64 delaySeconds_, + uint64 futureSeconds_ + ) = maxTimeVariationInternal(); + + return ( + uint256(delayBlocks_), + uint256(futureBlocks_), + uint256(delaySeconds_), + uint256(futureSeconds_) + ); + } + + function maxTimeVariationInternal() + internal + view + returns ( + uint64, + uint64, + uint64, + uint64 + ) + { + if (_chainIdChanged()) { + return (1, 1, 1, 1); + } else { + return (delayBlocks, futureBlocks, delaySeconds, futureSeconds); + } } /// @inheritdoc ISequencerInbox @@ -131,10 +300,8 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox messageDataHash ); // Can only force-include after the Sequencer-only window has expired. - if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number) - revert ForceIncludeBlockTooSoon(); - if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp) - revert ForceIncludeTimeTooSoon(); + if (l1BlockAndTime[0] + delayBlocks >= block.number) revert ForceIncludeBlockTooSoon(); + if (l1BlockAndTime[1] + delaySeconds >= block.timestamp) revert ForceIncludeTimeTooSoon(); // Verify that message hash represents the last message sequence of delayed message to be included bytes32 prevDelayedAcc = 0; @@ -146,14 +313,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox Messages.accumulateInboxMessage(prevDelayedAcc, messageHash) ) revert IncorrectMessagePreimage(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash( _totalDelayedMessagesRead ); uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead; uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount(); - uint256 newSeqMsgCount = prevSeqMsgCount + - _totalDelayedMessagesRead - - totalDelayedMessagesRead; + uint256 newSeqMsgCount = prevSeqMsgCount; // force inclusion should not modify sequencer message count ( uint256 seqMessageIndex, bytes32 beforeAcc, @@ -173,42 +338,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox delayedAcc, totalDelayedMessagesRead, timeBounds, - BatchDataLocation.NoData + IBridge.BatchDataLocation.NoData ); } - /// @dev Deprecated in favor of the variant specifying message counts for consistency + /// @dev Deprecated, kept for abi generation and will be removed in the future function addSequencerL2BatchFromOrigin( - uint256 sequenceNumber, - bytes calldata data, - uint256 afterDelayedMessagesRead, - IGasRefunder gasRefunder - ) external refundsGas(gasRefunder) { - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) revert NotOrigin(); - if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( - data, - afterDelayedMessagesRead - ); - ( - uint256 seqMessageIndex, - bytes32 beforeAcc, - bytes32 delayedAcc, - bytes32 afterAcc - ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0); - if (seqMessageIndex != sequenceNumber) - revert BadSequencerNumber(seqMessageIndex, sequenceNumber); - emit SequencerBatchDelivered( - sequenceNumber, - beforeAcc, - afterAcc, - delayedAcc, - totalDelayedMessagesRead, - timeBounds, - BatchDataLocation.TxInput - ); + uint256, + bytes calldata, + uint256, + IGasRefunder + ) external pure { + revert Deprecated(); } function addSequencerL2BatchFromOrigin( @@ -218,17 +359,17 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external refundsGas(gasRefunder) { + ) external refundsGas(gasRefunder, IReader4844(address(0))) { // solhint-disable-next-line avoid-tx-origin if (msg.sender != tx.origin) revert NotOrigin(); if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, afterDelayedMessagesRead ); // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; + IBridge.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 dataLength = data.length; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; @@ -246,8 +387,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox prevMessageCount_, newMessageCount_ ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); + } + emit SequencerBatchDelivered( seqMessageIndex, beforeAcc, @@ -255,10 +400,71 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox delayedAcc, totalDelayedMessagesRead, timeBounds_, - BatchDataLocation.TxInput + IBridge.BatchDataLocation.TxInput ); } + function addSequencerL2BatchFromBlobs( + uint256 sequenceNumber, + uint256 afterDelayedMessagesRead, + IGasRefunder gasRefunder, + uint256 prevMessageCount, + uint256 newMessageCount + ) external refundsGas(gasRefunder, reader4844) { + if (!isBatchPoster[msg.sender]) revert NotBatchPoster(); + ( + bytes32 dataHash, + IBridge.TimeBounds memory timeBounds, + uint256 blobGas + ) = formBlobDataHash(afterDelayedMessagesRead); + + // we use addSequencerL2BatchImpl for submitting the message + // normally this would also submit a batch spending report but that is skipped if we pass + // an empty call data size, then we submit a separate batch spending report later + ( + uint256 seqMessageIndex, + bytes32 beforeAcc, + bytes32 delayedAcc, + bytes32 afterAcc + ) = addSequencerL2BatchImpl( + dataHash, + afterDelayedMessagesRead, + 0, + prevMessageCount, + newMessageCount + ); + + uint256 _sequenceNumber = sequenceNumber; // stack workaround + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != _sequenceNumber && _sequenceNumber != ~uint256(0)) { + revert BadSequencerNumber(seqMessageIndex, _sequenceNumber); + } + + emit SequencerBatchDelivered( + _sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + totalDelayedMessagesRead, + timeBounds, + IBridge.BatchDataLocation.Blob + ); + + // blobs are currently not supported on host arbitrum chains, when support is added it may + // consume gas in a different way to L1, so explicitly block host arb chains so that if support for blobs + // on arb is added it will need to explicitly turned on in the sequencer inbox + if (hostChainIsArbitrum) revert DataBlobsNotSupported(); + + // submit a batch spending report to refund the entity that produced the blob batch data + // same as using calldata, we only submit spending report if the caller is the origin of the tx + // such that one cannot "double-claim" batch posting refund in the same tx + // solhint-disable-next-line avoid-tx-origin + if (msg.sender == tx.origin && !isUsingFeeToken) { + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, blobGas); + } + } + function addSequencerL2Batch( uint256 sequenceNumber, bytes calldata data, @@ -266,9 +472,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox IGasRefunder gasRefunder, uint256 prevMessageCount, uint256 newMessageCount - ) external override refundsGas(gasRefunder) { + ) external override refundsGas(gasRefunder, IReader4844(address(0))) { if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster(); - (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash( + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formCallDataHash( data, afterDelayedMessagesRead ); @@ -276,7 +482,7 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox { // Reformat the stack to prevent "Stack too deep" uint256 sequenceNumber_ = sequenceNumber; - TimeBounds memory timeBounds_ = timeBounds; + IBridge.TimeBounds memory timeBounds_ = timeBounds; bytes32 dataHash_ = dataHash; uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead; uint256 prevMessageCount_ = prevMessageCount; @@ -293,8 +499,12 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox prevMessageCount_, newMessageCount_ ); - if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) + + // ~uint256(0) is type(uint256).max, but ever so slightly cheaper + if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0)) { revert BadSequencerNumber(seqMessageIndex, sequenceNumber_); + } + emit SequencerBatchDelivered( seqMessageIndex, beforeAcc, @@ -302,34 +512,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox delayedAcc, totalDelayedMessagesRead, timeBounds_, - BatchDataLocation.SeparateBatchEvent + IBridge.BatchDataLocation.SeparateBatchEvent ); } emit SequencerBatchData(seqMessageIndex, data); } - modifier validateBatchData(bytes calldata data) { - uint256 fullDataLen = HEADER_LENGTH + data.length; - if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE); - if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) { - revert DataNotAuthenticated(); - } - // the first byte is used to identify the type of batch data - // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) - if (data.length >= 33 && data[0] & 0x80 != 0) { - // we skip the first byte, then read the next 32 bytes for the keyset - bytes32 dasKeysetHash = bytes32(data[1:33]); - if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); - } - _; - } - function packHeader(uint256 afterDelayedMessagesRead) internal view - returns (bytes memory, TimeBounds memory) + returns (bytes memory, IBridge.TimeBounds memory) { - TimeBounds memory timeBounds = getTimeBounds(); + IBridge.TimeBounds memory timeBounds = getTimeBounds(); bytes memory header = abi.encodePacked( timeBounds.minTimestamp, timeBounds.maxTimestamp, @@ -342,24 +536,139 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return (header, timeBounds); } - function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) + /// @dev Form a hash for a sequencer message with no batch data + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed + function formEmptyDataHash(uint256 afterDelayedMessagesRead) internal view - validateBatchData(data) - returns (bytes32, TimeBounds memory) + returns (bytes32, IBridge.TimeBounds memory) { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - bytes32 dataHash = keccak256(bytes.concat(header, data)); - return (dataHash, timeBounds); + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); + return (keccak256(header), timeBounds); } - function formEmptyDataHash(uint256 afterDelayedMessagesRead) + /// @dev Since the data is supplied from calldata, the batch poster can choose the data type + /// We need to ensure that this data cannot cause a collision with data supplied via another method (eg blobs) + /// therefore we restrict which flags can be provided as a header in this field + /// This also safe guards unused flags for future use, as we know they would have been disallowed up until this point + /// @param headerByte The first byte in the calldata + function isValidCallDataFlag(bytes1 headerByte) internal pure returns (bool) { + return + headerByte == BROTLI_MESSAGE_HEADER_FLAG || + headerByte == DAS_MESSAGE_HEADER_FLAG || + (headerByte == (DAS_MESSAGE_HEADER_FLAG | TREE_DAS_MESSAGE_HEADER_FLAG)) || + headerByte == ZERO_HEAVY_MESSAGE_HEADER_FLAG; + } + + /// @dev Form a hash of the data taken from the calldata + /// @param data The calldata to be hashed + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed + function formCallDataHash(bytes calldata data, uint256 afterDelayedMessagesRead) internal view - returns (bytes32, TimeBounds memory) + returns (bytes32, IBridge.TimeBounds memory) { - (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead); - return (keccak256(header), timeBounds); + uint256 fullDataLen = HEADER_LENGTH + data.length; + if (fullDataLen > maxDataSize) revert DataTooLarge(fullDataLen, maxDataSize); + + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); + + // the batch poster is allowed to submit an empty batch, they can use this to progress the + // delayed inbox without providing extra batch data + if (data.length > 0) { + // The first data byte cannot be the same as any that have been set via other methods (eg 4844 blob header) as this + // would allow the supplier of the data to spoof an incorrect 4844 data batch + if (!isValidCallDataFlag(data[0])) revert InvalidHeaderFlag(data[0]); + + // the first byte is used to identify the type of batch data + // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes) + // if invalid data is supplied here the state transition function will process it as an empty block + // however we can provide a nice additional check here for the batch poster + if (data[0] & DAS_MESSAGE_HEADER_FLAG != 0 && data.length >= 33) { + // we skip the first byte, then read the next 32 bytes for the keyset + bytes32 dasKeysetHash = bytes32(data[1:33]); + if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash); + } + } + return (keccak256(bytes.concat(header, data)), timeBounds); + } + + /// @dev Form a hash of the data being provided in 4844 data blobs + /// @param afterDelayedMessagesRead The delayed messages count read up to + /// @return The data hash + /// @return The timebounds within which the message should be processed + /// @return The normalized amount of gas used for blob posting + function formBlobDataHash(uint256 afterDelayedMessagesRead) + internal + view + returns ( + bytes32, + IBridge.TimeBounds memory, + uint256 + ) + { + bytes32[] memory dataHashes = reader4844.getDataHashes(); + if (dataHashes.length == 0) revert MissingDataHashes(); + + (bytes memory header, IBridge.TimeBounds memory timeBounds) = packHeader( + afterDelayedMessagesRead + ); + + uint256 blobCost = reader4844.getBlobBaseFee() * GAS_PER_BLOB * dataHashes.length; + return ( + keccak256(bytes.concat(header, DATA_BLOB_HEADER_FLAG, abi.encodePacked(dataHashes))), + timeBounds, + block.basefee > 0 ? blobCost / block.basefee : 0 + ); + } + + /// @dev Submit a batch spending report message so that the batch poster can be reimbursed on the rollup + /// This function expect msg.sender is tx.origin, and will always record tx.origin as the spender + /// @param dataHash The hash of the message the spending report is being submitted for + /// @param seqMessageIndex The index of the message to submit the spending report for + /// @param gasPrice The gas price that was paid for the data (standard gas or data gas) + function submitBatchSpendingReport( + bytes32 dataHash, + uint256 seqMessageIndex, + uint256 gasPrice, + uint256 extraGas + ) internal { + // report the account who paid the gas (tx.origin) for the tx as batch poster + // if msg.sender is used and is a contract, it might not be able to spend the refund on l2 + // solhint-disable-next-line avoid-tx-origin + address batchPoster = tx.origin; + + // this msg isn't included in the current sequencer batch, but instead added to + // the delayed messages queue that is yet to be included + if (hostChainIsArbitrum) { + // Include extra gas for the host chain's L1 gas charging + uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); + extraGas += l1Fees / block.basefee; + } + require(extraGas <= type(uint64).max, "EXTRA_GAS_NOT_UINT64"); + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + batchPoster, + dataHash, + seqMessageIndex, + gasPrice, + uint64(extraGas) + ); + + uint256 msgNum = bridge.submitBatchSpendingReport( + batchPoster, + keccak256(spendingReportMsg) + ); + // this is the same event used by Inbox.sol after including a message to the delayed message accumulator + emit InboxMessageDelivered(msgNum, spendingReportMsg); } function addSequencerL2BatchImpl( @@ -389,39 +698,9 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox totalDelayedMessagesRead = afterDelayedMessagesRead; - if (calldataLengthPosted > 0) { - // this msg isn't included in the current sequencer batch, but instead added to - // the delayed messages queue that is yet to be included - address batchPoster = msg.sender; - bytes memory spendingReportMsg; - if (hostChainIsArbitrum) { - // Include extra gas for the host chain's L1 gas charging - uint256 l1Fees = ArbGasInfo(address(0x6c)).getCurrentTxL1GasFees(); - uint256 extraGas = l1Fees / block.basefee; - require(extraGas <= type(uint64).max, "L1_GAS_NOT_UINT64"); - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee, - uint64(extraGas) - ); - } else { - spendingReportMsg = abi.encodePacked( - block.timestamp, - batchPoster, - dataHash, - seqMessageIndex, - block.basefee - ); - } - uint256 msgNum = bridge.submitBatchSpendingReport( - batchPoster, - keccak256(spendingReportMsg) - ); - // this is the same event used by Inbox.sol after including a message to the delayed message accumulator - emit InboxMessageDelivered(msgNum, spendingReportMsg); + if (calldataLengthPosted > 0 && !isUsingFeeToken) { + // only report batch poster spendings if chain is using ETH as native currency + submitBatchSpendingReport(dataHash, seqMessageIndex, block.basefee, 0); } } @@ -433,17 +712,37 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox return bridge.sequencerMessageCount(); } + function _setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_) + internal + { + if ( + maxTimeVariation_.delayBlocks > type(uint64).max || + maxTimeVariation_.futureBlocks > type(uint64).max || + maxTimeVariation_.delaySeconds > type(uint64).max || + maxTimeVariation_.futureSeconds > type(uint64).max + ) { + revert BadMaxTimeVariation(); + } + delayBlocks = uint64(maxTimeVariation_.delayBlocks); + futureBlocks = uint64(maxTimeVariation_.futureBlocks); + delaySeconds = uint64(maxTimeVariation_.delaySeconds); + futureSeconds = uint64(maxTimeVariation_.futureSeconds); + } + /// @inheritdoc ISequencerInbox function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_) external onlyRollupOwner { - maxTimeVariation = maxTimeVariation_; + _setMaxTimeVariation(maxTimeVariation_); emit OwnerFunctionCalled(0); } /// @inheritdoc ISequencerInbox - function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner { + function setIsBatchPoster(address addr, bool isBatchPoster_) + external + onlyRollupOwnerOrBatchPosterManager + { isBatchPoster[addr] = isBatchPoster_; emit OwnerFunctionCalled(1); } @@ -479,9 +778,18 @@ contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox } /// @inheritdoc ISequencerInbox - function setIsSequencer(address addr, bool isSequencer_) external onlyRollupOwner { + function setIsSequencer(address addr, bool isSequencer_) + external + onlyRollupOwnerOrBatchPosterManager + { isSequencer[addr] = isSequencer_; - emit OwnerFunctionCalled(4); + emit OwnerFunctionCalled(4); // Owner in this context can also be batch poster manager + } + + /// @inheritdoc ISequencerInbox + function setBatchPosterManager(address newBatchPosterManager) external onlyRollupOwner { + batchPosterManager = newBatchPosterManager; + emit OwnerFunctionCalled(5); } function isValidKeysetHash(bytes32 ksHash) external view returns (bool) { diff --git a/src/chain/CacheManager.sol b/src/chain/CacheManager.sol new file mode 100644 index 00000000..434560a8 --- /dev/null +++ b/src/chain/CacheManager.sol @@ -0,0 +1,208 @@ +// Copyright 2022-2024, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; +import "../precompiles/ArbOwnerPublic.sol"; +import "../precompiles/ArbWasm.sol"; +import "../precompiles/ArbWasmCache.sol"; +import "solady/src/utils/MinHeapLib.sol"; + +contract CacheManager { + using MinHeapLib for MinHeapLib.Heap; + + ArbOwnerPublic internal constant ARB_OWNER_PUBLIC = ArbOwnerPublic(address(0x6b)); + ArbWasm internal constant ARB_WASM = ArbWasm(address(0x71)); + ArbWasmCache internal constant ARB_WASM_CACHE = ArbWasmCache(address(0x72)); + uint64 internal constant MAX_MAKE_SPACE = 5 * 1024 * 1024; + + MinHeapLib.Heap internal bids; + Entry[] public entries; + + uint64 public cacheSize; + uint64 public queueSize; + uint64 public decay; + bool public isPaused; + + error NotChainOwner(address sender); + error AsmTooLarge(uint256 asm, uint256 queueSize, uint256 cacheSize); + error AlreadyCached(bytes32 codehash); + error BidTooSmall(uint192 bid, uint192 min); + error BidsArePaused(); + error MakeSpaceTooLarge(uint64 size, uint64 limit); + + event InsertBid(bytes32 indexed codehash, uint192 bid, uint64 size); + event DeleteBid(bytes32 indexed codehash, uint192 bid, uint64 size); + event SetCacheSize(uint64 size); + event SetDecayRate(uint64 decay); + event Pause(); + event Unpause(); + + struct Entry { + bytes32 code; + uint64 size; + } + + constructor(uint64 initCacheSize, uint64 initDecay) { + cacheSize = initCacheSize; + decay = initDecay; + } + + modifier onlyOwner() { + if (!ARB_OWNER_PUBLIC.isChainOwner(msg.sender)) { + revert NotChainOwner(msg.sender); + } + _; + } + + /// Sets the intended cache size. Note that the queue may temporarily be larger. + function setCacheSize(uint64 newSize) external onlyOwner { + cacheSize = newSize; + emit SetCacheSize(newSize); + } + + /// Sets the intended decay factor. Does not modify existing bids. + function setDecayRate(uint64 newDecay) external onlyOwner { + decay = newDecay; + emit SetDecayRate(newDecay); + } + + /// Disable new bids. + function paused() external onlyOwner { + isPaused = true; + emit Pause(); + } + + /// Enable new bids. + function unpause() external onlyOwner { + isPaused = false; + emit Unpause(); + } + + /// Evicts all programs in the cache. + function evictAll() external onlyOwner { + evictPrograms(type(uint256).max); + delete entries; + } + + /// Evicts up to `count` programs from the cache. + function evictPrograms(uint256 count) public onlyOwner { + while (bids.length() != 0 && count > 0) { + (uint192 bid, uint64 index) = _getBid(bids.pop()); + _deleteEntry(bid, index); + count -= 1; + } + } + + /// Sends all revenue to the network fee account. + function sweepFunds() external { + (bool success, bytes memory data) = ARB_OWNER_PUBLIC.getNetworkFeeAccount().call{ + value: address(this).balance + }(""); + if (!success) { + assembly { + revert(add(data, 32), mload(data)) + } + } + } + + /// Places a bid, reverting if payment is insufficient. + function placeBid(bytes32 codehash) external payable { + if (isPaused) { + revert BidsArePaused(); + } + if (_isCached(codehash)) { + revert AlreadyCached(codehash); + } + + uint64 asm = _asmSize(codehash); + (uint192 bid, uint64 index) = _makeSpace(asm); + return _addBid(bid, codehash, asm, index); + } + + /// Evicts entries until enough space exists in the cache, reverting if payment is insufficient. + /// Returns the new amount of space available on success. + /// Note: will revert for requests larger than 5Mb. Call repeatedly for more. + function makeSpace(uint64 size) external payable returns (uint64 space) { + if (isPaused) { + revert BidsArePaused(); + } + if (size > MAX_MAKE_SPACE) { + revert MakeSpaceTooLarge(size, MAX_MAKE_SPACE); + } + _makeSpace(size); + return cacheSize - queueSize; + } + + /// Evicts entries until enough space exists in the cache, reverting if payment is insufficient. + /// Returns the bid and the index to use for insertion. + function _makeSpace(uint64 size) internal returns (uint192 bid, uint64 index) { + // discount historical bids by the number of seconds + bid = uint192(msg.value + block.timestamp * uint256(decay)); + index = uint64(entries.length); + + uint192 min; + uint64 limit = cacheSize; + while (queueSize + size > limit) { + (min, index) = _getBid(bids.pop()); + _deleteEntry(min, index); + } + if (bid < min) { + revert BidTooSmall(bid, min); + } + } + + /// Adds a bid + function _addBid( + uint192 bid, + bytes32 code, + uint64 size, + uint64 index + ) internal { + if (queueSize + size > cacheSize) { + revert AsmTooLarge(size, queueSize, cacheSize); + } + + Entry memory entry = Entry({size: size, code: code}); + ARB_WASM_CACHE.cacheCodehash(code); + bids.push(_packBid(bid, index)); + queueSize += size; + if (index == entries.length) { + entries.push(entry); + } else { + entries[index] = entry; + } + emit InsertBid(code, bid, size); + } + + /// Clears the entry at the given index + function _deleteEntry(uint192 bid, uint64 index) internal { + Entry memory entry = entries[index]; + ARB_WASM_CACHE.evictCodehash(entry.code); + queueSize -= entry.size; + emit DeleteBid(entry.code, bid, entry.size); + delete entries[index]; + } + + /// Gets the bid and index from a packed bid item + function _getBid(uint256 info) internal pure returns (uint192 bid, uint64 index) { + bid = uint192(info >> 64); + index = uint64(info); + } + + /// Creates a packed bid item + function _packBid(uint192 bid, uint64 index) internal pure returns (uint256) { + return (uint256(bid) << 64) | uint256(index); + } + + /// Gets the size of the given program in bytes + function _asmSize(bytes32 codehash) internal view returns (uint64) { + uint32 size = ARB_WASM.codehashAsmSize(codehash); + return uint64(size >= 4096 ? size : 4096); // pretend it's at least 4Kb + } + + /// Determines whether a program is cached + function _isCached(bytes32 codehash) internal view returns (bool) { + return ARB_WASM_CACHE.codehashIsCached(codehash); + } +} diff --git a/src/challenge/ChallengeLib.sol b/src/challenge/ChallengeLib.sol index 25ff894d..30a4fc1d 100644 --- a/src/challenge/ChallengeLib.sol +++ b/src/challenge/ChallengeLib.sol @@ -5,11 +5,13 @@ pragma solidity ^0.8.0; import "../state/Machine.sol"; +import "../state/MultiStack.sol"; import "../state/GlobalState.sol"; library ChallengeLib { using MachineLib for Machine; using ChallengeLib for Challenge; + using MultiStackLib for MultiStack; /// @dev It's assumed that that uninitialzed challenges have mode NONE enum ChallengeMode { @@ -62,16 +64,21 @@ library ChallengeLib { ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0}); ValueStack memory internalStack; StackFrameWindow memory frameStack; + MultiStack memory emptyMultiStack; + emptyMultiStack.setEmpty(); Machine memory mach = Machine({ status: MachineStatus.RUNNING, valueStack: values, + valueMultiStack: emptyMultiStack, internalStack: internalStack, frameStack: frameStack, + frameMultiStack: emptyMultiStack, globalStateHash: globalStateHash, moduleIdx: 0, functionIdx: 0, functionPc: 0, + recoveryPc: MachineLib.NO_RECOVERY_PC, modulesRoot: wasmModuleRoot }); return mach.hash(); diff --git a/src/challenge/ChallengeManager.sol b/src/challenge/ChallengeManager.sol index 12cad085..c5427e7e 100644 --- a/src/challenge/ChallengeManager.sol +++ b/src/challenge/ChallengeManager.sol @@ -110,6 +110,12 @@ contract ChallengeManager is DelegateCallAware, IChallengeManager { osp = osp_; } + function postUpgradeInit(IOneStepProofEntry osp_) external onlyDelegated onlyProxyOwner { + // when updating to 4844 we need to create new osp contracts and set them here + // on the challenge manager + osp = osp_; + } + function createChallenge( bytes32 wasmModuleRoot_, MachineStatus[2] calldata startAndEndMachineStatuses_, diff --git a/src/libraries/Constants.sol b/src/libraries/Constants.sol index d15bdf16..c06c6144 100644 --- a/src/libraries/Constants.sol +++ b/src/libraries/Constants.sol @@ -4,9 +4,6 @@ pragma solidity ^0.8.4; -// 90% of Geth's 128KB tx size limit, leaving ~13KB for proving -uint256 constant MAX_DATA_SIZE = 117964; - uint64 constant NO_CHAL_INDEX = 0; // Expected seconds per block in Ethereum PoS diff --git a/src/libraries/Error.sol b/src/libraries/Error.sol index 2114aa1e..0d5a2a8d 100644 --- a/src/libraries/Error.sol +++ b/src/libraries/Error.sol @@ -7,9 +7,12 @@ pragma solidity ^0.8.4; /// @dev Init was already called error AlreadyInit(); -/// Init was called with param set to zero that must be nonzero +/// @dev Init was called with param set to zero that must be nonzero error HadZeroInit(); +/// @dev Thrown when post upgrade init validation fails +error BadPostUpgradeInit(); + /// @dev Thrown when non owner tries to access an only-owner function /// @param sender The msg.sender who is not the owner /// @param owner The owner address @@ -61,6 +64,17 @@ error NotOutbox(address sender); /// @param outbox address of outbox being set error InvalidOutboxSet(address outbox); +/// @dev The provided token address isn't valid +/// @param token address of token being set +error InvalidTokenSet(address token); + +/// @dev Call to this specific address is not allowed +/// @param target address of the call receiver +error CallTargetNotAllowed(address target); + +/// @dev Call that changes the balance of ERC20Bridge is not allowed +error CallNotAllowed(); + // Inbox Errors /// @dev The contract is paused, so cannot be paused @@ -153,11 +167,35 @@ error BadSequencerNumber(uint256 stored, uint256 received); /// @dev The sequence message number provided to this message was inconsistent with the previous one error BadSequencerMessageNumber(uint256 stored, uint256 received); -/// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox -error DataNotAuthenticated(); - /// @dev Tried to create an already valid Data Availability Service keyset error AlreadyValidDASKeyset(bytes32); /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset error NoSuchKeyset(bytes32); + +/// @dev Thrown when the provided address is not the designated batch poster manager +error NotBatchPosterManager(address); + +/// @dev Thrown when a data blob feature is attempted to be used on a chain that doesnt support it +error DataBlobsNotSupported(); + +/// @dev Thrown when an init param was supplied as empty +error InitParamZero(string name); + +/// @dev Thrown when data hashes where expected but not where present on the tx +error MissingDataHashes(); + +/// @dev Thrown when rollup is not updated with updateRollupAddress +error RollupNotChanged(); + +/// @dev Unsupported header flag was provided +error InvalidHeaderFlag(bytes1); + +/// @dev SequencerInbox and Bridge are not in the same feeToken/ETH mode +error NativeTokenMismatch(); + +/// @dev Thrown when a deprecated function is called +error Deprecated(); + +/// @dev Thrown when any component of maxTimeVariation is over uint64 +error BadMaxTimeVariation(); diff --git a/src/libraries/GasRefundEnabled.sol b/src/libraries/GasRefundEnabled.sol new file mode 100644 index 00000000..63a5bbfe --- /dev/null +++ b/src/libraries/GasRefundEnabled.sol @@ -0,0 +1,52 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +// solhint-disable-next-line compiler-version +pragma solidity ^0.8.0; + +import "./IReader4844.sol"; +import "./IGasRefunder.sol"; + +abstract contract GasRefundEnabled { + uint256 internal immutable gasPerBlob = 2**17; + + /// @dev this refunds the sender for execution costs of the tx + /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging + /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded + modifier refundsGas(IGasRefunder gasRefunder, IReader4844 reader4844) { + uint256 startGasLeft = gasleft(); + _; + if (address(gasRefunder) != address(0)) { + uint256 calldataSize = msg.data.length; + uint256 calldataWords = (calldataSize + 31) / 32; + // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost + startGasLeft += calldataWords * 6 + (calldataWords**2) / 512; + // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call + // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input + // solhint-disable-next-line avoid-tx-origin + if (msg.sender != tx.origin) { + // We can't be sure if this calldata came from the top level tx, + // so to be safe we tell the gas refunder there was no calldata. + calldataSize = 0; + } else { + // for similar reasons to above we only refund blob gas when the tx.origin is the msg.sender + // this avoids the caller being able to send blobs to other contracts and still get refunded here + if (address(reader4844) != address(0)) { + // add any cost for 4844 data, the data hash reader throws an error prior to 4844 being activated + // we do this addition here rather in the GasRefunder so that we can check the msg.sender is the tx.origin + try reader4844.getDataHashes() returns (bytes32[] memory dataHashes) { + if (dataHashes.length != 0) { + uint256 blobBasefee = reader4844.getBlobBaseFee(); + startGasLeft += + (dataHashes.length * gasPerBlob * blobBasefee) / + block.basefee; + } + } catch {} + } + } + + gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); + } + } +} diff --git a/src/libraries/IGasRefunder.sol b/src/libraries/IGasRefunder.sol index e7b08656..f80ac3b2 100644 --- a/src/libraries/IGasRefunder.sol +++ b/src/libraries/IGasRefunder.sol @@ -12,28 +12,3 @@ interface IGasRefunder { uint256 calldataSize ) external returns (bool success); } - -abstract contract GasRefundEnabled { - /// @dev this refunds the sender for execution costs of the tx - /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging - /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded - modifier refundsGas(IGasRefunder gasRefunder) { - uint256 startGasLeft = gasleft(); - _; - if (address(gasRefunder) != address(0)) { - uint256 calldataSize = msg.data.length; - uint256 calldataWords = (calldataSize + 31) / 32; - // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost - startGasLeft += calldataWords * 6 + (calldataWords**2) / 512; - // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call - // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input - // solhint-disable-next-line avoid-tx-origin - if (msg.sender != tx.origin) { - // We can't be sure if this calldata came from the top level tx, - // so to be safe we tell the gas refunder there was no calldata. - calldataSize = 0; - } - gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize); - } - } -} diff --git a/src/libraries/IReader4844.sol b/src/libraries/IReader4844.sol new file mode 100644 index 00000000..5d3ad2ad --- /dev/null +++ b/src/libraries/IReader4844.sol @@ -0,0 +1,13 @@ +// Copyright 2023-2024, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.6.9 <0.9.0; + +interface IReader4844 { + /// @notice Returns the current BLOBBASEFEE + function getBlobBaseFee() external view returns (uint256); + + /// @notice Returns all the data hashes of all the blobs on the current transaction + function getDataHashes() external view returns (bytes32[] memory); +} diff --git a/src/mocks/Benchmarks.sol b/src/mocks/Benchmarks.sol new file mode 100644 index 00000000..66d5ebba --- /dev/null +++ b/src/mocks/Benchmarks.sol @@ -0,0 +1,52 @@ +// Copyright 2022-2023, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +contract Benchmarks { + function fillBlockRecover() external payable { + bytes32 bridgeToNova = 0xeddecf107b5740cef7f5a01e3ea7e287665c4e75a8eb6afae2fda2e3d4367786; + address cryptoIsCute = 0x361594F5429D23ECE0A88E4fBE529E1c49D524d8; + uint8 v = 27; + bytes32 r = 0xc6178c2de1078cd36c3bd302cde755340d7f17fcb3fcc0b9c333ba03b217029f; + bytes32 s = 0x5fdbcefe2675e96219cdae57a7894280bf80fd40d44ce146a35e169ea6a78fd3; + while (true) { + require(ecrecover(bridgeToNova, v, r, s) == cryptoIsCute, "WRONG_ARBINAUT"); + } + } + + function fillBlockMulMod() external payable { + uint256 value = 0xeddecf107b5740cef7f5a01e3ea7e287665c4e75a8eb6afae2fda2e3d4367786; + while (true) { + value = mulmod( + value, + 0xc6178c2de1078cd36c3bd302cde755340d7f17fcb3fcc0b9c333ba03b217029f, + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + ); + } + } + + function fillBlockHash() external payable { + bytes32 hash = 0xeddecf107b5740cef7f5a01e3ea7e287665c4e75a8eb6afae2fda2e3d4367786; + while (true) { + hash = keccak256(abi.encodePacked(hash)); + } + } + + function fillBlockAdd() external payable { + uint256 value = 0; + while (true) { + unchecked { + value += 0xeddecf107b5740cef7f5a01e3ea7e287665c4e75a8eb6afae2fda2e3d4367786; + } + } + } + + function fillBlockQuickStep() external payable { + uint256 value = 0; + while (true) { + value = msg.value; + } + } +} diff --git a/src/mocks/BridgeStub.sol b/src/mocks/BridgeStub.sol index d0f9e8cc..2e2dee05 100644 --- a/src/mocks/BridgeStub.sol +++ b/src/mocks/BridgeStub.sol @@ -8,8 +8,9 @@ import "./InboxStub.sol"; import {BadSequencerMessageNumber} from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; -contract BridgeStub is IBridge { +contract BridgeStub is IBridge, IEthBridge { struct InOutInfo { uint256 index; bool allowed; @@ -44,6 +45,10 @@ contract BridgeStub is IBridge { revert("NOT_IMPLEMENTED"); } + function updateRollupAddress(IOwnable) external pure { + revert("NOT_IMPLEMENTED"); + } + function enqueueDelayedMessage( uint8 kind, address sender, diff --git a/src/mocks/InboxStub.sol b/src/mocks/InboxStub.sol index a31f33ef..182dda67 100644 --- a/src/mocks/InboxStub.sol +++ b/src/mocks/InboxStub.sol @@ -4,8 +4,10 @@ pragma solidity ^0.8.0; +import "../bridge/IInboxBase.sol"; import "../bridge/IInbox.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; import "./BridgeStub.sol"; @@ -17,11 +19,16 @@ import { L2MessageType_unsignedContractTx } from "../libraries/MessageTypes.sol"; -contract InboxStub is IInbox { +contract InboxStub is IInboxBase, IInbox { IBridge public override bridge; ISequencerInbox public override sequencerInbox; bool public paused; + uint256 public immutable maxDataSize; + + constructor() { + maxDataSize = 117964; + } function pause() external pure { revert("NOT IMPLEMENTED"); @@ -65,7 +72,12 @@ contract InboxStub is IInbox { address sender, bytes32 messageDataHash ) internal returns (uint256) { - return bridge.enqueueDelayedMessage{value: msg.value}(kind, sender, messageDataHash); + return + IEthBridge(address(bridge)).enqueueDelayedMessage{value: msg.value}( + kind, + sender, + messageDataHash + ); } function sendUnsignedTransaction( @@ -179,4 +191,24 @@ contract InboxStub is IInbox { { revert("NOT_IMPLEMENTED"); } + + function setAllowList(address[] memory, bool[] memory) external pure { + revert("NOT_IMPLEMENTED"); + } + + function setAllowListEnabled(bool) external pure { + revert("NOT_IMPLEMENTED"); + } + + function isAllowed(address) external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function allowListEnabled() external pure returns (bool) { + revert("NOT_IMPLEMENTED"); + } + + function getProxyAdmin() external pure returns (address) { + revert("NOT_IMPLEMENTED"); + } } diff --git a/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol b/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol new file mode 100644 index 00000000..0676845a --- /dev/null +++ b/src/mocks/PendingBlkTimeAndNrAdvanceCheck.sol @@ -0,0 +1,29 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "../precompiles/ArbSys.sol"; + +contract PendingBlkTimeAndNrAdvanceCheck { + uint256 immutable deployedAt; + uint256 immutable deployedAtBlock; + ArbSys constant ARB_SYS = ArbSys(address(100)); + + constructor() { + deployedAt = block.timestamp; + deployedAtBlock = ARB_SYS.arbBlockNumber(); + } + + function isAdvancing() external { + require(block.timestamp > deployedAt, "Time didn't advance"); + require(ARB_SYS.arbBlockNumber() > deployedAtBlock, "Block didn't advance"); + } + + function checkArbBlockHashReturnsLatest(bytes32 expected) external { + bytes32 gotBlockHash = ARB_SYS.arbBlockHash(ARB_SYS.arbBlockNumber() - 1); + require(gotBlockHash != bytes32(0), "ZERO_BLOCK_HASH"); + require(gotBlockHash == expected, "WRONG_BLOCK_HASH"); + } +} diff --git a/src/mocks/Program.sol b/src/mocks/Program.sol new file mode 100644 index 00000000..3966196d --- /dev/null +++ b/src/mocks/Program.sol @@ -0,0 +1,126 @@ +// Copyright 2022-2023, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; +import "../precompiles/ArbSys.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; + +contract ProgramTest { + event Hash(bytes32 result); + + function callKeccak(address program, bytes calldata data) external { + // in keccak.rs + // the input is the # of hashings followed by a preimage + // the output is the iterated hash of the preimage + (bool success, bytes memory result) = address(program).call(data); + require(success, "call failed"); + bytes32 hash = bytes32(result); + emit Hash(hash); + require(hash == keccak256(data[1:])); + } + + function staticcallProgram(address program, bytes calldata data) + external + view + returns (bytes memory) + { + (bool success, bytes memory result) = address(program).staticcall(data); + require(success, "call failed"); + return result; + } + + function assert256( + bytes memory data, + string memory text, + uint256 expected + ) internal pure returns (bytes memory) { + uint256 value = abi.decode(data, (uint256)); + require(value == expected, text); + + bytes memory rest = new bytes(data.length - 32); + for (uint256 i = 32; i < data.length; i++) { + rest[i - 32] = data[i]; + } + return rest; + } + + function staticcallEvmData( + address program, + address fundedAccount, + uint64 gas, + bytes calldata data + ) external view returns (bytes memory) { + (bool success, bytes memory result) = address(program).staticcall{gas: gas}(data); + require(success, "call failed"); + + address arbPrecompile = address(0x69); + address ethPrecompile = address(0x01); + + result = assert256(result, "block number ", block.number - 1); + result = assert256(result, "chain id ", block.chainid); + result = assert256(result, "base fee ", block.basefee); + result = assert256(result, "gas price ", tx.gasprice); + result = assert256(result, "gas limit ", block.gaslimit); + result = assert256(result, "value ", 0); + result = assert256(result, "timestamp ", block.timestamp); + result = assert256(result, "balance ", fundedAccount.balance); + result = assert256(result, "rust address ", uint256(uint160(program))); + result = assert256(result, "sender ", uint256(uint160(address(this)))); + result = assert256(result, "origin ", uint256(uint160(tx.origin))); + result = assert256(result, "coinbase ", uint256(uint160(address(block.coinbase)))); + result = assert256(result, "rust codehash", uint256(program.codehash)); + result = assert256(result, "arb codehash ", uint256(arbPrecompile.codehash)); + result = assert256(result, "eth codehash ", uint256(ethPrecompile.codehash)); + + bytes memory code = new bytes(program.code.length); + for (uint256 i = 0; i < program.code.length; i++) { + code[i] = result[i]; + } + require(keccak256(code) == keccak256(program.code), "code"); + bytes memory rest = new bytes(result.length - program.code.length); + for (uint256 i = program.code.length; i < result.length; i++) { + rest[i - program.code.length] = result[i]; + } + + result = rest; + return result; + } + + function checkRevertData( + address program, + bytes calldata data, + bytes calldata expected + ) external payable returns (bytes memory) { + (bool success, bytes memory result) = address(program).call{value: msg.value}(data); + require(!success, "unexpected success"); + require(result.length == expected.length, "wrong revert data length"); + for (uint256 i = 0; i < result.length; i++) { + require(result[i] == expected[i], "revert data mismatch"); + } + return result; + } + + function mathTest(address program) external { + uint256 value = 0xeddecf107b5740cef7f5a01e3ea7e287665c4e75a8eb6afae2fda2e3d4367786; + value = mulmod( + value, + 0xc6178c2de1078cd36c3bd302cde755340d7f17fcb3fcc0b9c333ba03b217029f, + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f + ); + value = addmod( + value, + 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f, + 0xc6178c2de1078cd36c3bd302cde755340d7f17fcb3fcc0b9c333ba03b217029f + ); + unchecked { + value /= 0xeddecf107b5740ce; + value = value**0xfffffffefffffc2f; + value = value % 0xc6178c2de1078cd3; + } + + (bool success, bytes memory result) = address(program).call(""); + require(success, "call failed"); + require(keccak256(result) == keccak256(abi.encodePacked(value))); + } +} diff --git a/src/mocks/SdkStorage.sol b/src/mocks/SdkStorage.sol new file mode 100644 index 00000000..dac31592 --- /dev/null +++ b/src/mocks/SdkStorage.sol @@ -0,0 +1,176 @@ +// Copyright 2022-2023, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +contract SdkStorage { + bool flag; + address owner; + address other; + Struct sub; + Struct[] structs; + uint64[] vector; + uint40[][] nested; + bytes bytesFull; + bytes bytesLong; + string chars; + Maps maps; + Arrays arrays; + + struct Struct { + uint16 num; + int32 other; + bytes32 word; + } + + struct Maps { + mapping(uint256 => address) basic; + mapping(address => bool[]) vects; + mapping(int32 => address)[] array; + mapping(bytes1 => mapping(bool => uint256)) nested; + mapping(string => Struct) structs; + } + + struct Arrays { + string[4] strings; + uint8 spacer; + uint24[5] packed; + uint8 trail; + address[2] spill; + uint8[2][4] matrix; + int96[4][] vector; + int96[][4] vectors; + Struct[3] structs; + } + + function populate() external { + flag = true; + owner = address(0x70); + other = address(0x30); + + sub.num = 32; + sub.other = type(int32).max; + sub.word = bytes32(uint256(64)); + + for (uint64 i = 0; i < 32; i++) { + vector.push(i); + } + vector[7] = 77; + + for (uint256 w = 0; w < 10; w++) { + nested.push(new uint40[](w)); + for (uint256 i = 0; i < w; i++) { + nested[w][i] = uint40(i); + } + } + for (uint256 w = 0; w < 10; w++) { + for (uint256 i = 0; i < w; i++) { + nested[w][i] *= 2; + } + } + + for (uint8 i = 0; i < 31; i++) { + bytesFull = abi.encodePacked(bytesFull, i); + } + for (uint8 i = 0; i < 80; i++) { + bytesLong = abi.encodePacked(bytesLong, i); + } + chars = "arbitrum stylus"; + + for (uint256 i = 0; i < 16; i++) { + maps.basic[i] = address(uint160(i)); + } + + for (uint160 a = 0; a < 4; a++) { + maps.vects[address(a)] = new bool[](0); + for (uint256 i = 0; i <= a; i++) { + maps.vects[address(a)].push(true); + } + } + + for (int32 i = 0; i < 4; i++) { + maps.array.push(); + maps.array[uint256(uint32(i))][i] = address(uint160(uint32(i))); + } + + for (uint8 i = 0; i < 4; i++) { + maps.nested[bytes1(i)][i % 2 == 0] = i + 1; + } + + maps.structs["stylus"] = sub; + + for (uint256 i = 0; i < 4; i++) { + structs.push(sub); + } + + arrays.strings[2] = "L2 is for you!"; + + for (uint256 i = 0; i < 5; i++) { + arrays.packed[i] = uint24(i); + } + + for (uint256 i = 0; i < 2; i++) { + arrays.spill[i] = address(uint160(i)); + } + + for (uint256 i = 0; i < 4; i++) { + arrays.matrix[i][0] = uint8(i); + arrays.matrix[i][1] = arrays.matrix[i][0] + 1; + } + + for (uint256 w = 0; w < 3; w++) { + int96[4] memory array; + for (int256 i = 0; i < 4; i++) { + array[uint256(i)] = int96(i); + } + arrays.vector.push(array); + } + + for (uint256 w = 0; w < 4; w++) { + for (int96 i = 0; i < 4; i++) { + arrays.vectors[w].push(i); + } + } + + for (uint256 i = 0; i < 3; i++) { + arrays.structs[i] = sub; + } + } + + function remove() external { + while (bytesFull.length != 0) { + bytesFull.pop(); + } + + while (bytesLong.length > 16) { + bytesLong.pop(); + } + + chars = "wasm is cute <3"; + + while (vector.length != 0) { + vector.pop(); + } + + while (nested.length > 1) { + nested.pop(); + } + + for (uint256 i = 0; i < 8; i++) { + delete maps.basic[i]; + } + maps.basic[8] = address(32); + + for (uint160 i = 0; i < 4; i++) { + delete maps.vects[address(i)]; + } + + structs.pop(); + + delete arrays.matrix; + delete arrays.vector; + delete arrays.vectors; + delete arrays.structs; + } +} diff --git a/src/mocks/SequencerInboxStub.sol b/src/mocks/SequencerInboxStub.sol index c476043b..49b31702 100644 --- a/src/mocks/SequencerInboxStub.sol +++ b/src/mocks/SequencerInboxStub.sol @@ -5,30 +5,37 @@ pragma solidity ^0.8.0; import "../bridge/SequencerInbox.sol"; +import "../bridge/IEthBridge.sol"; import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; contract SequencerInboxStub is SequencerInbox { constructor( IBridge bridge_, address sequencer_, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation_ - ) { + ISequencerInbox.MaxTimeVariation memory maxTimeVariation_, + uint256 maxDataSize_, + IReader4844 reader4844_, + bool isUsingFeeToken_ + ) SequencerInbox(maxDataSize_, reader4844_, isUsingFeeToken_) { bridge = bridge_; rollup = IOwnable(msg.sender); - maxTimeVariation = maxTimeVariation_; + delayBlocks = uint64(maxTimeVariation_.delayBlocks); + futureBlocks = uint64(maxTimeVariation_.futureBlocks); + delaySeconds = uint64(maxTimeVariation_.delaySeconds); + futureSeconds = uint64(maxTimeVariation_.futureSeconds); isBatchPoster[sequencer_] = true; } function addInitMessage(uint256 chainId) external { bytes memory initMsg = abi.encodePacked(chainId); - uint256 num = bridge.enqueueDelayedMessage( + uint256 num = IEthBridge(address(bridge)).enqueueDelayedMessage( INITIALIZATION_MSG_TYPE, address(0), keccak256(initMsg) ); require(num == 0, "ALREADY_DELAYED_INIT"); emit InboxMessageDelivered(num, initMsg); - (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(1); + (bytes32 dataHash, IBridge.TimeBounds memory timeBounds) = formEmptyDataHash(1); ( uint256 sequencerMessageCount, bytes32 beforeAcc, @@ -43,11 +50,11 @@ contract SequencerInboxStub is SequencerInbox { delayedAcc, totalDelayedMessagesRead, timeBounds, - BatchDataLocation.NoData + IBridge.BatchDataLocation.NoData ); } - function getTimeBounds() internal view override returns (TimeBounds memory bounds) { + function getTimeBounds() internal view override returns (IBridge.TimeBounds memory bounds) { this; // silence warning about function not being view return bounds; } diff --git a/src/mocks/Simple.sol b/src/mocks/Simple.sol index a97e1d0c..b9aafc74 100644 --- a/src/mocks/Simple.sol +++ b/src/mocks/Simple.sol @@ -4,11 +4,13 @@ pragma solidity ^0.8.0; +import "../bridge/ISequencerInbox.sol"; import "../precompiles/ArbRetryableTx.sol"; import "../precompiles/ArbSys.sol"; contract Simple { uint64 public counter; + uint256 public difficulty; event CounterEvent(uint64 count); event RedeemedEvent(address caller, address redeemer); @@ -30,6 +32,7 @@ contract Simple { } function incrementRedeem() external { + // solhint-disable-next-line avoid-tx-origin require(msg.sender == tx.origin, "SENDER_NOT_ORIGIN"); require(ArbSys(address(0x64)).wasMyCallersAddressAliased(), "NOT_ALIASED"); counter++; @@ -45,8 +48,12 @@ contract Simple { return block.number; } + function storeDifficulty() external { + difficulty = block.difficulty; + } + function getBlockDifficulty() external view returns (uint256) { - return block.difficulty; + return difficulty; } function noop() external pure {} @@ -93,6 +100,7 @@ contract Simple { useTopLevel, delegateCase ); + // solhint-disable-next-line avoid-low-level-calls (bool success, ) = address(this).delegatecall(data); require(success, "DELEGATE_CALL_FAILED"); @@ -113,6 +121,7 @@ contract Simple { useTopLevel, callCase ); + // solhint-disable-next-line avoid-low-level-calls (success, ) = address(this).call(data); require(success, "CALL_FAILED"); } @@ -121,7 +130,29 @@ contract Simple { uint256 before = gasleft(); // The inner call may revert, but we still want to return the amount of gas used, // so we ignore the result of this call. - (to.staticcall{gas: before - 10000}(input)); + // solhint-disable-next-line avoid-low-level-calls + // solc-ignore-next-line unused-call-retval + to.staticcall{gas: before - 10000}(input); return before - gasleft(); } + + function postManyBatches( + ISequencerInbox sequencerInbox, + bytes memory batchData, + uint256 numberToPost + ) external { + uint256 sequenceNumber = sequencerInbox.batchCount(); + uint256 delayedMessagesRead = sequencerInbox.totalDelayedMessagesRead(); + for (uint256 i = 0; i < numberToPost; i++) { + sequencerInbox.addSequencerL2Batch( + sequenceNumber, + batchData, + delayedMessagesRead, + IGasRefunder(address(0)), + 0, + 0 + ); + sequenceNumber++; + } + } } diff --git a/src/mocks/SimpleCacheManager.sol b/src/mocks/SimpleCacheManager.sol new file mode 100644 index 00000000..22b99533 --- /dev/null +++ b/src/mocks/SimpleCacheManager.sol @@ -0,0 +1,22 @@ +// Copyright 2022-2024, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; +import "../precompiles/ArbWasmCache.sol"; + +contract SimpleCacheManager { + function cacheProgram(address program) external { + ArbWasmCache(address(0x72)).cacheCodehash(codehash(program)); + } + + function evictProgram(address program) external { + ArbWasmCache(address(0x72)).evictCodehash(codehash(program)); + } + + function codehash(address program) internal view returns (bytes32 hash) { + assembly { + hash := extcodehash(program) + } + } +} diff --git a/src/mocks/UpgradeExecutorMock.sol b/src/mocks/UpgradeExecutorMock.sol new file mode 100644 index 00000000..6b7ca9db --- /dev/null +++ b/src/mocks/UpgradeExecutorMock.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/utils/Address.sol"; + +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; + +contract UpgradeExecutorMock is + Initializable, + AccessControlUpgradeable, + ReentrancyGuard, + IUpgradeExecutor +{ + using Address for address; + + bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); + bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); + + /// @notice Emitted when an upgrade execution occurs + event UpgradeExecuted(address indexed upgrade, uint256 value, bytes data); + + /// @notice Emitted when target call occurs + event TargetCallExecuted(address indexed target, uint256 value, bytes data); + + constructor() initializer {} + + /// @notice Initialise the upgrade executor + /// @param admin The admin who can update other roles, and itself - ADMIN_ROLE + /// @param executors Can call the execute function - EXECUTOR_ROLE + function initialize(address admin, address[] memory executors) public initializer { + require(admin != address(0), "UpgradeExecutor: zero admin"); + + __AccessControl_init(); + + _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); + _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); + + _setupRole(ADMIN_ROLE, admin); + for (uint256 i = 0; i < executors.length; ++i) { + _setupRole(EXECUTOR_ROLE, executors[i]); + } + } + + /// @notice Execute an upgrade by delegate calling an upgrade contract + /// @dev Only executor can call this. Since we're using a delegatecall here the Upgrade contract + /// will have access to the state of this contract - including the roles. Only upgrade contracts + /// that do not touch local state should be used. + function execute(address upgrade, bytes memory upgradeCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(upgrade).functionDelegateCall( + upgradeCallData, + "UpgradeExecutor: inner delegate call failed without reason" + ); + + emit UpgradeExecuted(upgrade, msg.value, upgradeCallData); + } + + /// @notice Execute an upgrade by directly calling target contract + /// @dev Only executor can call this. + function executeCall(address target, bytes memory targetCallData) + public + payable + onlyRole(EXECUTOR_ROLE) + nonReentrant + { + // OZ Address library check if the address is a contract and bubble up inner revert reason + address(target).functionCallWithValue( + targetCallData, + msg.value, + "UpgradeExecutor: inner call failed without reason" + ); + + emit TargetCallExecuted(target, msg.value, targetCallData); + } +} diff --git a/src/node-interface/NodeInterface.sol b/src/node-interface/NodeInterface.sol index 9f3ec1d2..bba06e52 100644 --- a/src/node-interface/NodeInterface.sol +++ b/src/node-interface/NodeInterface.sol @@ -155,4 +155,20 @@ interface NodeInterface { // @dev returns 0 for chains like Nova that don't contain classic blocks // @return number the block number function nitroGenesisBlock() external pure returns (uint256 number); + + // @notice Returns the L1 block number of the L2 block + // @return l1BlockNum The L1 block number + function blockL1Num(uint64 l2BlockNum) external view returns (uint64 l1BlockNum); + + /** + * @notice Finds the L2 block number range that has the given L1 block number + * @param blockNum The L1 block number to search for the range + * Throws if no L2 block exist with the given L1 block number + * @return firstBlock The first L2 block number with the given L1 block number + * @return lastBlock The last L2 block number with the given L1 block number + */ + function l2BlockRangeForL1(uint64 blockNum) + external + view + returns (uint64 firstBlock, uint64 lastBlock); } diff --git a/src/osp/OneStepProofEntry.sol b/src/osp/OneStepProofEntry.sol index 390727c3..ac1cc9ee 100644 --- a/src/osp/OneStepProofEntry.sol +++ b/src/osp/OneStepProofEntry.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -14,6 +14,9 @@ contract OneStepProofEntry is IOneStepProofEntry { using MerkleProofLib for MerkleProof; using MachineLib for Machine; + using ValueStackLib for ValueStack; + using StackFrameLib for StackFrameWindow; + IOneStepProver public prover0; IOneStepProver public proverMem; IOneStepProver public proverMath; @@ -65,17 +68,22 @@ contract OneStepProofEntry is IOneStepProofEntry { ); { - MerkleProof memory instProof; + Instruction[] memory codeChunk; + MerkleProof memory codeProof; MerkleProof memory funcProof; - (inst, offset) = Deserialize.instruction(proof, offset); - (instProof, offset) = Deserialize.merkleProof(proof, offset); + (codeChunk, offset) = Deserialize.instructions(proof, offset); + (codeProof, offset) = Deserialize.merkleProof(proof, offset); (funcProof, offset) = Deserialize.merkleProof(proof, offset); - bytes32 codeHash = instProof.computeRootFromInstruction(mach.functionPc, inst); + bytes32 codeHash = codeProof.computeRootFromInstructions( + mach.functionPc / 64, + codeChunk + ); bytes32 recomputedRoot = funcProof.computeRootFromFunction( mach.functionIdx, codeHash ); require(recomputedRoot == mod.functionsMerkleRoot, "BAD_FUNCTIONS_ROOT"); + inst = codeChunk[mach.functionPc % 64]; } proof = proof[offset:]; } @@ -113,7 +121,8 @@ contract OneStepProofEntry is IOneStepProofEntry { } else if ( (opcode >= Instructions.GET_GLOBAL_STATE_BYTES32 && opcode <= Instructions.SET_GLOBAL_STATE_U64) || - (opcode >= Instructions.READ_PRE_IMAGE && opcode <= Instructions.HALT_AND_SET_FINISHED) + (opcode >= Instructions.READ_PRE_IMAGE && opcode <= Instructions.UNLINK_MODULE) || + (opcode >= Instructions.NEW_COTHREAD && opcode <= Instructions.SWITCH_COTHREAD) ) { prover = proverHostIo; } else { @@ -122,7 +131,18 @@ contract OneStepProofEntry is IOneStepProofEntry { (mach, mod) = prover.executeOneStep(execCtx, mach, mod, inst, proof); - mach.modulesRoot = modProof.computeRootFromModule(oldModIdx, mod); + bool updateRoot = !(opcode == Instructions.LINK_MODULE || + opcode == Instructions.UNLINK_MODULE); + if (updateRoot) { + mach.modulesRoot = modProof.computeRootFromModule(oldModIdx, mod); + } + + if (mach.status == MachineStatus.ERRORED && mach.recoveryPc != MachineLib.NO_RECOVERY_PC) { + // capture error, recover into main thread. + mach.switchCoThreadStacks(); + mach.setPcFromRecovery(); + mach.status = MachineStatus.RUNNING; + } return mach.hash(); } diff --git a/src/osp/OneStepProver0.sol b/src/osp/OneStepProver0.sol index 107e4973..671ff074 100644 --- a/src/osp/OneStepProver0.sol +++ b/src/osp/OneStepProver0.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -11,6 +11,7 @@ import "../state/Deserialize.sol"; import "./IOneStepProver.sol"; contract OneStepProver0 is IOneStepProver { + using MachineLib for Machine; using MerkleProofLib for MerkleProof; using StackFrameLib for StackFrameWindow; using ValueLib for Value; @@ -90,28 +91,11 @@ contract OneStepProver0 is IOneStepProver { bytes calldata ) internal pure { StackFrame memory frame = mach.frameStack.pop(); - if (frame.returnPc.valueType == ValueType.REF_NULL) { - mach.status = MachineStatus.ERRORED; - return; - } else if (frame.returnPc.valueType != ValueType.INTERNAL_REF) { - revert("INVALID_RETURN_PC_TYPE"); - } - uint256 data = frame.returnPc.contents; - uint32 pc = uint32(data); - uint32 func = uint32(data >> 32); - uint32 mod = uint32(data >> 64); - require(data >> 96 == 0, "INVALID_RETURN_PC_DATA"); - mach.functionPc = pc; - mach.functionIdx = func; - mach.moduleIdx = mod; + mach.setPc(frame.returnPc); } function createReturnValue(Machine memory mach) internal pure returns (Value memory) { - uint256 returnData = 0; - returnData |= mach.functionPc; - returnData |= uint256(mach.functionIdx) << 32; - returnData |= uint256(mach.moduleIdx) << 64; - return Value({valueType: ValueType.INTERNAL_REF, contents: returnData}); + return ValueLib.newPc(mach.functionPc, mach.functionIdx, mach.moduleIdx); } function executeCall( @@ -157,6 +141,62 @@ contract OneStepProver0 is IOneStepProver { mach.functionPc = 0; } + function executeCrossModuleForward( + Machine memory mach, + Module memory, + Instruction calldata inst, + bytes calldata + ) internal pure { + // Push the return pc to the stack + mach.valueStack.push(createReturnValue(mach)); + + // Push caller's caller module info to the stack + StackFrame memory frame = mach.frameStack.peek(); + mach.valueStack.push(ValueLib.newI32(frame.callerModule)); + mach.valueStack.push(ValueLib.newI32(frame.callerModuleInternals)); + + // Jump to the target + uint32 func = uint32(inst.argumentData); + uint32 module = uint32(inst.argumentData >> 32); + require(inst.argumentData >> 64 == 0, "BAD_CROSS_MODULE_CALL_DATA"); + mach.moduleIdx = module; + mach.functionIdx = func; + mach.functionPc = 0; + } + + function executeCrossModuleInternalCall( + Machine memory mach, + Module memory mod, + Instruction calldata inst, + bytes calldata proof + ) internal pure { + // Get the target from the stack + uint32 internalIndex = uint32(inst.argumentData); + uint32 moduleIndex = mach.valueStack.pop().assumeI32(); + Module memory calledMod; + + MerkleProof memory modProof; + uint256 offset = 0; + (calledMod, offset) = Deserialize.module(proof, offset); + (modProof, offset) = Deserialize.merkleProof(proof, offset); + require( + modProof.computeRootFromModule(moduleIndex, calledMod) == mach.modulesRoot, + "CROSS_MODULE_INTERNAL_MODULES_ROOT" + ); + + // Push the return pc to the stack + mach.valueStack.push(createReturnValue(mach)); + + // Push caller module info to the stack + mach.valueStack.push(ValueLib.newI32(mach.moduleIdx)); + mach.valueStack.push(ValueLib.newI32(mod.internalsOffset)); + + // Jump to the target + mach.moduleIdx = moduleIndex; + mach.functionIdx = internalIndex + calledMod.internalsOffset; + mach.functionPc = 0; + } + function executeCallerModuleInternalCall( Machine memory mach, Module memory mod, @@ -454,6 +494,10 @@ contract OneStepProver0 is IOneStepProver { impl = executeCall; } else if (opcode == Instructions.CROSS_MODULE_CALL) { impl = executeCrossModuleCall; + } else if (opcode == Instructions.CROSS_MODULE_FORWARD) { + impl = executeCrossModuleForward; + } else if (opcode == Instructions.CROSS_MODULE_INTERNAL_CALL) { + impl = executeCrossModuleInternalCall; } else if (opcode == Instructions.CALLER_MODULE_INTERNAL_CALL) { impl = executeCallerModuleInternalCall; } else if (opcode == Instructions.CALL_INDIRECT) { diff --git a/src/osp/OneStepProverHostIo.sol b/src/osp/OneStepProverHostIo.sol index 260ab206..f5f124d2 100644 --- a/src/osp/OneStepProverHostIo.sol +++ b/src/osp/OneStepProverHostIo.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2024, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -6,6 +6,8 @@ pragma solidity ^0.8.0; import "../state/Value.sol"; import "../state/Machine.sol"; +import "../state/MerkleProof.sol"; +import "../state/MultiStack.sol"; import "../state/Deserialize.sol"; import "../state/ModuleMemory.sol"; import "./IOneStepProver.sol"; @@ -14,10 +16,13 @@ import "../bridge/IBridge.sol"; contract OneStepProverHostIo is IOneStepProver { using GlobalStateLib for GlobalState; + using MachineLib for Machine; using MerkleProofLib for MerkleProof; using ModuleMemoryLib for ModuleMemory; + using MultiStackLib for MultiStack; using ValueLib for Value; using ValueStackLib for ValueStack; + using StackFrameLib for StackFrameWindow; uint256 private constant LEAF_SIZE = 32; uint256 private constant INBOX_NUM = 2; @@ -52,7 +57,7 @@ contract OneStepProverHostIo is IOneStepProver { mach.status = MachineStatus.ERRORED; return; } - if (ptr + 32 > mod.moduleMemory.size || ptr % LEAF_SIZE != 0) { + if (!mod.moduleMemory.isValidLeaf(ptr)) { mach.status = MachineStatus.ERRORED; return; } @@ -101,16 +106,35 @@ contract OneStepProverHostIo is IOneStepProver { state.u64Vals[idx] = val; } + uint256 internal constant BLS_MODULUS = + 52435875175126190479447740508185965837690552500527637822603658699938581184513; + uint256 internal constant PRIMITIVE_ROOT_OF_UNITY = + 10238227357739495823651030575849232062558860180284477541189508159991286009131; + + // Computes b**e % m + // Really pure but the Solidity compiler sees the staticcall and requires view + function modExp256( + uint256 b, + uint256 e, + uint256 m + ) internal view returns (uint256) { + bytes memory modExpInput = abi.encode(32, 32, 32, b, e, m); + (bool modexpSuccess, bytes memory modExpOutput) = address(0x05).staticcall(modExpInput); + require(modexpSuccess, "MODEXP_FAILED"); + require(modExpOutput.length == 32, "MODEXP_WRONG_LENGTH"); + return uint256(bytes32(modExpOutput)); + } + function executeReadPreImage( ExecutionContext calldata, Machine memory mach, Module memory mod, - Instruction calldata, + Instruction calldata inst, bytes calldata proof - ) internal pure { + ) internal view { uint256 preimageOffset = mach.valueStack.pop().assumeI32(); uint256 ptr = mach.valueStack.pop().assumeI32(); - if (ptr + 32 > mod.moduleMemory.size || ptr % LEAF_SIZE != 0) { + if (preimageOffset % 32 != 0 || ptr + 32 > mod.moduleMemory.size || ptr % LEAF_SIZE != 0) { mach.status = MachineStatus.ERRORED; return; } @@ -128,18 +152,92 @@ contract OneStepProverHostIo is IOneStepProver { bytes memory extracted; uint8 proofType = uint8(proof[proofOffset]); proofOffset++; - if (proofType == 0) { + // These values must be kept in sync with `arbitrator/arbutil/src/types.rs` + // and `arbutil/preimage_type.go` (both in the nitro repo). + if (inst.argumentData == 0) { + // The machine is asking for a keccak256 preimage + + if (proofType == 0) { + bytes calldata preimage = proof[proofOffset:]; + require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + + uint256 preimageEnd = preimageOffset + 32; + if (preimageEnd > preimage.length) { + preimageEnd = preimage.length; + } + extracted = preimage[preimageOffset:preimageEnd]; + } else { + // TODO: support proving via an authenticated contract + revert("UNKNOWN_PREIMAGE_PROOF"); + } + } else if (inst.argumentData == 1) { + // The machine is asking for a sha2-256 preimage + + require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); bytes calldata preimage = proof[proofOffset:]; - require(keccak256(preimage) == leafContents, "BAD_PREIMAGE"); + require(sha256(preimage) == leafContents, "BAD_PREIMAGE"); uint256 preimageEnd = preimageOffset + 32; if (preimageEnd > preimage.length) { preimageEnd = preimage.length; } extracted = preimage[preimageOffset:preimageEnd]; + } else if (inst.argumentData == 2) { + // The machine is asking for an Ethereum versioned hash preimage + + require(proofType == 0, "UNKNOWN_PREIMAGE_PROOF"); + + // kzgProof should be a valid input to the EIP-4844 point evaluation precompile at address 0x0A. + // It should prove the preimageOffset/32'th word of the machine's requested KZG commitment. + bytes calldata kzgProof = proof[proofOffset:]; + + require(bytes32(kzgProof[:32]) == leafContents, "KZG_PROOF_WRONG_HASH"); + + uint256 fieldElementsPerBlob; + uint256 blsModulus; + { + (bool success, bytes memory kzgParams) = address(0x0A).staticcall(kzgProof); + require(success, "INVALID_KZG_PROOF"); + require(kzgParams.length > 0, "KZG_PRECOMPILE_MISSING"); + (fieldElementsPerBlob, blsModulus) = abi.decode(kzgParams, (uint256, uint256)); + } + + // With a hardcoded PRIMITIVE_ROOT_OF_UNITY, we can only support this BLS modulus. + // It may be worth in the future supporting arbitrary BLS moduli, but we would likely need to + // validate a user-supplied root of unity. + require(blsModulus == BLS_MODULUS, "UNKNOWN_BLS_MODULUS"); + + // If preimageOffset is greater than or equal to the blob size, leave extracted empty and call it here. + if (preimageOffset < fieldElementsPerBlob * 32) { + // We need to compute what point the polynomial should be evaluated at to get the right part of the preimage. + // KZG commitments use a bit reversal permutation to order the roots of unity. + // To account for that, we reverse the bit order of the index. + uint256 bitReversedIndex = 0; + // preimageOffset was required to be 32 byte aligned above + uint256 tmp = preimageOffset / 32; + for (uint256 i = 1; i < fieldElementsPerBlob; i <<= 1) { + bitReversedIndex <<= 1; + if (tmp & 1 == 1) { + bitReversedIndex |= 1; + } + tmp >>= 1; + } + + // First, we get the root of unity of order 2**fieldElementsPerBlob. + // We start with a root of unity of order 2**32 and then raise it to + // the power of (2**32)/fieldElementsPerBlob to get root of unity we need. + uint256 rootOfUnityPower = (1 << 32) / fieldElementsPerBlob; + // Then, we raise the root of unity to the power of bitReversedIndex, + // to retrieve this word of the KZG commitment. + rootOfUnityPower *= bitReversedIndex; + // z is the point the polynomial is evaluated at to retrieve this word of data + uint256 z = modExp256(PRIMITIVE_ROOT_OF_UNITY, rootOfUnityPower, blsModulus); + require(bytes32(kzgProof[32:64]) == bytes32(z), "KZG_PROOF_WRONG_Z"); + + extracted = kzgProof[64:96]; + } } else { - // TODO: support proving via an authenticated contract - revert("UNKNOWN_PREIMAGE_PROOF"); + revert("UNKNOWN_PREIMAGE_TYPE"); } for (uint256 i = 0; i < extracted.length; i++) { @@ -287,6 +385,103 @@ contract OneStepProverHostIo is IOneStepProver { mach.status = MachineStatus.FINISHED; } + function isPowerOfTwo(uint256 value) internal pure returns (bool) { + return value != 0 && (value & (value - 1) == 0); + } + + function proveLastLeaf( + Machine memory mach, + uint256 offset, + bytes calldata proof + ) + internal + pure + returns ( + uint256 leaf, + MerkleProof memory leafProof, + MerkleProof memory zeroProof + ) + { + string memory prefix = "Module merkle tree:"; + bytes32 root = mach.modulesRoot; + + { + Module memory leafModule; + uint32 leaf32; + (leafModule, offset) = Deserialize.module(proof, offset); + (leaf32, offset) = Deserialize.u32(proof, offset); + (leafProof, offset) = Deserialize.merkleProof(proof, offset); + leaf = uint256(leaf32); + + bytes32 compRoot = leafProof.computeRootFromModule(leaf, leafModule); + require(compRoot == root, "WRONG_ROOT_FOR_LEAF"); + } + + // if tree is unbalanced, check that the next leaf is 0 + bool balanced = isPowerOfTwo(leaf + 1); + if (balanced) { + require(1 << leafProof.counterparts.length == leaf + 1, "WRONG_LEAF"); + } else { + (zeroProof, offset) = Deserialize.merkleProof(proof, offset); + bytes32 compRoot = zeroProof.computeRootUnsafe(leaf + 1, 0, prefix); + require(compRoot == root, "WRONG_ROOT_FOR_ZERO"); + } + + return (leaf, leafProof, zeroProof); + } + + function executeLinkModule( + ExecutionContext calldata, + Machine memory mach, + Module memory mod, + Instruction calldata, + bytes calldata proof + ) internal pure { + string memory prefix = "Module merkle tree:"; + bytes32 root = mach.modulesRoot; + + uint256 pointer = mach.valueStack.pop().assumeI32(); + if (!mod.moduleMemory.isValidLeaf(pointer)) { + mach.status = MachineStatus.ERRORED; + return; + } + (bytes32 userMod, uint256 offset, ) = mod.moduleMemory.proveLeaf( + pointer / LEAF_SIZE, + proof, + 0 + ); + + (uint256 leaf, , MerkleProof memory zeroProof) = proveLastLeaf(mach, offset, proof); + + bool balanced = isPowerOfTwo(leaf + 1); + if (balanced) { + mach.modulesRoot = MerkleProofLib.growToNewRoot(root, leaf + 1, userMod, 0, prefix); + } else { + mach.modulesRoot = zeroProof.computeRootUnsafe(leaf + 1, userMod, prefix); + } + + mach.valueStack.push(ValueLib.newI32(uint32(leaf + 1))); + } + + function executeUnlinkModule( + ExecutionContext calldata, + Machine memory mach, + Module memory, + Instruction calldata, + bytes calldata proof + ) internal pure { + string memory prefix = "Module merkle tree:"; + + (uint256 leaf, MerkleProof memory leafProof, ) = proveLastLeaf(mach, 0, proof); + + bool shrink = isPowerOfTwo(leaf); + if (shrink) { + mach.modulesRoot = leafProof.counterparts[leafProof.counterparts.length - 1]; + } else { + mach.modulesRoot = leafProof.computeRootUnsafe(leaf, 0, prefix); + } + } + function executeGlobalStateAccess( ExecutionContext calldata, Machine memory mach, @@ -317,6 +512,93 @@ contract OneStepProverHostIo is IOneStepProver { mach.globalStateHash = state.hash(); } + function executeNewCoThread( + ExecutionContext calldata, + Machine memory mach, + Module memory, + Instruction calldata, + bytes calldata + ) internal pure { + if (mach.recoveryPc != MachineLib.NO_RECOVERY_PC) { + // cannot create new cothread from inside cothread + mach.status = MachineStatus.ERRORED; + return; + } + mach.frameMultiStack.pushNew(); + mach.valueMultiStack.pushNew(); + } + + function provePopCothread(MultiStack memory multi, bytes calldata proof) internal pure { + uint256 proofOffset = 0; + bytes32 newInactiveCoThread; + bytes32 newRemaining; + (newInactiveCoThread, proofOffset) = Deserialize.b32(proof, proofOffset); + (newRemaining, proofOffset) = Deserialize.b32(proof, proofOffset); + if (newInactiveCoThread == MultiStackLib.NO_STACK_HASH) { + require(newRemaining == bytes32(0), "WRONG_COTHREAD_EMPTY"); + require(multi.remainingHash == bytes32(0), "WRONG_COTHREAD_EMPTY"); + } else { + require( + keccak256(abi.encodePacked("cothread:", newInactiveCoThread, newRemaining)) == + multi.remainingHash, + "WRONG_COTHREAD_POP" + ); + } + multi.remainingHash = newRemaining; + multi.inactiveStackHash = newInactiveCoThread; + } + + function executePopCoThread( + ExecutionContext calldata, + Machine memory mach, + Module memory, + Instruction calldata, + bytes calldata proof + ) internal pure { + if (mach.recoveryPc != MachineLib.NO_RECOVERY_PC) { + // cannot pop cothread from inside cothread + mach.status = MachineStatus.ERRORED; + return; + } + if (mach.frameMultiStack.inactiveStackHash == MultiStackLib.NO_STACK_HASH) { + // cannot pop cothread if there isn't one + mach.status = MachineStatus.ERRORED; + return; + } + provePopCothread(mach.valueMultiStack, proof); + provePopCothread(mach.frameMultiStack, proof[64:]); + } + + function executeSwitchCoThread( + ExecutionContext calldata, + Machine memory mach, + Module memory, + Instruction calldata inst, + bytes calldata + ) internal pure { + if (mach.frameMultiStack.inactiveStackHash == MultiStackLib.NO_STACK_HASH) { + // cannot switch cothread if there isn't one + mach.status = MachineStatus.ERRORED; + return; + } + if (inst.argumentData == 0) { + if (mach.recoveryPc == MachineLib.NO_RECOVERY_PC) { + // switching to main thread, from main thread + mach.status = MachineStatus.ERRORED; + return; + } + mach.recoveryPc = MachineLib.NO_RECOVERY_PC; + } else { + if (mach.recoveryPc != MachineLib.NO_RECOVERY_PC) { + // switching from cothread to cothread + mach.status = MachineStatus.ERRORED; + return; + } + mach.setRecoveryFromPc(uint32(inst.argumentData)); + } + mach.switchCoThreadStacks(); + } + function executeOneStep( ExecutionContext calldata execCtx, Machine calldata startMach, @@ -348,6 +630,16 @@ contract OneStepProverHostIo is IOneStepProver { impl = executeReadInboxMessage; } else if (opcode == Instructions.HALT_AND_SET_FINISHED) { impl = executeHaltAndSetFinished; + } else if (opcode == Instructions.LINK_MODULE) { + impl = executeLinkModule; + } else if (opcode == Instructions.UNLINK_MODULE) { + impl = executeUnlinkModule; + } else if (opcode == Instructions.NEW_COTHREAD) { + impl = executeNewCoThread; + } else if (opcode == Instructions.POP_COTHREAD) { + impl = executePopCoThread; + } else if (opcode == Instructions.SWITCH_COTHREAD) { + impl = executeSwitchCoThread; } else { revert("INVALID_MEMORY_OPCODE"); } diff --git a/src/osp/OneStepProverMemory.sol b/src/osp/OneStepProverMemory.sol index 6fee2f93..3c966049 100644 --- a/src/osp/OneStepProverMemory.sol +++ b/src/osp/OneStepProverMemory.sol @@ -19,13 +19,6 @@ contract OneStepProverMemory is IOneStepProver { uint256 private constant LEAF_SIZE = 32; uint64 private constant PAGE_SIZE = 65536; - function pullLeafByte(bytes32 leaf, uint256 idx) internal pure returns (uint8) { - require(idx < LEAF_SIZE, "BAD_PULL_LEAF_BYTE_IDX"); - // Take into account that we are casting the leaf to a big-endian integer - uint256 leafShift = (LEAF_SIZE - 1 - idx) * 8; - return uint8(uint256(leaf) >> leafShift); - } - function setLeafByte( bytes32 oldLeaf, uint256 idx, @@ -109,35 +102,13 @@ contract OneStepProverMemory is IOneStepProver { revert("INVALID_MEMORY_LOAD_OPCODE"); } - // Neither of these can overflow as they're computed with much less than 256 bit integers. - uint256 startIdx = inst.argumentData + mach.valueStack.pop().assumeI32(); - if (startIdx + readBytes > mod.moduleMemory.size) { + uint256 index = inst.argumentData + mach.valueStack.pop().assumeI32(); + (bool err, uint256 value, ) = mod.moduleMemory.load(index, readBytes, proof, 0); + if (err) { mach.status = MachineStatus.ERRORED; return; } - - uint256 proofOffset = 0; - uint256 lastProvedLeafIdx = ~uint256(0); - bytes32 lastProvedLeafContents; - uint64 readValue; - for (uint256 i = 0; i < readBytes; i++) { - uint256 idx = startIdx + i; - uint256 leafIdx = idx / LEAF_SIZE; - if (leafIdx != lastProvedLeafIdx) { - // This hits the stack size if we phrase it as mod.moduleMemory.proveLeaf(...) - (lastProvedLeafContents, proofOffset, ) = ModuleMemoryLib.proveLeaf( - mod.moduleMemory, - leafIdx, - proof, - proofOffset - ); - lastProvedLeafIdx = leafIdx; - } - uint256 indexWithinLeaf = idx % LEAF_SIZE; - readValue |= - uint64(pullLeafByte(lastProvedLeafContents, indexWithinLeaf)) << - uint64(i * 8); - } + uint64 readValue = uint64(value); if (signed) { // Go down to the original uint size, change to signed, go up to correct size, convert back to unsigned diff --git a/src/precompiles/ArbDebug.sol b/src/precompiles/ArbDebug.sol index 9924eded..01ee127a 100644 --- a/src/precompiles/ArbDebug.sol +++ b/src/precompiles/ArbDebug.sol @@ -37,6 +37,8 @@ interface ArbDebug { function customRevert(uint64 number) external pure; + function panic() external; + function legacyError() external pure; error Custom(uint64, string, bool); diff --git a/src/precompiles/ArbGasInfo.sol b/src/precompiles/ArbGasInfo.sol index 31dd70ea..b4c21096 100644 --- a/src/precompiles/ArbGasInfo.sol +++ b/src/precompiles/ArbGasInfo.sol @@ -129,4 +129,24 @@ interface ArbGasInfo { /// @notice Returns the available funds from L1 fees function getL1FeesAvailable() external view returns (uint256); + + /// @notice Returns the equilibration units parameter for L1 price adjustment algorithm + /// Available in ArbOS version 20 + function getL1PricingEquilibrationUnits() external view returns (uint256); + + /// @notice Returns the last time the L1 calldata pricer was updated. + /// Available in ArbOS version 20 + function getLastL1PricingUpdateTime() external view returns (uint64); + + /// @notice Returns the amount of L1 calldata payments due for rewards (per the L1 reward rate) + /// Available in ArbOS version 20 + function getL1PricingFundsDueForRewards() external view returns (uint256); + + /// @notice Returns the amount of L1 calldata posted since the last update. + /// Available in ArbOS version 20 + function getL1PricingUnitsSinceUpdate() external view returns (uint64); + + /// @notice Returns the L1 pricing surplus as of the last update (may be negative). + /// Available in ArbOS version 20 + function getLastL1PricingSurplus() external view returns (int256); } diff --git a/src/precompiles/ArbOwner.sol b/src/precompiles/ArbOwner.sol index 46ac63c5..2999480d 100644 --- a/src/precompiles/ArbOwner.sol +++ b/src/precompiles/ArbOwner.sol @@ -1,16 +1,18 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2024, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.4.21 <0.9.0; -/// @title Provides owners with tools for managing the rollup. -/// @notice Calls by non-owners will always revert. -/// Most of Arbitrum Classic's owner methods have been removed since they no longer make sense in Nitro: -/// - What were once chain parameters are now parts of ArbOS's state, and those that remain are set at genesis. -/// - ArbOS upgrades happen with the rest of the system rather than being independent -/// - Exemptions to address aliasing are no longer offered. Exemptions were intended to support backward compatibility for contracts deployed before aliasing was introduced, but no exemptions were ever requested. -/// Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000070. +/** + * @title Provides owners with tools for managing the rollup. + * @notice Calls by non-owners will always revert. + * Most of Arbitrum Classic's owner methods have been removed since they no longer make sense in Nitro: + * - What were once chain parameters are now parts of ArbOS's state, and those that remain are set at genesis. + * - ArbOS upgrades happen with the rest of the system rather than being independent + * - Exemptions to address aliasing are no longer offered. Exemptions were intended to support backward compatibility for contracts deployed before aliasing was introduced, but no exemptions were ever requested. + * Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000070. + **/ interface ArbOwner { /// @notice Add account as a chain owner function addChainOwner(address newOwner) external; @@ -78,15 +80,60 @@ interface ArbOwner { /// @notice Sets the base charge (in L1 gas) attributed to each data batch in the calldata pricer function setPerBatchGasCharge(int64 cost) external; + /** + * @notice Sets the Brotli compression level used for fast compression + * Available in ArbOS version 12 with default level as 1 + */ + function setBrotliCompressionLevel(uint64 level) external; + /// @notice Sets the cost amortization cap in basis points function setAmortizedCostCapBips(uint64 cap) external; /// @notice Releases surplus funds from L1PricerFundsPoolAddress for use function releaseL1PricerSurplusFunds(uint256 maxWeiToRelease) external returns (uint256); + /// @notice Sets the amount of ink 1 gas buys + /// @param price the conversion rate (must fit in a uint24) + function setInkPrice(uint32 price) external; + + /// @notice Sets the maximum depth (in wasm words) a wasm stack may grow + function setWasmMaxStackDepth(uint32 depth) external; + + /// @notice Sets the number of free wasm pages a tx gets + function setWasmFreePages(uint16 pages) external; + + /// @notice Sets the base cost of each additional wasm page + function setWasmPageGas(uint16 gas) external; + + /// @notice Sets the ramp that drives exponential wasm memory costs + function setWasmPageRamp(uint64 ramp) external; + + /// @notice Sets the maximum number of pages a wasm may allocate + function setWasmPageLimit(uint16 limit) external; + + /// @notice Sets the minimum costs to invoke a program + /// @param gas amount of gas paid in increments of 256 when not the program is not cached + /// @param cached amount of gas paid in increments of 64 when the program is cached + function setWasmMinInitGas(uint8 gas, uint16 cached) external; + + /// @notice Sets the number of days after which programs deactivate + function setWasmExpiryDays(uint16 _days) external; + + /// @notice Sets the age a program must be to perform a keepalive + function setWasmKeepaliveDays(uint16 _days) external; + + /// @notice Sets the number of extra programs ArbOS caches during a given block + function setWasmBlockCacheSize(uint16 count) external; + + /// @notice Adds account as a wasm cache manager + function addWasmCacheManager(address manager) external; + + /// @notice Removes account from the list of wasm cache managers + function removeWasmCacheManager(address manager) external; + /// @notice Sets serialized chain config in ArbOS state function setChainConfig(string calldata chainConfig) external; - // Emitted when a successful call is made to this precompile + /// Emitted when a successful call is made to this precompile event OwnerActs(bytes4 indexed method, address indexed owner, bytes data); } diff --git a/src/precompiles/ArbOwnerPublic.sol b/src/precompiles/ArbOwnerPublic.sol index 1fbfdc03..0de57ce6 100644 --- a/src/precompiles/ArbOwnerPublic.sol +++ b/src/precompiles/ArbOwnerPublic.sol @@ -26,5 +26,16 @@ interface ArbOwnerPublic { /// @notice Get the infrastructure fee collector function getInfraFeeAccount() external view returns (address); + /// @notice Get the Brotli compression level used for fast compression + function getBrotliCompressionLevel() external view returns (uint64); + + /// @notice Get the next scheduled ArbOS version upgrade and its activation timestamp. + /// Returns (0, 0) if no ArbOS upgrade is scheduled. + /// Available in ArbOS version 20. + function getScheduledUpgrade() + external + view + returns (uint64 arbosVersion, uint64 scheduledForTimestamp); + event ChainOwnerRectified(address rectifiedOwner); } diff --git a/src/precompiles/ArbWasm.sol b/src/precompiles/ArbWasm.sol new file mode 100644 index 00000000..7d43b847 --- /dev/null +++ b/src/precompiles/ArbWasm.sol @@ -0,0 +1,115 @@ +// Copyright 2022-2024, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.4.21 <0.9.0; + +/** + * @title Methods for managing user programs + * @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000071. + */ +interface ArbWasm { + /// @notice Activate a wasm program + /// @param program the program to activate + /// @return version the stylus version the program was activated against + /// @return dataFee the data fee paid to store the activated program + function activateProgram(address program) + external + payable + returns (uint16 version, uint256 dataFee); + + /// @notice Gets the latest stylus version + /// @return version the stylus version + function stylusVersion() external view returns (uint16 version); + + /// @notice Gets the stylus version the program with codehash was most recently activated against + /// @return version the program version (reverts for EVM contracts) + function codehashVersion(bytes32 codehash) external view returns (uint16 version); + + /// @notice Extends a program's expiration date. + /// Reverts if too soon or if the program is not up to date. + function codehashKeepalive(bytes32 codehash) external payable; + + /// @notice Gets a program's asm size. + /// Reverts if program is not active. + /// @return size the size in bytes + function codehashAsmSize(bytes32 codehash) external view returns (uint32 size); + + /// @notice Gets the stylus version the program was most recently activated against + /// @return version the program version (reverts for EVM contracts) + function programVersion(address program) external view returns (uint16 version); + + /// @notice Gets the cost to invoke the program (not including minInitGas) + /// @return gas the amount of gas + /// @return gasWhenCached the amount of gas if the program was recently used + function programInitGas(address program) + external + view + returns (uint16 gas, uint16 gasWhenCached); + + /// @notice Gets the memory footprint of the program at the given address in pages + /// @return footprint the memory footprint of program in pages (reverts for EVM contracts) + function programMemoryFootprint(address program) external view returns (uint16 footprint); + + /// @notice Gets the amount of time remaining until the program expires + /// @return _secs the time left in seconds (reverts for EVM contracts) + function programTimeLeft(address program) external view returns (uint64 _secs); + + /// @notice Gets the conversion rate between gas and ink + /// @return price the amount of ink 1 gas buys + function inkPrice() external view returns (uint32 price); + + /// @notice Gets the wasm stack size limit + /// @return depth the maximum depth (in wasm words) a wasm stack may grow + function maxStackDepth() external view returns (uint32 depth); + + /// @notice Gets the number of free wasm pages a program gets + /// @return pages the number of wasm pages (2^16 bytes) + function freePages() external view returns (uint16 pages); + + /// @notice Gets the base cost of each additional wasm page (2^16 bytes) + /// @return gas base amount of gas needed to grow another wasm page + function pageGas() external view returns (uint16 gas); + + /// @notice Gets the ramp that drives exponential memory costs + /// @return ramp bits representing the floating point value + function pageRamp() external view returns (uint64 ramp); + + /// @notice Gets the maximum number of pages a wasm may allocate + /// @return limit the number of pages + function pageLimit() external view returns (uint16 limit); + + /// @notice Gets the minimum costs to invoke a program + /// @return gas amount of gas in increments of 256 when not cached + /// @return cached amount of gas in increments of 64 when cached + function minInitGas() external view returns (uint8 gas, uint8 cached); + + /// @notice Gets the number of days after which programs deactivate + /// @return _days the number of days + function expiryDays() external view returns (uint16 _days); + + /// @notice Gets the age a program must be to perform a keepalive + /// @return _days the number of days + function keepaliveDays() external view returns (uint16 _days); + + /// @notice Gets the number of extra programs ArbOS caches during a given block. + /// @return count the number of same-block programs. + function blockCacheSize() external view returns (uint16 count); + + event ProgramActivated( + bytes32 indexed codehash, + bytes32 moduleHash, + address program, + uint256 dataFee, + uint16 version + ); + event ProgramLifetimeExtended(bytes32 indexed codehash, uint256 dataFee); + + error ProgramNotWasm(); + error ProgramNotActivated(); + error ProgramNeedsUpgrade(uint16 version, uint16 stylusVersion); + error ProgramExpired(uint64 ageInSeconds); + error ProgramUpToDate(); + error ProgramKeepaliveTooSoon(uint64 ageInSeconds); + error ProgramInsufficientValue(uint256 have, uint256 want); +} diff --git a/src/precompiles/ArbWasmCache.sol b/src/precompiles/ArbWasmCache.sol new file mode 100644 index 00000000..7d1b8380 --- /dev/null +++ b/src/precompiles/ArbWasmCache.sol @@ -0,0 +1,33 @@ +// Copyright 2022-2024, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity >=0.4.21 <0.9.0; + +/** + * @title Methods for managing Stylus caches + * @notice Precompiled contract that exists in every Arbitrum chain at 0x0000000000000000000000000000000000000072. + */ +interface ArbWasmCache { + /// @notice See if the user is a cache manager. + function isCacheManager(address manager) external view returns (bool); + + /// @notice Retrieve all address managers. + /// @return managers the list of managers. + function allCacheManagers() external view returns (address[] memory managers); + + /// @notice Caches all programs with the given codehash. + /// @notice Reverts if the programs have expired. + /// @notice Caller must be a cache manager or chain owner. + /// @notice If you're looking for how to bid for position, interact with the chain's cache manager contract. + function cacheCodehash(bytes32 codehash) external; + + /// @notice Evicts all programs with the given codehash. + /// @notice Caller must be a cache manager or chain owner. + function evictCodehash(bytes32 codehash) external; + + /// @notice Gets whether a program is cached. Note that the program may be expired. + function codehashIsCached(bytes32 codehash) external view returns (bool); + + event UpdateProgramCache(address indexed manager, bytes32 indexed codehash, bool cached); +} diff --git a/src/rollup/AbsRollupEventInbox.sol b/src/rollup/AbsRollupEventInbox.sol new file mode 100644 index 00000000..c0866d9e --- /dev/null +++ b/src/rollup/AbsRollupEventInbox.sol @@ -0,0 +1,71 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./IRollupEventInbox.sol"; +import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; +import "../precompiles/ArbGasInfo.sol"; +import "../libraries/ArbitrumChecker.sol"; +import "../bridge/IDelayedMessageProvider.sol"; +import "../libraries/DelegateCallAware.sol"; +import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; +import {AlreadyInit, HadZeroInit, RollupNotChanged} from "../libraries/Error.sol"; + +/** + * @title The inbox for rollup protocol events + */ +abstract contract AbsRollupEventInbox is + IRollupEventInbox, + IDelayedMessageProvider, + DelegateCallAware +{ + IBridge public override bridge; + address public override rollup; + + modifier onlyRollup() { + require(msg.sender == rollup, "ONLY_ROLLUP"); + _; + } + + function initialize(IBridge _bridge) external override onlyDelegated { + if (address(bridge) != address(0)) revert AlreadyInit(); + if (address(_bridge) == address(0)) revert HadZeroInit(); + bridge = _bridge; + rollup = address(_bridge.rollup()); + } + + /// @notice Allows the rollup owner to sync the rollup address + function updateRollupAddress() external { + if (msg.sender != IOwnable(rollup).owner()) + revert NotOwner(msg.sender, IOwnable(rollup).owner()); + address newRollup = address(bridge.rollup()); + if (rollup == newRollup) revert RollupNotChanged(); + rollup = newRollup; + } + + function rollupInitialized(uint256 chainId, string calldata chainConfig) + external + override + onlyRollup + { + require(bytes(chainConfig).length > 0, "EMPTY_CHAIN_CONFIG"); + uint8 initMsgVersion = 1; + uint256 currentDataCost = block.basefee; + if (ArbitrumChecker.runningOnArbitrum()) { + currentDataCost += ArbGasInfo(address(0x6c)).getL1BaseFeeEstimate(); + } + bytes memory initMsg = abi.encodePacked( + chainId, + initMsgVersion, + currentDataCost, + chainConfig + ); + uint256 num = _enqueueInitializationMsg(initMsg); + emit InboxMessageDelivered(num, initMsg); + } + + function _enqueueInitializationMsg(bytes memory initMsg) internal virtual returns (uint256); +} diff --git a/src/rollup/BridgeCreator.sol b/src/rollup/BridgeCreator.sol index 1c2b60cd..0e45f815 100644 --- a/src/rollup/BridgeCreator.sol +++ b/src/rollup/BridgeCreator.sol @@ -6,110 +6,101 @@ pragma solidity ^0.8.0; import "../bridge/Bridge.sol"; import "../bridge/SequencerInbox.sol"; -import "../bridge/ISequencerInbox.sol"; import "../bridge/Inbox.sol"; import "../bridge/Outbox.sol"; import "./RollupEventInbox.sol"; +import "../bridge/ERC20Bridge.sol"; +import "../bridge/ERC20Inbox.sol"; +import "../rollup/ERC20RollupEventInbox.sol"; +import "../bridge/ERC20Outbox.sol"; import "../bridge/IBridge.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; contract BridgeCreator is Ownable { - Bridge public bridgeTemplate; - SequencerInbox public sequencerInboxTemplate; - Inbox public inboxTemplate; - RollupEventInbox public rollupEventInboxTemplate; - Outbox public outboxTemplate; + BridgeContracts public ethBasedTemplates; + BridgeContracts public erc20BasedTemplates; event TemplatesUpdated(); + event ERC20TemplatesUpdated(); - constructor() Ownable() { - bridgeTemplate = new Bridge(); - sequencerInboxTemplate = new SequencerInbox(); - inboxTemplate = new Inbox(); - rollupEventInboxTemplate = new RollupEventInbox(); - outboxTemplate = new Outbox(); + struct BridgeContracts { + IBridge bridge; + ISequencerInbox sequencerInbox; + IInboxBase inbox; + IRollupEventInbox rollupEventInbox; + IOutbox outbox; } - function updateTemplates( - address _bridgeTemplate, - address _sequencerInboxTemplate, - address _inboxTemplate, - address _rollupEventInboxTemplate, - address _outboxTemplate - ) external onlyOwner { - bridgeTemplate = Bridge(_bridgeTemplate); - sequencerInboxTemplate = SequencerInbox(_sequencerInboxTemplate); - inboxTemplate = Inbox(_inboxTemplate); - rollupEventInboxTemplate = RollupEventInbox(_rollupEventInboxTemplate); - outboxTemplate = Outbox(_outboxTemplate); + constructor( + BridgeContracts memory _ethBasedTemplates, + BridgeContracts memory _erc20BasedTemplates + ) Ownable() { + ethBasedTemplates = _ethBasedTemplates; + erc20BasedTemplates = _erc20BasedTemplates; + } + function updateTemplates(BridgeContracts calldata _newTemplates) external onlyOwner { + ethBasedTemplates = _newTemplates; emit TemplatesUpdated(); } - struct CreateBridgeFrame { - ProxyAdmin admin; - Bridge bridge; - SequencerInbox sequencerInbox; - Inbox inbox; - RollupEventInbox rollupEventInbox; - Outbox outbox; + function updateERC20Templates(BridgeContracts calldata _newTemplates) external onlyOwner { + erc20BasedTemplates = _newTemplates; + emit ERC20TemplatesUpdated(); + } + + function _createBridge(address adminProxy, BridgeContracts storage templates) + internal + returns (BridgeContracts memory) + { + BridgeContracts memory frame; + frame.bridge = IBridge( + address(new TransparentUpgradeableProxy(address(templates.bridge), adminProxy, "")) + ); + frame.sequencerInbox = ISequencerInbox( + address( + new TransparentUpgradeableProxy(address(templates.sequencerInbox), adminProxy, "") + ) + ); + frame.inbox = IInboxBase( + address(new TransparentUpgradeableProxy(address(templates.inbox), adminProxy, "")) + ); + frame.rollupEventInbox = IRollupEventInbox( + address( + new TransparentUpgradeableProxy(address(templates.rollupEventInbox), adminProxy, "") + ) + ); + frame.outbox = IOutbox( + address(new TransparentUpgradeableProxy(address(templates.outbox), adminProxy, "")) + ); + return frame; } function createBridge( address adminProxy, address rollup, - ISequencerInbox.MaxTimeVariation memory maxTimeVariation - ) - external - returns ( - Bridge, - SequencerInbox, - Inbox, - RollupEventInbox, - Outbox - ) - { - CreateBridgeFrame memory frame; - { - frame.bridge = Bridge( - address(new TransparentUpgradeableProxy(address(bridgeTemplate), adminProxy, "")) - ); - frame.sequencerInbox = SequencerInbox( - address( - new TransparentUpgradeableProxy(address(sequencerInboxTemplate), adminProxy, "") - ) - ); - frame.inbox = Inbox( - address(new TransparentUpgradeableProxy(address(inboxTemplate), adminProxy, "")) - ); - frame.rollupEventInbox = RollupEventInbox( - address( - new TransparentUpgradeableProxy( - address(rollupEventInboxTemplate), - adminProxy, - "" - ) - ) - ); - frame.outbox = Outbox( - address(new TransparentUpgradeableProxy(address(outboxTemplate), adminProxy, "")) - ); - } + address nativeToken, + ISequencerInbox.MaxTimeVariation calldata maxTimeVariation + ) external returns (BridgeContracts memory) { + // create ETH-based bridge if address zero is provided for native token, otherwise create ERC20-based bridge + BridgeContracts memory frame = _createBridge( + adminProxy, + nativeToken == address(0) ? ethBasedTemplates : erc20BasedTemplates + ); - frame.bridge.initialize(IOwnable(rollup)); + // init contracts + if (nativeToken == address(0)) { + IEthBridge(address(frame.bridge)).initialize(IOwnable(rollup)); + } else { + IERC20Bridge(address(frame.bridge)).initialize(IOwnable(rollup), nativeToken); + } frame.sequencerInbox.initialize(IBridge(frame.bridge), maxTimeVariation); - frame.inbox.initialize(IBridge(frame.bridge), ISequencerInbox(frame.sequencerInbox)); - frame.rollupEventInbox.initialize(IBridge(frame.bridge)); - frame.outbox.initialize(IBridge(frame.bridge)); + frame.inbox.initialize(frame.bridge, frame.sequencerInbox); + frame.rollupEventInbox.initialize(frame.bridge); + frame.outbox.initialize(frame.bridge); - return ( - frame.bridge, - frame.sequencerInbox, - frame.inbox, - frame.rollupEventInbox, - frame.outbox - ); + return frame; } } diff --git a/src/rollup/Config.sol b/src/rollup/Config.sol index 269ecb5a..13ca82e2 100644 --- a/src/rollup/Config.sol +++ b/src/rollup/Config.sol @@ -9,7 +9,7 @@ import "../state/Machine.sol"; import "../bridge/ISequencerInbox.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./IRollupEventInbox.sol"; import "./IRollupLogic.sol"; import "../challenge/IChallengeManager.sol"; @@ -31,7 +31,7 @@ struct Config { struct ContractDependencies { IBridge bridge; ISequencerInbox sequencerInbox; - IInbox inbox; + IInboxBase inbox; IOutbox outbox; IRollupEventInbox rollupEventInbox; IChallengeManager challengeManager; diff --git a/src/rollup/DeployHelper.sol b/src/rollup/DeployHelper.sol new file mode 100644 index 00000000..1fdf7b0d --- /dev/null +++ b/src/rollup/DeployHelper.sol @@ -0,0 +1,149 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import {IInbox} from "../bridge/IInbox.sol"; +import {IInboxBase} from "../bridge/IInboxBase.sol"; +import {IERC20Bridge} from "../bridge/IERC20Bridge.sol"; +import {IERC20Inbox} from "../bridge/ERC20Inbox.sol"; + +/// @notice Helper contract for deploying some keyless deployment to Arbitrum using delayed inbox +contract DeployHelper { + // All payload are padded with 0x04 (ArbOS L2MessageKind_SignedTx Type) + + // Nick's CREATE2 Deterministic Deployment Proxy + // https://github.com/Arachnid/deterministic-deployment-proxy + address public constant NICK_CREATE2_DEPLOYER = 0x3fAB184622Dc19b6109349B94811493BF2a45362; + uint256 public constant NICK_CREATE2_VALUE = 0.01 ether; + bytes public constant NICK_CREATE2_PAYLOAD = + hex"04f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + + // ERC-2470 Singleton Factory + // https://eips.ethereum.org/EIPS/eip-2470 + address public constant ERC2470_DEPLOYER = 0xBb6e024b9cFFACB947A71991E386681B1Cd1477D; + uint256 public constant ERC2470_VALUE = 0.0247 ether; + bytes public constant ERC2470_PAYLOAD = + hex"04f9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470"; + + // Zoltu's CREATE2 Deterministic Deployment Proxy + // https://github.com/Zoltu/deterministic-deployment-proxy + address public constant ZOLTU_CREATE2_DEPLOYER = 0x4c8D290a1B368ac4728d83a9e8321fC3af2b39b1; + uint256 public constant ZOLTU_VALUE = 0.01 ether; + bytes public constant ZOLTU_CREATE2_PAYLOAD = + hex"04f87e8085174876e800830186a08080ad601f80600e600039806000f350fe60003681823780368234f58015156014578182fd5b80825250506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222"; + + // ERC-1820: Pseudo-introspection Registry Contract + // https://eips.ethereum.org/EIPS/eip-1820 + address public constant ERC1820_DEPLOYER = 0xa990077c3205cbDf861e17Fa532eeB069cE9fF96; + uint256 public constant ERC1820_VALUE = 0.08 ether; + bytes public constant ERC1820_PAYLOAD = + hex"04f90a388085174876e800830c35008080b909e5608060405234801561001057600080fd5b506109c5806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c010000000000000000000000000000000000000000000000000000000090048063a41e7d5111610078578063a41e7d51146101d4578063aabbb8ca1461020a578063b705676514610236578063f712f3e814610280576100a5565b806329965a1d146100aa5780633d584063146100e25780635df8122f1461012457806365ba36c114610152575b600080fd5b6100e0600480360360608110156100c057600080fd5b50600160a060020a038135811691602081013591604090910135166102b6565b005b610108600480360360208110156100f857600080fd5b5035600160a060020a0316610570565b60408051600160a060020a039092168252519081900360200190f35b6100e06004803603604081101561013a57600080fd5b50600160a060020a03813581169160200135166105bc565b6101c26004803603602081101561016857600080fd5b81019060208101813564010000000081111561018357600080fd5b82018360208201111561019557600080fd5b803590602001918460018302840111640100000000831117156101b757600080fd5b5090925090506106b3565b60408051918252519081900360200190f35b6100e0600480360360408110156101ea57600080fd5b508035600160a060020a03169060200135600160e060020a0319166106ee565b6101086004803603604081101561022057600080fd5b50600160a060020a038135169060200135610778565b61026c6004803603604081101561024c57600080fd5b508035600160a060020a03169060200135600160e060020a0319166107ef565b604080519115158252519081900360200190f35b61026c6004803603604081101561029657600080fd5b508035600160a060020a03169060200135600160e060020a0319166108aa565b6000600160a060020a038416156102cd57836102cf565b335b9050336102db82610570565b600160a060020a031614610339576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b6103428361092a565b15610397576040805160e560020a62461bcd02815260206004820152601a60248201527f4d757374206e6f7420626520616e204552433136352068617368000000000000604482015290519081900360640190fd5b600160a060020a038216158015906103b85750600160a060020a0382163314155b156104ff5760405160200180807f455243313832305f4143434550545f4d4147494300000000000000000000000081525060140190506040516020818303038152906040528051906020012082600160a060020a031663249cb3fa85846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b15801561047e57600080fd5b505afa158015610492573d6000803e3d6000fd5b505050506040513d60208110156104a857600080fd5b5051146104ff576040805160e560020a62461bcd02815260206004820181905260248201527f446f6573206e6f7420696d706c656d656e742074686520696e74657266616365604482015290519081900360640190fd5b600160a060020a03818116600081815260208181526040808320888452909152808220805473ffffffffffffffffffffffffffffffffffffffff19169487169485179055518692917f93baa6efbd2244243bfee6ce4cfdd1d04fc4c0e9a786abd3a41313bd352db15391a450505050565b600160a060020a03818116600090815260016020526040812054909116151561059a5750806105b7565b50600160a060020a03808216600090815260016020526040902054165b919050565b336105c683610570565b600160a060020a031614610624576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f7420746865206d616e616765720000000000000000000000000000000000604482015290519081900360640190fd5b81600160a060020a031681600160a060020a0316146106435780610646565b60005b600160a060020a03838116600081815260016020526040808220805473ffffffffffffffffffffffffffffffffffffffff19169585169590951790945592519184169290917f605c2dbf762e5f7d60a546d42e7205dcb1b011ebc62a61736a57c9089d3a43509190a35050565b600082826040516020018083838082843780830192505050925050506040516020818303038152906040528051906020012090505b92915050565b6106f882826107ef565b610703576000610705565b815b600160a060020a03928316600081815260208181526040808320600160e060020a031996909616808452958252808320805473ffffffffffffffffffffffffffffffffffffffff19169590971694909417909555908152600284528181209281529190925220805460ff19166001179055565b600080600160a060020a038416156107905783610792565b335b905061079d8361092a565b156107c357826107ad82826108aa565b6107b85760006107ba565b815b925050506106e8565b600160a060020a0390811660009081526020818152604080832086845290915290205416905092915050565b6000808061081d857f01ffc9a70000000000000000000000000000000000000000000000000000000061094c565b909250905081158061082d575080155b1561083d576000925050506106e8565b61084f85600160e060020a031961094c565b909250905081158061086057508015155b15610870576000925050506106e8565b61087a858561094c565b909250905060018214801561088f5750806001145b1561089f576001925050506106e8565b506000949350505050565b600160a060020a0382166000908152600260209081526040808320600160e060020a03198516845290915281205460ff1615156108f2576108eb83836107ef565b90506106e8565b50600160a060020a03808316600081815260208181526040808320600160e060020a0319871684529091529020549091161492915050565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161590565b6040517f01ffc9a7000000000000000000000000000000000000000000000000000000008082526004820183905260009182919060208160248189617530fa90519096909550935050505056fea165627a7a72305820377f4a2d4301ede9949f163f319021a6e9c687c292a5e2b2c4734c126b524e6c00291ba01820182018201820182018201820182018201820182018201820182018201820a01820182018201820182018201820182018201820182018201820182018201820"; + + uint256 internal constant GASLIMIT = 21_000; + + function _fundAndDeploy( + address inbox, + uint256 _value, + address _l2Address, + bytes memory payload, + bool _isUsingFeeToken, + uint256 maxFeePerGas + ) internal { + uint256 submissionCost = IInboxBase(inbox).calculateRetryableSubmissionFee( + 0, + block.basefee + ); + uint256 feeAmount = _value + submissionCost + GASLIMIT * maxFeePerGas; + + // fund the target L2 address + if (_isUsingFeeToken) { + IERC20Inbox(inbox).createRetryableTicket({ + to: _l2Address, + l2CallValue: _value, + maxSubmissionCost: submissionCost, + excessFeeRefundAddress: msg.sender, + callValueRefundAddress: msg.sender, + gasLimit: GASLIMIT, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: feeAmount, + data: "" + }); + } else { + IInbox(inbox).createRetryableTicket{value: feeAmount}({ + to: _l2Address, + l2CallValue: _value, + maxSubmissionCost: submissionCost, + excessFeeRefundAddress: msg.sender, + callValueRefundAddress: msg.sender, + gasLimit: GASLIMIT, + maxFeePerGas: maxFeePerGas, + data: "" + }); + } + // send L2 msg to execute deployment transaction + IInboxBase(inbox).sendL2Message(payload); + } + + function perform( + address _inbox, + address _nativeToken, + uint256 _maxFeePerGas + ) external payable { + bool isUsingFeeToken = _nativeToken != address(0); + + _fundAndDeploy( + _inbox, + NICK_CREATE2_VALUE, + NICK_CREATE2_DEPLOYER, + NICK_CREATE2_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas + ); + _fundAndDeploy( + _inbox, + ERC2470_VALUE, + ERC2470_DEPLOYER, + ERC2470_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas + ); + _fundAndDeploy( + _inbox, + ZOLTU_VALUE, + ZOLTU_CREATE2_DEPLOYER, + ZOLTU_CREATE2_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas + ); + _fundAndDeploy( + _inbox, + ERC1820_VALUE, + ERC1820_DEPLOYER, + ERC1820_PAYLOAD, + isUsingFeeToken, + _maxFeePerGas + ); + + // if paying with ETH refund the caller + if (!isUsingFeeToken) { + payable(msg.sender).transfer(address(this).balance); + } + } + + function getDeploymentTotalCost(IInboxBase inbox, uint256 maxFeePerGas) + public + view + returns (uint256) + { + uint256 submissionCost = inbox.calculateRetryableSubmissionFee(0, block.basefee); + return + NICK_CREATE2_VALUE + + ERC2470_VALUE + + ZOLTU_VALUE + + ERC1820_VALUE + + 4 * + (submissionCost + GASLIMIT * maxFeePerGas); + } +} diff --git a/src/rollup/ERC20RollupEventInbox.sol b/src/rollup/ERC20RollupEventInbox.sol new file mode 100644 index 00000000..20451f34 --- /dev/null +++ b/src/rollup/ERC20RollupEventInbox.sol @@ -0,0 +1,26 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import "./AbsRollupEventInbox.sol"; +import "../bridge/IERC20Bridge.sol"; + +/** + * @title The inbox for rollup protocol events + */ +contract ERC20RollupEventInbox is AbsRollupEventInbox { + constructor() AbsRollupEventInbox() {} + + function _enqueueInitializationMsg(bytes memory initMsg) internal override returns (uint256) { + uint256 tokenAmount = 0; + return + IERC20Bridge(address(bridge)).enqueueDelayedMessage( + INITIALIZATION_MSG_TYPE, + address(0), + keccak256(initMsg), + tokenAmount + ); + } +} diff --git a/src/rollup/IRollupCore.sol b/src/rollup/IRollupCore.sol index e50f7a4a..341f723e 100644 --- a/src/rollup/IRollupCore.sol +++ b/src/rollup/IRollupCore.sol @@ -7,7 +7,7 @@ pragma solidity ^0.8.0; import "./Node.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./IRollupEventInbox.sol"; import "../challenge/IChallengeManager.sol"; diff --git a/src/rollup/IRollupEventInbox.sol b/src/rollup/IRollupEventInbox.sol index beb1b4ed..2e79f7e6 100644 --- a/src/rollup/IRollupEventInbox.sol +++ b/src/rollup/IRollupEventInbox.sol @@ -13,5 +13,7 @@ interface IRollupEventInbox { function rollup() external view returns (address); + function updateRollupAddress() external; + function rollupInitialized(uint256 chainId, string calldata chainConfig) external; } diff --git a/src/rollup/RollupAdminLogic.sol b/src/rollup/RollupAdminLogic.sol index b6c3771f..f7f07b1f 100644 --- a/src/rollup/RollupAdminLogic.sol +++ b/src/rollup/RollupAdminLogic.sol @@ -336,7 +336,7 @@ contract RollupAdminLogic is RollupCore, IRollupAdmin, DoubleLogicUUPSUpgradeabl * @notice sets the rollup's inbox reference. Does not update the bridge's view. * @param newInbox new address of inbox */ - function setInbox(IInbox newInbox) external { + function setInbox(IInboxBase newInbox) external { inbox = newInbox; emit OwnerFunctionCalled(28); } diff --git a/src/rollup/RollupCore.sol b/src/rollup/RollupCore.sol index 1107f105..a62655ff 100644 --- a/src/rollup/RollupCore.sol +++ b/src/rollup/RollupCore.sol @@ -33,7 +33,7 @@ abstract contract RollupCore is IRollupCore, PausableUpgradeable { uint256 public baseStake; bytes32 public wasmModuleRoot; - IInbox public inbox; + IInboxBase public inbox; IBridge public bridge; IOutbox public outbox; ISequencerInbox public sequencerInbox; diff --git a/src/rollup/RollupCreator.sol b/src/rollup/RollupCreator.sol index 93cf0bb2..0a7d39b3 100644 --- a/src/rollup/RollupCreator.sol +++ b/src/rollup/RollupCreator.sol @@ -4,18 +4,22 @@ pragma solidity ^0.8.0; +import "./RollupProxy.sol"; +import "./IRollupAdmin.sol"; import "./BridgeCreator.sol"; - +import "@offchainlabs/upgrade-executor/src/IUpgradeExecutor.sol"; import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; - -import "./RollupProxy.sol"; -import "./IRollupAdmin.sol"; +import {DeployHelper} from "./DeployHelper.sol"; +import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract RollupCreator is Ownable { + using SafeERC20 for IERC20; + event RollupCreated( address indexed rollupAddress, + address indexed nativeToken, address inboxAddress, address outbox, address rollupEventInbox, @@ -23,75 +27,125 @@ contract RollupCreator is Ownable { address adminProxy, address sequencerInbox, address bridge, + address upgradeExecutor, address validatorUtils, address validatorWalletCreator ); event TemplatesUpdated(); + struct RollupDeploymentParams { + Config config; + address[] validators; + uint256 maxDataSize; + address nativeToken; + bool deployFactoriesToL2; + uint256 maxFeePerGasForRetryables; + //// @dev The address of the batch poster, not used when set to zero address + address[] batchPosters; + address batchPosterManager; + } + BridgeCreator public bridgeCreator; IOneStepProofEntry public osp; IChallengeManager public challengeManagerTemplate; IRollupAdmin public rollupAdminLogic; IRollupUser public rollupUserLogic; + IUpgradeExecutor public upgradeExecutorLogic; address public validatorUtils; address public validatorWalletCreator; + DeployHelper public l2FactoriesDeployer; + constructor() Ownable() {} + // creator receives back excess fees (for deploying L2 factories) so it can refund the caller + receive() external payable {} + function setTemplates( BridgeCreator _bridgeCreator, IOneStepProofEntry _osp, IChallengeManager _challengeManagerLogic, IRollupAdmin _rollupAdminLogic, IRollupUser _rollupUserLogic, + IUpgradeExecutor _upgradeExecutorLogic, address _validatorUtils, - address _validatorWalletCreator + address _validatorWalletCreator, + DeployHelper _l2FactoriesDeployer ) external onlyOwner { bridgeCreator = _bridgeCreator; osp = _osp; challengeManagerTemplate = _challengeManagerLogic; rollupAdminLogic = _rollupAdminLogic; rollupUserLogic = _rollupUserLogic; + upgradeExecutorLogic = _upgradeExecutorLogic; validatorUtils = _validatorUtils; validatorWalletCreator = _validatorWalletCreator; + l2FactoriesDeployer = _l2FactoriesDeployer; emit TemplatesUpdated(); } /** * @notice Create a new rollup * @dev After this setup: - * @dev - Rollup should be the owner of bridge - * @dev - RollupOwner should be the owner of Rollup's ProxyAdmin - * @dev - RollupOwner should be the owner of Rollup + * @dev - UpgradeExecutor should be the owner of rollup + * @dev - UpgradeExecutor should be the owner of proxyAdmin which manages bridge contracts + * @dev - config.rollupOwner should have executor role on upgradeExecutor * @dev - Bridge should have a single inbox and outbox * @dev - Validators and batch poster should be set if provided - * @param config The configuration for the rollup - * @param _batchPoster The address of the batch poster, not used when set to zero address - * @param _validators The list of validator addresses, not used when set to empty list + * @param deployParams The parameters for the rollup deployment. It consists of: + * - config The configuration for the rollup + * - batchPoster The address of the batch poster, not used when set to zero address + * - validators The list of validator addresses, not used when set to empty list + * - nativeToken Address of the custom fee token used by rollup. If rollup is ETH-based address(0) should be provided + * - deployFactoriesToL2 Whether to deploy L2 factories using retryable tickets. If true, retryables need to be paid for in native currency. + * Deploying factories via retryable tickets at rollup creation time is the most reliable method to do it since it + * doesn't require paying the L1 gas. If deployment is not done as part of rollup creation TX, there is a risk that + * anyone can try to deploy factories and potentially burn the nonce 0 (ie. due to gas price spike when doing direct + * L2 TX). That would mean we permanently lost capability to deploy deterministic factory at expected address. + * - maxFeePerGasForRetryables price bid for L2 execution. + * - dataHashReader The address of the data hash reader used to read blob hashes * @return The address of the newly created rollup */ - function createRollup( - Config memory config, - address _batchPoster, - address[] calldata _validators - ) external returns (address) { + function createRollup(RollupDeploymentParams memory deployParams) + public + payable + returns (address) + { + { + // Make sure the immutable maxDataSize is as expected + (, ISequencerInbox ethSequencerInbox, IInboxBase ethInbox, , ) = bridgeCreator + .ethBasedTemplates(); + require( + deployParams.maxDataSize == ethSequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require(deployParams.maxDataSize == ethInbox.maxDataSize(), "I_MAX_DATA_SIZE_MISMATCH"); + + (, ISequencerInbox erc20SequencerInbox, IInboxBase erc20Inbox, , ) = bridgeCreator + .erc20BasedTemplates(); + require( + deployParams.maxDataSize == erc20SequencerInbox.maxDataSize(), + "SI_MAX_DATA_SIZE_MISMATCH" + ); + require( + deployParams.maxDataSize == erc20Inbox.maxDataSize(), + "I_MAX_DATA_SIZE_MISMATCH" + ); + } + + // create proxy admin which will manage bridge contracts ProxyAdmin proxyAdmin = new ProxyAdmin(); // Create the rollup proxy to figure out the address and initialize it later - RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(config))}(); - - ( - IBridge bridge, - ISequencerInbox sequencerInbox, - IInbox inbox, - IRollupEventInbox rollupEventInbox, - IOutbox outbox - ) = bridgeCreator.createBridge( - address(proxyAdmin), - address(rollup), - config.sequencerInboxMaxTimeVariation - ); + RollupProxy rollup = new RollupProxy{salt: keccak256(abi.encode(deployParams))}(); + + BridgeCreator.BridgeContracts memory bridgeContracts = bridgeCreator.createBridge( + address(proxyAdmin), + address(rollup), + deployParams.nativeToken, + deployParams.config.sequencerInboxMaxTimeVariation + ); IChallengeManager challengeManager = IChallengeManager( address( @@ -104,25 +158,28 @@ contract RollupCreator is Ownable { ); challengeManager.initialize( IChallengeResultReceiver(address(rollup)), - sequencerInbox, - bridge, + bridgeContracts.sequencerInbox, + bridgeContracts.bridge, osp ); - proxyAdmin.transferOwnership(config.owner); + // deploy and init upgrade executor + address upgradeExecutor = _deployUpgradeExecutor(deployParams.config.owner, proxyAdmin); + + // upgradeExecutor shall be proxyAdmin's owner + proxyAdmin.transferOwnership(address(upgradeExecutor)); // initialize the rollup with this contract as owner to set batch poster and validators - // it will transfer the ownership back to the actual owner later - address actualOwner = config.owner; - config.owner = address(this); + // it will transfer the ownership to the upgrade executor later + deployParams.config.owner = address(this); rollup.initializeProxy( - config, + deployParams.config, ContractDependencies({ - bridge: bridge, - sequencerInbox: sequencerInbox, - inbox: inbox, - outbox: outbox, - rollupEventInbox: rollupEventInbox, + bridge: bridgeContracts.bridge, + sequencerInbox: bridgeContracts.sequencerInbox, + inbox: bridgeContracts.inbox, + outbox: bridgeContracts.outbox, + rollupEventInbox: bridgeContracts.rollupEventInbox, challengeManager: challengeManager, rollupAdminLogic: address(rollupAdminLogic), rollupUserLogic: rollupUserLogic, @@ -131,34 +188,99 @@ contract RollupCreator is Ownable { }) ); - // setting batch poster, if the address provided is not zero address - if (_batchPoster != address(0)) { - sequencerInbox.setIsBatchPoster(_batchPoster, true); + // Setting batch posters and batch poster manager + for (uint256 i = 0; i < deployParams.batchPosters.length; i++) { + bridgeContracts.sequencerInbox.setIsBatchPoster(deployParams.batchPosters[i], true); + } + if (deployParams.batchPosterManager != address(0)) { + bridgeContracts.sequencerInbox.setBatchPosterManager(deployParams.batchPosterManager); } // Call setValidator on the newly created rollup contract just if validator set is not empty - if (_validators.length != 0) { - bool[] memory _vals = new bool[](_validators.length); - for (uint256 i = 0; i < _validators.length; i++) { + if (deployParams.validators.length != 0) { + bool[] memory _vals = new bool[](deployParams.validators.length); + for (uint256 i = 0; i < deployParams.validators.length; i++) { _vals[i] = true; } - IRollupAdmin(address(rollup)).setValidator(_validators, _vals); + IRollupAdmin(address(rollup)).setValidator(deployParams.validators, _vals); } - IRollupAdmin(address(rollup)).setOwner(actualOwner); + IRollupAdmin(address(rollup)).setOwner(address(upgradeExecutor)); + + if (deployParams.deployFactoriesToL2) { + _deployFactories( + address(bridgeContracts.inbox), + deployParams.nativeToken, + deployParams.maxFeePerGasForRetryables + ); + } emit RollupCreated( address(rollup), - address(inbox), - address(outbox), - address(rollupEventInbox), + deployParams.nativeToken, + address(bridgeContracts.inbox), + address(bridgeContracts.outbox), + address(bridgeContracts.rollupEventInbox), address(challengeManager), address(proxyAdmin), - address(sequencerInbox), - address(bridge), + address(bridgeContracts.sequencerInbox), + address(bridgeContracts.bridge), + address(upgradeExecutor), address(validatorUtils), address(validatorWalletCreator) ); return address(rollup); } + + function _deployUpgradeExecutor(address rollupOwner, ProxyAdmin proxyAdmin) + internal + returns (address) + { + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + address( + new TransparentUpgradeableProxy( + address(upgradeExecutorLogic), + address(proxyAdmin), + bytes("") + ) + ) + ); + address[] memory executors = new address[](1); + executors[0] = rollupOwner; + upgradeExecutor.initialize(address(upgradeExecutor), executors); + + return address(upgradeExecutor); + } + + function _deployFactories( + address _inbox, + address _nativeToken, + uint256 _maxFeePerGas + ) internal { + if (_nativeToken == address(0)) { + // we need to fund 4 retryable tickets + uint256 cost = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); + + // do it + l2FactoriesDeployer.perform{value: cost}(_inbox, _nativeToken, _maxFeePerGas); + + // refund the caller + // solhint-disable-next-line avoid-low-level-calls + (bool sent, ) = msg.sender.call{value: address(this).balance}(""); + require(sent, "Refund failed"); + } else { + // Transfer fee token amount needed to pay for retryable fees to the inbox. + uint256 totalFee = l2FactoriesDeployer.getDeploymentTotalCost( + IInboxBase(_inbox), + _maxFeePerGas + ); + IERC20(_nativeToken).safeTransferFrom(msg.sender, _inbox, totalFee); + + // do it + l2FactoriesDeployer.perform(_inbox, _nativeToken, _maxFeePerGas); + } + } } diff --git a/src/rollup/RollupEventInbox.sol b/src/rollup/RollupEventInbox.sol index ff7a727c..bb375778 100644 --- a/src/rollup/RollupEventInbox.sol +++ b/src/rollup/RollupEventInbox.sol @@ -4,56 +4,21 @@ pragma solidity ^0.8.0; -import "./IRollupEventInbox.sol"; -import "../bridge/IBridge.sol"; -import "../bridge/IDelayedMessageProvider.sol"; -import "../precompiles/ArbGasInfo.sol"; -import "../libraries/DelegateCallAware.sol"; -import "../libraries/ArbitrumChecker.sol"; -import {INITIALIZATION_MSG_TYPE} from "../libraries/MessageTypes.sol"; -import {AlreadyInit, HadZeroInit} from "../libraries/Error.sol"; +import "./AbsRollupEventInbox.sol"; +import "../bridge/IEthBridge.sol"; /** * @title The inbox for rollup protocol events */ -contract RollupEventInbox is IRollupEventInbox, IDelayedMessageProvider, DelegateCallAware { - IBridge public override bridge; - address public override rollup; +contract RollupEventInbox is AbsRollupEventInbox { + constructor() AbsRollupEventInbox() {} - modifier onlyRollup() { - require(msg.sender == rollup, "ONLY_ROLLUP"); - _; - } - - function initialize(IBridge _bridge) external override onlyDelegated { - if (address(bridge) != address(0)) revert AlreadyInit(); - if (address(_bridge) == address(0)) revert HadZeroInit(); - bridge = _bridge; - rollup = address(_bridge.rollup()); - } - - function rollupInitialized(uint256 chainId, string calldata chainConfig) - external - override - onlyRollup - { - require(bytes(chainConfig).length > 0, "EMPTY_CHAIN_CONFIG"); - uint8 initMsgVersion = 1; - uint256 currentDataCost = block.basefee; - if (ArbitrumChecker.runningOnArbitrum()) { - currentDataCost += ArbGasInfo(address(0x6c)).getL1BaseFeeEstimate(); - } - bytes memory initMsg = abi.encodePacked( - chainId, - initMsgVersion, - currentDataCost, - chainConfig - ); - uint256 num = bridge.enqueueDelayedMessage( - INITIALIZATION_MSG_TYPE, - address(0), - keccak256(initMsg) - ); - emit InboxMessageDelivered(num, initMsg); + function _enqueueInitializationMsg(bytes memory initMsg) internal override returns (uint256) { + return + IEthBridge(address(bridge)).enqueueDelayedMessage( + INITIALIZATION_MSG_TYPE, + address(0), + keccak256(initMsg) + ); } } diff --git a/src/rollup/RollupLib.sol b/src/rollup/RollupLib.sol index 82b9571d..f5da2312 100644 --- a/src/rollup/RollupLib.sol +++ b/src/rollup/RollupLib.sol @@ -11,7 +11,7 @@ import "../bridge/ISequencerInbox.sol"; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "./Node.sol"; import "./IRollupEventInbox.sol"; diff --git a/src/rollup/RollupUserLogic.sol b/src/rollup/RollupUserLogic.sol index bd16ad5e..9807f201 100644 --- a/src/rollup/RollupUserLogic.sol +++ b/src/rollup/RollupUserLogic.sol @@ -27,6 +27,11 @@ abstract contract AbsRollupUserLogic is _; } + modifier whenNotPausedOrDeprecated() { + require(!paused() || address(bridge.rollup()) != address(this), "PAUSED_AND_ACTIVE"); + _; + } + uint256 internal immutable deployTimeChainId = block.chainid; function _chainIdChanged() internal view returns (bool) { @@ -234,7 +239,12 @@ abstract contract AbsRollupUserLogic is * and move it to the desired node. * @param stakerAddress Address of the staker whose stake is refunded */ - function returnOldDeposit(address stakerAddress) external override onlyValidator whenNotPaused { + function returnOldDeposit(address stakerAddress) + external + override + onlyValidator + whenNotPausedOrDeprecated + { require(latestStakedNode(stakerAddress) <= latestConfirmed(), "TOO_RECENT"); requireUnchallengedStaker(stakerAddress); withdrawStaker(stakerAddress); @@ -258,7 +268,7 @@ abstract contract AbsRollupUserLogic is * @notice Reduce the amount staked for the sender (difference between initial amount staked and target is creditted back to the sender). * @param target Target amount of stake for the staker. If this is below the current minimum, it will be set to minimum instead */ - function reduceDeposit(uint256 target) external onlyValidator whenNotPaused { + function reduceDeposit(uint256 target) external onlyValidator whenNotPausedOrDeprecated { requireUnchallengedStaker(msg.sender); uint256 currentRequired = currentRequiredStake(); if (target < currentRequired) { @@ -659,7 +669,13 @@ contract RollupUserLogic is AbsRollupUserLogic, IRollupUser { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator whenNotPaused returns (uint256) { + function withdrawStakerFunds() + external + override + onlyValidator + whenNotPausedOrDeprecated + returns (uint256) + { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects // solhint-disable-next-line avoid-low-level-calls @@ -731,7 +747,13 @@ contract ERC20RollupUserLogic is AbsRollupUserLogic, IRollupUserERC20 { /** * @notice Withdraw uncommitted funds owned by sender from the rollup chain */ - function withdrawStakerFunds() external override onlyValidator whenNotPaused returns (uint256) { + function withdrawStakerFunds() + external + override + onlyValidator + whenNotPausedOrDeprecated + returns (uint256) + { uint256 amount = withdrawFunds(msg.sender); // This is safe because it occurs after all checks and effects require(IERC20Upgradeable(stakeToken).transfer(msg.sender, amount), "TRANSFER_FAILED"); diff --git a/src/rollup/ValidatorWallet.sol b/src/rollup/ValidatorWallet.sol index 9b8c2296..0d7cbace 100644 --- a/src/rollup/ValidatorWallet.sol +++ b/src/rollup/ValidatorWallet.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.0; import "../challenge/IChallengeManager.sol"; import "../libraries/DelegateCallAware.sol"; import "../libraries/IGasRefunder.sol"; +import "../libraries/GasRefundEnabled.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -109,7 +110,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes[] calldata data, address[] calldata destination, uint256[] calldata amount - ) public payable onlyExecutorOrOwner refundsGas(gasRefunder) { + ) public payable onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { uint256 numTxes = data.length; if (numTxes != destination.length) revert BadArrayLength(numTxes, destination.length); if (numTxes != amount.length) revert BadArrayLength(numTxes, amount.length); @@ -144,7 +145,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab bytes calldata data, address destination, uint256 amount - ) public payable onlyExecutorOrOwner refundsGas(gasRefunder) { + ) public payable onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { if (data.length > 0) require(destination.isContract(), "NO_CODE_AT_ADDR"); validateExecuteTransaction(destination); // We use a low level call here to allow for contract and non-contract calls @@ -168,7 +169,7 @@ contract ValidatorWallet is OwnableUpgradeable, DelegateCallAware, GasRefundEnab IGasRefunder gasRefunder, IChallengeManager manager, uint64[] calldata challenges - ) public onlyExecutorOrOwner refundsGas(gasRefunder) { + ) public onlyExecutorOrOwner refundsGas(gasRefunder, IReader4844(address(0))) { uint256 challengesCount = challenges.length; for (uint256 i = 0; i < challengesCount; i++) { try manager.timeout(challenges[i]) {} catch (bytes memory error) { diff --git a/src/state/Deserialize.sol b/src/state/Deserialize.sol index 75bf62bf..04596a4f 100644 --- a/src/state/Deserialize.sol +++ b/src/state/Deserialize.sol @@ -7,6 +7,7 @@ pragma solidity ^0.8.0; import "./Value.sol"; import "./ValueStack.sol"; import "./Machine.sol"; +import "./MultiStack.sol"; import "./Instructions.sol"; import "./StackFrame.sol"; import "./MerkleProof.sol"; @@ -88,6 +89,16 @@ library Deserialize { ret = bytes32(retInt); } + function boolean(bytes calldata proof, uint256 startOffset) + internal + pure + returns (bool ret, uint256 offset) + { + offset = startOffset; + ret = uint8(proof[offset]) != 0; + offset++; + } + function value(bytes calldata proof, uint256 startOffset) internal pure @@ -119,17 +130,39 @@ library Deserialize { stack = ValueStack({proved: ValueArray(proved), remainingHash: remainingHash}); } - function instruction(bytes calldata proof, uint256 startOffset) + function multiStack(bytes calldata proof, uint256 startOffset) internal pure - returns (Instruction memory inst, uint256 offset) + returns (MultiStack memory multistack, uint256 offset) { offset = startOffset; - uint16 opcode; - uint256 data; - (opcode, offset) = u16(proof, offset); - (data, offset) = u256(proof, offset); - inst = Instruction({opcode: opcode, argumentData: data}); + bytes32 inactiveStackHash; + (inactiveStackHash, offset) = b32(proof, offset); + bytes32 remainingHash; + (remainingHash, offset) = b32(proof, offset); + multistack = MultiStack({ + inactiveStackHash: inactiveStackHash, + remainingHash: remainingHash + }); + } + + function instructions(bytes calldata proof, uint256 startOffset) + internal + pure + returns (Instruction[] memory code, uint256 offset) + { + offset = startOffset; + uint8 count; + (count, offset) = u8(proof, offset); + code = new Instruction[](count); + + for (uint256 i = 0; i < uint256(count); i++) { + uint16 opcode; + uint256 data; + (opcode, offset) = u16(proof, offset); + (data, offset) = u256(proof, offset); + code[i] = Instruction({opcode: opcode, argumentData: data}); + } } function stackFrame(bytes calldata proof, uint256 startOffset) @@ -240,49 +273,54 @@ library Deserialize { returns (Machine memory mach, uint256 offset) { offset = startOffset; - MachineStatus status; { - uint8 statusU8; - (statusU8, offset) = u8(proof, offset); - if (statusU8 == 0) { - status = MachineStatus.RUNNING; - } else if (statusU8 == 1) { - status = MachineStatus.FINISHED; - } else if (statusU8 == 2) { - status = MachineStatus.ERRORED; - } else if (statusU8 == 3) { - status = MachineStatus.TOO_FAR; - } else { - revert("UNKNOWN_MACH_STATUS"); + MachineStatus status; + { + uint8 statusU8; + (statusU8, offset) = u8(proof, offset); + if (statusU8 == 0) { + status = MachineStatus.RUNNING; + } else if (statusU8 == 1) { + status = MachineStatus.FINISHED; + } else if (statusU8 == 2) { + status = MachineStatus.ERRORED; + } else if (statusU8 == 3) { + status = MachineStatus.TOO_FAR; + } else { + revert("UNKNOWN_MACH_STATUS"); + } } + ValueStack memory values; + ValueStack memory internalStack; + MultiStack memory valuesMulti; + StackFrameWindow memory frameStack; + MultiStack memory framesMulti; + (values, offset) = valueStack(proof, offset); + (valuesMulti, offset) = multiStack(proof, offset); + (internalStack, offset) = valueStack(proof, offset); + (frameStack, offset) = stackFrameWindow(proof, offset); + (framesMulti, offset) = multiStack(proof, offset); + mach = Machine({ + status: status, + valueStack: values, + valueMultiStack: valuesMulti, + internalStack: internalStack, + frameStack: frameStack, + frameMultiStack: framesMulti, + globalStateHash: bytes32(0), // filled later + moduleIdx: 0, // filled later + functionIdx: 0, // filled later + functionPc: 0, // filled later + recoveryPc: bytes32(0), // filled later + modulesRoot: bytes32(0) // filled later + }); } - ValueStack memory values; - ValueStack memory internalStack; - bytes32 globalStateHash; - uint32 moduleIdx; - uint32 functionIdx; - uint32 functionPc; - StackFrameWindow memory frameStack; - bytes32 modulesRoot; - (values, offset) = valueStack(proof, offset); - (internalStack, offset) = valueStack(proof, offset); - (frameStack, offset) = stackFrameWindow(proof, offset); - (globalStateHash, offset) = b32(proof, offset); - (moduleIdx, offset) = u32(proof, offset); - (functionIdx, offset) = u32(proof, offset); - (functionPc, offset) = u32(proof, offset); - (modulesRoot, offset) = b32(proof, offset); - mach = Machine({ - status: status, - valueStack: values, - internalStack: internalStack, - frameStack: frameStack, - globalStateHash: globalStateHash, - moduleIdx: moduleIdx, - functionIdx: functionIdx, - functionPc: functionPc, - modulesRoot: modulesRoot - }); + (mach.globalStateHash, offset) = b32(proof, offset); + (mach.moduleIdx, offset) = u32(proof, offset); + (mach.functionIdx, offset) = u32(proof, offset); + (mach.functionPc, offset) = u32(proof, offset); + (mach.recoveryPc, offset) = b32(proof, offset); + (mach.modulesRoot, offset) = b32(proof, offset); } function merkleProof(bytes calldata proof, uint256 startOffset) diff --git a/src/state/Instructions.sol b/src/state/Instructions.sol index 75452f77..c9accdb4 100644 --- a/src/state/Instructions.sol +++ b/src/state/Instructions.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -134,6 +134,8 @@ library Instructions { uint16 internal constant DUP = 0x8008; uint16 internal constant CROSS_MODULE_CALL = 0x8009; uint16 internal constant CALLER_MODULE_INTERNAL_CALL = 0x800A; + uint16 internal constant CROSS_MODULE_FORWARD = 0x800B; + uint16 internal constant CROSS_MODULE_INTERNAL_CALL = 0x800C; uint16 internal constant GET_GLOBAL_STATE_BYTES32 = 0x8010; uint16 internal constant SET_GLOBAL_STATE_BYTES32 = 0x8011; @@ -143,11 +145,44 @@ library Instructions { uint16 internal constant READ_PRE_IMAGE = 0x8020; uint16 internal constant READ_INBOX_MESSAGE = 0x8021; uint16 internal constant HALT_AND_SET_FINISHED = 0x8022; + uint16 internal constant LINK_MODULE = 0x8023; + uint16 internal constant UNLINK_MODULE = 0x8024; + + uint16 internal constant NEW_COTHREAD = 0x8030; + uint16 internal constant POP_COTHREAD = 0x8031; + uint16 internal constant SWITCH_COTHREAD = 0x8032; uint256 internal constant INBOX_INDEX_SEQUENCER = 0; uint256 internal constant INBOX_INDEX_DELAYED = 1; - function hash(Instruction memory inst) internal pure returns (bytes32) { - return keccak256(abi.encodePacked("Instruction:", inst.opcode, inst.argumentData)); + function hash(Instruction[] memory code) internal pure returns (bytes32) { + // To avoid quadratic expense, we declare a `bytes` early and populate its contents. + bytes memory data = new bytes(13 + 1 + 34 * code.length); + assembly { + // Represents the string "Instructions:", which we place after the length word. + mstore( + add(data, 32), + 0x496e737472756374696f6e733a00000000000000000000000000000000000000 + ) + } + + // write the instruction count + uint256 offset = 13; + data[offset] = bytes1(uint8(code.length)); + offset++; + + // write each instruction + for (uint256 i = 0; i < code.length; i++) { + Instruction memory inst = code[i]; + data[offset] = bytes1(uint8(inst.opcode >> 8)); + data[offset + 1] = bytes1(uint8(inst.opcode)); + offset += 2; + uint256 argumentData = inst.argumentData; + assembly { + mstore(add(add(data, 32), offset), argumentData) + } + offset += 32; + } + return keccak256(data); } } diff --git a/src/state/Machine.sol b/src/state/Machine.sol index 9d80f45c..2a67e639 100644 --- a/src/state/Machine.sol +++ b/src/state/Machine.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -6,6 +6,7 @@ pragma solidity ^0.8.0; import "./ValueStack.sol"; import "./Instructions.sol"; +import "./MultiStack.sol"; import "./StackFrame.sol"; enum MachineStatus { @@ -18,36 +19,49 @@ enum MachineStatus { struct Machine { MachineStatus status; ValueStack valueStack; + MultiStack valueMultiStack; ValueStack internalStack; StackFrameWindow frameStack; + MultiStack frameMultiStack; bytes32 globalStateHash; uint32 moduleIdx; uint32 functionIdx; uint32 functionPc; + bytes32 recoveryPc; bytes32 modulesRoot; } library MachineLib { using StackFrameLib for StackFrameWindow; using ValueStackLib for ValueStack; + using MultiStackLib for MultiStack; + + bytes32 internal constant NO_RECOVERY_PC = ~bytes32(0); function hash(Machine memory mach) internal pure returns (bytes32) { // Warning: the non-running hashes are replicated in Challenge if (mach.status == MachineStatus.RUNNING) { - return - keccak256( - abi.encodePacked( - "Machine running:", - mach.valueStack.hash(), - mach.internalStack.hash(), - mach.frameStack.hash(), - mach.globalStateHash, - mach.moduleIdx, - mach.functionIdx, - mach.functionPc, - mach.modulesRoot - ) - ); + bytes32 valueMultiHash = mach.valueMultiStack.hash( + mach.valueStack.hash(), + mach.recoveryPc != NO_RECOVERY_PC + ); + bytes32 frameMultiHash = mach.frameMultiStack.hash( + mach.frameStack.hash(), + mach.recoveryPc != NO_RECOVERY_PC + ); + bytes memory preimage = abi.encodePacked( + "Machine running:", + valueMultiHash, + mach.internalStack.hash(), + frameMultiHash, + mach.globalStateHash, + mach.moduleIdx, + mach.functionIdx, + mach.functionPc, + mach.recoveryPc, + mach.modulesRoot + ); + return keccak256(preimage); } else if (mach.status == MachineStatus.FINISHED) { return keccak256(abi.encodePacked("Machine finished:", mach.globalStateHash)); } else if (mach.status == MachineStatus.ERRORED) { @@ -58,4 +72,67 @@ library MachineLib { revert("BAD_MACH_STATUS"); } } + + function switchCoThreadStacks(Machine memory mach) internal pure { + bytes32 newActiveValue = mach.valueMultiStack.inactiveStackHash; + bytes32 newActiveFrame = mach.frameMultiStack.inactiveStackHash; + if ( + newActiveFrame == MultiStackLib.NO_STACK_HASH || + newActiveValue == MultiStackLib.NO_STACK_HASH + ) { + mach.status = MachineStatus.ERRORED; + return; + } + mach.frameMultiStack.inactiveStackHash = mach.frameStack.hash(); + mach.valueMultiStack.inactiveStackHash = mach.valueStack.hash(); + mach.frameStack.overwrite(newActiveFrame); + mach.valueStack.overwrite(newActiveValue); + } + + function setPcFromData(Machine memory mach, uint256 data) internal pure returns (bool) { + if (data >> 96 != 0) { + return false; + } + + mach.functionPc = uint32(data); + mach.functionIdx = uint32(data >> 32); + mach.moduleIdx = uint32(data >> 64); + return true; + } + + function setPcFromRecovery(Machine memory mach) internal pure returns (bool) { + if (!setPcFromData(mach, uint256(mach.recoveryPc))) { + return false; + } + mach.recoveryPc = NO_RECOVERY_PC; + return true; + } + + function setRecoveryFromPc(Machine memory mach, uint32 offset) internal pure returns (bool) { + if (mach.recoveryPc != NO_RECOVERY_PC) { + return false; + } + + uint256 result; + result = uint256(mach.moduleIdx) << 64; + result = result | (uint256(mach.functionIdx) << 32); + result = result | uint256(mach.functionPc + offset - 1); + mach.recoveryPc = bytes32(result); + return true; + } + + function setPc(Machine memory mach, Value memory pc) internal pure { + if (pc.valueType == ValueType.REF_NULL) { + mach.status = MachineStatus.ERRORED; + return; + } + if (pc.valueType != ValueType.INTERNAL_REF) { + mach.status = MachineStatus.ERRORED; + return; + } + if (!setPcFromData(mach, pc.contents)) { + mach.status = MachineStatus.ERRORED; + return; + } + } } diff --git a/src/state/MerkleProof.sol b/src/state/MerkleProof.sol index 09c405b2..26d979e0 100644 --- a/src/state/MerkleProof.sol +++ b/src/state/MerkleProof.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -24,12 +24,12 @@ library MerkleProofLib { return computeRootUnsafe(proof, index, leaf.hash(), "Value merkle tree:"); } - function computeRootFromInstruction( + function computeRootFromInstructions( MerkleProof memory proof, uint256 index, - Instruction memory inst + Instruction[] memory code ) internal pure returns (bytes32) { - return computeRootUnsafe(proof, index, Instructions.hash(inst), "Instruction merkle tree:"); + return computeRootUnsafe(proof, index, Instructions.hash(code), "Instruction merkle tree:"); } function computeRootFromFunction( @@ -95,5 +95,23 @@ library MerkleProofLib { } index >>= 1; } + require(index == 0, "PROOF_TOO_SHORT"); + } + + function growToNewRoot( + bytes32 root, + uint256 leaf, + bytes32 hash, + bytes32 zero, + string memory prefix + ) internal pure returns (bytes32) { + bytes32 h = hash; + uint256 node = leaf; + while (node > 1) { + h = keccak256(abi.encodePacked(prefix, h, zero)); + zero = keccak256(abi.encodePacked(prefix, zero, zero)); + node >>= 1; + } + return keccak256(abi.encodePacked(prefix, root, h)); } } diff --git a/src/state/Module.sol b/src/state/Module.sol index e21fb018..dc4776c7 100644 --- a/src/state/Module.sol +++ b/src/state/Module.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 diff --git a/src/state/ModuleMemory.sol b/src/state/ModuleMemory.sol index 1f0a4434..0f7317ed 100644 --- a/src/state/ModuleMemory.sol +++ b/src/state/ModuleMemory.sol @@ -11,6 +11,8 @@ import "./ModuleMemoryCompact.sol"; library ModuleMemoryLib { using MerkleProofLib for MerkleProof; + uint256 private constant LEAF_SIZE = 32; + function hash(ModuleMemory memory mem) internal pure returns (bytes32) { return ModuleMemoryCompactLib.hash(mem); } @@ -35,4 +37,56 @@ library ModuleMemoryLib { bytes32 recomputedRoot = merkle.computeRootFromMemory(leafIdx, contents); require(recomputedRoot == mem.merkleRoot, "WRONG_MEM_ROOT"); } + + function isValidLeaf(ModuleMemory memory mem, uint256 pointer) internal pure returns (bool) { + return pointer + 32 <= mem.size && pointer % LEAF_SIZE == 0; + } + + function pullLeafByte(bytes32 leaf, uint256 idx) internal pure returns (uint8) { + require(idx < LEAF_SIZE, "BAD_PULL_LEAF_BYTE_IDX"); + // Take into account that we are casting the leaf to a big-endian integer + uint256 leafShift = (LEAF_SIZE - 1 - idx) * 8; + return uint8(uint256(leaf) >> leafShift); + } + + // loads a big-endian value from memory + function load( + ModuleMemory memory mem, + uint256 start, + uint256 width, + bytes calldata proof, + uint256 proofOffset + ) + internal + pure + returns ( + bool err, + uint256 value, + uint256 offset + ) + { + if (start + width > mem.size) { + return (true, 0, proofOffset); + } + + uint256 lastProvedLeafIdx = ~uint256(0); + bytes32 lastProvedLeafContents; + uint256 readValue; + for (uint256 i = 0; i < width; i++) { + uint256 idx = start + i; + uint256 leafIdx = idx / LEAF_SIZE; + if (leafIdx != lastProvedLeafIdx) { + (lastProvedLeafContents, proofOffset, ) = proveLeaf( + mem, + leafIdx, + proof, + proofOffset + ); + lastProvedLeafIdx = leafIdx; + } + uint256 indexWithinLeaf = idx % LEAF_SIZE; + readValue |= uint256(pullLeafByte(lastProvedLeafContents, indexWithinLeaf)) << (i * 8); + } + return (false, readValue, proofOffset); + } } diff --git a/src/state/MultiStack.sol b/src/state/MultiStack.sol new file mode 100644 index 00000000..45bc7e6e --- /dev/null +++ b/src/state/MultiStack.sol @@ -0,0 +1,58 @@ +// Copyright 2021-2024, Offchain Labs, Inc. +// For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +struct MultiStack { + bytes32 inactiveStackHash; // NO_STACK_HASH if no stack, 0 if empty stack + bytes32 remainingHash; // 0 if less than 2 cothreads exist +} + +library MultiStackLib { + bytes32 internal constant NO_STACK_HASH = ~bytes32(0); + + function hash( + MultiStack memory multi, + bytes32 activeStackHash, + bool cothread + ) internal pure returns (bytes32) { + require(activeStackHash != NO_STACK_HASH, "MULTISTACK_NOSTACK_ACTIVE"); + if (cothread) { + require(multi.inactiveStackHash != NO_STACK_HASH, "MULTISTACK_NOSTACK_MAIN"); + return + keccak256( + abi.encodePacked( + "multistack:", + multi.inactiveStackHash, + activeStackHash, + multi.remainingHash + ) + ); + } else { + return + keccak256( + abi.encodePacked( + "multistack:", + activeStackHash, + multi.inactiveStackHash, + multi.remainingHash + ) + ); + } + } + + function setEmpty(MultiStack memory multi) internal pure { + multi.inactiveStackHash = NO_STACK_HASH; + multi.remainingHash = 0; + } + + function pushNew(MultiStack memory multi) internal pure { + if (multi.inactiveStackHash != NO_STACK_HASH) { + multi.remainingHash = keccak256( + abi.encodePacked("cothread:", multi.inactiveStackHash, multi.remainingHash) + ); + } + multi.inactiveStackHash = 0; + } +} diff --git a/src/state/StackFrame.sol b/src/state/StackFrame.sol index 083376ec..eb72fe0d 100644 --- a/src/state/StackFrame.sol +++ b/src/state/StackFrame.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -60,4 +60,9 @@ library StackFrameLib { newProved[window.proved.length] = frame; window.proved = newProved; } + + function overwrite(StackFrameWindow memory window, bytes32 root) internal pure { + window.remainingHash = root; + delete window.proved; + } } diff --git a/src/state/Value.sol b/src/state/Value.sol index a4cb832a..ca1b1a19 100644 --- a/src/state/Value.sol +++ b/src/state/Value.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -61,4 +61,16 @@ library ValueLib { return newI32(uint32(0)); } } + + function newPc( + uint32 funcPc, + uint32 func, + uint32 module + ) internal pure returns (Value memory) { + uint256 data = 0; + data |= funcPc; + data |= uint256(func) << 32; + data |= uint256(module) << 64; + return Value({valueType: ValueType.INTERNAL_REF, contents: data}); + } } diff --git a/src/state/ValueStack.sol b/src/state/ValueStack.sol index ce676bd0..4ba135fb 100644 --- a/src/state/ValueStack.sol +++ b/src/state/ValueStack.sol @@ -1,4 +1,4 @@ -// Copyright 2021-2022, Offchain Labs, Inc. +// Copyright 2021-2023, Offchain Labs, Inc. // For license information, see https://github.com/OffchainLabs/nitro-contracts/blob/main/LICENSE // SPDX-License-Identifier: BUSL-1.1 @@ -36,4 +36,9 @@ library ValueStackLib { function push(ValueStack memory stack, Value memory val) internal pure { return stack.proved.push(val); } + + function overwrite(ValueStack memory stack, bytes32 root) internal pure { + stack.remainingHash = root; + delete stack.proved; + } } diff --git a/src/test-helpers/BridgeTester.sol b/src/test-helpers/BridgeTester.sol index b355c51c..0bcbe00f 100644 --- a/src/test-helpers/BridgeTester.sol +++ b/src/test-helpers/BridgeTester.sol @@ -16,6 +16,7 @@ import { InvalidOutboxSet } from "../libraries/Error.sol"; import "../bridge/IBridge.sol"; +import "../bridge/IEthBridge.sol"; import "../bridge/Messages.sol"; import "../libraries/DelegateCallAware.sol"; @@ -26,7 +27,7 @@ import "../libraries/DelegateCallAware.sol"; * Since the escrow is held here, this contract also contains a list of allowed * outboxes that can make calls from here and withdraw this escrow. */ -contract BridgeTester is Initializable, DelegateCallAware, IBridge { +contract BridgeTester is Initializable, DelegateCallAware, IBridge, IEthBridge { using AddressUpgradeable for address; struct InOutInfo { @@ -73,6 +74,10 @@ contract BridgeTester is Initializable, DelegateCallAware, IBridge { rollup = rollup_; } + function updateRollupAddress(IOwnable _rollup) external { + rollup = _rollup; + } + function activeOutbox() public view returns (address) { if (_activeOutbox == EMPTY_ACTIVEOUTBOX) return address(uint160(0)); return _activeOutbox; diff --git a/src/test-helpers/EthVault.sol b/src/test-helpers/EthVault.sol new file mode 100644 index 00000000..e8258bd6 --- /dev/null +++ b/src/test-helpers/EthVault.sol @@ -0,0 +1,20 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +/** + * Simple contract for testing bridge calls which include calldata + */ +contract EthVault { + uint256 public version = 0; + + function setVersion(uint256 _version) external payable { + version = _version; + } + + function justRevert() external payable { + revert("bye"); + } +} diff --git a/src/test-helpers/InterfaceCompatibilityTester.sol b/src/test-helpers/InterfaceCompatibilityTester.sol index ba637705..4d3328fc 100644 --- a/src/test-helpers/InterfaceCompatibilityTester.sol +++ b/src/test-helpers/InterfaceCompatibilityTester.sol @@ -7,5 +7,5 @@ pragma solidity >=0.6.9 <0.9.0; import "../bridge/IBridge.sol"; import "../bridge/IOutbox.sol"; -import "../bridge/IInbox.sol"; +import "../bridge/IInboxBase.sol"; import "../bridge/ISequencerInbox.sol"; diff --git a/src/test-helpers/OutboxWithoutOptTester.sol b/src/test-helpers/OutboxWithoutOptTester.sol index 50f378ac..89dcc1e1 100644 --- a/src/test-helpers/OutboxWithoutOptTester.sol +++ b/src/test-helpers/OutboxWithoutOptTester.sol @@ -48,12 +48,18 @@ contract OutboxWithoutOptTester is DelegateCallAware, IOutbox { rollup = address(_bridge.rollup()); } + function postUpgradeInit() external {} + function updateSendRoot(bytes32 root, bytes32 l2BlockHash) external override { //if (msg.sender != rollup) revert NotRollup(msg.sender, rollup); //test only!!! roots[root] = l2BlockHash; emit SendRootUpdated(root, l2BlockHash); } + function updateRollupAddress() external onlyDelegated onlyProxyOwner { + rollup = address(bridge.rollup()); + } + /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account /// When the return value is zero, that means this is a system message /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies diff --git a/src/test-helpers/RollupMock.sol b/src/test-helpers/RollupMock.sol index 085b9c00..9abcc6db 100644 --- a/src/test-helpers/RollupMock.sol +++ b/src/test-helpers/RollupMock.sol @@ -8,6 +8,12 @@ contract RollupMock { event WithdrawTriggered(); event ZombieTriggered(); + address public owner; + + constructor(address _owner) { + owner = _owner; + } + function withdrawStakerFunds() external returns (uint256) { emit WithdrawTriggered(); return 0; diff --git a/src/test-helpers/TestToken.sol b/src/test-helpers/TestToken.sol new file mode 100644 index 00000000..9a8cb39b --- /dev/null +++ b/src/test-helpers/TestToken.sol @@ -0,0 +1,16 @@ +// Copyright 2021-2022, Offchain Labs, Inc. +// For license information, see https://github.com/nitro/blob/master/LICENSE +// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.0; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/** + * Basic ERC20 token + */ +contract TestToken is ERC20 { + constructor(uint256 initialSupply) ERC20("TestToken", "TT") { + _mint(msg.sender, initialSupply); + } +} diff --git a/test/contract/arbRollup.spec.ts b/test/contract/arbRollup.spec.ts index ba417541..8660f0ef 100644 --- a/test/contract/arbRollup.spec.ts +++ b/test/contract/arbRollup.spec.ts @@ -15,16 +15,25 @@ */ /* eslint-env node, mocha */ -import { ethers, run } from 'hardhat' +import { ethers, network } from 'hardhat' import { Signer } from '@ethersproject/abstract-signer' import { BigNumberish, BigNumber } from '@ethersproject/bignumber' import { BytesLike } from '@ethersproject/bytes' import { ContractTransaction } from '@ethersproject/contracts' import { assert, expect } from 'chai' import { + Bridge__factory, + Inbox__factory, + RollupEventInbox__factory, + Outbox__factory, + ERC20Bridge__factory, + ERC20Inbox__factory, + ERC20RollupEventInbox__factory, + ERC20Outbox__factory, BridgeCreator__factory, ChallengeManager, ChallengeManager__factory, + DeployHelper__factory, OneStepProofEntry__factory, OneStepProver0__factory, OneStepProverHostIo__factory, @@ -37,7 +46,13 @@ import { RollupUserLogic__factory, SequencerInbox, SequencerInbox__factory, + Bridge, } from '../../build/types' +import { + abi as UpgradeExecutorABI, + bytecode as UpgradeExecutorBytecode, +} from '@offchainlabs/upgrade-executor/build/contracts/src/UpgradeExecutor.sol/UpgradeExecutor.json' + import { initializeAccounts } from './utils' import { @@ -67,17 +82,22 @@ const ZERO_ADDR = ethers.constants.AddressZero const extraChallengeTimeBlocks = 20 const wasmModuleRoot = '0x9900000000000000000000000000000000000000000000000000000000000010' +const dummy4844Reader = '0x0000000000000000000000000000000000000089' // let rollup: RollupContract let rollup: RollupContract +let batchPosterManager: Signer let rollupUser: RollupUserLogic let rollupAdmin: RollupAdminLogic +let bridge: Bridge let accounts: Signer[] let validators: Signer[] let sequencerInbox: SequencerInbox let admin: Signer let sequencer: Signer let challengeManager: ChallengeManager +let upgradeExecutor: string +// let adminproxy: string async function getDefaultConfig( _confirmPeriodBlocks = confirmationPeriodBlocks @@ -103,7 +123,7 @@ async function getDefaultConfig( } const setup = async () => { - const accounts = await initializeAccounts() + accounts = await initializeAccounts() admin = accounts[0] const user = accounts[1] @@ -113,6 +133,7 @@ const setup = async () => { const val3 = accounts[4] const val4 = accounts[5] sequencer = accounts[6] + const batchPosterManager = accounts[7] const oneStep0Fac = (await ethers.getContractFactory( 'OneStepProver0' @@ -156,31 +177,133 @@ const setup = async () => { )) as RollupUserLogic__factory const rollupUserLogicTemplate = await rollupUserLogicFac.deploy() + const upgradeExecutorLogicFac = await ethers.getContractFactory( + UpgradeExecutorABI, + UpgradeExecutorBytecode + ) + const upgradeExecutorLogic = await upgradeExecutorLogicFac.deploy() + + const ethBridgeFac = (await ethers.getContractFactory( + 'Bridge' + )) as Bridge__factory + const ethBridge = await ethBridgeFac.deploy() + + const ethSequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const ethSequencerInbox = await ethSequencerInboxFac.deploy( + 117964, + dummy4844Reader, + false + ) + + const ethInboxFac = (await ethers.getContractFactory( + 'Inbox' + )) as Inbox__factory + const ethInbox = await ethInboxFac.deploy(117964) + + const ethRollupEventInboxFac = (await ethers.getContractFactory( + 'RollupEventInbox' + )) as RollupEventInbox__factory + const ethRollupEventInbox = await ethRollupEventInboxFac.deploy() + + const ethOutboxFac = (await ethers.getContractFactory( + 'Outbox' + )) as Outbox__factory + const ethOutbox = await ethOutboxFac.deploy() + + const erc20BridgeFac = (await ethers.getContractFactory( + 'ERC20Bridge' + )) as ERC20Bridge__factory + const erc20Bridge = await erc20BridgeFac.deploy() + + const erc20SequencerInboxFac = (await ethers.getContractFactory( + 'SequencerInbox' + )) as SequencerInbox__factory + const erc20SequencerInbox = await erc20SequencerInboxFac.deploy( + 117964, + dummy4844Reader, + true + ) + + const erc20InboxFac = (await ethers.getContractFactory( + 'ERC20Inbox' + )) as ERC20Inbox__factory + const erc20Inbox = await erc20InboxFac.deploy(117964) + + const erc20RollupEventInboxFac = (await ethers.getContractFactory( + 'ERC20RollupEventInbox' + )) as ERC20RollupEventInbox__factory + const erc20RollupEventInbox = await erc20RollupEventInboxFac.deploy() + + const erc20OutboxFac = (await ethers.getContractFactory( + 'ERC20Outbox' + )) as ERC20Outbox__factory + const erc20Outbox = await erc20OutboxFac.deploy() + const bridgeCreatorFac = (await ethers.getContractFactory( 'BridgeCreator' )) as BridgeCreator__factory - const bridgeCreator = await bridgeCreatorFac.deploy() + const bridgeCreator = await bridgeCreatorFac.deploy( + { + bridge: ethBridge.address, + sequencerInbox: ethSequencerInbox.address, + inbox: ethInbox.address, + rollupEventInbox: ethRollupEventInbox.address, + outbox: ethOutbox.address, + }, + { + bridge: erc20Bridge.address, + sequencerInbox: erc20SequencerInbox.address, + inbox: erc20Inbox.address, + rollupEventInbox: erc20RollupEventInbox.address, + outbox: erc20Outbox.address, + } + ) const rollupCreatorFac = (await ethers.getContractFactory( 'RollupCreator' )) as RollupCreator__factory const rollupCreator = await rollupCreatorFac.deploy() + const deployHelperFac = (await ethers.getContractFactory( + 'DeployHelper' + )) as DeployHelper__factory + const deployHelper = await deployHelperFac.deploy() + await rollupCreator.setTemplates( bridgeCreator.address, oneStepProofEntry.address, challengeManagerTemplate.address, rollupAdminLogicTemplate.address, rollupUserLogicTemplate.address, + upgradeExecutorLogic.address, + ethers.constants.AddressZero, ethers.constants.AddressZero, - ethers.constants.AddressZero + deployHelper.address ) - const response = await rollupCreator.createRollup( - await getDefaultConfig(), - await sequencer.getAddress(), - [await val1.getAddress(), await val2.getAddress(), await val3.getAddress()] - ) + const maxFeePerGas = BigNumber.from('1000000000') + + const deployParams = { + config: await getDefaultConfig(), + batchPosters: [await sequencer.getAddress()], + validators: [ + await val1.getAddress(), + await val2.getAddress(), + await val3.getAddress(), + await val4.getAddress(), + ], + maxDataSize: 117964, + nativeToken: ethers.constants.AddressZero, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: maxFeePerGas, + batchPosterManager: await batchPosterManager.getAddress(), + } + + const response = await rollupCreator.createRollup(deployParams, { + value: ethers.utils.parseEther('0.2'), + }) const rec = await response.wait() @@ -194,6 +317,7 @@ const setup = async () => { const rollupUser = rollupUserLogicFac .attach(rollupCreatedEvent.rollupAddress) .connect(user) + const bridge = ethBridgeFac.attach(rollupCreatedEvent.bridge).connect(user) sequencerInbox = ( (await ethers.getContractFactory( @@ -201,6 +325,10 @@ const setup = async () => { )) as SequencerInbox__factory ).attach(rollupCreatedEvent.sequencerInbox) + await sequencerInbox + .connect(await impersonateAccount(rollupCreatedEvent.upgradeExecutor)) + .setBatchPosterManager(await batchPosterManager.getAddress()) + challengeManager = ( (await ethers.getContractFactory( 'ChallengeManager' @@ -224,7 +352,10 @@ const setup = async () => { sequencerInbox: rollupCreatedEvent.sequencerInbox, delayedBridge: rollupCreatedEvent.bridge, delayedInbox: rollupCreatedEvent.inboxAddress, - bridge: rollupCreatedEvent.bridge, + bridge, + batchPosterManager, + upgradeExecutorAddress: rollupCreatedEvent.upgradeExecutor, + adminproxy: rollupCreatedEvent.adminProxy, } } @@ -378,41 +509,59 @@ const getDoubleLogicUUPSTarget = async ( .toLowerCase()}` } -describe('ArbRollup', () => { - it('should deploy contracts', async function () { - accounts = await initializeAccounts() - - await run('deploy', { tags: 'test' }) - }) +const impersonateAccount = (address: string) => + network.provider + .request({ + // Fund inboxMock to send transaction + method: 'hardhat_setBalance', + params: [address, '0xffffffffffffffffffff'], + }) + .then(() => + network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [address], + }) + ) + .then(() => ethers.getSigner(address)) +describe('ArbRollup', () => { it('should initialize', async function () { const { rollupAdmin: rollupAdminContract, rollupUser: rollupUserContract, + bridge: bridgeContract, admin: adminI, validators: validatorsI, + batchPosterManager: batchPosterManagerI, + upgradeExecutorAddress, } = await setup() rollupAdmin = rollupAdminContract rollupUser = rollupUserContract + bridge = bridgeContract admin = adminI validators = validatorsI + upgradeExecutor = upgradeExecutorAddress + // adminproxy = adminproxyAddress rollup = new RollupContract(rollupUser.connect(validators[0])) + batchPosterManager = batchPosterManagerI }) it('should only initialize once', async function () { await expect( - rollupAdmin.initialize(await getDefaultConfig(), { - challengeManager: constants.AddressZero, - bridge: constants.AddressZero, - inbox: constants.AddressZero, - outbox: constants.AddressZero, - rollupAdminLogic: constants.AddressZero, - rollupEventInbox: constants.AddressZero, - rollupUserLogic: constants.AddressZero, - sequencerInbox: constants.AddressZero, - validatorUtils: constants.AddressZero, - validatorWalletCreator: constants.AddressZero, - }) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .initialize(await getDefaultConfig(), { + challengeManager: constants.AddressZero, + bridge: constants.AddressZero, + inbox: constants.AddressZero, + outbox: constants.AddressZero, + rollupAdminLogic: constants.AddressZero, + rollupEventInbox: constants.AddressZero, + rollupUserLogic: constants.AddressZero, + sequencerInbox: constants.AddressZero, + validatorUtils: constants.AddressZero, + validatorWalletCreator: constants.AddressZero, + }) ).to.be.revertedWith('Initializable: contract is already initialized') }) @@ -456,6 +605,9 @@ describe('ArbRollup', () => { await rollupUser .connect(validators[2]) .newStakeOnExistingNode(1, prevNode.nodeHash, { value: stake }) + await rollupUser + .connect(validators[3]) + .newStakeOnExistingNode(1, prevNode.nodeHash, { value: stake }) }) it('should move stake to a new node', async function () { @@ -665,6 +817,44 @@ describe('ArbRollup', () => { await rollup.confirmNextNode(challengerNode) }) + it('allow force refund staker with pending node', async function () { + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() + await ( + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceRefundStaker([await validators[3].getAddress()]) + ).wait() + + await expect( + rollup.rollup.connect(validators[3]).withdrawStakerFunds() + ).to.be.revertedWith('PAUSED_AND_ACTIVE') + // staker can only withdraw if rollup address changed when paused + await bridge + .connect(await impersonateAccount(rollup.rollup.address)) + .updateRollupAddress(ethers.constants.AddressZero) + + await ( + await rollup.rollup.connect(validators[3]).withdrawStakerFunds() + ).wait() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() + + // restore rollup address + await bridge + .connect(await impersonateAccount(ethers.constants.AddressZero)) + .updateRollupAddress(rollupUser.address) + + const postWithdrawablefunds = await rollup.rollup.withdrawableFunds( + await validators[3].getAddress() + ) + expect(postWithdrawablefunds, 'withdrawable funds').to.equal(0) + const stake = await rollup.rollup.amountStaked( + await validators[3].getAddress() + ) + expect(stake, 'amount staked').to.equal(0) + }) + it('should add and remove stakes correctly', async function () { /* RollupUser functions that alter stake and their respective Core logic @@ -740,7 +930,7 @@ describe('ArbRollup', () => { const prevIsPaused = await rollup.rollup.paused() expect(prevIsPaused).to.equal(false) - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() const postIsPaused = await rollup.rollup.paused() expect(postIsPaused).to.equal(true) @@ -751,7 +941,9 @@ describe('ArbRollup', () => { .addToDeposit(await validators[1].getAddress(), { value: 5 }) ).to.be.revertedWith('Pausable: paused') - await rollupAdmin.resume() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() }) it('should allow admin to alter rollup while paused', async function () { @@ -806,10 +998,12 @@ describe('ArbRollup', () => { ).to.eq(await validators[2].getAddress()) await expect( - rollupAdmin.forceResolveChallenge( - [await validators[0].getAddress()], - [await validators[2].getAddress()] - ), + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceResolveChallenge( + [await validators[0].getAddress()], + [await validators[2].getAddress()] + ), 'force resolve' ).to.be.revertedWith('Pausable: not paused') @@ -823,12 +1017,14 @@ describe('ArbRollup', () => { 'create challenge' ).to.be.revertedWith('IN_CHAL') - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() - await rollupAdmin.forceResolveChallenge( - [await validators[0].getAddress()], - [await validators[2].getAddress()] - ) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceResolveChallenge( + [await validators[0].getAddress()], + [await validators[2].getAddress()] + ) // challenge should have been destroyed expect( @@ -846,14 +1042,16 @@ describe('ArbRollup', () => { expect(challengeA).to.equal(ZERO_ADDR) expect(challengeB).to.equal(ZERO_ADDR) - await rollupAdmin.forceRefundStaker([ - await validators[0].getAddress(), - await validators[2].getAddress(), - ]) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceRefundStaker([ + await validators[0].getAddress(), + await validators[2].getAddress(), + ]) const adminAssertion = newRandomAssertion(prevNode.assertion.afterState) const { node: forceCreatedNode1 } = await forceCreateNode( - rollupAdmin, + rollupAdmin.connect(await impersonateAccount(upgradeExecutor)), sequencerInbox, prevNode, adminAssertion, @@ -872,7 +1070,7 @@ describe('ArbRollup', () => { const adminAssertion2 = newRandomAssertion(prevNode.assertion.afterState) const { node: forceCreatedNode2 } = await forceCreateNode( - rollupAdmin, + rollupAdmin.connect(await impersonateAccount(upgradeExecutor)), sequencerInbox, prevNode, adminAssertion2, @@ -881,17 +1079,21 @@ describe('ArbRollup', () => { const postLatestCreated = await rollup.rollup.latestNodeCreated() - await rollupAdmin.forceConfirmNode( - adminNodeNum, - adminAssertion.afterState.globalState.bytes32Vals[0], - adminAssertion.afterState.globalState.bytes32Vals[1] - ) + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .forceConfirmNode( + adminNodeNum, + adminAssertion.afterState.globalState.bytes32Vals[0], + adminAssertion.afterState.globalState.bytes32Vals[1] + ) const postLatestConfirmed = await rollup.rollup.latestConfirmed() expect(postLatestCreated).to.equal(adminNodeNum.add(1)) expect(postLatestConfirmed).to.equal(adminNodeNum) - await rollupAdmin.resume() + await rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .resume() // should create node after resuming @@ -932,12 +1134,16 @@ describe('ArbRollup', () => { rollupUser: rollupUserContract, admin: adminI, validators: validatorsI, + batchPosterManager: batchPosterManagerI, + upgradeExecutorAddress, } = await setup() rollupAdmin = rollupAdminContract rollupUser = rollupUserContract admin = adminI validators = validatorsI + upgradeExecutor = upgradeExecutorAddress rollup = new RollupContract(rollupUser.connect(validators[0])) + batchPosterManager = batchPosterManagerI }) it('should stake on initial node again', async function () { @@ -998,10 +1204,11 @@ describe('ArbRollup', () => { await expect(rollupAdmin.connect(user).upgradeTo(newAdminLogicImpl.address)) .to.be.reverted // upgrade as admin - await expect(rollupAdmin.upgradeTo(newAdminLogicImpl.address)).to.emit( - rollupAdmin, - 'Upgraded' - ) + await expect( + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(newAdminLogicImpl.address) + ).to.emit(rollupAdmin, 'Upgraded') // check the new implementation address is set const proxyPrimaryTarget = await getDoubleLogicUUPSTarget( @@ -1046,7 +1253,9 @@ describe('ArbRollup', () => { ).to.be.reverted // upgrade as admin await expect( - rollupAdmin.upgradeSecondaryTo(newUserLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(newUserLogicImpl.address) ).to.emit(rollupAdmin, 'UpgradedSecondary') // check the new implementation address is set @@ -1073,10 +1282,12 @@ describe('ArbRollup', () => { )) as RollupAdminLogic__factory const newAdminLogicImpl = await rollupAdminLogicFac.deploy() // first pause the contract so we can unpause after upgrade - await rollupAdmin.pause() + await rollupAdmin.connect(await impersonateAccount(upgradeExecutor)).pause() // 0x046f7da2 - resume() await expect( - rollupAdmin.upgradeToAndCall(newAdminLogicImpl.address, '0x046f7da2') + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeToAndCall(newAdminLogicImpl.address, '0x046f7da2') ).to.emit(rollupAdmin, 'Unpaused') }) @@ -1087,14 +1298,15 @@ describe('ArbRollup', () => { const newUserLogicImpl = await rollupUserLogicFac.deploy() // this call should revert since the user logic don't have a fallback await expect( - rollupAdmin.upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x') + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x') ).to.revertedWith('Address: low-level delegate call failed') // 0x8da5cb5b - owner() (some random function that will not revert) await expect( - rollupAdmin.upgradeSecondaryToAndCall( - newUserLogicImpl.address, - '0x8da5cb5b' - ) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryToAndCall(newUserLogicImpl.address, '0x8da5cb5b') ).to.emit(rollupAdmin, 'UpgradedSecondary') }) @@ -1104,7 +1316,9 @@ describe('ArbRollup', () => { )) as RollupUserLogic__factory const newUserLogicImpl = await rollupUserLogicFac.deploy() await expect( - rollupAdmin.upgradeTo(newUserLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(newUserLogicImpl.address) ).to.revertedWith('ERC1967Upgrade: unsupported proxiableUUID') }) @@ -1114,19 +1328,25 @@ describe('ArbRollup', () => { )) as RollupAdminLogic__factory const newAdminLogicImpl = await rollupAdminLogicFac.deploy() await expect( - rollupAdmin.upgradeSecondaryTo(newAdminLogicImpl.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(newAdminLogicImpl.address) ).to.revertedWith('ERC1967Upgrade: unsupported secondary proxiableUUID') }) it('should fail upgrade to proxy primary logic', async function () { - await expect(rollupAdmin.upgradeTo(rollupAdmin.address)).to.revertedWith( - 'ERC1967Upgrade: new implementation is not UUPS' - ) + await expect( + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeTo(rollupAdmin.address) + ).to.revertedWith('ERC1967Upgrade: new implementation is not UUPS') }) it('should fail upgrade to proxy secondary logic', async function () { await expect( - rollupAdmin.upgradeSecondaryTo(rollupAdmin.address) + rollupAdmin + .connect(await impersonateAccount(upgradeExecutor)) + .upgradeSecondaryTo(rollupAdmin.address) ).to.revertedWith( 'ERC1967Upgrade: new secondary implementation is not UUPS' ) @@ -1174,9 +1394,82 @@ describe('ArbRollup', () => { ).to.eq('view') }) + it('can set is sequencer', async function () { + const testAddress = await accounts[9].getAddress() + expect(await sequencerInbox.isSequencer(testAddress)).to.be.false + await expect(sequencerInbox.setIsSequencer(testAddress, true)) + .to.revertedWith(`NotBatchPosterManager`) + .withArgs(await sequencerInbox.signer.getAddress()) + expect(await sequencerInbox.isSequencer(testAddress)).to.be.false + + await ( + await sequencerInbox + .connect(batchPosterManager) + .setIsSequencer(testAddress, true) + ).wait() + + expect(await sequencerInbox.isSequencer(testAddress)).to.be.true + + await ( + await sequencerInbox + .connect(batchPosterManager) + .setIsSequencer(testAddress, false) + ).wait() + + expect(await sequencerInbox.isSequencer(testAddress)).to.be.false + }) + + it('can set a batch poster', async function () { + const testAddress = await accounts[9].getAddress() + expect(await sequencerInbox.isBatchPoster(testAddress)).to.be.false + await expect(sequencerInbox.setIsBatchPoster(testAddress, true)) + .to.revertedWith(`NotBatchPosterManager`) + .withArgs(await sequencerInbox.signer.getAddress()) + expect(await sequencerInbox.isBatchPoster(testAddress)).to.be.false + + await ( + await sequencerInbox + .connect(batchPosterManager) + .setIsBatchPoster(testAddress, true) + ).wait() + + expect(await sequencerInbox.isBatchPoster(testAddress)).to.be.true + + await ( + await sequencerInbox + .connect(batchPosterManager) + .setIsBatchPoster(testAddress, false) + ).wait() + + expect(await sequencerInbox.isBatchPoster(testAddress)).to.be.false + }) + + it('can set batch poster manager', async function () { + const testManager = await accounts[8].getAddress() + expect(await sequencerInbox.batchPosterManager()).to.eq( + await batchPosterManager.getAddress() + ) + await expect( + sequencerInbox.connect(accounts[8]).setBatchPosterManager(testManager) + ) + .to.revertedWith('NotOwner') + .withArgs(testManager, upgradeExecutor) + expect(await sequencerInbox.batchPosterManager()).to.eq( + await batchPosterManager.getAddress() + ) + + await ( + await sequencerInbox + .connect(await impersonateAccount(upgradeExecutor)) + .setBatchPosterManager(testManager) + ).wait() + + expect(await sequencerInbox.batchPosterManager()).to.eq(testManager) + }) + it('should fail the chainid fork check', async function () { await expect(sequencerInbox.removeDelayAfterFork()).to.revertedWith( - 'NotForked()' + 'NotForked' ) }) @@ -1190,7 +1483,7 @@ describe('ArbRollup', () => { 0, 0 ) - ).to.revertedWith('NotBatchPoster()') + ).to.revertedWith('NotBatchPoster') }) it('should fail the onlyValidator check', async function () { diff --git a/test/contract/batchData.json b/test/contract/batchData.json new file mode 100644 index 00000000..5dd4870e --- /dev/null +++ b/test/contract/batchData.json @@ -0,0 +1,3 @@ +{ + "data": "0x005bbf6d343290db01f0e1f3dd39a2a8d7a49681ca5f1cd844a616ec81325a9e848861aad0504a3080ebbd71af203c4428c2a0588440c954a50850c4fdbedd22b074ddc12f4768ec93dc9fe7e7f6e7dc7b5f2d605488a3ac46f95823ca9c8889dfbf4918a495bc0dda02a3ffffc30ab001734635760f0b9036d6a677a2c14f41123440d7fc2c2d9a0bbca4252dad252e008b1ea075de87889cec99c81793315d93fdbceed9bcda444f8e9e8c8d891c86e9e989f9dce49df6bfd2f7b13ba41b9020c134d9f0608758a0c336f6eadfd4eab75f830d35e5869cd51aacb3639c763f7ef014283e72078fa0e61acb63dce3720de766196a4a6bc810fa75735a6c10900812b25843829ae0516be8c6126730d58504093e3c68c026260604c6505c9ea19613318070461c6b01489ed29c713ca07b0c080231c3bdf3d41adb83f7f0e47a308e41f4a330073c0ecf774437cef523f801701d78de9267a5b9fbbeafbbcfffb9fb9afb03b4e778e7ff567fa3bff3feeb0e24acad643a85225e163bb7cff7fca7f7fcce9db45d6896cce35652e22278d0f7fed2e79fdcaabff7d1ccf6e6da1f536d6666d4c691d61adbb6cb1615333a1254a25001a80454241bcedfbd07f990a864cf13f2512c0a49379754e30760a416b3cdabb73584e78a58ef071038edb040e5c54cd7940b8d5959d13aeec18ac4f86c251b6abeab80c5f695ea0e6472b46d7414e02c96032c0cc0c202b4929cef31a865abb7a1afd093f6653a4be96e515defcdb9c80481737f000c70a3383aa01224720d370014956dc68ac04f18f377bd2d8ce8c6585ca611e6dfafc27ba624564d939ce1a6b26727701f0d00560222e3d8ce2250904530a263e2a5d7ccd7b64150dabbfe8e107a4555197d64e73308826fa4e3a02fa3c36108e82364a212801c3505d18ca3eac076cf219c4b2cbcb6c81617740eb08fa5f8d18c4325840c21201901528e019a3ddf495ac27ab52fba5bc54ef5c6dd34b14ef15bd191932a22aae2fbb3d7b700aea45fcc968a74e5face61864a1110dbea4329743c8183ef033d0cd4fe8912fd207a1593a0e0b67161658de02894eb87a057bfe8e4409d4f339e2a2a34ef8553ddfc3040b97b9704f71f0414f3d1c8ef936cc70740725f08f0e56ebbdc67dad7ad7411a05fadd3cff6db28959b6b549c8fcaa2b693d4fa2f06c03ca789c0b597ff2f1b98788362af20ef0992d0e8e0c1e18051799d79b72aa7df851c9d1157825042c1b5042bb2ac3112b32e4a3c77029425373f76df7e86721dc871cfd21e45a1d6925fedd1ce8fbce0683da40b54368a5b960508f2d0f7c33652603787bd2f665ca56c0c5b76cf0d843800163290f81a4806c280d14500455311376b791290f087229d66f8b2a54c803a49872d9c8a4401cd2900fffb145584001f6c2c1d872a40bdd5def2c5964e4cc579048be642044f1b855506b0d987d58c67aca376d1f70f4fbafa8720b206421591e460a767583fb0d2ad8400b0d42c8c9fa3853b292a619d53f8b56e1de22360530b6773ebab916a04119a1ab41743f9010aae55664696352240a6c611ba362ca05c3bf55b007158a59dc1c56223df75e6674e562c78c36fca666f4354b410d285c594c5ef2c2fcdbe27cd58cdead8146866523677200a5352e84fb1f36821c4f7c72053904800c4934e0778827d62085b6c088042870243b14481a32051fa10b6d8500085ee7b71e0002d47489196721da54ae211a243ee4be97e45aa03878596b23d21603bf684f6b1db6f4b00d5d14b62b4a7eda75483b68040574fa9b18ed34f8b1763c2d847616afef7428a434e0930302e664d3f20665f3f76fb4dd72cf4f7278672a9b69b71bafa4fb4e1b2afbefa6ba700ba714bab312a384d2c52704ea61c155f07ee47e3a9180bd3c8447f033b25222bc7d634197941e5608157bc826213723ea4b16d75a79407b7b69f84af9bbe9d7ac1d51f2113e9f4400cc4435fccf991815974d71735af21fbc9e86631d5dc404bc45a18417c58a1fd33218027ec65270e095454c3f2a231fa17a0329681cb452fe2fbd3e42993f8e25e99bdac17be9f958626ea35fb1e5e44c7cff96695e818d67b8a851996b8dda2e2ead6f28a062e57e0d7043fd42ccce94424a4a1d1574a945c34769129d3a89ccfea42e71ccf90a7dbba1a8cb0dc0743d6222dd6bc4ffcb0ca2b782942e39643bb48dbc4368088ca503f16bd98caf373b1098bcda4550a4258cac09506eb80a7853558d853888cd0abf3eb33955d24f9eacabb044e912724942d9fab844fd102acfa77c36809b27fe00f3b70dc074f4a823db5d14f15fd71d0101826e991b1e4fdda76b32627b17f3bbc9d173aa04612626798fcb300b599c6b84d9f5ecdce85e069330651a7b9fad3040735c7331a261818084101279b92044b89533d4bac297fb7fb144b4664beb91af37b6b236345da3fe29d3364245cc8f21bcd9be5d7bf5d927313101978a694744bbb2c936ab4de755424f1b1dde81cf5aa77644f2f056e02e4b32576e73d8132892414f27a1bc283c55b05fdfca7a7376fa029c38566596fe52d056a0fa327ff8cc4d6963567db879602ee3bc2a0f49edffc7f343606856e76934e6b2d17af439b0cf39e077a9570466546a71414a4b759876b4ffc5a277899021e49bcd92a8e1cc1835d2095b880aee1b38209dd9073352e7470b0d9909064998d3593274b178cc41b1535fc35817b91306237e5f4cec4b088ead88d6a0e07ca77b51747d68a9faadb1fa754cdcb74cdcc3d89365f25ebc5a29873982ad2d6f09b8b448da5f86162f352c3dc84f42689b0a54624a98f04b92cac1de00236b585bcd9418c83c29db706275ed5068ceca21df5a49cdf52c7a5fe7feddbb9583b153d6cccee0b76c30517ee68891dc00742808f5dc85f1d1fb6f70bf2f617a64cdf4b081c8801cd66854903a38d8ef01b257a00275415b9b859322abf9c7e0632005411a425fc387435a2ee664a60fb23595f0d397743c1b6ed61658d684bca61642b11b7140b1590f1046b3f326d204b34951ff9f7d0a778a0bd68a22ba45dbe1aaab093247d98080fdf72e2dc8b24aa50e74ea35ed0f652cfb1afd1591445074280b6182a7e715ab3c8d42a13ead0e03ce8adbff7f3807b2df611c0e6881732030dd83eeff7271455a65df85ef31dd145b25b930c76dcc8740867119cfdd31407ed5643ff07e83dffa45903bff350978764d9a8953bd46c2a13534d3b7866a17c712c65fd61110bd1f98154e2b84e0ad4811a952683cf2e280a2da1f90c90944ae3c4b245b23021d96f2ab5dfa02ac12f210a7ac77351abcc5caf2c191807f3bbf76737cebb7f3a626a22dd4df19414cc3e4111c9878ca6a4aeaa393dfda07066c194873337dc615308d7a7e3c9eeb5c89dfe84311f8b0803c4a4e548b64423231201329f51e4c3289b3d406a0408341ddf60490976c491793dc8182441823092dc3320d5322efcec4f34a5efbd00d0a0d6e5f0cea753199615c5e891f307633e862b2bbd4608e47569bce6ac507220fa53e79120cc2e0f6e5c8157b5b93bf64ecb6474004572e1f8c8f23c1ab6f677de5f4f81d6718e83536800f2ab67e95823d4c6177c49cf0034791781ccf5ee281b15297a009c3702e335390c02aa060500d07b74c71808df53c357f893015f14a90655a9a9eda76e1787e8c01f5ee5b5f31095ecd99ebb79df05062de77bba02f10dec178699b79bea47cee6ad8f611c6d99acb5f988f11d1fcb9607fefff8dc808b64c190570bb51820135a530c0d241a20a3b3c31749ee6196c158133b5c7086fa8976db3ec0058b6e3a72cfafb39ceb09c00848dc4ad91560b9465fe1c7e5743c4412733b91b4fd8552ee8187ca9d3ee5d3e9093200dc2f1c422b422ca5f6c6921e9864dcb2cae716e0662729daff12c747377d02e21a9ea229a2ee9c07416812e5c764c7c9c8cf676940f963f297f20d5e34f4acd1ef3c4f8346089bf6b3025200c46f796b1435679ec4a3ec5a7feefa84115c53bfe61b07b35cded4bf912ec8811d502fe35c069ae88a282d13e6ce0a1a3d6c562fc3cd6dc4ef8973eac4fbe8b2a26b8ac40561d118c84c3bb2dcca1dcdce4334cc697a2f2d53917c33e6e5b9b8205e74dd771cd19b8c10c71e7473c7e5c6d2c5a3654baa00b14a4ab43ea35f422041ce716b1456043acf020ac00d79b8783e6895d49db6a73b593d0efdff611e235e46e32b8c39d7006196399fdd2bd9a8968c38408df0407061bf2a9e3a02c25261ddf374eda9381eec6cd11f90af742edc5dd73802861517c871d0b6c9c009e4ded8a7c157daa05f65550a334beaa25f4909e980d832b3f8770cb42a5908e20ef3ac39d8fd23aa5464f334bd1bd1d6f3757d74df0912109110f2a882e4df35c311ec243215b215891086a909748041b74154d0bed5114f10232122c52fcde70a056fb8a22bfb49fa812dfb4a95136f9e7dcba1abe2b648a4de80aaeaf5faf49dfe532ef7d75d4c1d9e3f855431a66703196987ec6c85a819336aebcc38eeba22ab1b9b7201459d0c0e313316bbd65c88b7dea55e0e7e08b57ffac1faf6858974fdab8968b251170a8dc2a61a43581040a180734597a9fe0327364ddaf5bc154745f631f6ce30a260efc1d5af6c3e1822d3056521ab83c7e1a5ce2f8acdcb48b44a6cbe6ec1062d43a4413c07d010cd2d50b2136355a8d8449d4a93cc026fd70cd32d1ff3a113a80f8280536d5ffcea07054dc26622a0e317d7518d21985bd34a74c6b05ef3fc6d589980c81a0673f33bac313ee0d7ed57e22bd0f33116a0eeafa8c38f093fca110156a7d0aa2db781eb0b21b4d005263b1498614c862dc3049b097dfb68db47246ccf1880924fe2e89fa1dd8e7b68d048904d359032c0088940527bff1e002b0ab3c0d73781841e5595286b365c23e1e95d987bf4e43e38b871a9644811670c78d9eb194150e3a908dc6450b7932b92fe5d49a763d27999961f602dec5adecc16161c80826d7ba25014b4a1877ee7442b38ca885eb1653573de1ddd881fd48cfe8f2c86c1b3b7192566d4b2b20daa92b7956aa25891c9197a34aca22b5cec452bf36f358321dc8baec0a06a360430c097f918fdf23542dc22e02c81df0522c4422a28f0c732c4742b4c2319272a861840b7473b07c5006fc0bace7c4bf23c6dfb9627d5411e1516b7fc0cb635e4f96737873283a99c266c5a3d8b0d1d721ef984d7d01099e061d829e96c967536a718fd9dfc3c5bb5cd356fe3f2e678f1d6ee687cd9c5b7d9d898604a2aa017a32ae2ca9f93f6b83c174583389afd373944d49320990d7bc2b11e0a6b71f46842c4d04d25baf81c2dc44d98082895f7e4e723620adc1e5f110f8f8b0758497f990c47785c113364527616d29b76a1985693d9f65ae6ebf82696ec7f071f8dbbfb0f9d399ed842adaece20baf60e67bd4406fa6ec783bcf187341a1b29ea673ff85ae602f6e72041a3adb2e83439f38f440a5131713374bde7bc2e3b239d690c08b7e4a092e8b013b3d228f2ab65f6ecbbf9f5a18f22876441b73c142ccd6f012296ea5de8abe84fe9d21374d15fbd278788f67227a3353db0053113d29b46f3b7de8dc01cb699f094cbd4f92d461f053e1f4f1d7db149d7f83fff832e3c8cb594e5f347f9314a681eae70925da03dcb2866b994cd5859ecb85258e059674f79160e74cf2df7adec95af7765f6f140fc77b15c49975093fe6e85bcc7cc008cce85bc7e2663b7fb24dcb17b544398ee9bbbecd68c5eeea07cfdf5a11a41c5743bbd75a7beb0f56e275cb0d577578480c4a5c252d2b44f81654dc8f74f1944853e7cb5d5503ab64bd75377700a8eeac9ed888a71ea6a351655eaaf0c817999f39c0143fbc4f5cee8e6f1f96aab50cb87ffa56caf4b7e68d70e92ed8166649e03ff1520c33ff7d8f7729c5cf3148a2cd83167919f0822b659a642e6d17b6323ae5d914f159bf152bdffe2d4030f7bf6a167614893aefb744b146c0d0a6931ded8feff6d5f12b618f7e24e3d62654482f0744af46465a749f2d6568a07085a6e3e9f998ce081852d78cd5595a11e25b629e93a067f9c7eaf1e19cb7868af21e98adeefd74dca54a4e8e32f20e816c0a018abe7bfbab57618f27abf45f295a143866648570fda32ac88baa991f6bf2d7bc04d94dbba5defca8fe00fdaed9c325fd2bca91392e68e5fea1b5ae13fc3d59795a1dbc4f79cc6f72eba25fa90e9a6edbd24c47b6745747d46f710a54dea8a1985f56104ce74a5aaab10a68d7c569a04cef67d0805df3b42f3312ab79a2cff72a53ed1e3009d31d9a709fc1bafd3999d53d4c940f5e7bf10ee6e6bd34fc1367de4f2ffa58b9fa4d7416a8c5aab97ceb76dc4efaa14576e2e4e2f0aac694d4e23b3fb5d4b2ecb14ec38a2d6e8659daa27c1b445d86f24007959efec1c62cb5c8da7234cd879c0fad04244a7bab4034baba964b990d7dcbee1b56660f9a652275eaf1a43cdf26e393698f4a68977f438d85c06c0006e65b6fca669f68116bbddf135f4008831f45672c3d18cdbe05db8e7492c5b7b003b12dcc85e9d44b1e39f34db56280fc0f6fb1571ac8c9135e107cb8f2f64b950176c872d41ce2bf64a6e72c0a47054edd5b6280ec9fae9f4a3966232f481cde6f54a0ded02dcbf60748ac9028e6a9483541053ab5646d1d23214594feffa0ecea12dee58abcbb99b66cc08b0e2807d4b9a7549a622284d85104bba54b91e12d847ba9e80f3cc632c38e3f1c3d65f1e32e84441a3be8dc4e632ab92b0a2b4ed4fdf09bf203ac474f6c76dfa2f41cd311aa149359bca8cc5a10ff91ddfd5993e25ecc3c9b9ba766fba1e3e0dd00ac6314883be898bfa3e386e15a1724f0c0fa7fc56a8c36c6c3bc675691fea72c33d24c8023f20ee60c51667f3636da940a2275fd5d64d34a6684327391ea47f6d83b75ada94efb39a6787251b735b569434c5d77f2e2b634a87b839e6874ffaa401ad4dad8af63e28ae7b7d1c83c1d0d407097cb3184ee57a7936edf7dc2068e257e523d6469f5580d44fdad5b4d6215f00b54d2aa0836cf53bc6c8d8d6453b0d85591c6bd3c25e10bb1c1931f49ea122c069642260cf2f85843368676580d6059fd0426c37304a969582f0e19ecfe9046d857441cac6423cf9648c2c88651a6d27f08e13b733dfba578f1f765b7d3a00c570edc08a0a005a284083a3207194f122415aa92554b1c10cf51a2920c61d6d631fa9e57b8034cb2f1e0d58fee3ce8dc57f36877047e763dbc79efadd40595c527785d00f136cd3c858bd8079dc4b6bb40111f0a2cd361d49b9da4c39e22be0f1f14cb896d8d4c24ab2ccf449e41ac6552cbbcec5e64eed108fc328e695325b993e061e297bea399959b36c707fd50ae0064844fc8060e56e5870a019d0999bd16f4209b902c52788f78f2b2a6dc8a1412ef7b3073bf1386adf4e0cf608d345b4f9cc589f61fb67aff2d67c0af5a4f37ebfbb0f9cfbf5cfabe9b22ca9bbd4c1f1328dde181cdf6d961b564fe2a67c778acff639c91959706ea2234577248653794c80fb4f00f8223db3e9dff94df7f0daa6ca16576b9ec1c8ecfdf9650b2694c61b8add7cf81fe371606c91845a7a1cae329e0d08574382b8e88da254824a296d56c222fe6c97004c7d84f7f5516da7e27685a53c05c7356bce08c2fb4b598d9715d7bc3de55bb77ab7a2e0913a7233f8417ec5f754ce7ed4628ca151331c2a65b63a5ce88a414cfdfd6afdbb30636e16a6136858d600e7d3810be8a9003b0a7fc76d3eaacb302870dcadc90816b7f2f51cb99315ac3653f42fb8230c0ba14affc3ffcc4210157b2969a4755eddb0e41455f81dcc3ddb7a76f4bddfe3bf5fbf6666dd10a0a6ef2328750702d4cc46fea3a6798c31c37eaab2f3189b6e46421f882dc9138b387fa954a1f60ebac0fb41d494a81f087c3e92f38b41e7ff1f222dc2e549065ccc17bb4ddd6d8d6a259c944e15d99f52eb22000e410f267ba77907a6c07e8fd117b31782013d7d3655584f654e06e3fa8269581928ba9184e25c2632ed4314d6df3fa0576dce9cbc1c789679687353d42dbbbe5d56c1bfe5784f9d6a7be8ef90ce41f9e9a073338660cb44edbec9e24e5f9f8d7ae6b0b75d7990ddc5ec4622dfc75d68b6e51af2094dbac2549f7372de4591723bdeaf398fb2652042c6293a690008f4ce1826a6f8909cff4215146d2fc4c42b8d081bfe19a1798ea23807b0cb27d2822a28d8b6331f2f86eaa60f2d15b532cb720a57112465dd2f51ed1776ca10331d7a8ef6dca9f65dc25c352c1bac8e885623833400daff5dd7127e66297d71b12ba7f846d922392f1d2513c762fd61b60c70049cf085694807d19b467eacaa641f3f26ddefd45d17e18307ab8bdb220e94ba6f71c310d72666d07330905b8a8c9d54bb09e59d052b3f26abfba9c5ca2030dc63d551835498edf1af43110e7a347870a9fc60d97c1798bc768a1637e4a17a839b6cc893bde080f9721a35b6378c1855fb09e0a2a42bb43671f1080564fc0108e20146441d1f64d8fc9625df9339345519626a2bfdc66b0c1e9ce895319e1a7e3b9b50f9affa7f0977e034201cf06197e65ec49264cab0d94101c86debbd653f3f59a2f206b5def04ff66d9b45e05c6128b8a6b2eb2db3de2b8634e88045dad49da5b71af52346b3b2dded902199b9068507b5db163fa40b3c788d7d2ae585cca55bce6a8fd0193f6261a6da27df43534f80d6e9f58c1e3a06e900774a1c8f26f9eb080ab250ea3de499248dce7d7f23025bf650a5ba91b5a4432519875ecaa23af9f32aee41561d6036e057348e94fda23114df0129002fe34719988310600bc70ccf20bd57cdf1964508031e87a64f56658981e2b204f04fafdd9746b49467a7cec377810db11a7659a46c63ac5133bdd956200bfa9405ed17dafc90215464f0848aafd10ed2900ea5e46a9bac25bf9c396fd2bd020e9e6e1379f42077289a53a13faf8cf759de8a327abcdda1a9cbc4499b5bc91c7148e32cb118000392536b2f8a02228ab58547d0a4cde4999f82892ba7f6b81cf45520ca6e4aa11c907eae85a705e9f55db7d462d865dbc20c075685a903c7218a45323ffe5bd5764677e9de97567d9feffbad2a8fbc0ba76da380193505794460a047092ef06a134b4521000770d8854897d5a90e2c4e74560997e24578d784175d893eebe06f43ec8bcaea000f33cb3aaf9625d73481aeb0cd8a63489e21328ecfffe9c267b0983922b3543155a0c0105c1fd201657a93aea538a722281d3663e67fb4524c5001ae122076e07865865fb61e8fd481c6f6996f7e803b4c8d43e4d7b167ef514175dc6dfa5c4b96d510c29637413995e48cd476e45f0d2e5499c904e4b2043088416b2971e21af2f0e1fe43280c898e8827a26f9fd47cf9c124cdd962778a42af2a30381b13e198d6c8d89ee7dd12a24f4457c7ac8c42634328a0229eff0a24cc93a719b7412d51815075b3e055ccb72c34d341022ab869dde915ca76a71c3174f174e643331a000392ec7a3d1750484aadd56ea6652688c366eb12f7e7fe4ffff7d554dfa270d8d406cc1f11ef63d8068c1729fe5f4d6dce9e7972a7012ae01ea0b7105f823db3e9df61505035c468ba66fc41cd9a5cda1cd825ba1970dd1c1c7fbda5bf213a5d667ec418428cca2725c03b40b62cd232f11bbe363db9bb33ae2812aa3eebce86cfc649fce734120fb957841ae61078673ba4ef9bf530588500db1fdd9b060ebb924b852c70e25a2ee8fb1be8d803835ed32d71877f875aa9f93aea019b52310696650582eacd3a835ebec1f1e66771de5f79a34e6937ae0e443ef0b1a77d9fdd56d0afc4929c5e7a84d1913077d604dd23b5de0bd4060f2b833e6958b146eb87b247a79f25c15298c969959425dc7a2a3fc20cd5336dbb320d5ec2cf0f3a9031636097bedc10f540f9d913b0a8dae3f583b4a1041540efbb1d37840055f24716a6f50f68c1dbec8bae2e0b7489db1b38d4703ffeaada91f23244b6f48101845214ef906390b873da4fc372de7609f9dbfe494fbfd33346c885adc48fb55a00aadf891f9399abdbbefe65f878241a4ef26b4359f4d2896657800d22eea2de9ac58bd90e05dbcac3ca1ac54316436b45fd8e94b1cdc6e63870465f5a247927bf51b4d0ef57e74fcce9a432699b8204ba7756415b461bbbdff5810171ef86e92c02ce426d1ef478b4fe9888b55a80070f2d03e2505cad497174b49e00964cdc014b1195de597df1d56ab78a736d895f0a23e26aca3bbc0107e5f2874f1758180059d2152559df125a635499830c4aafe6173253faf71ba20fd5c369257fef8b4954d717e412d74d5fd67458dffb80c70018e0b01c754b42eb89e7fff0bb1591b0ad0c62b281feaba32c0937a6faebef03f45200cb1aa6c66cde6d7b2574459996f5253f5259cfff9e36469af35dd7ca9fa7063b2fb3a160dbd674a45d55a51607d7429bf19d056f8554202c96e52c13313c5417eedd30182b08595da78c0cdbe8846f27c63e85fda23f3b9a207d257f397daf78b9fd51b1f5beabe66dc88851bd1487ee0e22f9981f69d95271e7fa36c4aed152808dc2a0b911076e23e3c23272453884fa0f8f1a4abfd379c84e180769db2a5149671b60815cff0f1526ad4fff7aaf16840565e40eb3bfbad7dae4c66d5d1d86424c6f468eb77b8177d58f81b79cc1ba7f10374805f799932c209651937e1ae30cd8cacf01baf65c0e58a9b9e76a73a566fe71108636e7cf50890caf6ee1e1c7fa7e6a9d71e228157276b6a073b7ed902e1053f8ca9c99168a26f825a6a4d0d76170208b37598045401b79c1455c40087e51a72b40df87c942be79f51c394c7162bbf3cf8cc02fd7ff156522d8c86548108a598bcf3f7a3d9c765b835fd4d70fd674ad3c45c026424e1cff20571b522448c32fcd6b8f3a760a4abf6c8f7b2462e72fef3c070981915fc20664e77954e960a0327d0bd2c7e270d9b68e26312d3fc65bc39561673a32b3349a77015a5f82f3e1d9652004a0d2ef747dfacdcda84a01ba73afee241be7ef8bc87082dedf1f9aa64a862255a60051b510fe43c6d1d1d87f57031b6b8e9b26f3c1a539039a9dc5e4407e88f650d32ec87c1363cf0f17d15e8ec0337d4718753f019ead39a1a48b90ebefb0d89332495fd4f5b63b513081f9b429b32c0471fe80d17f013a8ec3a324b0b14aa575ff8b34b880d45d000d8d68bcee2f5cf267b5bf7a834909843dff41556a4fda757b7b519163eebbccfdde3b42484eea9e274f8d5a922c9304ac76fe4529687f4d82e1c085329ec76afff13a91043b5c98e0fa969147a35031986643c1ef7cff7987bebc3ff908753ad53f11a93dc5ad3eb7c287fd6dccb0355416a2bee72877b2aac5b78379b27b79ad1fd1f652cdc679bd2aed9615762d77994180c90218dc145027a3fee7174770fa376f56460811e77a54824e9baf2dd932c300952d53acd3336759c9117dde9f59146379199f9d4e80c596c337d986509a1fb82c4e7b521fe8e554c0748b1a2ac2a60ea4cdd9dfe19e02b10f4e43fbf19b07843ec456f8e50c60fdfcb0f5fb7434f25b67e1cc4047edb460cbc111008091e421ea721e4e5b70df0aa95b26347e1fbd2d0302409e10011a22a150ba44a30750e4400e26a120048f1e75f0779b7cbffaaa97576859df9123481548be6c59972dc2ae23a7f9096140fb61c837d8f14e5bf8552625ff9d3e9bd8b5c879adaae5c99b814726edf9ec1cfd90fca777d90549ad5fad45eb3a398647f8fd16f882f6de2e037c928d134aa859786881c72fea2c60930886b02e78ed7328eac7a5197816eff080efed964084c501fa61f4d1f9de6a2b84b16e8cfb8298dded3114f36f5eb103c56fd1a1820eaa3a5d303cb3fab35e43733e0b02dc373b87c189d56edf1fef3242382ddbd6c0ace88f4d207ecd365961c1490bc487b40f0250b92d9c4374c5a2e02f8526378d76365cd983ce0ad8d9416181b8ac9c5b234062652aa5f6223873cd8d9f880e74aeac6e7f4bb532c1bce11f9962136acd1f7f9c989c2697f3c6477a60552a50a27a0fd2d3fcab4c580f9e00e07c0803cabb14844b7ea4b9c92b67cb2af3155a95eb0366e36a64fab7afb4ee3ba4c5a077a6b060d11abe052cc285c542321aa8df0dcd45bcb08beda64d9f288d467cd9533943b251a0844bd8ba7f815c2a74828080be800960047ad8d8e3a47eaee002c71b6bc9fdc74a001e6e5fea6600e3cd26230d25a59eea17d16fac8d2d40936798ecf8fa77e5e8438bf8401d820721e1e4fedbbfdb7fa6fc9aef23c21d1353f86744a0f2bfb517a93eda3a650663f18e36e20424d994f2a26f044e49cb7bf753a9107f389c704342b33acc4ca06647e80ee2b304f2b4f802359586e5ea7459bdef35209f3a890b19cc88b01b6689838ebe48b5fbe2264691105299fc5b31bb78142015607ed57e5ca19174c0bd3e9bcfa4fc11084e79972f09d98bce40a17510ed820cf2cd1ecad85654e55c9f516d5a7b978ca67ff265c7c5af243f11794b897c7c5a97c278f9ac9260f9287865532932adcf2f26d97fc7a2ad38080fa1eebec66847f2ef806a2b29b320851ab27d126b33f429181b5365a935a398be588097c1c7c525ab3d591262627a48829e46524fad8ba95f14db3d0c0312b05ec6f6e858140ee7095fa7135d90942c7c195de64fa7ca0786dd825af5be0080aba806556f7f97cc2e673cab6f2f60e8b8b48cf1cbf1968f6bddcca1c83e121b522b36403ca781280432f6360829ccc51302a367f246275f3cfc4c2e37aefcfe5e8411f50397ced95316dfc4908a7f8a6021f106f7d8a81ae565af2d3821f08875f020de47b959543955c72c9cbf38037f6d0a6b85348f6ba71743aed8350429c108f4e36dc696f604edda0a09f5598c16e8936f54d86f30197a373dec31388268da128420b2c9c908861df9439e35d0b0ae782eb48d864c21e45aa3119201945241cc9c33cb61817728e40475175a1a86dff0bf9db386e1a2689bf6bf85073125baacce49782ba6b4c817e733cf2b983a7ff30094bb1fa3a7089c1218fe8104ccbecbdf9a6a28e1cd446cd175c62c02b924c207ce6ed950b06d8e21e63f1e2689445cd9d382f2401c28978010c8fa9d75eb32228063513d76f396a62289150f176d1cdc10f29152c37c1c1296b8fff8048318e81f8c7e718e0d429a66909253827e742004e82f34a03a94a2fe7b10f73d9036bb99cffaaf0d2fa565408f0e0f7c804f66a10508efdd8694699ec02098a22a0e3954d3e3195debfabd984b2c79dee2d936afffbccabd18cdb4c6b27898b0d3a6cd71da88a00465a9a3fed07f9710efa3b94e85dc728e1afd8623c07a5a6cb35978b35cf70db3b5ae9eb05bb9040fdc87f56617a83051ff16b608e7ead8e37fbe04b4ea4a04a339db2b3fa0d33bf6c667e38df341fea197e7770fb8ebdc29ee3346ecc254bc7f96373473384722dde4222732ebab03d25e9ab81ffcff33a683cb2b12dc5dac00a828128b902e10f48e3059f65940009d7d46c12b5929a27c0513a6633e37baddfec1be0d269baa9d67d995affc005954d603bb2cb8330d2ccfbf9ab94cab5fd1d78ef1b52bb05f6f617ed77689087b28f1235970ceac9b1d7dddfa4c3c88ad03d242c32429c742ac2b74866c499e900037e1635839f095d1360bcdd37abed4cde9f76211999e875f7cf69c4583a14c9931f621591d6cf2ee99819f8fec41518625ba237c03f1bd73509d763f65fecc8484fd0b77e425bc9a94dfdce4865124d71e5f1d24f67cee9573692470488174956483a048305f105863bf7c7eb912b708c9f6a506c672c4b3ba8f587cdf4b56d31a5854a2039df134f2293cdd7e4f09c1dd5e3e91aafc5d5c7c7fd31f69ffc399bc84a55553df74ac92bd6c3e2cd9fecd78fdf036c0bcbf576fc69c445c111337bb2db9c329cf3fb348edd16a2d7051adc8faeee19bc90e1067bb3772915e9a3ee3071abff4584b7957ad7cdb605e96ecd5c9381c7a69985106e62b768c193f4bb04ec231d0e722d01edae6c2b159cf3338906effe241587545ebda48c28242996b574e36f4604265bdb0686c38d13b0c9fcba672a3ac72ab68d89e91808a87b05eb078bcea3e572f5e2d23f882f23e25f87d8203d45a0235cfdcb77c97e4c9c7f3aab3b72d9febf1179f0766403e01407eab864954f56b8a3bc777b1d5944538bb2ad474c722c4daa8b96895bea37a1f43c9ffa2e449625e3adaa481b976a1683772cd070cfb7b3538ca688be230c10816403493cd57407d8d23b7418d8ea26038cf93f10a37a2326b700f8404f83621510df1953182f579b4a6a41bdf3ecc7a645ac77e385cdbb404f5eb020e45ed59b95be5a2a828996cd5f8713797142ef69d64e5f70e34f5cf548123cd8423f251aa7fad7f60bc84fdce2afce7cf2e29a0b9692156f00464f97c0eeaee3dd4032a86ffd7d5ae7e859bb103a2f0e654b0f817b0b30af49a193a032fbc7dfb6c0df2ba162d5cb28f4827deeee6d0b1d9a93f824e14ee3ceddf0b341df69ffeae831eccb46acf74ffb9af5e9146d78e7fe640d9ad66d4189eb8f1de1c965b72f2c7567e50d95a915c968b067399143b03412ea1dc70bcf5cfc96b46fad05ddaf9025777862c8e951d7876b97e95a8db0d75bb86647b1aa847e2bd274536b627342f1ff8630a0efab1b80187705ff3cfacacef5f05fe2c71d3860b7f389fe50033f42e3bcc3f59916081f892c94bcc8442c806272b9bec7f7798be8f01d8b0dabd6ff9a9f193e6e0030a3572996433f0a2219c8caa83ce2c3137a12c67e782d0bd0eb0add2efab3ca17ee3dbff49114615cda060490356430f4d449aedc9544146ad86a5f182bde22598a4bada389dc82cdd48c68878bb3aefeee10eb578768decbdacfe5d260b284a3508ea5e3c9da7e466942daed76732e5dffa1951baf8cb8aac1753776e9ec5abeaaeb1b58becef3087db1ea5212737cf6506a89415a568a2a9d5bc61abdab0e58db214e80a7d0c2a8fbcb7ca7d572b61063aa012af18b6e640ad7338dd968af9248097d4368b8056d9adb91294ee0f03dccca9b395d7a0d6d8dfca43aa31b20444fc74d3a9b6001c35a1f05eab541c6d015fac67829830dabbb6ac41959234f9dc1f7d68eafa765d909feba3a162f666b80bc9950b65cf456396e4e5b6a4bc3e771a8dd38f0609ce9573f1c08cf711b21ba2ffd7565eef1f98e331ed3f144bbdc78d5c0ac04c9dd34cc2ae96fbc70ec41398134e1e89fe065e2f18ea232837637d383a4303dc6ccfcbd81597bf3d210d7e99b6d3cad6a29a21075c622fe7c3d86ef61bde52dcf3b7190f4db28e2b4a302e966aa5426c2b03359fd0badb219db6b6ec89ff495e6e6b402bbacd60b610ff8f989a7e64ae8c83d4c52f3c175da1330ed65c69530e0a3f23fe09f4540ccfc26c1d3c27d0f7ad3cedbe76a46bd240df4c0229b2a5cfdf92fd1e842febd9deae51463cd837c180751e4caabca2b1e0646accdf1f93eb21620979a79ba5d673bafd738109b54c97308ccc4e09433192e9a5b84d8f0c6408cc13efa1faff20b838b4c36391e118a741d0650e01a34676a0ff0dd313c9e9096fae42773a8318aacd9ca207f2b2d69869d2c2b7be514a9066f5dd19a7d9b30d9dff20ac505ce8fef061e8c5cdf4279aa9749607e1152c85b5cd772e42e83d229b295922a06736d3c277f706323cc110829d9c58a560982bfabef51c1c76967a38847496d5fedff786b238be8814f22aae2f0d6244913a6f6ccf9b04773007e25f662dda74666c110cb4a3900e0bda023cb9b2dfdce78bdb54f51209be26781133ebb2ef4e170bb9e0bc7b00f96c2cd2edeaeec7eb2dfe09d5a0e06105c020a7e516b5cf8669c69eed5f3705f5baaebe16f8f2ad1e996bbc622cdb25bfa1bcd79350b29e9aa79786b7adc8fac0aab7752030710cb0f9de4d9721f00bf2e33cfeca2d0acada4baf295c99481fef1cc0af495cfa25206808f805ce5ebb558c3067b8c49fda698dfd3bfeff05671daf597bf1b7eb2d3977f708d457eae3bc48ea9990f1b7cd050a0d10cdc83303969411fbaca7f3acf99f2a03ee44f87eff09e98ceaf581ed2eb10d410e286f6c896c2aa7b8f9c41152108058276145a0e244732d5cb83e5ace94338d095b2464495a5ab223ee4d110fec8c724e6d2204f9de16e3e7089dfb8ff3229555171aa9db3fc8e4563aabbbc41bef91079b8998601da8d7bc324cfcd93d2e1c3ac33002e66b4c2402a57d2bc35de5475d13706280a9b469e210f4b887c6243769489c0c24a8e5b0b9a203b9f503ef438a4eab4f16cd9aed07bb5d16144604e307e636212f9c566102916d6902d0a9480b6112b1b6f672a4a8d67a367c658d064ad668aa72198ce0d6e0bb3b4a68a92c5c783d2123a60bdf14ede1efd23d17c48236fe21462e6a7aa37a1b06058872ce4ac87df4072f3e461ee02751175c12457571b9abf32ba647f74110159e7cbf474077e3b66f56f1bb2831c17745356f414bf07028fba8c9ea598d7035430319c0536b2366da4a1ad7bf4e3c8186b8c618f9f338237bc537a19b9a6c6387b77a3d467c49196956240b984e641721baa1382817c4cf0d5a708a664adb5553db35f73c18053b84a6acabf8b818d205619248c043dd6d2e04191d1565a569f11402d86eedbc315f4fa7bf6cd586433e61577c1202ef1c6f3cdf48047847143dc12bbe783b34fada726dfbd1d3bd826f4d66a74ca32df7dd121382dfd3a948272cc114583f7b49c81a52347416db37c109edc82dd220fd4169fdc00ce42f0a9696ede246fded63bc1fe8fb5630e614d0fe77a0ad9f2000aeef05110026b67f7fc77e5f0583d0725fa6a2becf4abf0fe1bebf190000bb5e60750eb0711674900274792a288418f4f4c9f77113e89d0748df0e82bac74fdf199a206c4a406501a23501a9d783f40e20e767b0710c1fc319682abe13cbdb99e38731e2f2fca1ce6f19301ffd92a754f4398fb50b69e23bb95baaf7bfc3b008852fc315111ce9c3c35dd7df25114f791f92317a20696db92fc3b1ee01b426e4f8e7e1b8633f05eff0de778913bbb3c4c4afe83e69ce3313cc16f90dd3910346435f32c234e6666f9b8b19789a5195c190334cfd2e71c73857222752375745577411120918ae282bc751f5c35b55701667d0d5291de363a22df8437a60a3376a5ff349089dabcb7145f33b0969697364337ea4166bcc5d19c598a480140c6a514e825edc366b865821dfd6395dbc2e0757233ffcb7ae05844890b1373624a566b1aefad63b0c496fdfba3a5d3fa407f77c21757aba3b769bff106cf96902f7021ea027a59daba60527110267f47e6af255e685143cc083fbc0b9c716227eea7ad9d3054118215cc64311a5b92c02bcf91441747116f2ea884d386d444896638bb40ec7bb5b25f2d443e4eee1686f94ddc7db90ce5dc843bd067384249dfacc8286ec78fbdd9516a9bd58e1f2829607b406951269931a26ff104c59677b9b5c99dee045e9f834ed8b27dbe889e3d8b84eafdf02ffd54784b0a19d440ac3bc3dee22e701e09b8c5fea7407392ba6a3cf6008ac6cf5408f975828242ceb816a2e7215977258a39151639716242d0a235f5a220225954e229c11692f43dd5a7dc236738eadc6c2673d70af77fdfa49b524a47d97def3f50c3c7f7e160800021408980a18b4797793c72f229095f70708fcdd7beb517105959369b3e7cc10b5b4a15890da60970198985f8ef8688c56d9767df44d61720b3ea2ceff252993b09ab8d7d693191d9d8630e0ca48a52ba836d58f6ca78bfee98110a0f41d3c5e6d197f5007a0d6488f9c21e00ca5a11ff758a430ad8f511f6256d981c4cd48f35d5b590a90352d0a355d3de2e3fcd5494aeae2021be4e2c5ea4a4a9fa8406a08608015d53326a5af3b2f2d7c0f34e973909d244cdb89121e6f5762357d25d7b0f43e40c964ba3ebb18a62c11590f27acb52a83d1e50a1535ccd55283d2686e4c974355e09c03116f90c62097676d79bee0b908844f25c5510419e1c524c200eae9dd01827a29ebc37038c05089a030c1481bf9cb9248cb7a1a7755e6400ca016d926594232e681d452e9487d4735ee2f5e08cd357e27802d2062696d97adac19a9760d7239472aaf41338cef8dfd318696351002ec00f6817788ce1d30dd175e14b5c440bbffaf13363786e2219f48a69e6ab6968038f92bccfbfaabfc16c4a8b37e5ac3f1db298cc34a0f4f5e7efa6d09c794fdd90ea62c28ed6ff2ab1af32d82161426273048490daa504eaa8c0e30de9fe716f70af97b329b69c7d3f6ca849556f4b9074ddeb24dcc6c5d0636be5951aa663de3fb45cd0adc05b08512856fd5409fc00e73a3606a07b45a49eeebdd2159324f3977409e25e3a27344a5fe50263ddc439681ae78263bf11c7fd6eecbf1201cb9eb7e87668cbb7e403c6dbf100ce202b767793ac8937f204e2f7f540b4d9689a2938c06eedf3e9ff638e68fdcafcdc7465cab1619429532b5bf6c27a4f10c43388cde8600fa8a656dd57fad2bad8c71b7946acb3e43fe455422d98ac29c6c7f61a14ac0421d60c2978ebee825330cccb108ed370dbe11d9cb185f09d2a5a318a9b1daeb1eee600a6fb4a2a3e2de6777585ebdc0f7d235d82c1330381557cb0807a0571c62d79f1fbba47f9e6014a92ae47d58186600b327f24ef7bcb8ad1b908b9339765c74da5f53a92ef31c9a93dd34991df7e233b66007146cabd026a77fb176686989cf193daf8f083675135d511effdf51130ea90d89610cdfa9ced3b73bdcbd065d1c7942640f883516bb0701a4b9b0995cc8d1d27d000cb0234ec7ebb8fb3bdd6d0825d0faad7d4c6fc01f5f4ed07f1690d4a15383d4480fa0fbda27d04e54a8c4d2e4907411886caee64a5dae99a35c3fedac4acfe091497441cf81e8e374f754b4b468b38c77d8f501a4f25d50a9f19d13a5811b0d2e1d1b1ab02e28eed08911edd3912b04ebea5fed1fdce68c2e8009677b875c6b5485cc8e92259008378295070b38930e89551191033ff632dcd34d776010567a76ec0d44e6fc38ad12e88c5b5e087480d546c3bb249436463718b21d5dc59f2a8efa7e60f61ac40f0fe05b5717426ac7d080efd1f4f909b11f3bd7e47c968e58a48b045cd44b544edccc8c63f3adbb4e2a68a64e6f57ff73e449ac6619f6fab011d8f79d6d7cb6e3febaf27ccb642142d8809e44f214fcdf7a9d5bf4e0bd532a365bc0ffe8d943f03ba6cf4837dbc9dc73f6cd162e6dce00f0a1c2192bb7a834a5fc605cab8813514cd590fb97d6ce21b221c3bda3686d1397fa190372886f50823c7df127befdaa893ed9bbe26293fb7141846302fa05028857d8e597917278d2279ee4f79cf8a6ef303e3c8c36048c048822f62d42b1c194e8f06a408c3b31c7988ae502b62efd37e89014964746c22c4f1f0db13cdf062853315c1f85bc24de5429e1bafcd8c6d8319b79ff11faf1b33e5379d9691c3621e83f0ae7a09490803c6ea1329160fdcf39ef283fc23350c17dcaebf6351df4cd5b7e950138292deeaa8dc242920e889d45d4f1be551d42cf371c8372488d62085a85874799b5f0233281222ac896d31012ada9dba3afa8f4a1e1fd95ceab8d548b1b6efb0753627ca3079745ca81f5e5adaed7ce9239f23fc8dcbd31472ebf88cebfca1ffd0794f11f929a3a7622a7edb7b73dc664c0cfdfa6d9db5e9083f5bec3c3897dc479c8b3eaa43cc80882966f27c4f896a828d52312dbdefafdce8d48f4957c7d17ccc71fb7e78a4a4e11655692524c06453011ee6fc2e57de3cc7af7272d6890c636d5d8c17f64f4791aade7aec7c74327faea132827f574b75c5bf8d090b056134bf577afcd9d0240c1c770b2a7e0a841c766250b35ea0d9b3340985bf57bab083880d3b393c52706358eca4ac3f7f0e3f2f50a19f660b774d4c554bc7e353b7d7b49b3ccf97d17cd7ca4110c47c17b13fff6a715055978cf592db3955360ae22d8fd5cd4b2011054f21ce5c936871086ab1d02da256fe976964cc427a5b31947fb5fa2e8ffaf53b8fa366c5aa8bb0feb79e89b9caff4033124d73d77ea7acb7fdf48d33f0d5a23da46f13e96cf5fd7902a18f7c6dfdae0423e8de002ae0cc6ea6850dbca01fa01f431a446d6b7d256d416055b8777779adaffb4e250c80cbe76b8f6f4fcf010ed95083c2904d4c75b9d25cef27fb1f19af8f9b26e11bb98582b32fe6b3e3c54641a7717eb4090b33f60f45f801a41cf7a9d2cbbd6bdcff73e22b0af9b2c49caeb7173bc12fe1a2f1bd3dfa72a3341719d72f3f9702d92195cea97d95e3ed58a7cc22747bef3fde9561d8a1cde24686caa1c6409d049636b20e946b6ba9f99af2598fb39d2dd7212892ee472f726d0b31adb890c8d452b119fd78ee81db6723eaa7a451aedfdb781e4488dae2d191a219ac529d3249df695349ba08575ffc0a2d95952b508354cd549a27a7cdfed11b9e031606d669852fcd88ad6e9c4ff7e6450a1efce55f58ff52478464c3bd078bb2b3ca40bbc6d3e4a4da6c6bf18042362282812b4b6acd28c372ba9e236ee49eaac43ec4add32073ea8f53cadd93d06bc1a6c228506dc0184fa86d2459bdb2bfdf61824eb9fedeaff9f190a9b79ddb2aa366364bc720af7fe0201e848c9f586fd99d4b2f10cc1802d07b789c42cb36f834899e5b1adde946ec0dfeaf438fc9272811e18b6fbb5b36fcf7e3fdc21501c5cb7cf9e5af947e34b895758da54bf2cc3981762617745dad181af68da114cdd118ec88cf2496a5b5b931ab1d3452ce04760a8c59ed06fa685eb5ab6361ffa4e9cc8662d27d5afc0de93d3f8bf93f99a93f9a3b08bd5ced8ce03498b9f4f599403db16ddff137c5813554e8303e41c1eb78a4527d3649385b0f595f7cfa7c22d4bbca18804216c80a9939546a6cf32aca25c981d511f72dc90d68185c20d7746473da5cd3a02c111f8d21f93828a0f6fed8b6392fc75d489abe1079840f955955fc0cc04428217512f9ad3c4e37fdd0360c0981d8da79d5cd1d8a2092546fa8874e3079adf6c473f03e460859de07befa739c0be405cc3e35d98d96fe403f18324d33b8dc37c582352f9bb0958244d531ef1ed024bacc2d47eaa5a04f7edc440570fe2c9fb2f01ffb56d2ef470ac6fb0a85fd8a36c513b4c0b501dd67a12a7b131e543fe6a01ce32c72d855e103fefd955c7e36297eab18943ce8288cf0e6393fc900e42504e61867d336d558ac6790524596d8d1a15f3a397b97b158527b4a9d61c6ef63864131a39571663040d3df4b4d3bbcce363eaa894c47a61e8a779518b05eac8661e599621a0f7e20bb47a2a150536621aa589c96810197753a39c99da8c70f9701b85c76a75813d00a445389628a5a3d52e4f05704c92279efcb233e6a086f2428d19f9ac94b1f03a7d11a1b81831ed34f5f392c0de4857a7b36339699c618f17a6339611f5fc4fea91e8aa001def0ce41e02908cef4c0cbb3c895a4fd42209d3a6e394fc2d221cfdebf7597a729b83eb609a68395049ac16216fab06595dd5ac932afb894a9b971067e3d738715312e8195b08eaf345d294050b2b3d1cffd0df9f8cfb7293116259188ead3f358f8e822067a2b816e9bfdc3130316228cbcc11b56ca31487210a383782fdb8081b164d448e2b8ac1df09c7f7e3b4b086df9ef6e62c4a621965d546caf609a6f03f265964201aede980dc8d1324f781017b67a401b8f260465353fe7b6c274e897848f401271aa44d562430ea67811a1d00ed6b67b04c1c233a7abd5707783ae78f544e8a8b196ef2ac8c890a3c45c5ca34ba0fa87723ec82826ddbacf081a683be2f5a99196ed65133f845712af76dc711c782178658a8d000a72330440febd1210920525d1cdd7b1eaa37906f8e5ec90a3b41ec9b02e6491fb88f251e04b30a23f8ec0c5b64d8be7896c6628d82b8d7d518b6da6a6fac77336e91ac74b69398f01d7e92943b0aa2e5b4a6ba8185b447512e4c09985cd61731d525b4a69c4bc3089687058df8473b4fe0d9e9247b2542afd563c62a892728d99e41f2321453361f2f4f647c04502ec47ba94e66c20cb2af4fdb7c80718673318c5d4cf46e2895b67d53899f2aeb0205011017c4c7a51a138af0e6cab878c56ae9fb5d98925c4b5394e85179cd77316656b53f6235d35578ea848f42b775cd4e10e08858996db19ef61a393ee7ad918576ac23e4ba994344eee7804e9b780a11b908e07743f9fdb0988dba76cd8262557c79345ccebf2183d42affdad7fa8e6ed0b39350453729b291f7b38944b5493ce5e1f0628a2bb3e40d1005868a19246605fb7f336680ef9816819113721a93038c0f144530533a326a9cd47f511f5e543598b52982f5f052ea6e5d6583bda7debbc00d713e2e409e976776a94d2f546b7a0fb08cd7bcec967490f42390238d45aa7721471e9be2108fe31a3c3cb14938790d231793d6c1a65dcf687b58032329d746cd6dc27bd4b8073f40ec920721fdabe8e99931487f494001c174fcd66bb81b44fade6124695c9f90a56147b8e3279d478268535ae9f119d57ffbd6bae6cf5623069100e5737ff4f25f2924d21d5d5bd2beeb119cffcf18eacb87628003ee3fac1b5d755063a9cc5fcc22d302422250e39f30c351503f2d68fc53afa22ea6bc0d17cad04ef24f29d479794d2424e2a90d901a00031250cdcf8f2fb87ea6f95179fe3adfa62c2189320bfcc37dc1c7dc2be7b699f613f9fabd8113f9fbbe26c6dc52b8f2e47177c93031ab222ccca2ec095341830c78ee0ed81ab638270405d7726c11311b3bf0db69ec37461dc18022e3d9907c260bf7a5e9878a0965804850d527930ee9820eda7ac98da7da8eda4508ed0c7ec450b62e27513a309441b6be3846d44cd0f17a740f677e611abe78958f2c28f2628c8eb2b0e35a45247de93aa2d129bd38d7a480accb2c968534c0d6b711a028e7d1c49c492bc0ca804910a65acdb82ebf24c936820dd5cd24745044d5db3553478451a6f95196fa8ecb8179b1db6863ea1fe01701bd4e371a67041f04a8cd58954d2d57ace1032902503a0db1927d5229100b1d00fa344a14920a2178f1ab418612844d1a75d6ec0584f3952c885756bc49e1c8ad49dd8e22dac6f9bf180cae76e93b4aa9fef10c75bdc214e97b18fe93f1a34be038cff595642490bdfa299d738a301b1d1e06e4929ef5b5d94c7c80ee53355ff2a6f0805ef49406bb2915d823ba699707a542caa8aad91adbfa86f490374bbdebd249d15634a1c37c6faaa1e72a9ea98f07fc3552fb97c5ee2a2419ff1ac887a9ee9a290d29a6b6a3e7bab5d42ba902dbd150f4239022357787a163fb6464202cde5a4dd90d45c4063f7bf67d407676d9802a630c37b52f2f6e424822a051fc61e1d07d8d90e4df4f6e0223623b1780c41263fe5c019f2dfa53043e0656efaf06bf301ab5ca0d83e6cff38cbdf1671510dd29c069c0e86b9dd0e19b46f36ea8eb01c086921fb132d1b905d394fcc45e28921e96c468302826ba446238f37b659492ebaacd3ff4a21d1010ba575df5a5eafd8356417c18042eccf7b9cfe61398df3f124623ce95dce8bbafecda46ed082005d245e429d8b9236f31aaf6ac68ef42811523a8a6f2e5b2327d8ec83d2699ba50168de8fde9acd67888c8ac4f6ecfb77aab893f361473a8c615bcf2f591cc22381e3c4a7dc9a368d425f9c7efc2812cd609144c167a7347a6004d3e2e1e35ac936ad9067b2d90ad7c3bbea1bd600ebf72e472f57ab3eb8f07d146a178602f8c1615a323764887796059a42a4a4887a00f34e2ce20ba31454a88ccca67695a7afa5f3c915309fae92ff0420fc612eabe998e8638d4ff880cc5951d643a01b9dff50da52b336fb55b09aa83e13640702065380dd0e8b0245dab5c05f8f885ac7b7058c124958096ea612c182f979df6b1bbbf6351e0b99a54c78a1df0d62931283472c6999e45fef58d6565f758b518091756d5c203f73784ffc4d4efa6b81e36e58981b0c25bc8e3e0381ecc67b59f1b689ac8b444f2362b04714c0d7810c1e4837954265e6bbc09f87b6053640b7ae1dba26a3c50ac8453ebb6100d756d74df89846559b789da04365c59f2232f69f1a680bc6f5c77fed4a59672ed6a31a9a01648676361cc8af9fe4ffd5c38d223c2781fd6041974cf3b11dc8b17907cb21820a131e0b553f98dd144e4d863963bdc106047e88d0c24d9cf29d4b323d1ab7aab8d3c4f92311254f8d959e1ac90daf4cf9dd0f31120827897b197a0cc44c957c8b868ca83dc29978ad424ce05b67d0ffa9fff9d488d62b50169e4afb07852be7ee6c9b6fb1a03f327cdab830edecd883e81dfa87cf8658cff907f527f1b89a91882a4c47a031327d2947e813414269ce75a0a0e8400cbde0ad6810b22da3fca4d5495bf6470bcf99bc63a24cc8b6ba40e2c1a0d31d901acd7870bc6feee94f7857e608e8d91c18ad18c161d83dc752b42c2f8898d3cea25b1cc05c86a9cf3c0fc7a533acadc5d6040ef84e49e49003d05d4d7be5f0555f621ee0704cc189d32c8fe263c4d8bbbdc610e531a392d9a229fc00f240b0a857e493dc13dbfe22cd4620f510a8607e113cf2df1f8b1dda10dd58fa550a77522e721e656b157f8c47b929be70621ac646f993354f0c9ffc73aaec94c990ca48d95bccfb204f0a8a6f09b65523fba4fe79e447cff5ad29cab77b593176414406430263d8cee3bc04d7a9ea734d338f7d16b8bfa672823ea8d3138da878d3f49cb654bbb13ec0195ee28df5138735f0b45147ebeddad623bd456d9c2a0b8e7d81f5e7b8e4d01f4a99c9965fb082e6947684993e312f0c296783e4815c2086465c10d61782865b05e48167b4fac7c5bd50a51e6c9518d1baa2280970072191e4d5384f81d4bcb8631c80bfd1ea16b5fb5b04ffddc02819900c30219e2046d4c6eaaaf73b1f78ea268d3db0522271223b121d3da8953e8c90797c7b47bef70df7f6a04b7c50d75a1e5f715f662c766175848e5204db8a585d0647ce8e13b357a958cd6439f908f2305792273d5c243926c8409091289f9d7f0b1ba8fdbb4f882f311f0c738d1c622e6dfb50c8d20dff3629bdf67edd55057cedd10b388bc84e72f29a9b52cda9f1d75d044aad37ebe023c87099ebd3f6b471d9c51ab34779643cfe2ca66d42e4343d02f7dd114ee136f60d836af3c0ccdb3902a174cd6068db6585d876e333bf67880ad28dffe103e8a1613c4b3fdcd6f90aa01df06097f3b495961b2cd6e6301f8ea669c454dc090229558f77c5115fa3a9b2a6da722713a60843bb76247504b6d3d5b73ba6fe4d722806b26647589494607b5fb0d361503f5f1fb2684a0f0dcfd12eaff89410ee765e12519bbf8e03399bfb5af0f4e05434e8a723f7b80543321ed1f3260fc090b60324c843797d92a387027d73f39e95631796b34ac44412627e5b9e0f3600c02200dc587ff2bc0aa7ea8b31d0a8bb2df989cc7a742ffecc2ec3ca1384cc157d99830dbad34439d94f6009cabfcfacfbb6e0a898c19ef342d96e9e8078e44d9943fddde59eab2f06648ec1f6c9df9aeae69b115594f1ee328290e0468e81a57cd1adeedc9ede66b74cffc99509138b1630b245a753e822bbd69c07ce670d983ee0448a4ec0b92ba8662fe4fcc357ce5635386266ed0d2e8bf6a005ec5f2eba71df370bffc76be2899496f0137efd2d8965352a7a5e6a3e505eabd2e3053c09b9758a244b08e4e75588c204c8609bc4e5a952219eabf450653ab8df636ae5be64ec4ea7f9cba9d0feb89e81b83f37d45279ff06cbcd7625825c91acf2e91c8584b8952b921cf2ecd2c86566f48677a5d85ca58b958413a0fdf9fa908650fb02bf94eff3b9fc0968803bbef954ce4723d95d62b05dd7726996c64ad5d20d3db0536ea70ff683de52dad34312b8711fab57f3d018d8662a6c1b4bbf8f35150cc28e405520a146f8855da7fc4d1939e357d74109b5e437c4bf64b5bdf7fc4c69cde2cf335e0a2fb6fd49e30854b9e3253b8d9bef487530607742c2f3133607b9b28cf90faf42d66ea58b3a5965bef6e9a26840089c7c1d3bff6bce63d8a86318f4acf1f7e8c793ae174dafe747d329ae5260b672ed3837974b358d077eba776188feb4a7187e6c0233b9db580b2e365721613ccda692d86b990d83c25ba6062ca26cd288669606ed4f08b2c23ab5e4109b501a560493956b77c254e1cca395df7c18aef9dd6e2b5dc38c043ab9a4a83100d0481b9eaa311eaffaf6f73a2e79ca922d723cf1a8749b5aa02df3234729c04e94187003497e653e9c91fd23aec7a3d64bcc74b965fde585efea9bf39d388c5102fe962ba2021efc11f4ccb6ab8a80b142103c60037fa49e1fdd25ca8bc4e5ff095b5f74de909edc397b1506d7fe09c6c2152252297665f572e850c70ce558e614605070084fc847e09d42d9280cca25247c840af377e0aa5d7a6cd84705722de8e0ebe33324873f1946a4893c8276ba5eac1ca30cecf6b01e55cd04e62cfc9ffbb34e8b98ccd48620de251907f4964658a10b5819bc7ccba5566adba003f64cc261ca2d44f0b4aae20c32f80ae6ce1cb9405d9a7c2594e10ed0647f45092a87b9456e80b01a4fe5e4b48549197d4e29055a371519e1efd4a5e0d361b6dc4f782e15b606ce006843e28cd8bcca52e5d94d6e85f9898d9de40972142475562c14d31b9f538cc156110504f0211f264db96c7c739dfb0d472ee11e13558bad9ff2667488770be0ec53ade0f33df7b86331507a8defdace556ee701e8f71bc1580dea09cdb08f76b5c6f27e134f25fec535dbb2d3668da93413fc74e4e23a053fc43c2519176191a0a8d9e88a6ecbf7cb54dffc48629a067b0fcbb89f6a29be4e21fe482fa2932b62e1df21afe893d48c5cf1d77f7ca5cbfe5bf0c051bd739e5a95badfcc10f502e2862ca6a7c5a99193d95fd33e4a38ef416de805b3fff8eda097a8a3e31723493dff3c347d4d7b4a80d58dbea8cf977b0b496e2023260fad1e743a7cc85f440f0517298c6202d7747842f88320163e8bbe18c85b2eabbe27fbbfce4cae0ba3e0456c6795f124d2edd2e8eac761cfe7c9edd4139d4497b9675032792d8793b1967572e18a346ca43480141d8a62cee5b10e1ff413a2517358f5694c857d39a1184d54ec307ddade8283789eb98e2ff36e433406fa4b5e2c2ad298cef092f62177dc70a5ddd52a37ec2642f94c2656210541ea3494816307cf3a0eae5f95025481bee753686ec9d243d8537ad0dccad70551a66ee01b2d622d0cc820db7ecd4767b992b968b2fbbecde7c7c71197dec3c3acafcc6d25d1047c88902d07b648ebcaf38ffddc2748f2119c303771f748b01b91a3cad7f9916debbc7d0a559423a0749a5e77630f62a12a29672ca737fe197738ba72d80cf3147cd902b54fca3940cc501a65056b7ac309f93b37929fbd97402513fdaf1ae6cc7a094d6f60d17cf4826cab1e91fac39bda0a4554532a87716afe66980b9215e9c81abe364de5fb655c4fb373e31213a5d85c12229e7ba6f1642193a8a15d5baef42c2caaceb61e0bdd431f6f79107202b40f0d9694066b732aa79bb7fa2318e8c72ebf98915121e737d34ef10bdf8a15660130198ea48b81626f7236db4001d663b8c328631783e65ace0feb8a6d61fa69d1da292e358a8ba19cb332fae166569a4475499df04306f8726ae5a6a626f7989d602063bd5ef59db96d3b5cba970cc1a9b5158ea37a83c86e971a6cce874db6ac77283122b0c10eca3945f94fe5d45179eaf97f665025f1236ec1f56bafc488ad69434a929dc74976d522a1d2e39f84948dc1957922efc6419beb636809f48e5bc486cbd20e897b111c78904e3737ef24710d024c2bd4650c6d6fe447a15bffba7ef90a7700c8f8eb5d4171ba6c6ec2915891904003e497c9994438fcab8443c6e8d463ccc6695eccba60f4a7123445ced51d8ba9f3a3b80dad5a27a9366fafd864ec190f1ba9c713e6f0723e3777e3a602a3211fe7092170a9c94a2d9b29dcd27324ab1eeeb0f37527ef9a43576719b2ea5f13c7db9c8ad4ce9c738b84540ee561f9265b90352266fa966a8eb88aa2a8ee9c86e7e3fb3cee794bb1d7af1ab303469cc9335b92b688e070f64e0c3dd20f5984efff8aef8c379038a0b47d539bac7b9b04f571865a95756ee3fbfe7ba8ba04d03b592e2071421e2b431e32d81b485e0cc595219bbd98017446b862ce5b59ca784dbcb335417a9ab64ff8fdf77460fa705c4251ab7a2a0c406cbbdada0ea9394f8a6ed94078044c040a06877acd2501b3c710257ff9e50e3a951c92265ce7ddc954ca09ec6bcdff1c829a56b1a9558d958557b7e5db89e3090ae3609afba609274507c9d11427548193920bccb0066ded2ee7fffbfe8ff20d6f0617bbcf2adcf1d0994e33a686e88a69e621feaddbbc00a8147cfb1b207bc932f0c0ad9e65e3531293a0ff2a2961041b6e4482e0d99af826043f614ac0850ffc447babf506608f1785bdb7268d7404aa7e72045dc64dabc3eac39edc22e121076ef96507c24427623f1f1e5fffcda0e1b08dd203e5b0f885155c915c633d8e9828d1e0c6fc9cab908e88f1d7dff60d757e017fa6b823fb76cb8a07fefac78a06edb3f07bd3d191498c3308cd0ac6033ff27773f3bf1001474349bd5b2712dd446b2032140b2086859b5e7ad136603951f683d5f51e492e12266e3af9cf88e7575790fbe1dc08f4132e024e452dc67a64b511985e5801b96528d1ca433d04e6ae9880feefa5dcbc91cb9acfe453dcd57092969fea244fb4890f8065d3f5c8608efe7149ebe3da9a0c1f3168e8bf58cebb1324ba57e16f1a847eb8d259db132922b035ab22f5172d3ed535e6c0334b219312702da0c639972ef6e11c6f5c9d5ba047e705163f531d4e3b4c2c1f90f8e2e7059fa684b9dcfcdc607cbb06c0a0b44e3aa2e2e71f2abbe10ef9bd6df85ca77c85a2c1577023dea72f74aa54189b6d479d4154c15f985249a6ae251973dc39c2d6a310d4188665a49d65119080134014ebb5c63f6df5371923a2785af41430bceec6e3f052491bff67ad7fbe24802eeb164e9844252fdeddc21f4a6a231e7e307aeb3bbc63ad26a7f060c6f8000c03d47e64d18cd24728b85480e5490578edc7d31509c1994e981ffd3c50f3ca52631edab6761d25e332a372c82e4a9cb6fb4ccb4463daa6c8821ad19233598c886a87a08e5053d97863c613525950f45bbe8213b460bcd9d3e0a8a6e01f4a3b9b7c2b4563c63665d4f15576f5c6004174d0246b26c57e165d092df82c835e8b83e54a32c565b542614962829be81ccb4c200e04942eaadbea06e36db1660623af4888c33d17b926d018a1ea35767d111479d9d2d40f7e2e3c0e53586a5d6cac88c771cb1de8a26930795d5026940e5d8ec1d1165418eddabe3e129cbed43a4fe4739b94fe99d0c9adffa8e0a8dbbf85d1aa9fe6b4da48ee69b6f85cc92621bff00d0f3f800f46158b034a5a70d497ed8ff6e6841cee8a35d5f3165c004c7f3d69bdbb5158bb4af4ca3fd458d6158eb33028ac653d21b0a66093937dd54e7c6f24f248ecadc29d5f2c18899fa69c4c615740d674e486626d3722b3cc65525133dc911d47790a8f773806baa29c00b804985867f714c55e706f30ef9e59b8b349ad6df06f1aecc5df520afdbcda851c079ad3780dce594fc28d504560d84a3222caef6dcc7115009ddca7b86b955af6fa8718404628d4991f29ebf2cd4771c6b89561467a77655b99e0842446627bf9af2f44a38fc530379e692d291afb5de7bffc1380b9f106b3153ec3acd962efb15abe9af25a339811badc2b4eddd216d23343b982ebf6b81a5f2459897c03ec4b6ce3f39442a0627dbb7c297efb59a65614011abd5b6615664570ae640abdd2dc22e58a5a0b4e0cbca8d4ca4e74196cc215517741140cf6e547ed6cf88dd5db0ab9075112b6328e6ed681c19a5dab4f8c4caa354a2a031c8d2371a6dc897673704540d616280e273bd4d16e4ed18eacaab5a289625b3a4311b09472663838d7a4912bae11090d536d7fd8798a57614ab5631e3a190abbd6023eb2d845c4c33b2853b711c962b16da866d5a297f93835a6616468ef21f2759b6f85b9c34233527c73c52c37ad81beba3d20400929683db27fc4a19f41ab3c8f73ee2cd54ad789656dd523675d5d4683cbedd06c0da8ddb98f74776fed6b6a406b45f23ecb2a2ed50cbcee717c02f9be6ed256eea151c9722370355ad218d9b8485a85c95b05b4c51cd22e6187a948f4cb3d7fd54504c5dc3916a5674deeb78eecdb7fef50c3a5866bad6329ff67394fa4d2d1e2dc3482a238df19262cb07abae33c5f732ec7aa9da249c27ce4d0b54dfb05d405e7b1085187cd48ca58bb67a47af8476365ed6aec5f0274f1aa1aec17e8344eda159cf8f00d1fe0b812b736006054a95851967da7657362125d8ca1ddab7f45f84ed5fd23ffdbb49ef472c106502c6d0f77f970035110bb0ff539395fee00da753dab05b4eae1b7d72c54aeeed5fc9bb42ba2a276f8d03510714683a9401ac4635697450565e73d5c19ba8248d4bc3e45a046db66ace6378ed3f059fc9595a994b6a2dd326251d73d96b2af634d7a06e43d385a4d3b65f4d4f2ce126cba76a8a96b4d3104b6ff36f18ec17dd58d8d57fce8ca3599c1098e4f0a1ebf0dac96fb5991aacdc59490a2d91937a2a2715484dd6818e36040851e135b16aded8357ce6ce6adfb26d0beeb76ec8ddef45463c6a2b6323af5f74f603c6f8e8870847d0970a3ceb7f75e5bfa7fc77da35172102f774b391eb0b63fed4a7491a534c17bc17ab25670b90782583bdefb6ec6270fa471d35eb6b7ebad4d30d3bab6c91e568b903aa6be4bea163ec7f67ed95eebb9190ffa634e73262c4648e0ac2f1ed34f10cba37c468c03a8795d1d501b1a1907fce99a1cde73aa171504f632b0f2afcb04efa90efa40d800d38b09a29d17fa88a338023ab708d2f8fc0bcdb1eeeeb690bfac5b498353eeb896e45cbbf54f48500ed4c199e9ac8115d54d01e2338b85ba74df85f777e23e0b4490818cfcd0f8f04014cf763f42d8eb2caa66788c9cfc9c74ac7d5ce0cc7fc1a1879e3412c36191c5107b87f1dfc5457c345a6d23541c32cb1f5a5b783a1d0b3b77e7e51b57db711996e725fae5f4fd959d88ae246f3a5c24932ded15cac32f0b3f97a535239010ebd983c04ea933ead5e754fe89ae8afc7961391039ba9870b40eeacea7c3fbe50ad452e8472936e5b3697185191efe38178a324f06d6bcac0b7b31ff09698810bb85682cd82804f2971077a21da8b0215ba9247bc71242b734f6a152ee0eaee60c132beb209899e8ed7a3001e75739afd35795bc2003f686934dbfca760afb623b821183a63b3f315646e45176c48ea77a6c1ef6313f68d68f2936d3010ecc781c59b619e389dc5955d5d5e2ba33ea56f3bda13a0921e0c895b15d48ee7aa73ec383bac3e46a78f735bde943356362963dbb194d3cc4c2790639fcd2dffd3dbad6b4a964e652c22e39d82ea0cc3da3911b972ce0f27ece4749d51c1b012a4d8d044f1099d43f19a4ba85c0c5ae69a1642b4012ff6de074a9b90a28d9b1b2f2fe611a0f7f439c75dd7f47c57ba33ed6a45e977a46870dce3efc316da2e882814f405b4f59840cb4c893402426a0ca4d528fa5387101b65f669cae7ff05d1d178c1bccd220b2a29531d38b003d60129f6199c287da4c3c75d96d61142253b60cdd3c4ed806f510a2f5538790b0471799424586ee060f77b2c0a9983c855904b01fd1eed6d71ac55a68a5537383689f4caded71128d424a46c9209799b5f44d0581de3a7fe1ffce55c8e7f138c47ed0538af002e9f6d447eba076d9d217f4c83ceb1a87698d11bd3d9427b70ce6d8951672b60703dbda332b2378b40a189ed2f0c15010462cdbe232a50a07dcbc4a75ed204cbcab9ca213c84a236a84a1ee0672e1c021af31b9870e3906859d743e8b0c5b0daff2c2d2ca93c91c6c00cb976417cd718a8332d682130c0b376f5a0815b12813d19bb4fb164f036a4a9fc3469b98c21225039549e8f5f093030f8e01298314c6c431ceae3f52e1d8f267c0e278999f5e09b4d4be4a7a2f8541af4fc0811ed8d083c956e505ae8be743682cbd301f95044d7d1356159b1d173ffb355ba18c8b401293a08526402c6d0b7302b695038e99347bd19ecbf0dfc9b8915e4cc6dbeab8fae5fe4043530251d82b6698df7138e537df78a4e4f96468e7f4ec763bd98c006f9225382baba78806902db9fd2396d83d4d2d6e5d958ead0b64f3443533abab56abee1da0e92396202a4ec244be62e6d9d8579eebe9d99ff22252d161f3e033d5e3cc6189c1c200e0bda6ddcacff26db63fbddf5f4efcc882a155dd8186a595fbd9c834e6aef136f48882243fd248095269af4bbb0b78a7d7a9a41c71bb505216cca339e2b40fa4f6369cfde7874e3639193be3381cb059e9ef2324a928daee33c5b7813bb8b439d048bd38b21937bbf9f71bed332939d3fbedf3afec5ac1ebcd70015149d689ff50a5850157e0ffc5559d5a7474cb44796650274da3035e891826968bcc591045e77dbb8e9bc32fda7ba6accf5e1c1f43cf67bfe1a53829fca8a70d7355b13a9168d9a66b6a041da7459729de26d6ad3f0eb670d68b60d624a273b9558aa692d44e41e0d911c606a14b87aa53af8b24e5729bdb3b8f72b611ace222a856fb6b5b3da5dfd41a117eb131381382f10f0dbff6adc2d8762585eef5188cd3948c395a9724c7fa6a34a928826edcecd792d9fc5964fcb58195f7ffa4b6ba9ac47ad8e7d0dd45f16d137bb8410de39ec337114dffe9ae2bf504780100706ff824ab19d8b75303ba0d7dfa06ef4e0f528e1fec4c19bd1370423bd9b88692d7473a1b07f3074a3ee7beb10feb5511a390440d9e92bbef06a9865aa511b37c457231571ec55fdfaddb88f677b75eb02a9e30b10f9f65f55c4b5f749d4b40f6792d6605f5180f908cb012c129c4395ffaf1d11bbb037cbca74df03c62ac73f3c622c5efd6d364999d9f5f3ffc20b9350c6998666ccde81585ad967e07ed8a97c5fee7389033c5b04fb25fa1115f1a626acf229dd17e16de623a60ef0c8cd3c3cc7e1529de2c747c0c02654bbf06d210488e1511259b372701cd89bcb7d03bedf7d13dc0c1432c59d0eab5f116370701b2249dea74e8dbc50507ce8a5a5d297bc590a6ae392beaa837c8e7c5d97906bff3f9c0d799bd38c0a9350b5d98cce334cd9dadef60acbeed72cce0744932461db6d78dab88c61daee90cc9da98232fc10218362e0fe7b5676ea877ed8569a05dce696354812d1d2c04c88a8aa25c960aa4eb3120dece597b4a998efc8eddd689b746f46c51a53e2a98c520acacaa6ec865fcd1e9df7605edd5c813aaea2e3e437499e1e227cf44eba758d09efc4022b8473b611f59323a1c01a352518608d682f830d1d290ec78642c0a47d062a51965676568033cf832f84ceb88f1d69f4dde4f9679294449c4ff09c54e7bad7fc4a4ef6f0ae521f638ec779951543837c060e0b01f8be90e1c7b4882f8480d4b80a32a96e4113b7942022c4c48b9048984b78a9d06af602f6620d968bf149a6c61deb7878bb74deffa1b0986b670bcc25e3d1248f6a9423a53a84fb2bb7e1262161789b250772495174016ff1c7ee91c886c55fb14be0d77f46f80da32064ca62baee169f887978e84f3e8108af869f1c29dd9595cb7aa6d39f7ffe0440ed476928f41ff73c5b9af84b50bc7426f77f66d9fb969e4edcb00755e4bc25edcf6dc9070ae48cb59d4167eee8642fa89766bbc21137ffdffffee8a5fcefa7c82cbfa947fb6aabff2f83123416544cab1726935a5d9474a6aba1699d3d4a5910c64e43a39812a28203a337bc9d3214885dc63cf20ec8cbfe1eebe355ce22268eab1fc4115b05b37277e101a8489578392609da9dde73022b98e627a17eb126d70a880b4f0acc74d10e43e319417f6a8a3a8ee62e0b347b39c2118d35f59a9a3c4e2f8168c1e2cde03242365672051f72357ea47b2794d2af3ef5e9a09b243e4ac5725da9a858617f8f28527ccd2b9d34dddbf322e2dc5956fe9c6c63b0d95b33e458311c7b7cb72df3314d68154cc1e5dc7a933bc919dcc5a85b9599d4160277f41ae5a38b82df63ada73767f230bcdcd3ebc9439d2bded373a64f7528b180b9904ef10e01dfefeb7a4642cf40012024441e18a8296b9b983677319e4d6899f5183ed4d0aad6bb46d4f1674fc0ebdcf9f83701485c1f5c02127f49f375aab172dfd4dce03fbe2d4ef1a0a2932cc9fdf107772fd8a9edc4e869ef014a17990b91d508d5ecdf914d844382dd9a938f7f56a749641b468be875bf8b4cc895a3b248bc41e2ad1a614269216a0a9e9b6eacf19b82212ef1458a2f1f90b4aaf4ec754112b19f13758c1722afd7b392bd747cd7a74663af36feed477451c29281fac3efb979b36185ab3f6b6b0a1034677cd4e8c0cd5ff24a1f9a23e1c28ec6da3b8a9da90ae940b5c5b09cad5864c3d309aa295e8215afb9b100c701a2e68b93a28949f59ff757aaf6c21dafdc0989e2c5afdf6f58ace4544583873f652df147d5f8f89d10a3a9efc43a84bbe407c40eaed6f5f9672924d446fa258d0b3a104b584a90778f799f2534fc6b10c695265b5731ce593fac8f0b1f76fe5b7a6f70debcc8ea4741039222e9fefd88afa6bc3121f2663a6633b7711b6384c35b890fa33cb6dd86f5e4e72f82e4bfed45103064bb4ac1021b5d4686a7c0849c2817af3c220d5e425e24928b1e5244c320fb7ad103f07d30e7fed4bc3165c03b5055851e37b6001f68188a3dcee7d2d545af9d100166ae55dd0e727507aed08761728cba9a33e865964d2396f24aea46100f9afb1ad883d86e3bc61538a1a525798e9b5ecf8ecbe26f6b5ad371f2855a6d78a1a1ddc7d924cc3f78beb859bec98ce05a65a1246d11b7fe5d9569da863a361fbf688c90712d9f990cfea3280476cdeb1d8ec5b47b522ecf1ad8e6c53caa1e0a2c7324629547c186e7c842e80c81f06d34dafafba971ce5b09966cfeef0b2d81a481437923e7e8a1e2976d573b9bdeeb7264148b4daa5d2098620adcda8fb15f6decd711e4eb52192a5e494fb411069f7b2bf21d58d0f6061668b5d3008960e036bba4250ee528ade0d47cf028447665af7a59addbd830a46a8dcff13e30ddb288eb30b9ad2212dec408bf11c8d9833dc5efcb74b55244b36a80e89c0f61d04440cd8707fe2fecc7eb5eee2b131ffbf53e46fced2dabbda1e1bd022ee406e42282f99d67702a4f413cd7ebbf29ae9f500857b2d33d65a13d02f3b001a76945264230b25a331d3aa82e7c548933c97f62cdb4f581891cf2b672263b825d1034b6953b9b9aa9ef20c2ad5fb4554b1554da97b83363136dfdd924374e2a1dbaf1718bc69df4bb1cc026a4a2bad2a6135507f67c1e9da3d5d1ad027a39ce4d8bcd9e28d93e3e55c4746cc78a1cf02e46625088b4ed8b8a3ec379cd031db9120539e0884c328f06820db1a97ed6cdf67d7e357e2efbafed6717518a39971513ad1b545661574b6c5fa71644ca0044fd019f8fb8781b34c6cc1758f1dbbebda07cb52f5e1e47b71b59dbd38bd38e7b53a6b73586d5b7c9381c5d2a43ff3ea88859390f787b8523ed1b4ddac338fc4708ee92dccc934c866ff7007568e01ded140ae2e21171302ef87db9b95811e839964e8c6a75147afe601cd0c01ee070301d885838b8e1db51f3b554ecb1200682d9cf0ce2739bdff671689264818930a3bfdbbb3f6b5467e5dcfcf1c3c47ecde8ec00dcb8636046563761a1b9dbfaf2a72869e6bc383588cdba2a8abba0fdfdf7b37f102c922ac0a594bbcb6dbbab2a2d321dfa83de1bafffdbf6d984acea007036ac3d9ed591d7b965f650e0c0fac4218194660841ebca90c7e36ba6804da5bafc668e4256dff59e567c5e9274b2c04af5ca325b247c21fd6b85ba778806521e61865418b076f82d16fa2c2759726a6fbcb2ed3fa3b09c09b87674005ce1d847b5eb6189d59572425cf66759c1ff9edabc37f46d013393aa070049059e15e92c880eda1bfbeafa7afecb9a4dbb0c67696e95e7a5928fcb0e287f3d2b88918f465cc2d8403a05c1fb2f003f3b0de5fa5a066fe7e8e96d37ccde1827d50bfed06a2a4df60df4edf80724f4bbe2b1e036025793b3a1c150171583af3a84e09f4cf4564836aca670655ae45c429d0305d7aa9d8e3d0ec3a0da5c7ae319dbb7ae5f4ab360588dab08316b49b54638ce57da9cca70982a7ff85c4bca4c5c778a2b6dd8223fb932cdd502ff113625c8535e5e429de06fdfdd689116c3215364322af58a54b5cffb4b2aafa16229fecdb8b2dd2aab6a98e449efe95dcd09fe2f15964cc6ac41f16fbff24b9a832499307bac65d35251a375e007441f2da77e4383900c4a14e7896aab72fd6f8e5e6a0907fdb93c25ae53f130a29e2b468e3df166c1214b54847bfe09934df8ca7f3a91859b4ef2b3e3a3f86d986a6ddd8ca5181a0fde29ec1495f9421acdf2e3111a9585fa5ec4cc614fd6ce333f003f5d9d59b8c4d785b8e8cd0df1ed5f1364cd25d85e2e53321358e549818d0a26107596854bdf11b3bf242b558b20a8afc84179386dea0d52a70e647e966a44e3ee16edb5ebe0279ae280b74604f3b5cee95a279d3a990ae4a970b1a148a67a76892146175adfb166f49a9f2531ef62a63c2dfad93f9e02cd05a89a001692dfabd7101fd80211445d07a55571780e56b7f58905958356d90a21eb5d5563a76a0e5688f3fc4da594d7bdfe09715634c3534e127e21a318a9ef160e7f86034fd67d9feacb2220d380b1eceab3e1d313eccc491a5931d32662adb7ee48156a40b3270968af8f189f3477e6067d51c519e01025224f054644fc89d896bd22c6b6abce2ffc40cbea425f5119018ef7c5ea4a19724c123d8322bb44271f833fb990e471f39772c13815a4273aff7cfdb2c26c4df1606ec92596449074d3871fd08e4464c64e937666503fa66a3b4ee1d392fadedcbe56677b27f25cd2b2b2492e67a3f0a328c8f3d9b45900ce968772abda11e7efd3afb8239cb269124c3011afd54f0e3684f3163cde85d7de529fc67222d08ebcedb844b2ad77df35e711a125f79afbd7eb22c6ddfb6df2cefbae12642cab898f2e52fe4b018342ab00c2db1383c9ca31d4e31e78748b6919717372f987041b49e9fca9d702635df343b472548ac0b684021aa41cdf35b888c34c31a4a82a6635cc1a313919b8f8cc349406f74bad1daa5261cf118d06f369165693c4af6fd3280528ba3d2f7c5260beca8da959215f339f5aff55ba6cd8909c003703140526850d0ac083b60f506055e3946e738e2c05a4bd80a1537a9814ee375734ea9a34e5a7920e97aff949a3968e7eb699057f1e91bcf49454212d7ec7f7bfb76bd5205f2874219ec7fc2de892ab3241ad4697c40b396d0641d04b86faba69a282a63bb0cd23ad28428664fc5aebb40dfade736fa4fea16968fa65b284056058e9c58700550da007dfbfaafd92ad4454a0882fdc058bdef596209253faf35e4c96d3b60cda5749f8d1ab6dc9a13a46eb3a79591b8413818765a167af70ff9deb98542197e47c4a36f54ebdec0c759d4a7197a502f312bb2af2894f7b989ca9caa60ebc63d52f7d8c0277574cd86b8167fb877e9aee190fa09fddcf10faf594fb43994bc3d2e630b9dffcee9f12b11eee3e3fc090eaedaeb9335cd89bf3e1e7c2da2c87d9660e1fadafe5dcd8c12e75385bbfb16d70f3c2215aaed29b29fd5b32c3911d6d9995f3e644478f949c21e01bf17a63442924e2f3e52f7eaa3f95e29263b94dc48cd8a2cb085240f58019fc8945c6ff55e2c4b0ca6f5735c1f2007cca7745a4da2597f40d53ca5f7ab47996a6b6b3789a6638ea935ee21214d9bdf67c2d89da11857223a2fe43ed1188721c19aaa3b4b223719916566f4131911645de112af4c1e432914645044f293bfe3d44ceefe7bef44586dce3ae371cf6da325fbbc529628f53cf3f2df1137cf20d9f238bdf43e715137f3216e47c1ddf20ac3280f9f9cbc392d8970dd578ba6fab2d44831f91f5255f9f5d45d6b2dac87edf230d20f7bf1c210ca4e03f81265a7f4cee6aa6425ca42a828055e3fa1ed5328f7ac33dbe9063a1534e5b344762316c11e171a6b5e0c80e54843595244b71e0ecd9e47316f0e739085e5e637c538a984468e640e7e94d129b879b60fde32b8e944917100324dfbddf49fb9a814ed7c3c4969c2bee9470626b1efc89d37e8d8dd81e17960f05dee160c640ae77ff11eb91ce9f6e7fcfc05ed30d93e1c2ce33553b33c4efb9f4d82b2b2cfa536708fe23daccf75a93cb10fd5ac2b2806a706a7f59b0df893d8f213120cc1c9e760838ae68ffd70074c58e4f66ab13072387aff29d55ca475b08aeb456dce53aee30e8b3571ae0b871360b95207226cf551e7d9da0f89dc54adedb3d70fb5399888c8b84a06cfc00cd87682f18d6f585143fc500ab10e2a231c400fd56598df8f4947782c51ef35b90ee9f440abb5bd275fd747ca7497dd265d31500640f3f4758232b90c2eca9b9a37d45bbf56f1373477eebe9261f16bcf71f0fcd29334c9d6d9bd88b607c11de41a1cd0915b191d4f9c6fed2fdd3bb04d236a532d999e8381a3ca4dc5d7bc0560df5b9048b7be60ca006d7f28f5ec7734f351e5821fbd8a35fe0e59f8be0d69d698141e243d484237f1eb4cc2d3bc9964637ca4f8a61af359cc52217beda15525040e8b7f9fb8fedb7b978614348f00c27c49e034cee46143da0165c295a300638272d3e497a59caffef6648fc68d25dfa72a6ab7af8ed3eec6f569e606cf18a0f50f9e2ab31a2146917ada84e7c0bfd3af7c26d33fbe6fd02ced52e7e339ec10465613572341f348b0bb2153c453a4bd27eb6d720713fd8cf1a1c9e5fdc0523300f2319921b39a04e0113b7a0987e2f965f7a977f8cae61b92786591d83e6f08ad5c417a6f76e0163822ec8dd4af5a573a0777258d0befba816ca09835e16f9b158d301bc211b06418454cc9daa7afbb25a148e51091fc243b602ad0008d5478eb95789fa7691b6b78907b3ba21bd224b2a51a95be20c2f449311d61834419f4d153c847f0b9388e629a3ac45866eccd5326fce680ad10032447284025ecf428f703db8b3e61debfe0b6d7fc062149cf93d9ab5aac243d1bdbcefb915422619e5e82f773a7538bdb8bb1e7684ef2f5035eb32bed3d47826af2cf8cb2f36abd5c1316e9bf405b24089b33d3c59a1016c61d033266594747a09da7fd68244348102d9fde5c66796ee06a9199661bb8854658d85be648581d19cab3f4d878ea28a610f011973cc19ce591cd1852c3e675adfd977bd8991214a5719c47acee2f7a7251501dcc15fd779868e4da06c2257b12ee38a21d1904b2afdbe08e92c6e301420eac2eb02a707a8cbeaf14f7b256e20269a86776316fd3e84b2be54037bf622616340405866e5b31a7c2a229483ff892652495642cc68eed860dd6790dfcd015c5c1711e06fb489175d1608f91bb9f310e558af6bf9de42254e17a3524b96811964056e05334c98691b934523a61b8d6c56a7cd2fb2f34f9573e87ab06d0145ecbc52f92b780cfa4a71e1e7af40bafe3f9dc48487f9c1521e668f09d4aacbebff61c98778ffd5356cdb303b72e73e780bf0aef75266bfb3eea799f7c0700b11ff79341171d1c00fd7421fe66a2e164897d116ffa803ea20b5b7bc2241190d71e07551f126357c8fbb70a3b65d03b0f66c7d7ff62b6e88d7e58543da6844a292db25555fb9d15a03be95088628054194909131607f143afbe2304e759177a327d0e6fe157252d8325c64655a14facf0a0498061f2c8ac4931e02817370977160942dfe713491a98de00e0b7f284f4a0d31a6f7de7f1cf9ce3e47bf8430be4ae062c21efda544b37b6ef345cc98c82a875f9a7273f8998dbe0cacde606c023cbcdd5b35f01f91a7fb143f26092239c87350c28aac87c62e16eba6889542f2071bd162ca435888599605e12f1269257c17e9077d1ed1db7b87f2f546d14176e5958ed1dee851affe4d41a632583ca787240b78d755cf0ba7dd9c30d9b8200d9653b0bb9a4714709a374591f2ffa90658e4f0e9425000202e5c23196b012ae4a5abbf45491e4bb0322b0ea08c1dd688991b3134ebdecc7a492f37bb47585c8bd46586cd29d61efd538202231043606a83a8edf7492ab61092a7af122b36aeeb8481f9a09c85e386b5bcfa1d6d4bfe1d4e1d77b96c312ec0b34e6e86698b5e9fef423fdf62fda13ba7f75245918bcaefcfd7bfb440de918a6b79c5b3626b080bb8edfa8a4d4aa2705c59252337e23cac11572c74c3a45d3a0303bf681e2c5c2ab28d289d75ff1199fef1a10861afa3e4377ae44252a3010ade3879d039c6aa9faaf1dd9cb0416db82d260603c7fae3a73eb4d9e8dda6bdbfbe57ff8a19ae3972f09dac2a3629b16d79f90ceeb16d426d3d135b72f41df740c1450c00fafaa4ca840278c2a8fec7f6412b21ebee7985823677fe76a53b9e4f4afc8c904ddad13e0b2ebd2899330bc2502c33ab4924c7fb2db9dbb15aadd95b128b67d12b4bbf6fbc9822f499886896884b1a11bbe4e581ebf98cb474a7f29ca4b2ee0891baba7ae4f263849246bf5f04d651dae6bb608a7465b4547a486bef7b12cc98221a9cce849c7e39d0e13fa33d6ee6955c10c12f68932f06f7140ecfc525649fc9477c280e4ba4dae27655d2de673e509a58c503d0fcc2efeebedf98a27aee654f34e5f32080f6c825f711b76534626f3d4a88f03cc067a94c8ea3c3ee02718dfaeca15c0fa8a16e82d1a0987e065f4073e1a3aeb176a5ffc6fe4eefc603dc3a8554fcccdc9ba5c0caaae2d6a7bdcc895d2d3e593c47086a0167e1d58933f89f9c942ab121e18789b57f8dc2f98d8326daa5add316c14ff9d9849219e4152c0049e83d2f245947b0d0860a4201c52ea6a1f96efeed8f0243d3f5d27f7fefff2bbbe86cfa95d8f0456aae29c400dfdefc6b1d91d2baefa32a5e400ac9b547351bc0d845226fa5b7af506a80b2f104146d09b9ad3d7bdfe6f42c50c0cea81643f6faaa1df3536c259de3f4bb5f9cce3ead650f3893dd0fa04fdc883036421d960dbeaff9cfa290ac51f7af897f1a8fe54ea03f9a2ee42b2d51b36462889c6b78d3bbf9e3bf3b9c3abc24c5c18c4a34c539cdaac87ab4de5c235fa888845836e03b391a2e9a66fd5b4b714da69c82e62988dc1326aa476d0bdfa74355ca226d2f76341cb96648d0b80b24dc17db8277bcd2dbfd311dfeff459d039c4a6813761d2820df7e0f7de45b0979d0560d7efb6f94126d9b645c30278f21cf05b3a1605bd18fea622256e3cbb180b9977048feb68a8d45f96ca012512b8f258eab400828398a07c000c1f845cc1857667fa5ca19c66d18b8a741b271c9cba44e64e2b317592cb2d596005933a7dddce453cc20eacfe901c5a3305d7b7333c0ef444d4bc38aeefb6ed88b179542c1b6d9eb47232a8310829ecf3bcf37c2e1690b8e9baa572e2dfa2f66408ae34e64faa93e52a9ba065515627cc36c874f0266438c05f526314b7dc2b9c9d21dc450985b7a919ebcc4601eaf3bcfe7b4457efa46c1f6eaf18742603fa6a859fa2aa6b255eeb2b359deca4611b0ac5c6d39c040c53dacce53a40e6fdff3b7a55ddefd5e1f5757e8a0e30f2bd2d4670905e600daaf31fee5d18ae0bf196491001f8f03ac9593e7aee7e0443b6b0221cccd3f7df461587fb2ef23d3be2ebed7b83fc9b4e505540751025fe63b5c05c9c02bbf8521ba38ce6eca2ccdc005b86bf557b73a910226f8d6fccd6967c3042dc42d6296dbc29bc3e91c06ff9fde5e9f2cb60fa860625d71d7e8d97a7e4488f65604aef41a636f8b52c3611f021facced0b80adfe7e23f0bec2cb7d73519d87f05ef312c8e5a44998089d0378bff12fa8e1bbb862eccfe93a4b43cc4d7c01dbd08fa31371743b9ac7b7ba73e05b7f0bc256a935e04d4532ec33c35a5e5b1ef73da9979e8936e3cc7c1625b9e096b7a8de05062055e1821af3a7aa3b6cc9895ec40d54c2ea28b5f73e69ee071b0fbccb77a75276a0a95d85b9f46cc9f13ad2758fecb89b76e8eee74d6dc2aadc8d060a87ee9c1bf8438c15f6b8925629b804a580e847997a406307fbb1ac0bd728be59d082418f35b9faee4fd1dcfe6d85d15301deaed1b72668f1766b59c491ece06be72c1c338ffbb72931a63786666acc5d0e17467690f3ee6b729ea67cfcf787963d51bd7d56ec00f2735152b02febc60d2ded370fa8cc28ee01f3589258726d1ff6a8668ee3c1143236b7640b3918c9be71831db65c2ad587ed57201520ff587c15bafb57e84e1e6fc4d19a9be0d5d5019ce873ce89d39cd7cf8f524a4251a2e04072c88ba58cabac586235ffe4f3b5c8bc0d3c2a7d0311b924d80010e422f108a230464008110e40101d9a1889c52dbff17abaecc8fd2839b9ddf538b75d49b1e1a4a69dd8f9826a2d0354d9f29e56d8c00d398e7a1b2a4910c51faaa9c820f95a7442cb33b1ed96c461b4f517572bed524fe96ac4b3818cfc17a2dfc1344080640689fb60984862225748531c0957134786dacd00da2ab13821cb3da08f45469aa500bdd654df93576e7af7d4e80489f7781f1f43c7eaf98b9cf680ec55c4d93f9c17b8a36f0a5455046b110b60fecc44a291c03f791ee206c4ad518a2815bc3a5c9db0c1ed9808016fff5296d85a250823edec2022d67f9bf52ada441e8008fd14ebd89ed495985dfe8f978b39609bcef7eddd33a87fb78f24dbb0ee4a2313290e2cacb88392b9066f85af67fb08791eb7679c842bcb54c87391a2367dad5af7755a616ed2b26a4bd0c5b79b20f94b24875847d67ca56b605bd9329c841125f92e0d22962f87ccd95c9b5bc86a2f7411d9b283f8eca40459839427f317399736c20e17708334084b62385b91f59f44198c82b1bd9429692b24df1bb98f1912b94603aefb263ea5794ef8b71458047ef47a0911fef8e24a15a54a1cb3edf5d03d40294d53e32668839f31817985c2640d050d5fbf8dfc2b7aa9485c28cd44bcb62c95f77c3fbb44bdc6b87de15098f3b6895c79b535c9c18d04537bdc3b0617948012fd7725943ddef6151debf76d1ebfd993237491432c71b089aacb7b575d03252e2254d3eb633076068a8ac3475ad53cab7f1c4381d8c47320a551dc64c3b0f5a2f18a5fbd0413565c8c733c1ee7273ca82bc774a0913fe1b01ff2d1bc8058b7ba26634ae7ccf9e0bc63adea305c7e294c7fe6f5048dc0fe922a2049dffe9587fb02ca2d0fb7ae7a338f6c99267d59c6fb6b4c3bf8b50d1b0c0ad164f973e627339c0fa5dcb0bd99005bfdc5fdd223cd1c5965b48459e2aa1b25ee9e207a949f0275cc46dd9588512dd988264a552d40d99d86ef59754654a286238658571db464f182027a82f0d19592c50738fa2c25e0434bb2226fd943c227d6a04284515b55c33d751dfc9d620d8d95a1cbf05cc07288c82e414e443cec2d78d466ab528dbbf50507b015e1293538278867c74b28469a601e516280221a63ef275b20e5d339baeba8a281ab662a3f142a98966ed40ee82482105692be64d18d4acfb6b893faaf5b40bf8faf725887053980814f602c5866d094f2a2690e703f8b6abf0a638c90be0c82f621c28053ae05500b0b96bf80b30e90067018a20504c0e3706ead68a2878d5f414afbe90912f1864d143b41e603f3ec8c610645a5720e54485350a02c8064c3e7eb6f50d9495a56d49960bc08b1c1169da41dd6527fc31991516675513c38c79a24c709cd6b9acf9a4bb2f02135e4401397ce049204d1bd359c3fbb6624bfc072a168ac5109ade8ee8a9743755d8bae0c1a6f8120467b2aff3389d00d78359f12107aa1475d97253929041d2d89bc678b5a97088516e611b61cdda3ccc42efac5aa1c79125f1dd2310fe3755f907478969b5366e07b6d7fa466f8bad61f110eca237accd46df4c024d4946d3b25151ac8d9a82f2d5d6408bbe8ba1932726a496ae61a23cda546ce0a57bba509bcb6ea83a8e5336142d94823f4ef8cf231b0e60d0a94499e5e900662fc1b304199d9c47744b4d00456f627448f398d89113dcb4d841d51c90a360df797b08c9d7df4526c697bdfd19e70bb82869d9df8d866f015637cb77eb30c94372c62fb0c199b719f05874eddcb663c99baf27ad67045deec1ebae1295e4c3483e5df71434c0ef05503e537e76d4142565a168d719151bf773e5c5760bcb3046fac510508505bb2f362aaacef4bc5f5e410f3538d01af231e89136cafa5e88403e694a388ab471a49b2a543642a0d5ac039c5e26c5f4f7add1b3c34bbed6285ad150f3261e9f63bbcf29b7ebe1ef5388260f6780af0d46a7fd9116f5e8ec63e9974178764894fe885d58ce02adac9e44d40892e56d602f8189e43ac53e30a0f495cb88dff12bf4636411311a1fdec0de8eb60a1d6f74dcca54212f4efe05326099cf64c89452a4c6fb0a57ccd3ae54c5b4faaf468ae8b4c33f7a2816b7ff32dd27298f42933a527d9a8aa14a99bacf9f5fffca902031c94b57e907fb18eb7048b635a84530837f635b965be356ea2a40eaba4e81838ffd4eaa96f3ffb9ec142508ff01ea2ee4fa2e578171c59556c96f3b6630abb85fa41a748f891ff9cf0ad3968a6604d88c46d959bcd19b3ca79cef91e37cf746bfaa8a86d0193f3b80806ac86e5da6d6aa552c3660fd7c11a17c35b792d6fa2cbc9cef73af25e9b03824b3f4f56acf6fd812ec5b0c773cdd78652a7cfc628ac257dbee3028aea2b722348a69c1305625c65203aa7f875078bc4319075f49f0d512bac173cec0cac4b747e4a45fc7aef84e19773ec49fd3e4e6087680a4280f0fb936319d353cbaf0225039f41024310cd280197d3565056b98e57d6da8167ff15fb3299d92bdb27bb552de641e0932dba71a7ea9a9439f011cf26f4807992a4ab7edb909af0a570a855f838e0869aeae610b3d63c282b0ab6531252bcc20a0163fa91f8dac4f6a735724b486d8e1621eb5fe810be9760b786ed6179df8b9685c5af9e725caa42e509493d1536f7d68319233d9343c4c5d38099b5309468864c926b924d0a0811ec60167f28de787a013f43fe2667aa6d2f0e2955566ad77f194abbf64b8016e2b7d68843702d60e559d48ccd6cd4b7d4156b23d49a46ec9766d0c192c8fb213707d86b67ac7f78fff4b037d31b3779e2897ddbd014ab2eda37f7e94a64e5ebf6e151914be1f798b518d283e46b9163ca0897b5aa0a9b41141505675cd1fee5cb3057154374a40b99dc6cd4a93b8b5807f2ea0bfa1e7e98a4dd45fad17958f28ca942d6debe2ca0894a26840d982e5dd04797780bf1d949d869e080bc6530449f2572870575609f8ba6ce4a3e60ecaedb6b1fe1f3dd9a0fa586ba8bf89529a27847add1b33c408047a06967a97063e312f35dfd71aabfde01301862560d6a8e222ca38bc3ab9db8ef050974e7e8f05fb164dacbb0667706dc5bd2459dbcb7e068e20ecb1b8e76fa431cdd28030d1e7d15f0fc06f835e3d904938cc6fb702ef581be136237773120023a23835e991c57231480ed94e11691ed8538a89574aaf9a230b8ba68fdc40a863bee5f77e912f153b2328d8db4bac5fd48a51456a4d39f4458626ea13cc67b968e40d034c38941fb9b28b5ccae69008f1d7f68a7441be06eb12447fbd5692cd9bb3bb0930ed3bbb0e388761b40650230b21b3f922cb4cf1aa0d4035fa5cfc6fbf1f24fed294471dfa7dbd125b5a0c5108df9f8126b3922fe6167afd81b02f9640c9972ed261651f87453a619784f4a84f39035875ecbf72ad0e4c4f97b4b9f4ec05b7e9ec0da722891dfc7e520f30d328faaec330fea231e1082fcdf9d451997663249fcee0834c181a7e45300e48deb271f6c0c61b458fdcb722bc078aa4de0f6f5f43f8515f6a0e2a9afe9fc1e6885eec10853e0b0ff567d4d8b167bad9e539404bf26b78cb9a134d1a3c76773a2621eda1d18fa574bd6cc536b020035783431543d17728ba6446ec8dc8a7d63898bf1620605e99646873d0f12d3638bbe7063ad9326dc05b3dae4b4785daf0148a6382ee4e85dac9d5e261581078101d414f4627f8ef87de2f6a48d186dc87b52b68330c2d3f8a94a5cd2e6ff32ae727fd4ed0789ffd4051e455f43bc91a748c2ab3baded005bdd1292e8cdedf8b51f76ab31c4388a1837e0360c007afb5c6e1d8b782068f3bc37a26c790cdf38f986508665cc68bb3014fc5f378c0592de4ab1e74f81f41ae349589e0b89b9d74d7092d0eb4e1aed70e74d60177a89373e1d20c1b42d6b6a1d7905e331a5f7c23f77fe63790e18009704b034ff5c31215157ebfeec2d31a4bb3d4c3746505ca7e5d0c1dd1da3b5a3a1afce407e342625dc8e7decdff65c7fd538ec45ec5acb5aa6b49f0b90e15e109d603272df52a8c38c13b6bc4477814963eef463835977e8686d46ea7fafb4d246e6317e9cd5066db84924c7c48597b2c6f476b989ad4266524a9034dca60979b0ab4f9efb5f045a4368bcce9de9edb22263c85e89424b9c399e97f2386b23707dee4f23441598d19d4a680ca25f14e7e2755d79bd22f12311c41b30e93448863e7a59aeb21330454fc5da22eb0b403fe6b53a12f23f00d0e6ceb7419af06f777f442924d4b92829378a6987b87a55c5b2111e422379104c0660f327f1accbf0093b6b0bc2358cc6f4c3fc0221dd6acdd204fe379c34a8d270047fb0ed9e8e08d85daa1de2145e70ab1657f7005f74d1b77c4ee828b987f5f4c3f5b86087a8f2866acf2efee3894db927397307c737253b0a722f26ca0ae3cad804b07654867d9a0f0c2d8ad9c388612196bdf781185f366a3c59736d83f37752f72d89611bd2b5666fb28335bae99962b139649fc1a72bc498463a66d43be890f9821877107ba09e3cb09cee01cc0f1a552fdf7225be874239b93c920c25fbc776dd87b1c26d83922c191023aef56db8435cf24c4ac671649f1cf5fe852eb67f65f8b3c1ca96a17fa4e232b186df6fa62e9fa9f679f1d4414fca0601827820446caa3824996db542c9cdcefb1b1bd2f7ce05c8d7736c1f9c17dea82eb7392ccd544670307e5d6c68bf6888a958821afc2d8d18395fad7167c7b559e04fd76ffced3b0379b3ab00174e5959bcb639961169320a6dc85304e86892066ea31d26c6149dc95f795b8dba43f45ab87f4cee12aa6cd1e159c15d2dde2e0c9c37f7af66f9a5e5e1849bb432b8e25379778377399cd9de35479793d07e0b08c0ecb5d485d60bc85244b87ada456573f61fdf4a8f1168fd25ad1abbb3eca734aab5fd0fad71f93edc4b61ff95702978af2eb98bd8ffe350e080afcd20f443a2aeb730f448820d3c424a1000415feb2ef941964f1b1a635bc0011aacf3bfa980fcd82059dcaad6181bc18e665a15fa5f28c667ab55e730ba3439be6d69b9dfc777faff4aedaf6695c0d0547d43bb4d6688e21d8fedf2c7a1a4334c0ab3feb793cb14037bc8b6b891061fb64737d10e543fba235b63a90d9b9086e8094fe3f2857e0f47caf019ff02eab92ef1b7d9c81076f75ee915ac888cae3a47707665cb9a01697aa2491e92aab03641bc766a155320e6854798df1aa4e2acbe3df65b995da4d4d61630a132cbf2e9d459cab25580eb0202f95c55f0c5cba1d3c7d3edd94d63bf5af4149162cc3dc7a4606ba958f17f582412dfa2d0c4fff48a31b705f662a5d8b1321fb912168d2af68bfcfff142c799a77740176cfb0944eea960b5dde8b5c237dea486b259b78db74f568e80b643116e9f5ecff25bd165b35f9cedf9b7cab3bf2857441a2aa3ce19ff2acc2643781a1513a30a7e4c774f89cc8fb5ee2a8a4c30e7cb503e76473efd35bbf1fca11e42069a136c9e67564a2c6b95521e4ec4a1dca5be40502eceb551aedb70f7bfec72da686b1bb42a05b2156ed221ba7b5f8a5db2fc2fab5fcdcb2e60bd15c1c7cb25cd10bed969d30a84146ad349b5d7496c4370add2714f33709cff31d09bf1424348d673a6db6ce39b03814ec7dd40b5ed919ff3d0cbc2e3fc255fd7dff1315460d12a1c8ce9c53e3b1d95e1ceb0beb1d80584c32c42e207b7d3cc55f35b9c5bd45e965d452a203af20b879a250b08fac451460aee03bc137ababbbbe9f291e9fe0379894da4c573168726782174b4dca257798cffec0f813196be8b294fe84a8889e8c3c54ce77f8c763285e2e61856058a0a92e49a82f49135b538d5b27daf50664a0e11bd3548df0b83e2dc0629beb660612bbbdee4da4242321093dfbc5592d754e64666ec4368d2ea6782ebdccb49db9b239642ed03abc855da0e82a9d128bc872544356179188e19068fda06657b6473baf3eadf0891169a6fa21a79c2568f295c7b2eda3b709f92a2e71a4ca4b62fd46d4fa560a32b2f0da1048ad740f31e2a43c02413b84a7ecb95517c52a2edb002baef3bf2bb27fa26606c0aa44f48081e1cb68481b063113b0c638ccf449e9ec6ef36c03ab6524bb5ac48d67ed362e22af21f0e8b600f0b1fddccd39b8518ce9665d869818658437beed79e937bc4ad8496c2f47b2cd7481ad812eb6d4723afa30654aa56eca307af95d413494fcd28d8a99b00bcc96078b22c1571bb213c1a69046edb923135edc7b091b7ed1811567893b1da9a8b5cb91dd7bed3baac9d446fb175b8381462d4235f4fb697dfdf792c68660436c360e2b9b9a3ff62573bddf6df1b52fc6a873f0a6db213f4797395d660bb98d07e571801f2e0c6730fb3185c4e9115ce961c463a4e118c37f8b920301a1847fbb89c48a5d603e800163d79d3197ee9d099ee704410ebb9b5cb8bf1a9e14c23ed07db5ee3f0ad349e3c4f2bf153dee38a98ad57b327b309be291e8608bb285fe5408ed210330f0a49e8cd0c7ac93d0701fb863b4dc5330d78aea36ebf693fde74a5b841cc7712ca838f7080175c18ea46645f5bdca8558ada75700dbc995af50bc98d8141b0abf66daf8f1fb0ff4c0906aabdfdf80f02bf37369f31b15601aa5b0d2a90a43c94839b084c8a483e5ed8283ef3883980b1643c1b6f94a5892743282a50116f887db7ace65c5efac01dbb6d1a995af63d6dd15d17bccb8fe7b5e483cb90cea62eb70e866cfa12305372ad8ba9e9f1d000344919da60e4cc9ef5c7c7938a7b69fb04999bafbdfa37d3ef1a416a1a3cc7eac02b4d272fb7fe03467a8a8a3e4aacc66d905626d67b7e8f2c5d62de353a3e7b4feed2c0418d8b6b45f92f8583f6c3c59d82f5594eafa1f1800585d962e42877bf35c0e7df98332664bc275f94b7967f0e705822b05dd40085004dfddf9b8742a268a6d72e4dbe2d0bd38eaafe0f921b58d84f8dccd92e16110d0378da430b9c67934fb8c1c39419a454f39fb4c2691b7998d0ef6e0151114afe982d00f46cd5f64b42018f0790dd9a87fd94c821a06f2dbb122cb1c269e242ad9e3c522d5f7e7c22df3ef0f4064550d85cbe14117cd5f14c2d18d6a61dc5af33d9afc015b83f2e842b7334888b1c207bc7f411814d2941ad6b2a2d14fc7ddc9b707f04a82fb6cef7f8260433e1482158136e1de5f3c1f4aefcfb2585ecb7f77b0ee81f230a4675b7a94fecac7f8961300048d5451781c9a312ccd46a576294bcee147ad6a93a2a20e28e98261b71183fb0d22ab5dd5b5a9c31d3c3d96ce726f2464a0704415885ad034a68941213169a1835f8216bf87a3d461198e67a61a47630634d4b4cc03ed1f2180b573f2ab231bfb98ded45b6d074b5f8ffb3694ed65aae173ef853967d93d457117a41008f7c13322403931f7d46a6ddc2994b162548c7494c285b75f39615f6cb37ed3ae9950c5f1c810cc1d4d42b0f4624217b5ecde005c370df8a85a634f46405d70ad4ab2cfc20fee36bc915cf1e3f6b759f3452c27b964dc044a7974283f17444648c259a0681b15215b9ed43f2547fdffbcb5971ee3002cacd33bd5064171bc481314ab12c1dab3280c88a7350087e26988aec937096643a5e56ec9a53565262654c3dc72cae7e51d9aa88c34b109e8d42bbb37a9ab34a66f2c42475689f628a0f88d1502a8e0dd4c126cf90b10aed9f65923de49bbdda2be2986a8fc7489137f69daa7f12a66624e25f057719a700e3efd359768baa805369ec2014423bdc986eb539e3693f648f9dfd5e3b7f0a2777def72cb1c945895ac2cd964727f8e4625df7d199288c4b381216647f5b32e18370032aa1d93a465944ae5dc3924457e5992cb74f797e6a6d6f7d4bb0aa76aeb01c57e9fe90ca283a3461da8834656218a6ed3f9e94b92da59bfb71f5960543f6e24d8e5d8e10686307f9a54d976cc4d434a4cf540beb4e82eb7207312d1be10609deaca75a745c9cf74564dee1aa7906f58f9c97af9a46d690ec1b2fddbd084cb0063cf8f1851dfe96a72c0b2930ecb6b0bc41a798f7a19adbe837c3b65c740cfcdab48c2acc1a0cc9cbcaf08a24cc018fac6d7c52eef3d4ef78110368fda8b959503fb5946f3a81b68a87c76b13a933bd8ed678d1d9cfe78507e58ad407177e31b750d67b6e7fa7cfa856bec1d9c255e584cb5d2fa2734413a292337ab5e1d0ca140884df6ce88cad283385f3cbe7c2065c058af6d4700dc94b86134c4837827b3c2c749e68f2f9eba4e478e1d3a9304b7643a7cdf7f6a99e24a361ca0f33a27e7eb52941836e6269c0da14caa6765898cdf438a80d49be976894f7fa03bc72c4a710c6f475b1a454c28dd464e78a1f0b1098b958ddfadef4c7cd07b640c8980e92d8323c87a3933eed9bd08ad05749b499e76aaeacbd47d0699aee142da07918c710520695335d4ecc39b42cb9ad1c705c8b633fea5d8c09ff7cd5a51eb6c128e19abaa782783604d82a805a7731fd157a8c5f1989b418a80c85120ab48b8353ff5651e2b7e0998fa4557465f33c00bfe03b34575ff5330a5b6e7da3cc7e26967026df4cc181363b501408c27390ef849e6d43aa3cb01f1395c09d74459021c1ddde76a3eea63c563c1ce69c482aeada84906cb08ce1947390d0665c0be36eb93ad2e694bdf73b4e3ea2e14d42a433432186024d45d338c78466676afbef89f3687f598f0dd0bf6bebb8a90527d3fc5fca51a206156cb6b78ae80a32e88307e9cf4fd023dbe7a12c4e9f849513ecf82fac09dd6051d2837d10f3ad44fbfc1d576bfad2f6d3a1be256f241c6bc41d975751586550ff9921509ef5277015462423ee7b4ae90d7b9e4fe3336c5efc05cce9858c9d2813d0d0f5fdcaf9092bb37221ea59514597dc26d3cec892eb56b1bb15f1162f88f2198369ac1fb854aa7dd3f2c3b48e926038efeac7123dd17becf90a5747510390ee3426cf59420c966dc67229fc3b77b1b6d3da072060de31849e5cd9593f79326c2e3ab2571083194be194a5933232af687b51294076684cf810f02e1389dc62add7ee950b1355e5e872f0472e6b8ed321316d7ca29dc832c9dfc4d420cf531f7d8f59796e3f2844fe2380b7743181ec80e2510e98bc5da49ea9f71a7a0d6d5a0c09536e9832431e5a06c7255854389b2101476008a323882917f484be00ea4c4313e97f9933ba0cd38af9b8120e2a95238f742bf914eee0bb9a80aa5442505e51bc91fecec09d09cc4a793dc20fa38c2eee19ea1a3e0b55e5eb2021e6d022e9e6fae0df0bbe62d7f2b3758458fd2cb86d5b4c4d6a3f5bc92c282367e63da142b19b1cedf64ee540af0d776a875ea2045cd10b6db192ec581f3597419fafc18564f6747c64bef4a246f31af28bcfcfe27819d24c253f08cf62009fbf4efb3150383b7e0baef575bd6c66cc7a8a1b84ca407a80354167c322f7699126e7a996ef2f695db6a512686c88dfc15506c57db2294c7219c0b9652a3ab845bf9790902e5f5ff2274f04d5dfc0d9aea02724bdc36d1dc7bc7ce0a6b47b749879b56f71d7ca5e27b5aca3e3dade56ce6deb5555bbcf950fa971b9682ba6e55b942feb1005db42ad4ee3ef2cf068da224960025c3c174aae020f265025248df01ede361491832befa6e4e188a9eae7b7bd3a800e2cc50411f6fc87011b92c65aa356f14ba9364f5092fa35f35b41d0d4beacb1580461c8742cc5f8fc47c45ce0751533fd097746c4dff9cd30c4f8cde83c9905e60ed059c93bea79f87d06a9371eb8970524a3323e4ffb14c782ae8b6636682a9fc6584eb801600342c036628eceb0d2d91ef6f0cf624b91814fad6ce772285a1183fc10710cb630fa93f461c79f810a27e57b678e4c60cc2c932f7d8309776712e1012b6ee5ae1ab645106cde7329282d501c85cae66ca58579077591e9bfd22ed9f073b6f8a9c0dc6e497adf625d15582989e3299b760b492c80d5c22b9f08fb3f6dd17e1f22d50e5dbdb4a3d25115e6e351183706b41df6025256a0190f3f2129f25dbc4a6dff02d9c820e37a09b571437a0d390bfbe8f3b266822c78fa406675b8db0a719c31f1eba1dee94369e8a4fa1e83697cfe3cfe8616643f8dc1d3a4bb6092c09c0f3d12ce41b1126599d3ee624b9399d97e9d3f55c2c54c37fd6ef66da48092e1b1621f620dd03387dac26ac49baf766070c9745f6044e052df2a84cfffb5ca04974a3ad357561f4353d779976b77669174f4d55bf838ab816a1a3f50e414cfe373e6dd8433f1bf0e630c1d0156ffcf71bb70fe8e7e20775f9f57958bc04ee4fa65be3deefe495a39fd869819ed08232a0c4d000ce172e084e0704e2b3305065914123e355c969ac5437c5140b52b2ff0110ce37716a755a8d57087a0db821d2868a6f5b7acf4a468bc22b21b1376519ba6d3c4b00b4e52419446021d4d78fe86408ac4f65af30f488da55aab6ff9670b90935d63b20f39b6172627d3f1e708e14cc928cfac07ae03cf968762f8f07efc4e7afe4631ccdc499e6e2ea506088c8a9d7a87e14d27b3a74975e731f674cc1039b5b3091344a7d266182c0dd027cadd3e8dc2d20e86d857f541b25670caf6bb388d32c5a2f09b72818c0412aef75ef84584ced7e2dc7bc25a3994443ff20928b049f9c7a402cb09aa63d55dbbda335fdc35ceeb22e4d0fa114dba4de5c840de47cfe6f98d0118e9bf0168a4a3aa7814687e205bef4655d35aa3fb7d3090a693f34720c40cbe069a537985a6c011575eafbaab8d19e4e98832481d3ef50f04fdcb2f16701522aff412d208bc1e5b9ec3548bb6d0172882eef5a956aaba6815b1bf769a446b80b6ad79573135fb9409762450b439227ab987225da48e92a676c1235d25331e8cb62d6238e3aeb91fabeca8fa40999f0ffefa4e9c53807efb33269ddfb0ad694b8f1484d1ebcbcb1925300c3e1fcd71e6a695afa75d66ca070feaa7ca357b032abcec221155bb4d1407023a869d4a46742a0ebd4b934b1b99effb2a27d072d5fbae2f1d09bd978bfe0741e165bcc7dc4ccd1a62dda7fc1d3eaf7a70c37e747bbb9638004e647b999e5bc3ad9ef9fbfebb631847971cc5cacd11200e6bf5f6027ca8c2fa3e319b6cabdc5cef0a56ea6ef1ad8a6d39e3b740ed6eadcb1a773467ac58c4c8f3543b96854373ada5239a318876b07e1a7ac5c1cc36bcad036b8c6af51314cb346a794086db40411d33329414a21574260cd46f86b08b18ccea6547c43cf10da41f8818de7af63763f063d860f105c73b1cc2d7faaa4c40b8274e564edcb80c0e20e13719703da201140a3212df25588585f959037a1178c37c75a4eeb5efcb96783235b29098cabaa93bd3ef1b10f0e060a0f0ce866bd7772fe6cdc343c56165b3546b4bc647bc7644472fc183d500ca394c3e910c55c18b4645d818e67de4f67ea7f1c5ad42e06f74819957f977f4604d124fe23063707f7a5be0aafba22f96bd408afe4490355bba03a65a653c6804e3e9518ec639c63fa418dcc157d4b88bac7969ec72385bc2c370e8b7e46646256583341f628e162db99ed11c4f7a379b503dc76c46205657464ce283aedb02308792591f4cf788a0ade4c536ded81be5ce79573667e050af9344c2d142d0ed56a25c3b726cd7cbd9ac5c5c2059e79cc0babdc57cdb9e31a54d2da1adcb73b02c63c74352edbdfe59ebd9cf7d31b4dfd2e9a13caffff25fb9ab8d39ec51b4774d4f1e60b8e8abb598ca5822ac242677adefff116c395fcae430220a0e74dc737c09899f1edc4df3886da7f27f0c95c9f9b17ffe794b07875af1e4517f4e6792a56a8f8ca3ed32238caca389d619d45e3b88f84f09563469138fdbd7cd7a7c8f3f25be1fd7df250d0746899b5cc178c3d2bc3fc92dc034cba0697df507e61dae6b659e604405caf3ba3daad7692280bb78ba3be12af4f3bd9eed36e87df57220f85bfabd7cc0cfaaae68ec2cfcf70f8ef2c5142c3b3f42534912c2304492acdc4c9037a809204766fd7e824aaf17e4800aac165a87fb4c93522c2f49932edfbc15d0f9f8cd6870dc81c39c69b284e9a056f5785289496b4750c7b005b5f474551bac952ff289bfa44a15a40ed89c3ce68fa1b40da789cdc384c6786b5fc8a828fff202b40d07ea700b3e189b2fd38a57e77dc16d2926c6ac4a0dbf1335da341925ddbffe9f2284c90bd08fcb63c7087d201ef6e6c7eb1e17863edfc51b887adecefbe11421975fe847879fe60ea8b83d5b54da37a7e2488f66e049e51d1139e7e25753745be1ad2bcd288c15c1b90fe8ecb496a51beb0a34004fdeb1504a9320163e8d31b3b81b0dc63be382b6a69705e070ba572d48d6f0e40fb81fef7e70629da9e20e1f9b124a6767784e82476add814cd6603b682baf785cacc7f6872fffe143e6382ff120af6ffd152d22ebdee3b177ab3206afc54359fc7f63fdeaa05c1f9fefb1799726d11ee5fec854b5949a01c41f25488d00fe3ce0693977e5bb42ed21e79104223470350bcd67c0aa5699d28677853557ee5b527ab5bc57aab7a98a14793a75d34a8aa806ad8226c8d7c9162490686c7103db80a730c81402f9e48142ee3aaf012f6fc7417aceea0ccfb49480f8480c55fc0a5929ae70d74ef7e1f33974e9354ad58fff68ae5cec233639d30e8d1a804510a8ca16f7229d3171f6173b85cb73718b32dd85e5095f0218101f53f7466e866eaca436853f17303df224a147bda901bcbc4b38fc7daec168fd89ca608bca91573a31f608432f9e0afe04b0e499f23cd96f1f53ced0c72692b088dce0531b39fbb84f9ce30e059d1c75836022bcc17a59d0e93c54695c3035de77952b1f7bdfa104f9d9cf38299aa7e6b226c9e613eeb0bd0794b8afff4ef70671bd5faddced6162a5a85677492d930005cf191df15b80798bfcd0dfb94ee2fb54229289d7a6e4c73acf76cdc32d284a2f3c07e1232042c76e72d49a5b7ae8898e709b5c80f3f82c65f565cf2f1cd35bee7e365554279ec68b3111929e825dbdd5b75fe6978bfe23b46bce9cab14dd5a6ba936613cbe13ec8f189d0b779d51b25e5ef5bcde3f93f9c7ad598868f8ec4cade4e0793b87fd22c841ee095dd5f6b7c777d57c33f700bcd7e2dbd694a61fed521bf40fddfa66d3217399007f286f998ddc2b986fd98461061a30ef0bbf2ad7bff42f9f228fb83919eb938f31f59191c70669739e8efef26b333314a1e97ea2be8fb0726876c6865f74e55222d22f8a29a8256ece4d01a09d7348c35d5653235ab7f3ced6dc6875329712dbe9767e420030bf8383f0c6969c37de4c536cf28774d683d128a4cf7759d52494a8fec896802f99a1509c64e973b8eb9ac570e95d38a75a534cb22e1eaa1dcccf6f8a90897fa12b88590377eafcc7a2e596c6636e7e71f1260b48d0dcb529fb41ba7baeb9261b54dfba513f34e42773af6f46e728ea6b7aaf746b086bdd70e72980b7e561827183e3ff24029e9010f02775321f6ddc5982ca42d92d45f31ac07a49b6fb87d3d33a471eba8102a6a433ca5ba7fdde57d1b29661edde8070d0da1cf8e071fb4d6a378f6fbad09afe328dcfc36b7200a56546b5e2fa15ded5ad682b4922237f0e3eaaefad0be7cdb69e4fb9005196450a9bb3c899d845179903e96db1970d34f8d7dea48747ee784ae9f54292e0d8fdcf205e8ebcd84c0e8b4d0bea3057d0c78b1a4f0cbf5001282bfecec3b024e19ba2f02cf7c668068297bb0d1a1d9b2fe7495b4520775b4f76803307de3d2dbd8f5070d6ef02cb72646fafefbf87d62d9c3e178f27f647ae0fe12abcc21166240106f3b9e528c69dafbc033d1f3caf08d17aa3bab6733bba1c43836d80a6a0e697ff6b5ffc4276ec4ad3816d3cb612999c97b5eba5849d5b276a8d9d64345fe02647f0136df8bf25b1197af1e27eae349ab6e74d1cdd472664c3f4c74cbd4b6d03a3f7e418da746178dd8db86f8a05ddd2f96caf35a25858c160203dae19d891861bfc7ce18776eebdd8552b70b45b10ff8ff88e037e3de71d9762320d91f92c0241d3bb36a22b21bf888ad516ad0962056308d24e8b85ed05db11c54d7233ffabbeb7718dff0e5d74db872a47498918e1205f617c8a7318613ea6624f5830668f7ed112967d671ba3b177fb1d2d2c0ac34547b4f9313c95bdb0bfa6badb096b34ff45a01f4bd52a6dc187b914c09c2f1471956366f64324ae1d8ed4a12d1bb0b426090c11de0f7cdcd4c3204652e3074520bcb40a2c7534b853ff1d80c210ada224175d96b70ebe69c1eb1405b56dd609291ee5780e5f2639470fccf18e0f1737781a5fa5915fc82d94ef7f713ffa1700d5611d35e988c63af578b355d8828b056954885fa9587509c34ff69a0bbfa3319026ef88351410a90e93975c59e1b3aad76c73f43034498c38457cf871b95636488a4750938a05e6da3adc4e22268bc4dded189982d3de1e80715eab76dd12b273e210e8920ed332683b0d303b3c4df479f1c7501fb88f7ef701a8205249d3ebb232226e616f24f534fcd3f6efa3fb25636362705e1620faaa8898e3022d221483bbecda76a34ca27b944508d4e25e4621c58d49d28fe2588810a737895943b75758fe013c76dd8259b0b71c34bc3a109fbe105714923639bca991bd1620e9fa28bfa1fc0bca30c9bcb71ad6a811e8511bdd019a4e46d48fd90c18d7eac5cf0db121fc2b403059aecae7452cd0aab7064773fe714b5e3db410678c8928f57c5d51bda370af7bf8b363eefe6da148ceb2840662266a59c08d66c447c8a7ce379eefe44afd013ba51754f1ae52537af12b7d637e518a1c433251db2e2b3e62dd6a1d091deea79088813b07d9bb9dcf1a11edf5a1b196d277a7d35ccdac6ae1adbda12fb6477c537b5fce099f01f1b836afe2081609826da65c1982ef1fd02a78ab4da7d2b93e4bce7bdc9287fe4d82cf4716904e81691701dcb17517d2cffd968948c4537d29d004e6ec39497f94e9b6472b0cba4d4457a310d8f4f787fce032f2328aeee67f7a80f03d8707221e984bca83c96f4321e9860a253516d07ab793a83f92248a7b70fc7889bcfd5cd0b25e0e0caff444f63fe1ab16ee2e176093cab989343347bd0e4d98135c533a414d03ecd3a97686a08c76ea96b36af278d472dbc78d44e793a6dfad695ea679e5a188b26dbfac890f3f718aa7dbd12c3fc69a5f81041d8d0b3c4d420d3eab31cdc19a48a7feeaffdff1cf2303d4aebff6b161e69b3f84511af7fb686929ebcfc979a269f68c64c5443e60ad01bbfd3771163e1e013ba18e7459fea67102fe2df81c321c576a182b4c14c7ef9a7cec818274c62f3679147b039b74168d54f6966633aecc1e2e5ab18f2289f43033a8ec8dfb7cf21bbbbd4acbc62a577e18489bfb711b00196378d9338a83921a4e019a944d061e170c6a2e6dba340f77cf4f7aceb7b7a9549a8654a7b2a45f963982f856d2e43d110c115796ca745a67bc015783e0c79b170c53e06bfef8252081c7c8c963f583421c7087e0b47908aac56befb97c894181d689a2f48468e85cfb5ad9c232866a4a6dea41f6292dce835d27ccd5b6cf5fd239f61512a81acd24dc96429200158d5b0a30ebc1ee564c6ab8e665eff4fe047f62891ecc650d27f9ff61ecc1432ed927cf75a989915aa1584fd5946253318c75b3ce0a4bad69f2f197a3112c0df3126a8d942643a644c7ad4f94a4a11391b1f93a59bcf64f4832279a9ebed406ea9159b85bfc75caee8a078127daf0f86c68025c6176932beabc84b6a92553fd4435f874d5a6d64cbf9995bc6574680e97534521f147fc97c3b815e03de7ec377b428018e18aae66563fd4f753d581f6974a63932ea7fcd974927cd90a0ee5c6d2e2de015f736a469f59b40307e5a2649b58ce2a0041520502014e7972dfeae94199ec2f8719c231f28d3cc27863dddfdc0271e1222c90c15067c03bd473604d44866244fcae51c28174458119245b04c0bb3728a0edc6aa34b4823bc86533d087484b40f6aff18eca32352d3d4aaa1974d471e81ffa3962b6a03d61f9f130348b31a125449d73fdd36855d19839ac83e29a8d689633a195365f7e4ef68d729665cf53555d5c809a0cdbaaf66ca59f7833f8d8f35033d08812617075171dc885fe9c9f5f27346402b864cb13366183dd3969e696406767e1d0045cc39e3da6240c8c8d3cfd871985659c82c5890ca18ae161ef5d95d7c60000cc0c22966ef672f1d2b364dc5fd7a408adf193e00d94cb2eb3823cf9b01b2b36bc0b20b0fea4313e14a7a80e161fed53c7f07210656da72b074f8702bf36395f456b84ce29d5d2f3787e7eeff979b416f8cc5cebeea914ebc492abad14cbc886e5f43a8a0056280be8bdfb83cf733cb8776c1515c9c8fbf7f35cc669b338f79349da420117bf59102cccf2a4af2ac843d5c71e96bac9d78f8c845215194a5ed7d70d93573c71117fbd633467205ee56abb06d750b9168c9abf91ef8faf529606e6a90ac1447aaa4363f70d807414727656721a039c73d20741802871390f040a19c880a07e0166664e492f1e377168b55b0a4db603b887f66b7c0a36a1d86bc98cc107bfeef6860be08d87c457205f777cc5006848fd4f4ad7756d31eb825d3bc9ef9126ff90b9d209f24de318dfac859f98a840ad621840beca847f050500a0c5890baf0fb2734116f67277fc887c875670e0c7e0dff30a85d8243aa9e4784ef188e8d514c680ab752c142b36b176c76b689ad6ad56b6c8aee5317dcddb67582ed5ef7df6437e6edbf92b589af698bd43fd51b269fe931c4b4b4edf5c0906868f76037c5e37d5d9166dc82664d437ff9087bcce0b966d2562ce3b5a204367466d8028ec37758edae68f547ab6fc7f7842c9d6874bd2898abba309a567403f60cb0b75249786762545faceb8a0799b43c53059378f2bded9604adf243e4bd55a4674d50dff991c886f8327568c4be5f9609a88f8ec5b635e1dbc586b184838b345cb63bdd00da98027bc29f354a508795d586264360dc968d46056ee88e6ff054b5e50902fe0ae6e3216f5bda226e860e72ba640a1c55e141880732bf0adf4850a7be22b053ede0169f4f4525995b339120741f185ab8a4c6ea80566119359245fd3ded6b26e064665bcf1ebdb48156bac9f652430f405f89cbf9ebba19a78dff81fef26fa848aea3b33e37140d38202a874b60b409ed823a9b85d757a09ba8fc832dd5ab41b7174f627e916257e02586f9c29e389a6dff53e952f784ffb86d1da26114c0ebd2259722dfd6940d2ca42e4bf6e2b215d96dd3a33e2f885c71ba34753e4d88402caf9d347eecef98335204817303303485bb0c69ff58727efae2a048335910cd067228fa622bb35944cb8c7792fbafda21e4b3d3d7666b8e471ad08ff4f5b1117fc8c0fa138ef4920066b1edee2e83e67fc86e155127dad8f38fd702ec9a92391bcae96f5f19e5e31ebbc095efa99c250dcd0b052261bcfc11283ef13238f129ce02cd86257e25403a2cb15d56e7402a1f0ff40a3cd982079f6b1aa7f85ab5f10faedb0ef5bfb6cef3a7e2febc51ab24c1ebc113610984075710506f83c41e804247cf49045eb4f71af344208f9d6dd320c819a4a87b1a9aebb717c6ee8b36f0f1c325af8714615777c90cbba06ead35331ca4d5cbba06050832387e051ba782209c5fade1c366dc574c028d7cd7ec85677d46a6e8da612b1371c7acc45ec340c66c0dd74a0c7c62a805a19ae4dd949aed3f859e11d1d9eaf5c4452ec35855cb3621c8150442c6dd22b7c8e3fb7c88495fd959d19f0ec97b1fd5bea1bbdfcf6f67ece345ec3d53ec9e206b1ea989f37003c1fe06ccbf348630b583aa065e63a3ce7b651b22b98a2cb6f869cc6ee301f7b26a4b349d5f4e632ee0b83b4d410c1d31ad3306512731ca9cad89c8ae8cad2e3098fe31fda061f71350beab79eefb0b5c5a003ea39dbdc28ff167cc50c03d2bf98a2f61e333ae7b2ce0b64581ffe2e9f91f5ccfaca3600a298bad56a98b10705ebbf869bb67933a9a160c425af8e67cc9bd7dd92ec3e37ee5bb92b3e3088eb5b32b2e8d9db236f6f36544dd077089a128cdf9a06db50a802b8307f2fedbf64e90b454ceda64403db7c6ed7f00bc624d50ee8f5e9634750653b6f81f5df8b1ee53abecacb70a357a977b07ee60a21848e2e3fdb3c19f1fd5b634e5d88c6704f5bbfc334b83c50402895ca819ae61bd4f10b111ba70837b18a480ce5cf2d0d1e9e462000cf0e8abae565276b13a6ef9f043868f6dd188721612835fe37d4e22ced22a953106145a314390879fbfd4e6bd8d0ce4d81ed36ef7382408e939cfbbb90f5cf7217a43e348e3c7aa288e92dc2b79876a2df61b6647b82183c3e77bf397a8f62d78cb9236837f8a2a1ba9e82dfb2eb9431cd8d6a83e999175323bbb14c92e6205edd32f78be4800e5a0e7fa75e7a2671cd4353ff4057453b3bad6ef3be4aefe443480cdb895311d95a8ac50064fc342793171249292b01949e634789068a133e692436f7b900471fb1ecb1251baf14ee1611008eff31064d385b12bdfcfd952115290327698eadd4a4d673d82c2c7e2db24b114f600f2a1cc272f6b369233f9cf3f8ad37fb098dcedbc7b971eb0b3a1e3c7b669db216186a5336d0b339dfb4b532cbfeec3ca87498a0bf30e63d7a9fb7cab99f74ccc6bb53dbc234b8fd88095442e1d6ad8f0a62b72e1e99745df76efaf8d58af1fec79f48e9797ac68a46797f08041bb4d1a8ee3ab82bbd233730390e8912dc43fbe7d5ed43a38ec12510cd48e53371fd1fcc383250803b836399d951bddb0b125ccf6a1616a61a740f96ab1d875422f4bba046a9d209a64f171b34fdb87d2a5f258ca01d6cf0f3b02b819edc734f46a75219abb22b04bb5b6e6c7a1460dca4862c96f4f206ccfe2cd76fa81027b49836f16f6de2ff282a4d92751b8cbc1e98cb91113563cef18b0a333510c5dd051a15930a0b004a2be52eb64549c5a73462047b50ea34befd064d117a47d2efe1b59f31569d1823d6af8519972e79e80f1dbbae1df69b7b441fa17ade0c59d1028560508ee02237bff3519d097549ec9045d552f59cbadf6ad57ff959da97e612b9e57b6ddcfd0656b3dff76220bbd3a51dc9bf72ba5412a2b187c24cc909eb33e8f296ddb4950465ff51a86d0da642b32d6e4dd19b3dd9b77c77f16fd963037757f84f880334179b8f64f8426f6dd75a6880b44429b26e3dea865bbd0d47f5ef27a80fb132995aa105ae0fe5204e4e6e93d88dfa37652474fc17310dcd9caebb185b38ef52c7167d972ffe6eb08baa074cf387aa0c0f0690890fad953a40e5f776315b87da9879bb3b905a6f50da18bfefd49945aca988917ae6e026026ef91e935946ec90ed0510c7a0af465dee76347e5fbac795b1a66477c671ed4d4c0bc15a3e9440e8b12c985bf18f853eb4981d23f1260db8e0a40483ecbfcd203b3a8cedca4ea928498840c418573db977f7be4c30d910cdd91a57e3ba116247115a7cf40bf47773243b44f29aa7bd2088a66a004fc33a7fdcdd54f9e3568697a697486d1c0b618264563128b9d7ca169b0587a9cb4e182edda94e331c42fc9568567e8621ee071e5e5ed6c432cb13f924d2db2406591527287e5022b8716c2bac0d767311777c19b01a53bb90ca85d13d15223b78b1dcfece8a02ce6a37ffdb76852fc1174d6173c20a4c14f61abbb932e0dd1e0632c6e14d628429cdd63c904144bc11a527adec3a1c7dcc56dc2b3d895e1e9770b5a8b6352df7b715406e4caf55411734d5da7d13f4c58136271507fb3a2822d91c2278611d0c33ca1e0be8bb0756323a0140990ac14a12caa1000fa62432c58c408b15c41ca68118fc09df7d16120182a9492fd7192ab855d611a846791b449df16be4c290a577ad6c6a94ca0d443ea89507965d2512f6ac5f35854c0b5a07e54de7e36bb04ab0c38e5e866e2c4bfa9b8f1edb42065074ec46f6e3a7a886b8a72b56e79fa83c76c010acf5d7f50ee1acad95e3a4c977d460f6d26cc4d72f5a909ecd5fbf3bcde3e22c784828135380b507b0487311d371dc4fbd75f59eb18aaa4c3d65ebdca1159cce9a507cbdc25af10fc5c40303aafd354a401ae71ca0dd6d9a581b71ce6cfdf01685077337f80fdec5d5fbfed825a9c82c258acc448139caa056b40a33a9a15cd82f5efd5d9049380109f08debc43b1aa2873ac7d585120d20ab7d567b2713342afb7a492648dffcc049ff82a6882764f9ffbedffc3c3c7ddcfa195e79fc20da63462e42ef1fb822a8d6d480d33699460e8ed20974001e6db8af81ab22af7bf83bd261731dfd6237c22563f824595867543a3f8c8bb8233364323be292565e4912cd6bc73b50cdbcd0988f9e24520d5684bd54cf7ca440ad57f21adccbc65a89122978746e1aff2b2c5d8a07f323ecbf2d5614ee2f8aca46b2d20f93fe0b14b66e972022d2ce00a0a315c33cec1979aafc7d4cc69fe0c2733d9abcdc051b2c5e666b55587a333318d7c9159fdea04c7cf260696ca25ac21d11a3c6cb151beededbdc2295a6c0a1337f7b6d4d302bc906c664bc8ff612227bdc806a4d3d5ee0e5c738cbffe1a4245a556a0e3beb5eb74d8f32347d4f70ec211b0264dde4b1efca2bde05c729a7e620675b178ef1908c98a5ce195d0512d667aad8128133086be51c7f8f52780c696ddbfdccdf26c9e4dc235d28d0891f61ab3a35b92744231914a883a553ff02b4897ea6713286184dac7dca77d91865fffce3fbccfc22d7ff112d6af3750c7f47e096aef3caab53152efe72fd496fe322118814a59bdc180e4734185e5e94ed78cdde6b87a6edf015f35929ffc80e53656d3fcd39c927712f2df2cd525bed9d4f9b19ef7f14e422210fe23b99064f1d5ed8d7e0ece992b09ecf93b0e3712d22b309720cf72a740cbe39f7e00edbacada8074d4749a8713060cd2fab0daaca30be41f2bbbc225758b435603c448454dbaab420ad770353a50340f07bca0f6a085a201c3c39664063d315cb898f0e5c6e53d597320516b667fdb7a334769d7ddf7fb0420138d69430a3c4e256f748d9f1266c510db2ea4cbc66762abd310c396ec7bf6ddaaeb07da5e467d06ad1c500ae913bc7e7fe17f92a98cd96ab7efd91288a4ab0dfa630baf3d4df200bc1f1936095f793ea8623499ab61e3a8eccc747385d2efa56c6e3fa0328bda72021bbc9f84e2e813b0a250952ee53ed2d234fb64d0af6cef04d408caae73a72b767ea668754e8a92fc479bcd0a9222b452aa793f8873d6691210307f6077232288ddb6d0fc6ac4af73de3343e83b44f7ba2137e4412f907bf90b56dd81e313592cfe58b9492bb4d1666d4f0fdb03aa3bbb28cd20e774c49044dd99f7904f4799c7a26d35d825a8f80c7bbc64889a2087b66f1abd69e0ef94512e69a3d0457137c781b52215bfb6e33c3558c3b7ab14a4d565cf05594372192b981f9df56809f6629615b15db7c24fafcb1d1410b3019a2eb6fc259872b927c2c82991054949f3f9d9c34faa55c6ae4ceebeb705bbfb1535b15d40a1fd4782da9c0176235343c3a5aaf531eff82f3225f7bcb0c670815825ceec3b8f823b35b9de07e2c44f240e021850fc0ff9b5d8ca1d5ff1e682213b148a96de47228485c3ac56192d21630cf9e1c7b3a3611e17d611258061a06555f67683aa6cf1de7432a1446ba37850e58b99a31db740443e2440743184466bc51765cd98da0fdc0f413ec9212fcc49d6d46d54298c213af90036db1fc24f0db6dc0e97318f36f9f4370a278520faddf39bf09af08f92730432551471a4415d7c317e935da3da059f65dcd3af47aa1474ddc36c6bf3fe68dc0cce6b18bca045e8811419c307caafdf2c5ac89a703acc6cf213debc802c2a71539c62f00f94d4788f3c4ff554f9467ad700e46ad64c79b35ae89e249c415ac557d5903f24af39475a22abbbd3bc55e7a7bc5d481360da60c537b3fc1091e11f1b037606126488afeb6cd5fbc0355a389b77ff041e8611d8ed01e9374ae8332ea929e81c36d98314588432e186c9f8d9c5c3224b9f0dee44e0918be9706afdf15adb2d015e95250dae15102be2faa3bdff66faec9f8b011705333a5064900c435ea396cf1238b505d22fe5ef104be3091d6bb7bf9ad5287c9b8cd578cedf186c51e745bec787699a16fe426c931c422881d169042664c86418710bee02190466ed38fabb219b995d641de7f08244e74ee0458b1a66a98b695ea04ec19faf25e2d6c0782c1a3c714282dbdf8db599ab9851f0f6cc1fe1b5164fcd67615c6c412ce2f8e71e93699e6e099a999beb741d658e723ec717d6c5eaa29daa5a7fd4da383ea4670c23db13a5cfd66adabbf294641689885d62acc7eb720e48cd2959b8209e08b6c2a2f7e541ee358826a70c3ffbd2fd0d9375418d44a868a60891f382fa28cc1fa2205f5d9da7d93450a76965525aa663e62bc28a9ed99e2021ef275750f856fc80017d1b8a853e8b20201826a186978dff50db53c6f2955cf876118b65a6a6e4542c5ef6ef8eebebfae3f0ca5f363e357cfe0907ec7c886410ea93c3f01ebab92cfde358ebfa5b2857978bb8f9949020fe7bcc8a84670090bc91f1b1ffcd0376c8f53ac01ff5bba147edd9f5947ab154bd3381d988aa588ab43b0f69e3b68e491ac835000629bd82cdec6d5a3aef66d486bc6de82396a9f6b42015324e3f77f7476d9630b6ce24cf5fa12c5ce1db8570e7b75edae8f02153fc30dfe2559c7276406d55335be57260255ca14991429a482be7c2084cc6d80db64b48182658aa3a99dbfc792c82a8ec551371c8ae234b727a129fe87b638de7bc11a51e72754cc7ff84590f953b3eb1097009eb4ae2146ea88f76bbb1d0426b447c862948067b8cf5f17491d7a5b8a26e6ef8210fdf4a335dd86e4e0859bb8caea6fef39437b8c52f957a258ff9f9018b2a1cf7da56e1c6c028684bb1d8b1270234d7b4988525003daf7304eb8664490ce46036705d4ea3539d9025ccc0bb0c26d54587f352a9e9da48bb223c73b76521e6b61d686f7c2e7ff1b00882d9670039162f8cb8e9c6d1ac7a7c128e8f0d3df44e0daf56bfe9e5c248efebf5e637fe78f748870ca48704a0c3dd2152b2cdfa27bd19d0e1772208c70e2fc42e64266260f2ac94d00f4f757e50a2701b4a917207b47f20349a82114a19131f05efc6742f9704ccaaf51ee59e11dee2aae0cb48a0b9715280ed741b38277a6525f02737f7b21d4da4a57e762aff4e911c6d2bc62d66a17e190b5416afcdef94b092fd8483f5c08bab2beb37eae4032f8cf35f22462459e3d929a8194df605ae7948443e134d1efe557ac95c6d3cffdfce8d19f2ba8e100895780558556279af847f4222bbf1ca572d90ea9d5d404fb9e1684b6ee75c6ddf533ba0747e0342c44a172d949f77fe923c9e38f7ac3134355da23e4e492e0eca41969cc102b6dff0a249ecb8b24ad7f93f3beae473454973729dca7e66670704b61635855227087a3db603f6b20c1cfd7a0e97e112b6d18304cedf25aada07121fe3c5b46e3da139ae9b469d01a0216a3e2274fb4f37604b106ab212a44c220f72c81f0168b0300ad33ec6123f414e3162db30c295f9e91abda1b491742a3841206d4c5aebf8db8d2b90e219f2a6dbc96efe0ce0968847ba7e3368e37afa829d73ba8d60ab4d6ce072b0afaffb13637cdb00eb7f17c44f50732ae6ad191d45646897482efcc51fa1763c262067c0139e5696fcd3ac3bceb8776cffa2efbf9c433f2c967890bf47771cc98887a24af64acc1bc617c9fa4939bcc64229350aba77ad115d440c106dc14596866948b8f39e917c77d8c3cb42ad00a21752778954f99bfa7da1d807a86ebbf57fd1eaf6e79dfcfe85137b37eafab0d4ab4f4ab5eab0bfa553aacefe1506010ab30203b3b2da858a3e26a0d8702e7ebf76b361255b9eab4eca144d42405cd46c6712db488bb4c99e47f8968eda2ee8ae59b120e8cd13261485ce6d10709d66712c512873a4c9e8cc98ca6df59e1163cb5aaa648dd5fafe86aeaa78c177617f387fe6145ba0f76213c25b37c107972817643f12b720b6e8f2a28dd222cf07a382489f2ca4be5811ad93e56a00824c50003d73aefefe9ce97ba70d708b96be1b243cd88a3e490f79d53c6c6396961995d3dfc42a9496df4a14c3fac1a59f0bc834ec4c2aec3ef951cceb1cf7ff551c02476f9e345e9035fe8661776ba5d301e721c82b4a1297770ff593af0b2a1d7ccf258210904e500768c2b48f16d16d3d4df3c30f65f8f93585322553daa13a98512e1cb1e7c60265af1bcf46d07f36348a2569e41fed7f213e9da9017f00939c4afe880b7ff1f93480063f6485dadd19e4b5d0b0bbbc0c1286029435d1814ccf606d78d5dd8c5ed50c6195171b60eb4ead9e607f2ccff64fa3cd8770624d3667e5adf9df626cda473da547c6966be026409676b38cd26c7f28b2a5679727680a5d3f1aabf4035f4d010057f15dd97afe3def0493bda38bff81faf3caaee281c411f75b10987dcfcd74c4faa4f0a3a3435d54b823076033cc9866e6265f0c1fdd8c34763b3a7fdb5cf2aef369dd0376c8fe627524cd6b328e67a1cb1dd04389751dc3fa61eebedf3f27b691c973a67f875f9ee8a0e53b62a24dfbf29a71a992e22ed0c661f6476362020146a1b007e24357fbd6011494bfa3a61b06c574083a3dfd943b076c6001d474c89f4cb124fab1e4fa78f1cd9852bcdd8bdeb58737cdffed2dcd8eeb665b0cd1a78d7905bf7ed49ccce7c6a7e9a6cc738d5f4120d85ec4617b79ee650dbb20cf7a2f8d29cbb09394051e7e80d89372c4c979ecea130c47b7aa5de33426cfc33a91f59f62fefe49d32767d0a88b538119ff392f1497f1ae2c5d709781cf9da19708e017c978a71a1be7a529afcb25788195cb64077f4545173f41ae0575ec7bc163ee160acbc84f64ff23d9c11e0e9ef3782202697b314cfd467e3255eebe2fc8a8099ace952964a67b5a0c05a282a38d97b3f7a250808e8e47ba91dfaa038ec4df2461436c05637171fde96d37245e98e056eaf518a2e891c71d5598b7657414513f0e4472917087d5233205f79250f86632beb9faf5663741247cb55f8f21c742d155cd9bfc43dcdcc5a95bafc8070dc4578937e47f47fb5b9bfdc24a2d3fda453c9e6dceb5df88b9646cf598323a695f40b9b1c6699d1503af0b8bab0a51241363b926158ed0f351288570f0f61c2bfc95690ae4bf4d4c2acdbea793e948592d9dda9464dd15fc4ee6be96e561505a38e246e0a01a90c2421c0f7d51d52c68a486a07436cb441a339510c35ab3b9d5eb4e5d596e1343bb58b4693aa5f227009a5ee6fca879bca6d510fbba0f93de5ab3ea46bd8f7afc758def8ffd949c3fd85d10ae659246320add64b056a4968f592e7d5416bcbd62570e9c396acceeefc57e9334f23baa0edb74b6214a1cb8cd6848e5b8931339845b21d4acbdfa1cbd32ad0f0c3859adf69a999d74b238a4f2740d35fedeb846fbd0bf52c8a085ecfb94c02a4e4542e6aeefb36ca6fe57b4f456ede86825e63efc0cc32484d0af87b8d1f4d85416634125146cdb61165f84d8db67596df5288ae74cb10ca47346697ed009bbfe3ad8dc87fa9209bb50d094f7bbd80d27427d3043460e7e23749225fede5d21590be5d37cc60bb0b7e047607bfbcece47873987297c55f02947a3564c60ea73fe239a735a13999dda305a360b0b46709b2879aaff5b5caeed34f8ee27eac2c2d5954435ee4982e9ff65892fa92aff599e065af1ee0192a26a023b98de9be47f89b8d4c9057683ceb67a2a89bbc894ba4f5bcac97f61c779cc802f50a05878aa5f4960ccc5023c4da557aa1a0def7bbef1a112fffa4be1b06f4b52ad04e872d71480ed779dd0ebdcd1657632793922bb38deb4184b17e7da86dc9c1b53ff4538665cdbb07d00b3e362fbb7a3c14fca4217c06f6a93ac5d1b7cdc7187e94ae2529bc5f35e2f3a46edce8f23243612a3047098e338a1e0f4b970a4802f3f3089aaad2f1df58822869ab793457037ba38a887418223dfc9fc17b4fc6d0501c7eb74a2edc6f3a34348dce8c7e24f3d71730a9f465b5b255681f8b5a9a33974409d34eb86b9a7a478fb4441fa30d3845785fa6821b62c60115192e26aaf08c6ac034c08d0aac950168562581f6ab984f28862c164200ac6e0d77d947bd7af5f1a6f7d2aa6474b5294a62d3adbd011d73ba4da13c09e5d3c23f324e026d963ac25d6f7675bf210877db954ce3a4ecd9563d8917bcf93df27bdfad7bf4ae70c3f90c7e95f8eaab2a6d3f27a579d64947b2677bf2c60b4d555ec77758bcd35bffc82d98d81bb7b3e898dccc7c1ad251a70261238a6f9841e9f99d1eee560fd7bf5fac34bf24921d1b5a892240a9a2aa81970ce5b793a2350f8bc2ffd62a05153c66970d1112f524d56eaaf5e14b03caa4eed001101e3969eed9eb00e35467f31ca38753deb459cd4d5337336c2d6fe833d2315702ee17a0bc8defd73ac1d0f09da909ccda865aab43a8e5792c57e5abb687fb1d32817d244023277f40a3be0c9e771af85a8c0d22e0be18fbec0ab855382bfc08f860670ea7487fcb3584d5ac7f579585fabe2e79191686cbf26a2fbe68c0d4d51d5e4d19fa1858b933ba37e627ddb98a9e9024116614f8aab8ae4d589715be4d6266a2136bff9233770e18701256333b6acdbaa4341892d03557e89706cf5b57b22ffee5e6c85e01d8b0f57cf0b671a4ebf4a6b252e0fca989d0b5e8c0f8648138240adad89e4b62c92cf1286a2b0c31a5c8424b55fdeec0c1d7ea2236f9a3b1a5f1858c6a9a358cbf8278b52051645019a8fbc8cac6ab8152b5a98d181294279816e7eb15a945e0049449900b6272f3c52ea3820b2b8ab8ce13ff261240919eab98720e15cb12c57f15e8671fca351a4becfa0fc55cffa98304e3025fd4a05bae12e2b29ca632c604a7f2f8ae95a198d0c930d74c7f9e7e7ea5730c8e7cfc3e2ff67cd5e2cacd21433112dee2c7ccdefa4d313640e38def90daa5f66e3c9677a2d89c85278f5d64a1902f77d7a158dc301f2b42685418360428fd8615fbe685b192187c8b3bf24c617633ddb9f3f2a49fb572d20a1fd471c7064e2ac6bd277165f924bc9f9108bfa28a0e1ab4c2b151b8d42ab9a5c158e567641fe3703a09e04d9c555f15410df266e74e2ca6826910772447279260614fe9cab44eea21853f44e6a22617ff0488c72d06a778a432facd029d2ca2c435bd8ea827b4bbad3de7e2cc4e523d1d21ebf47b7e46d1c0156dde0d81c1e8e9265fe316c87c39fe989aba2a6114b285caa6c3891778552d21bfff2a68d2b7a3867a730e41e1099db84aa1d37ae8ef5e63d670d9f586c7c7cd034c107a575c03c570d19975d8b9507f1536b4d48d69ee1245346252504c9a74f7a8c7e3349a776381768e62cfb7a1ba7fc3cd50dce19858e77d717f232adecdbf0b63242064f455472e8f2e13bf0ba75472baff1c9e65c944bbe11df2b4f136dc0336ac36e6041f95b945faedf0a00599795a091622c5d0f3cd30843e5c278d4ebe03739b3585ab858cd557d923b227675f144d07b1ec5fc4a25021afba84978c99647860dd8e76950775084bb3e0ecb88d0cd647cf645a5ae90abb9b28bc093707b445e8868cd84c2f0d540e5be3e566c51e2574c689baf9691753800af31ba9cd81dcb8b3914090b0a97ab23bc3ed3c205a4d974ab12f07f297efb4c139ff35dea9bd485a7c8d7c3a84b28b394209080aa9d8a0d04029580577710bf902823802b83243c03a8f330e5b24ced0411924ab18f4ac9c1a0244255d85959de1b1467cce3fbfac43f35281fe0a791c5d92b8caa4f8cbd3d478f357d7d764ed4c0e2ad736a8b8bc9ec1044ed71a1937b5ea18eb891ef4f86a9b386e9639a542a51e0129128012711a506905b353bd1cdc328de1ff865fae3c38ccf1f76150170ad617741d08d0794145e0f30e24ca17bb2fd477d9ef0aeb7d1f4f684269e7500296cda47e7267774af6ffcf96d3b399a26cac38fef86779b1197a6d87872254f97a7450ed53789d4eb018bf3cdda87cd3b6374de5b4c3341893cb17a76c92a93adef6a833dd2b5c84ca85ca3113996d6d36a6f7fcb7bb4bb9368a5ca47bcffa5d6c4560286ac25a4538bfe560906e439b48d5a67875a4c461315c81b5967db46388e6f3d0e73a5baa16a44c5c06040dedadcba69f5e7e2aacab546c9762ba574253366720215e9c73a4e94b5ff5fdd1ba79c9d0174a77fc4604e8f021bf6b1f5f75f67954110a53d41ad352c42e2cb020ec3190fef42227caa1d6f617372220eaa37e2446518d1ffaeb675951d694ca6c2e27994205fde50e3ab7389db3733a5a5baa35a05b349665b1436df2195c89f8e9cddb02db1bd69ee0ad4a78fbc347c2efc3775eadfa63401ebe1fb2156ba594b7c71d89fe37b5094fad0673b671b39993dc327329368e6861ecc07266d75606a852ccbcf96ab421e5ff816d694ddaf8be90aab55b9c8dc1d62d75064969f72bf02f05236559d22d1d6b667f33d4adc1d276cd23bafbff8317bc54dda102514ecdd05363f615b9c63f5119317033421e94faab150f49f9be7b8dbff3c98722d2470f32cb0f3e8af0ee1f143d429d1ac01c5ab7374153f2fc5ee2b0076aa0db14d2af76f35533ba24eba4d99d6b7b42a5617eca12f1d23b9820625b2b84130db2eb107e6a1df37969b3ea0feda1e8628011ce93ad6f109f502ccb8f2e1ad19b22586e11844bf61a070083c54a44412b0c1d9baca7fdfe43897084f0d4db0520beb1f9cebf9ff1d716e588ad4e7dc4c3067c379ba6e4c8df3bc9a63c83a5d206a5a32e41513d13f732d5136a6020e54a27f53d324deb0f939f571a5718180d383d09b4ff105f6f7246bb7e06faa2d95bf734b9b85feb8d4305f670d3d5784b862ceb71c0bbb25c0873fb18457bde73b21463c6537d2d6f4445eb12dec4930113a1c7f9eab1b459582bc16d148750f47845a761693be20237b18c579a8d1c1f8cf67f3b800db7d80c15647c6988edcb8d753869e731ade6276810b8231ba7a0927669b8facc1263c9deac7d6266112e322ae40ecc47ae989f168893ecb8cec1c7f4d972a2d2380e4679fbbd7a227a5564c40aca589f2598fec8f251129b3d81ec78f5848add221a3130d76331c61eba572681c598319e935b1ce3874d49d40bef69777c44e3f037c8f15bf818ba9a7aa7dd441a70acf28a05b413e164d7fcc76b4a4d5e3aed4850d008a6f762a25174979e65a6394dd633e81429e9696c5150be9857938cc052fd62430761b3bcf862824d47ab4a65129d234edf3254d4a892517a2e0a2dd29d79a161d5f5410f52e02950d7801b9669eed5ff9655760b6bbae9a6eda9e8eb17e01abd46e8996dca3d85176ce4a9b5c912c177825cd2a5524643ff76b242c78061c3db909e4de56f46d41eed9dfc279ad327c5217521a78628458dc9c0572f4932fd9b4a77c2f17c34c1f79e57b4b685ace8c449e6d041361fe67aaa328a376bf1a1d395b391c403da161eff48bea89546a5937be225db02e48a27ad9234bfa31137e112b43240cea3075e0ab11683c1350dae3b2bd5cf633c4cbeba298c24aeb68485344a349bc5c70e8b2daca1daf4620965a8e5349cbe5020e608a241c86a6c847e48e9bfd2874d064d9438a0301701560bb89bd54d92606c0804549259fe7d9fa41cca0b9721ea7ffcbe2c5f7991e679d68228f841b30533519481e337dcd890dedfa4f1cf208d55e0ed1381df8a43da170e12fca397fe2ee6dfc54e7b81a7a57160e56f28ac075c10f090f42072d88069b5684fe751f3ffa7d70c8075e483464ade71bd2a1c72d1cc80a331f3193f5979610a9070b0c0abc30180874e5888ed4fdaf87c3a27b19d10c24d9cb0683cfac0abeb0b9c3de3bc5d2268c6b02355adb8235519fdc3769fd86b1e666917c15e07d2cb5950b90c4583365ef6b59bf97c865089677fb054d51dce5871e983b62331d8a99703f1d75a8e93a41c67867e9d3ffaea566dc392acdaaee7fec471da24bc621288629814813a1be8bd601bd08557a1d8358f10d5cfbdd26d6bfbfdac4030db75b6a36f8245cd2f9eccdb4f7fdd7471223c52ff93ba50e87d50fc09afc5dd4f6b1fdbe0b7aa27aed956dbfd97130966d2a1976f3bbcf9a0f4e6fd6ea5b6c7006f9fcb0812afeb68f046944c1a017c1a3b09f478584e35b4f3788b9df38b4b7457cd23f26550d6623ac116c1850783cc3b740c5db860528915f74d2927b26d6ee855b301de46b9194d1d27c38d98f4bbfe23aa3b20848efda5b03eee7990e5be39edcc67d0d0af8fa2b3e93900e8a234102f39fc31100e00933552cbf88389e43389dc38f099aff0dbbfb41b6e7bdc8013c4acdf11e0801028a416699a24c817e290f44a741072ad259b49f2688f73cca8fd1c9257a656a0073b30a34788c47d91cbfac484b1da63cfa78c8cad8ec5fae644566e34cab24a5899e6802d100488fe48c89fd9ab1c62bc557928156025ecd18762415a92276b2828a9fa5381b29777e9ecc5fd01a4d51e180077bdb6311b68162ada44b9e2a2ab8a3fe8cfb756396de0abddb12068a19b2448bc3f8c19a81ca27489a6570eb5faacaeafa1b0d25d07ada7a7d1364ddd74541a1fafe04cfcd26ea9f3c8e47044dfcc72fd47f0e8d2e732463f0a88900db26831ed5e92c07146e1cd837fbc14fcd98a523fd63911eca70f6ac2c390506af53a14ee7ec82b3fe18df64b173f69653ada276bb01084ba31ef41555508d50af953ceb38c3bc748a9bea000418e5471f8f67689ae4a04091a79d5364bf2ffa507d5f64ae0be5c7c6f33a98b5c8757ba4ca2bb925530eaf2e89092f44ae181e3bb859843fcaf633d1fea7ab0f414fb983c3aaeadca53e759357ce9221ff7fbb1de2a20df8d64c4c716b1831bed837bad51607f9d36464204919a2304555d3586c9ca55bbb20cca1e1a6a8e6e14442d6a6d74ac1659f313cd42563c087e36e7a303dc47a3d3a4ceb684bd87e01c16d27b97b66af461021eec3f596df6800e1284c5a9688424349e05684d5ffee3c71f8ebafa85e5ec270722442cff2acb8460de8d55724abd355c37edc592d5e22ceccfcf909cae7d61e285ecbb44fcb2d69d3f43ed98fac26bb776f12a0a5bf0931dc59130fb68685e28f97d05c3a2cb43608a7a0eef84fa6316f493a53130328662802eeb3023d7f2f77b72f6d18d206f00089a3a68f178a646af2e761bc51cb99724771bdc7edb3fa1f1346e5ecb92899435d503060ba9428fefcc2353265a0ef5bf632b54f42070dcbc38f6b3ef2c7fa79e921697fd92e5a61e4d9c44f5122187b21191c8be807a930e59bbc7ecdcedeeea613ce0048faa3f9e919d23767a210dd000655acd3136cd8c4e7a2f5f58a785f902571f4225ea1815773480ac26c90947d68623b18e18bc60de8a48d466b917388faa8ef0d95e9df160e33463a6a847149a44401661eb70a6961ee7523f6b9a00d199d7ec2272601e1aecf30574cfc40a2252f9a2eb0c549893e8de546a03cbdbbe4d2398db1f5ae39efddc4261445efc71a62a2d42fbbeba2417052efead3d8f47058e08047ec7474baf4bbf77fd15aa9822e56050920e8a782246014ad36566b3ecf5395616f68763c245dc01d9ac7161a5bf635376a749326feb5c217bb6538c099e2dadf092d631c6a4e27386782b8a8ff246c429d176772d31fd7308d0c68511a4b045f9da472887c6875e23c6fab755380cb8c3998f24b60ffeb98ddc536ad746129477602aa9d63f6c67347b360cef3aa619db3bb80c9fd37115e67145dd10c82ba3fa4eae8ea129e63f32184340be12e960edfd1d0a481dae9a0afbc47364ed1a318862fa6ff1e1d521f5cffb9a383a3e65dfe5305dd82c08dd12e9c863dc272ad1393e222dac2ad7641cad0ae0ea13babc25617e66abd8912c7949ccbe0450c928458f8741d0680034407b22d9ca2fdcde2d5d2af1aa51eac065b0eaf98a05f13a3fe6c9c48f20eb89930d7a90956c80074cb798a713dfd2654c120bf80269fdc992300dbaa93d4cea43a47c3e69cce5c47d5a4ac38e12eb664c4fd1b47c383e7b4d5e5d4711b32e721117a736b9f718b077a153a93b29bdd2ceef8b9514d71a37e67e32752087acdd34144045a66075cdffc8590cd3c8e86ac40861159be99ce22ea39b8fbed8bb6a8e99cfbdd16b03cebecfedad8d828e09997ec821cbd445af2327bb91066d26750de312ac76ac9afd83440208b39353dd5ba926ba5be515a1aeb98685bf0e51f2be3f0c4762137f866269685277c488d5f9cb165b345070f2da2c61148d3f30cc2b4eecf386cd30c83d127184b80433a425bd2feb71a2d92d6fa99c2c58f6770afc8f09e6d7bef82d0d914ba7b2068a6b7b378f400352f97ed4b8bfbfef43ad73c1c058dcdc5e83435ee24c470335ae722647d947069c310c6d231f28eac370296143f366b33c741daf960f09be88ffed61e4216a414ebd8f8b534d78ba3d4eeb146a06f6db76909363f7dc40ed007e906cc7e4d7adec4365cb6cfb3fe8fffc9650c8a9bd75097875864e067133fd29fcec078cc236032195ab8f8e078b63e6fe40be725562e226b7df09e054f59d97a33212a866132202436fc3d7cebdb292ab8f98298e8e01f8760babd2fd63a22993a9c67f192852974864c7e8a728c640fab52189a131807b0e9c497628dd688dcb842b3bedc23062d5c4d6e470d47cd42d691561eff3b434d16495553d28980f5aa1edd865c1a3dc7a4dcd9649eaa95f79bd9a39d9c2365d53498c8c66d64afe66cdfbd6990dbf08b1c43d69c5a2806905317e82959125281439eec46e54afa3f9c5ce546989796588868af997f862b156041bb7b6fd08ede7296c6a410eb4c88a1940576bae9c18218eb879a0fc228fb74bca749896b0b3d359711a76fa4fc27da12c528a9d83f8e6b4bf2347db9260aa7ccb7f606e438a283287872f46333130a1d5c7d9c9caeaf3be4c60466bfe4faeb99ce1b7cc2db026f6f38f231e3539787fac64355ab01478feb4fd718607d35700cdcfe2ac08fff70bffabb2e8ece070905c16a08dfa4b110108885e33bdd598c0ea4c427e611bb9938f8216b5da734ff6808a50f9db4f79ecb854a4c75889b1922f0b19014d5b0d1885dc76791131f0fe908d02d24bc34b8d0685102959efa6d1593e0579ae63dfb949b9b2cbbe5422eaa0cb2941d3e0f820de167f7b4decb34b34afa54bd8911630a48bdb6dd15141e0a2766aa9f6d27fd988fdbd76000bb475a11f2837f7cab294270949b3c50810c2a84f3e61af7456d865856de85a08e144fd31a8084ab8e46dd574d65d1abedded0e1e5feba7152fa296e4d64cc10ffacc6c46222f6d896b9d22b72b13d4e1887b84d45c7e0342181bef924dcb755db1855daa9a5104edfb5332aa2099138341945780af51fbc4490610f44d92c913d64abdf6abb40f58ecaea12337cb890bef95255311c0518b587476309bcde5c41e5ae3861fead15f84ce68167506888b23bb748f42df5cdd16f062e21dc54083edb6339b60b88ec546f2eaaef1f39e61399f1cb75b6fae7f8eddce09877315894005923c87ca170ff807065d3122a4e56cae16de90cfd1bd5a44ed42ba2f391f4457fe167a753bf395fd1879876be2c547867aeae330294317fb3e02862ad657a31b448d1fea304a3dd204bd0341560f1466ba91db4e7d621598d140572e8778a1ee996dc8501c930dd45544d51f4788ee4c4bf4ca3e94341dbed51077b2c10a75c8fc681412f60de9ed14ca25e9b88e422c149ef1e215bb704ee61522314fd57915f008b157c78bf4787e9264f41d1c523577d6edac8b778df112c1a73cffdaa9030f064b32878140f2746504f130e2c7ce891c026e891660d9784e934813848f0914cafaf421ae5257ea97cea62290ef62ca9d56f9471658e6daa3de0e53e16c8f38754b18fe8c29186d3d3ed47443526b6596340d7aeb67693996fd0b9879dd8a8a92e13dce7389cae1f3334b403f07de84845fa03bf6ef243171625bedebc1621cbaefd154f848391025ef904320114a970513829f04a52e6aff3eae5d6b4ecb3cbc998ff4b0e82cb54700a7dbe1e6b1ac66bea2633222ffddb7398caaf3dbb1e987d1b31a90e98d53d4c850f8ad47fbb15dd7dd0b5d51a3cc3b4e3dec945dc73210b10e5accf6be8dda492ece62fe292cd466145e0b924da85c92844643c0e7c2925834faab793a7acc124537c3dd497efaf571d1f60acaf98a2f907464b0042afe7c4613ead48fe32b5d637c14567b50ccc4af4230a2f466a86de4b8d086f5d8733ad25dbe52aa315431e3b3e50a2d17012f57106d98799002b4515cd6fa26ce999d5ce09dd32cff97a6ff290eb46e55f76c3c4dbed154ab25d63dc5a033d7cbf907a960d3bb99b93e6f076f7a9ed934c31caaa14e61a16ba46d61b5e4bff901de8e7df15c8e9f98af28bf75af8bf0b872bb6f910a0b83ec8b2733a4e2808aa90eb75b1ed0b52da2c9bbbf00f81498250dac0ef1c2a20e7b9b14486177de09acc02ca8316ae22b86fa750cc2253832e3d67954ec59a17c0d78cd5c25078cf2c47cb9f227d36dcd286330ded3a670bea083d9fdaf8e3bf0d80b9851968f89171a3d985e3a474dcb1ba7488b34b661c85dc23f46f2a8d30ec008759edb49c775957a66e147ae241ada0412dac705629595e56192621be6d102b00767b5aa4769f8d1e5b789a22c38393651bfa21b635ba1e86ffe10af60994606408dc3ca9c1d8ac4d47e91a944f4ec0ad3784c48001281de908be63746ed128ae04f93f8bd7c00ffc69c2f97e25194f4283392cced04a01984d89d1ba445292ad527667cd97ffb487d99d8673bfd7a1d7349b2745b2206fb31b3841ed0dece2291fa799b5e993c523e3527f01d5f624a15ce7f5552aaad03f6947d5a04efd63fd9ab6008a60aba167238e01d02702f85e272a0f962f04190540678e8d851a7ab819f8fc2602fae0c01dbc01dd83f8d37c9e03fc65dace8fb1d41e80bbdaa604f6dc08f18939d59084053aefff0901156f5b3ee076c2f600ab1fd4be01db68d25b1f5de50b0fdba63845f904cdb691399d18fb510fe2380cfb1e4a860e0c5b0b79114601e19cf9d1ba97ba92a6c85f147523f67d57d532e325e6a55941b7c01f8c399d30009f598d960128b89f83ca336fde57ecda750aad2a313d9f993ee33ba2fd5404d5409531690f1a795c6b1534c61b59a05b933123c73fde6239a4004296ef21b33358f7c53238c351143dadb77c519c0a6248bbedbfb8360ab6cae68c9a8470ce53886f680480b8877d60400f26fd685ed1695d6de09c1c762baa417785ab59a811ebbb986a72df170274bb3ccd391b7e32e838f495347809a54a2e299e0dd3b8f5388fe9ec628016ff02f853f830617d719887c76a995ab8fdd8861f0f6c41ed4aea65743b2f3b3d08ec163e97870dac1a9573532a3727d89a1e3e1ac46e973fd27792a299cf224f00bf294c7efc418820fa4df49787bec93f9d7ee50a80dfca7e9c701bf9e5d07e9ce3deb6df2f5dee9e0082a2baf7d322ce698d4470cc1de03c70aeee815f31c2a1338c2360d2e739c2a15fe386f4ec0aa5cb42825ace416872915b83818af3ff90289256d2fbcce3a79f1fb28185fe423fb7e20799e4729f5ddb90a087a41b8e9beac413dec401de5fb610733edd7986e7f842e9d3cb8604063838febf38cbcb4cde37543ead9761c6c2f36b31eb2ed714bbb38e76ef94813a6f26db37bf3b373a9bf1bd96ab32c43dfa7b335aa6e287bbb873601718537a811fcf44bde19bc572c539dc09bb74514db7b3307591a2a6c6811059193152dbd9f87d7e463a88965adbe5fecbff7b6a0dbe6d39339e43a59b38fdb386ca3ffee2f20635855b64b81a86d1486a34563d83d45e1febd434acebc1eb900cd7a708f31185f405f04689861a333e003e46bc930562c588fc9d565e9425d2d1857076593af7ad081d9074328e82d2a603c20080ccde667eb469d5bd4e164d5123e6ef8cff2a267d56fc7fc0d383a2ecc4a3a61ddc38e94243f47d56137284f9640f6f5b63667cde28c22478f7f48359f1013225006df80d62dd167063e0382ac59857958e582f49c3fa68fdea459a536b60a3212710cf09d791647270e798877c253361856c075cc013b47ecb423d65e03cd19e55defe402e1a9d2a3beaf2c89b09e902dbfe5945cb3c7711de8e188a12b1baf19d60f95ea683f9bc1cdfffdc19a651c9c7a32c64eae13b14f4faebcd9dc7a4a57f64e6416c950da769f95e97c975ef22945c75f9a9b44b6d81647a3b38a08cdc678cba8831866e7a20e2ffb4dacdb336b5893559348b2c4e1a8794fc89de37e0845d19b16c34fd96e7cfd728876765b5c3aca56fe900a4644c7706b12802f68286ea49b1aa3a201f55e6a91c046edb586df7322c66d4186774f2b65667274b123c618b5c40474cb44a6db7d20348990b1b19287ca2aea5002b9fc5542cc2de343941f7e7e02fc2211b2ea06e7821c94b4a0be67fcfa5433a4e8a5746607da0c3710f0414e701c5ee2df6e5d99ab5bdb69229c61fec6d4730aa7dc610dddebf95181668c635963cb74e87d6735a2d9cc594e48f53c231120d5783f103e1830d5c134fe2972affd0699e6aba54310006a0f31f4a92cbe252aec9736d597cdd3a378f6ad1f247eaa3a03605a1c97a2cef033edd4ef01678b985e0a91c0f5a8660bf83536af16ae96fddc40ae804416d7cda345898a66b0c176f99f1a1e61dfa2b573a946d937a6b837e0316d1fb952eeb45125fd8e5b2fe89fa5e1fdd111081c0ba5f7fb0e41e21653a0092fb545b06fbbde08c63f5b48e08971a0a4437e2afc64a00bf9760599a915c8f46c145421f633e7be90e6725c83ffb7bb55d975fea43ae668f26b3a0244027f391546f0735846076adb217705bcac70f15ee23640ce08db82a112538375c8e702df3b9a447196be50a8405f781536980a0fb9e60b044e2917202306c7823294b1775b9b1d7793760f1a232066769e996b909068b4109e32c73732c3aa16405ffa8d819f2e2e26b21df30d29aef2521c29a0633798373b518ccbc1f82a83db56df589d1f09e125fd2e219ff2fcd221c751784642c06d54b0fc1fb6cbe228cde9887cc2abb126f95ef47b373e6526d689ffddf0c38fd7c24ff36b2951475e4a4f2376e37c9700dadf3d52924a1a903a3ea55a35aacfa64b0a16f8bd917afc1dabee6c4e4957163bbb79e17f8c9741aa0a795cb5f8fc332ddc65176432e633af75b98b5e58fa59e63a2a13124c3089fd647d6a0799ddf11e119b517586acd1fabc454ac2af6645da112afb4e1f53ebe06fdacd29fffbd4882a0d876844e56ef7e0c6849c13408785834912cae9a57bd393acf2314e173fa9c57ada2ba849db295656dc992a2c5fe5c34bb6da9ff9ca29939ecd805826c062b54fbc7565fc88d74f25f0d582a9e43f1dce687e33700228df94fbac2cd2460fda7f2739a11d0f299b5850aa66921a29b5cc0e84d64b7d1822bcb5d8879c99150df773516fc4993219bf3f57e533e1e4342f4bd3f2fe219a64d174ac6e7632a409d6257944ac07aba481acfbbdcf871fd69488e166feed2f54a642394fd5770ed5953784b154b61550b04022eac9a081e8692d40a30718b8043eaa76df1ea4f101e65c4e5b70dc8be8fb67f02c905715d4f3b61fe9f8bdeada763b2dddeefd5c3bc82a54cd8812318302be4806f49c5ac08786a5975eac2e5521e0c69ec3f0ba25c44965d4ea1e0c175626d184dc6e7401592af3842d224452bd05575f87c626d3391e60a929492d833b527c18961789b3da2625d3dd9964f1e41fb7da76a94f3f83aa8b951a22df0cfd9df84f1213b213bee98331bfd660a20c63bbd627c44b481df4d0e8f0978a8aeb703f5324c2f198dc10f1e21aa9bc4fc38e368a4e61be79e0dc1bdd659fdd1beadb8ef6f30e1c82e48a5beb46b981abeff596d27446322c8c4c8e798e4b7b512428ce9bd77c0217add9c7c018a13c7f305ee6c772f920cc833228aef127d8dd1ebfc180b6c0393d33e1a94f611997d5ae478378e3a6c8ec9c7779c6b1ff8848736ab7c6d0282e545cd1ff0d1d09d24f2941baa1fff6f45bc6fb13465df361293034d31f6661853f1d780f41628c1302df8abb5ff806c894e2ef978bf63385ac4a3ba0a63e043dc18d556260d7ab0a3e9955c2752ff42633a2be226af1d9ab7916838435f5bd6fd2272b97a8450facce9fadb49c6a18a8d5e7b171fa5e1bac6d439027fc631ac9b38e91591010f5df166dc291e86c27c55af5fb8719c71026a1aa2414090c04d7193fce58153b6548ea964c731211cc6b71dabad0df912d40b7f65779bbaa0f031904cd3769bcea221becfb2be61ff762a52547fdc95514bbd51086677e69650449f4af8c5f027d2c2ab959161d327e612b38202e0cfc97a224ed6c39ebc194e0a8feb72b471cbd7d0cec052e1d901d5e831fe973ce899a3e094f43d565258cb0177e9669884e7f03fbe94747925c4035d22b7767fe2eff571ab0034e3320a6f6d30ee5212fdcf653e58c436f9584fc6c64fc051f6d898330fb35f6ca5f978d1f2f5aef369e6f48975bf5ed19ccc2913a841eb001d39c63362c964e9ff47fb26b40ba907b3621f73663b0588f1e1a1b9d91cb19f9b7dbf44d815b885f52dcbe612b0dac491c14bd43a0cc1315a7a0f6b675562c20805b5088bb6bb184d4f0d1ae6471d316a29caf55c56ab86f23de6b92f437b4b2922db8b1ca5d0bb39e1d05f997793b7337ca80619e5b39eb4655ad5f4a270f8ea7de255d9bfd994ea43ca001881dd243c871308041ece58735464f0bd000138ca9e94b7359e34ba24d958ff1c60445fd68e724fe33574b6120213c1af2cca03417f2a8fe0276ef4b8d27ec305768b026b4d54822727839d127e3751ef1688675702bd9b1de61e9ebd5a45aa9b9087db9b0c7a26555815b7df48ff3b2ddb4562eb6ae6a54c0955e8c8af7f9c1a3704f7a9fc5179975f333e882f7edd3a0848ee75e3e37981f81f04c11ba280d87d49995f0d5f0519da623e2eb8e6f916f51d5ca39542cfac0cb1076c5a9afa0db8b1f9c286c84f6b0e8aae8a2a51821592182a9f940c400012472d4f2ba24644901f5ca1a3bcec626602c42acb2665fb1134cc16df49cc4ea9cc14f98c19c61ac4958b4333ef42de89449156b6da89dbcc4975eef2098f6a6c33b41f7e737c10704a1cdeb6d73c3de0efc34cb085b587e12f102ae89246b21140a40e97ee32d0f794dc49b442212943d349bc957aa6426be0d627bfb7f631647811d3121e3fc820301d7937b3460767325b5d0e7c1771a2c5d0f50656168982b3809be216b470662420a1c0cbddec9e7848411fa24a1a9d74953bba4288baf39e46b8e9a139e407f79326f97ec5d196e81a9ba76c12a6a663671e73caa13f60f00272709b50646cccbd8c7f601cee203fc50017c47c00cbfffabf2228a6fe47f76b213205c8b5986ee54f249006d87344320b698986b71de0ea7014fa6380dd7d6b95bd4fcddc10fbce3cd7de26dd04d884b77403a783e77f1e0ad7e0739567f2a6aa3075e1b4de4492f5a2ff5e90e86f9c6a0217593e833ab80fd6240034be53b0c262dbdbe731f8f82fb0ab10c8585e6e5ccf5380d4611f8fc02a4f84751c0305b5a0564cc9f1e290511f68771b6ea8058895827d43b8e891d8ba9e8f1d31140c16fc50377437f612864f06c3b0b65e26da0c2a31ac7ed2929a3fbd2d935e927974ea80763168bef9ce81b271761903e41a3c5ecc994c895af0bd2a2e7cce574975c3358c04de5aabacc879154b7f98c87e45e4253b66d657d726c162b01df14b0bc50009fe371501c63d2a587be78b8763d44e1d2d580c54deb93db44b546ab7a21af6800bf4d8943cb76a29c964ee83854ffb7b464733ba6cb108efc660f8f6311fdaad8bb08549b2542a3431d959cadfad46e25969a65f0511f30a517fda430f4d11c2f7713222a9c4b6647900520e26715c8bfdeb34a4152abf93b9c36007af5fcd5527ef6f43bfa1b358fb6b3a4092c9465f11fc0674b3304486d9e0e0b48794fcb27e9d4adf253d6586853168bb798419a09ab4fafb3576d2283f27c49bf85513e1ff8e6fda5a3630dd2cb6cf944b636533e685ea038ca87085b00ee75419f97f22ee2ee6e27ed1ac7d2318a351e9b730a16d72c8f626d4cd21ca05260273cacb2579ed5fffffcd6ebf55cbef40fa727f74719a913e40d1958aa92dbf074280a58c827314aaaf6c3fa9c655e113a371993a3d84072bf2331665bdb05b91187e024ae8f88a7fe6a3ca5260a08b0e147df313cba65944dc2e376dea387b8ba66df72e28b7ebc719e8bd55940ba6c8a993afb234c95625bbe66913598826ab450154e79c40ef7bac2fc3cee09f2c878d47df58bb61e5def9f0086d600e1419eddde67dc5a070cd5df8a79e548ec4d84675f2ead462774211c5327cc06bf1cdc53519f6df3df01541f0155542edbf7e1ce9b8fa0aa1824fb79bcfed32cb494161e92f7fb24d2de39e01fd57f0d3fb4a5d20c2a6695019658af1de6acf5b1234b3b2d9f4257aee84625833620801d051ac53fd255a61abf4a2a7457aef308fa3d0915a6b99837285e3537d5acd64f3bb6380a14a831abc5295012a94171a4e85c192c6d40e48c29ec7d8880ec491a2597ea2f608b6b31435fadd467aa5a83000edf80f06ce09c0a34b0c2978ae8387b41ea21c8ba290c4f7d62643a6e5b8f73ea7c272b946d264c89b887b146620425e8fbb11761ac8e8e4877bf24fa7f9ac1f286ae2ee731ca0aca06c6cf4ddc4c94f85c11a1d4a8ebfabc384ac40ca4e7f32205e3ba2153cc74e86fef861d10b7b3c54f039f79af5077dc47c4736b01c4a8078296fd5c3d7edd5cbc3232c22325922ee8228954a9a62d17af9d090b21ad2fdda3efdd867c96ba3802772655729278800db7d585cf623091ff7c68d969dfc76653e8534a9a4a001097dbdb63a2a7924dc6b17558714bd30d054d64b1d86d15621e1338bf1ca750056f0f8c5ab217a0b7923da95607489a3fa86368091869de0bb8d849a17b78366f00311fd9dae4447d746267fc340ed50fbdf02dfdf1faaf34ff29f9898688b7f58fe4710f0b74b18a4e21a1710f53fba7b10e58fd624fbfa28dca2b34dc82dec5f449e33a4bb65719121d21a6a12088840730e35f91f539f788e7fb4d35d8bb42233264b92aad93ec17ef5cb22cdaafc04b70294a2d018282895b55af03a4343680fdb4ca51cd5d0a4c039afcd765e84e7693a6776effb475b8c13955204ceeccbcf6f38f709d2dd85d12e887d1555e2d2b5279dd859018af2edd83c0ffb19afea7b31a591c7630fffbf07ac3f837f9a5b48ade9a1111fe2b14921f49e644be8732bbe92c580a663e91f607f819fc2923c63abcced11c4a9e0f45f74fd94e743e168c4377dabd7792d8ae46f9dec5a94873facb3ca13f7842d7f5a8f6c0c997da77dbfec039ad350ef22e28848e072e3f40489b939e51f9fe5edbd75863e87eac0569d32af35579c22f65bb2ebf8dfa531ffd1cef09005a39bd9f5b95876ae8bd537761b49ed2b17db4f59cffb5865cea866b37514a84f491f842ef4e27fdf8237bf000d39085d152a1dc89603f163f29b521a949bb3be861060096e57019bf1091b4f5671c5cbe951565617885af1bbfab03f27bcdf6508637ca955504c145013a397fc5cc3c9c10d2d7b8556605f4acef3a6f52757727cf51fdad52185cc37a518801e1390aef3030bb6f1ad7f4924399971c0c74bff4185e06edcc45ad923fccb862ed44ed7f6751734ddf8deb7d9f0411d3239d7bff94ba1afb3c5e3371db1c0d66793889951310d2325dd9b83c417253287501cdffc5bb1d8cb69f647cedd836cd6071155cabed02ec3c4ee640139396fe82be71c59b8be156bc2aa12573295d428507df6615a68b520b869a54c7e3d11d740f1e0097fa16c3e021cd7f09d5888fbe3c3892a5593ecc058ca3207fd923cc67d03fb5bf02b346fbaa8bc7e7993492e2b188a749c533da68e0b3a99667f879bfcc66d48d50a3e2b209478d72e054df35d29187aff21f571209e4d8d0ec753ccd029a73445dfacc88578da2fe53a2ca72507e065f8603a3bfbb5687f9f42f88e9ae6b5d5187ee4c553be543721ff12df8ccc29d64df89d745fa2a5880f21460fb216b8b59bb1fb3e767f05d99f2ae3232f38cd275f9be3cdcd9a0820ff774c4387bc4b31dd5f85897925cfb137b9072d308c39e959668f49819d871976bdb1db81a0c797f6efbe0a7eb499ae9fb6f259fa5cdaa8a9a7719ccd904e996b2285413a3fe3d67404f0178cfcf11edffd59935207eaab477b0b7c6308c3d95b5329034ba8708fe41b8dc8721a849f2b3734ba32eba038ad3bb460e4572bdf749e96370befaf69748968e8edb09c727650c59426a6004fe10ed743177114a5d03b0c35e3d0ae7053687d5bed339e0254a26df15801abb734b9608eecfeda7b0fbd1e08e782b39031a3cd3beb0d17a9ba9f3e87ff7e7581a8cb6090511f18f2418668a30335f8dfd93bbabf9dcd8acf56279dfcaf45044fe6e6c60839a90c3b0f987e213c234a07c867a95a9ab3d72b80de348a1ead58dac7a8b139e7fc68b5d5ba68621f124ffaaa80911e265d217317aaeac77d5e64f11e8f1f8bdf2d78848fd74ad7d309069df0a5a9b08ba8b4f1861c4ccdadcb5798ea7edf6d3a857024ef5476c69576d9398b1944faf60350190cbb3ec17f06729264478d806e1b0af7dfd2d44cddcca5c6b0dcd3ffcd20744172005a8bb4a4235404a66ef69c0df5d59a2e280fae5ec645222cf2d5ed78a6ec3229915277b1ac0ef26d28ac30dcc68c3dd09ea8808936d165f5d64f6ac4845c0bddeba97e3477027abaa391828b49d26756ff4f19c9f7cb65c1eff692540a22826f26b57f07a44ae14a69dee2673daabbb58d8564d3786d1d58f0d6fd632dd25ef9192948d95dc8edf95122da6710b852da478aa2d272e0934d4d612a7ac15048cb44b3747ed12c9496c9839e74b9fee580281330863e156aed5a7ca6c678f9ddd2c52cd5d30b30fa00994cd893656364cd010715c149259b28fdcddaf82aa99b7450536d0b93f4648fb4d7b53a5ced6cc8778ebeccb8045e98d3892b86bf5f100e8b7acd120bd21bf551549afecef0d99542f11c87e4471064dada2bafc530d6867f40a3b5ba476b73f97d5f1d5c2c57e57fdcc6022b358fad211ae07c15b30df0df013c3b096edcc759f58c39e3069bc39ee107c58f6971c2dd700177c84b5ff04b65e9a62661f559a9806808830ffca5d36eb826dd7e7ccd78b0d937e22bdae8256b0c28ccfa830a8576bff3c99f35d0f3006c9dbc36d1e35c765426f0df84058f541d1103ac5d0ef2526e1f53afa42dfd1d41908e5d6870a44c020e4de451e1c091472b64c8599eba33dd7f1bf88e60f9dca04dff5db705a14c7f6e7719f2e262eb9291c885623795fb9534d3fcdf6ae0f7ca7b308eef198df07a32a4426d5a2c4faba06b5b511dfdb2ec2bcedd5305da52926dcd85e8ff3a8cff1b5e3c3f128067a14a2e24013581a5d11edf1e786acbfcebd4f0bd77f8dc22d4cfde6a2bdaf28b6d94930e2f1f8546cfcf1b35935c7be54e9b457f6b61272cbd80e8d427b2b1dd2bb3f8dbb2caf09725c0da6ffb4e0198335ad36df58ac26ddbf91aed6604ce6f8ed06c4448ff6ce5ae945d494e04331c77130b1b9c6a2a91f549bfcb18e23a35991a1b1ee6939a36f81fcd9270296cefdff25956d03254b6b206cf28ac8a53a2b9d148dbfb5377dd936756853f0c790fa23bc35c9d438532dfe73345c96690dc43fdd5326d612a10bc440e7dea9b39b6ffb43c075597c8623e60fb3dc4c028ddb05e0001f72bb2995358451aa2d23719d4f69f029b2b801debc2811eb78090d6ce58cb52d461604ed642ed8c367e838b1e47eebb526ffdbc52e82849594457080674e5fec12a40e9358d95562eee9ccfffddaa2ee6891c2dc35aabba90cc8fe0d20ae06b47506aa027a5ee0a7e7a992511d75844a0e388aa9f5591e9d14f20cb6b98384f47135f2dd1e3b53b926496d4f7ebc4beb7a9d137de727f003c3a4b7e5c406307f2e4fd02fbd381ac0858375f5575f9e9ea870a0f9643feebf5c9b75a43c8d9c6065bad9fc9845b8a068d7483f84537bd35ef454fa73bb0254595be5183261bcc995a635141c51214067d53f57d7d898cf5c0e82b3fcf892ffeaa9fd83b4d1fdb2aae77fa1f82ff0ff023beb7c62f564da8673c6e6847d87559dc9a4080b3144dd8f6d209c752a6096bedcff9d74f1b704467fc5215fc1c1abd981ef568b5e47f3f96d1eb65300edd786db1f460f3df7b28edd46b45934ae83a1a422031434d14c4fa6728ed2ff3a2f0e6a999ac02cf1c1bfdf1d6dcecef88146380792071aa4ea9778b847351905cc56b13581145e776f124389cacce64c920dcb59eb2afef1be1ca82d4895c2418881f3aed7b5fe4306f5237712e05e0cb3787f58fb6b61b2775682208e887e28c3289c40e822677d2d25e827e1f549352131ddf3228b2e3f2d2fc1e40007cfc636d5ed94963bae4f7761cfecff2c976e3a5460d9de41fb2c5d367e1b3e674660175adcde0c08fc2a47f0ea9aefdeb0caedff74350191444ea14c4caf7af4f2b5da484455957e6a52c126f021a846f7ff564e65c838df716c49198e1f04cbef39e3b4adf5c21e14d1906acbb6b0160f9d3eb40de83477c9a0f6c7f6d9db2c38028197c96e82ffebdf537ca978a36af0bd4ee14c5ec16500d73e9a8b6cbb1f85a386a66103c001198a8f24c8cbab33ef1ef6faddf87732e20c8ba869d8b366138f50c52020cef9e440cbf5404cd10f0862ba6ddb36e16df5f937437bcf8dd9dc53cd2798e63cc25d3261f25ec2b18795ac5868ca589b3011acd74eda8e3e6b0c15269d75ae8e277204d5d1ec4775a5a7934c7b201e993d35d14acc54e2a735e722428b60fa535a1639f9e16a153199449efe09e00db171344103a2bb631ec9b103b4fbe19c206defc79fc9f5859fe3c29810bb4b9c62c3a27f34c44ba50f58e429103c243e6696ef787931a46adb3053c2845bb07a45322a7650885b622a70871566df475da94482a059308578f7d5620224eab4e25c193d2524e5b55225015e0d8b78449449964a267973422239a2eec6230ffa1c1e6685510ef4720d99c08df4145509e20226921f586dfb4cf436fba94ffdc277ba08fb1f9574b5dc94eed18456cd9db9023fa0f168b1840a9f56ecec52ff7efc538cde8f65a8d1fead9d052807cfb8568ac8187e661426d70947f8285723639598486281fed50f45862661d94b3fab7a2e8efebd4735eb8f0be5b0af3e0df4fe7cdfd28c2aa361c5ec6068b5a4ede523a0b9a95bf5c26b741b7485441f4de1a2698c3992cf0a314fce7fffac5cc7ea4971d8e06209b4c0a16190d2eeede0609ae756fd661ce87a2cd719aacb647065b46087b5bef089793c7c4fddfce82fdcae5991ba57d26412e49f81d38ad089f8f1f2ed432d3f59f896b9563841641c3e8a714de6db4cab80d2232c6aa7c51e075a4b37044b2708279e2b4c50fb6ecbcecccc54cbd2cb538d42c5d4c7de39222a27cbf4e8886c21cf602a80927b765c6591ef399c6aa6cae94ac6cf08b389f3b04dfa460d2cbf255df099aac15dcf894444606ff913c9be472d8ee4420635d712a318fa51d07b3c8f978f29d22ca8d4562a5fe48c9a401846fd91335f073992cb17272b3c26eba71b95705ee67b5549380bcfc8ad17f13c9c128197e569d329415a11e0655358868283fefb43afcebe895868cb152c017842c98a51031c5468289e8924a4a0a17047b399ca3810d2a17c540b4a0fb288545fb9abc20061562d644f31a3414c40586a99e3b3145030d03369ea0ec36f339763b1215e2bf312d9ec95351498720b9b8b369f59801eeebef6f432afcb9a9cb22c73c3fcf655247436907f2ba228457147ef1a3c895abcef9ae7aed4b63c2f88e1b343471180b4519f369d73b47c14ae7fc2dd28035ccf37c152e40259ba212358d64c1a07d5282451454d297e03893f175e468143420bc053480a41383110465eddba0956a784a39f671142ae6a445003e1aecf0c520f85032bf4de61e53eb4c25eab2ce6a884437208613e0fd3c4cf041fb5badce3e16e7c6bc30da5f9c47dc4ef17320fe2e34acddb12227f95d3c5cab1af23ca628b385dd872fb54208abf992597197fed4c87436505ec00e600c90accabc3ecbc58126369b03e50d70c9dd1c85433f4b16540fd0447c35180a41a207660e10dd7f2e50c4efc11180baa5e4232fa1fa52865000fd175899ed476a66cd30e1a2f3801884d6747562fd4985d8ffae01c0a6c71fa4c86c3aad2a458cc0682cfd242df3bd2897e19c2d9d6a7ad97707351a23c9dc0d96f07a00a047a734c729b46840f5dfcdee81298b9968e143143ab9549c4cad47d8919e20791f5c64b873cfc306a10242bbd026e7f9ca2c15e666291751a94b0eb3bfc950aacc23b017787f20ca91430fadd654b14630d33f1d3b1d1f3e8abd56d41cdfffaac173d73348c8a07261677b418f9a27080efcfd28fab7cad2a53db6bab5621cf066aac0a1e6462b309428797065e5b02c9e2ecab2695866cb412f66004829a853aec5d652c6f9b359a0fa746ba9d8211978c409bf7c1273e2e7cd5b26449cc1ae136c71cc0341ab08fb37a92eb6a69ff2691dbce4fcb3774b49e1a6a0be77bdead220cbf24c892ab712e2bc0b6a620c953cf0f31224c9c2fd60b61655ff5aed38f7a7ecd36c06cf7e9b494e6e2553680360c0fb8ffd090e813fe223bde43543947ca8d9f0fe0e431aa3e8d4744766b256954e80f73f385a9fd9cff43cee455223a568c1823c3db9a09c781d8c9b087e218bbb9ab1ff66b401bf3036fd0ac3881a1241b0570aca2198b118acafaf43e46340abdfb20103e12f2f84c2147e24eaf0ee74817202758ba8013353075fb036e8251a11c7055e907c4044f25c0eaa3a7ceacbcad8a5aa5f0fdf902e10fd8cc95a13f9e4a50a90cd74b0c905d4e9b17978aabc7c3e4f49d7bde4ba4cb54709b64920a60b84f9b32d5faf69794ae7587d0d1829c96226c04f5e10f97e70b3d2c7c2540eecaf7969f4ca8d450a65d994c53476803b8185ba368a2a43df70006140b8275ff7f946239a1ca13f316b11574df48c960006d8bc07a1b84615815f226f4af73e3628878ee0dc99a2e9930d1e2c99642129070b3f5d21db0ef46356f51faa72db8ad6f98999e374a7463c86d448b1ae76787f26a2ea8e38a4ad25dde81cbdac763751a763d0065d60c53e60390a4f47d08bc181e63a835943a8507487964adb70cc1c69db5674bea8bbe09428200da7e4f3420da589a71b6ecdb8b2d1e478a8606e46381e75d930c74e7bd2bd7f7de00efe6c2eaf9a01944485279f4e27a39f14528ca51c4870e1150c25c3739548a43a0f7baa0231eb3adb80ab3a82e15a43328e7b9cbfd239fe8d20c220dd53331745d8f9803362417a3d94753582f38f48e59f81f5d2ec8b2500877dc79c1d328d40efac5bb08413fdad95ba95df4dcaaa6f8a97a9894421b9be03ab1018631ccd3cf12c2dffc826254ce1e0a3a6d6c320dab130d7bb8116cba8e3ef582923bc2c501f813581a54b004c0a4c24127e8c637d1b051ffa0520d826a15d2f1b3f99c0e335ff37d5f147f467f35197b57a5328ffea3792d89ec4c4f70ad4e6a9af8124963b503c916c425e0b3e4382c832e375714230a2a871913998cae8ab0504e25e633ff97c5423f8ece808dee9c646b52dffe2a8777f532034ad1cc8ac098412940c8316b4b5ab424b47aae1680753f2adc4f7d3ced6a41a90cbe6cb91a7f9ce60fe766b05a82878ebe461abadb0db85f05ad29ddc948cccee96f2db9f11a160ce4aac3ed9caa3b008c73ff758c8e6db51b159ddc2d332a49d784b9bb1f6172d5c4576587df6ed65a961b4e96f5b11a675e45fa738f71c7f8e7313c987322083e2bdbcd8c7728d4eaf2235204e6170a35bee752b6ca0216a97859f6ba8e8abe666d393b70b397024493a377804513c44fcfb956cfe7a3b855bceba7eb89478b2a8d392d6c7718a4b25926664261b5b953e2d838283160c0c8060cbc2288bc5c70d9b3cb9c0e3adb26699e6761b714b69f34381ee0b9a5f84df6aaf6a2d4dc2d8fe29fc9fbd502a44f5ca8721afdcff0e216b30b9de8343c93761594306f893e304cf1e662dfeff7f23f3753cbcffb4709777f7fa07f06680a6ffddfef96b462353c8085547ea4826a1c3927516bdb89e0392ad6446cfdef2ab84e78a3dc3ca503ed4fbaba3cd520d68bcfc8c26cee61b3b8310c01b24254b811d32633b22f4dcadfaf5aa19aabdf640fec9892d186ff1622a1719e173d7dee4ad6818d49044876e1cc795439f8368b859f8d3bf976acc05e42f63fd2f441cb45b674013f38524fa71430deb546b83dfb884c985f4ee3f31e97186f95a239e9d10e9715fd892a73b713d374c059e7911ae675b509aec93f13fc95169cd30e5802d2f9753eddad0ed70f6c0e32c163a0e749ef3ba7f4c5d2b754ff3ce77ae66d04f69bdf43f06126188fbdd821c62975144597296ca9eeb719302a06a90314ab1f463e84dd0e3dafc0f3f87772f019dfe5c169271a365f7f8791bdd429df13af583051a93e25a510e69327a974971a34619f06f872e48b43cbb42a88dd3f34860f19457d1099de055477919425609c9824dfdcf26e1e82a7ee6109facab30954ad76e0bf00527a4848e9874fd09e1abcb1eb8049484dd48cb65cade90b37c1a15e473deac5b89a64f8d33be040df189d5648e8de687a2abd5bb8fcc2688b185e2bb1d740bda2c2c258382e48fd65b65ad22a728b4922a60e40694d696425dc8195a3500154521f5cf5134434fa8bda2ce71d4473f976213d0a80df053a7d19d81afdafe5a26bc8e191381d5664c368c784e7bc149a9ad13a7952f0b5cf4dc56cdfe8db9e3fef2ae976692741d1a3f55cbcd7f1a59fb40dac5defe80bfd4edd90a3623c8f01fad376e8f9c3f844cc49609c6dfb265fb133e2b497ffefddd13d49bd1dcad26fbbdddfc6b3f13663f4d02cb6bc92d13e4a87d2d108de51f751bdb7b14d2a6e0ded8969357e3c393609fe0a9ec4224ed5f7de27f00925b9e05799904a390a99bc9740e4d665b5fa5e17611d3846abf7316d86f85c4d3f0ed1f052baf59207e3f0ca1a69f554b4857df97b8116b00445107be932e43d30310b26de085ed36b46b173983ce77e1aa0811e8f25201371d305f43aae274e3bfdaa890455936ac125f0544602294ac8837a348e64bb09b373c6c3467cbc8827d21c033ef3b67aced2d1d6a88c6e8bafa916a91cffc6a6b140cbee896d2ec291512c742cb7450655d8255b1a6d0c10c1a4b38acc6296b12bcb3e4911137f9eb2529410745686b6d402cdaf7f6f88f225147d05318ce784ea2e04dce7211893fe24d1d5079c76dc3f84cdb46f17f1cc08fa0915447d0dedf7a9704771a532013bff684a6cd1928a52e236151213ca5d9696bd8546d2bec401ac92fccae2df4cb24b8a26f37fc2b9354dea4b9ccd154e26d2657a8ca898e49650611af11a0b89f11016a8b4a974e83f61060297e96f2c707697b2b42884588079c2e2db38b7bb8cc8df0a6fc6f1952bae3977528d99844a69140bc173a1114faee1d9e9a205c289ae32c768df823288ca34ab1a998ca927cb03a001cd30254e51e2b4d9c5b40afaccac55f11e24b569e0260ff1db3adedc21788cb59e1966f675f3f25dd9a70f2fb1a65e54f70fef90b56f4b153e1d95896488753f3dfe8042d51994037afd621ce0184f7ecd30018d0b7845cdaebec4cee7f47c0d279f023e549f643fa47959bf8c05a484ce74e0d1dc0e1ec133a0965eb6809f161d6e5b5009cafee0204ddcad8a7d4722ab38c99ffd88ecf3fec37d2cf7adfebf0f0b5080b57d34bcc4047f7e931e8ec98a36e46663b5746b8acd6eb1f822fb88a2d835c44b1817bc50664f6368927b386220e4305771767a3735e900aea769c10b8b4fcefbbeb80fef3baf27cdc2bed9f2a14f48bf979784271ae106c57660ffe87efb70aabf608b4c7cabb20eacfa567c52697a85744391d898762b4bb47e17ffaa6b8849875130145bc44bbee48f388380bb3cdfc535688107d0795833fb2ec08efaeab2d6598ebbac068d32a98046066c0b103ee7e4c27f37ed286155c84e698701bf84105aeb297ccac3a3e312a2c161ab2e77047025ae6974a2ebe845eaa131bdea4c6e9ed810289f2252fffd34ec3f9f7d658ce60c310428bd89cfbd6055621c6b294ec03b835484ddce61443ef936898d903bbd010ec7ee6e7ebadfbed7f1441e27b7878c9a06ab90f3f6c6dc5713db65a65bb792673b101867fecaed7ceff6bf00add8497eeb27c09c18aa57c35d1923a2dbdeb4587c73586f063440bc84a9d09b2e4c824c34fb57db3403314a2a4c19960c5e0b5f2543fa296b812542384acc673db0b982ecdf2b455e2bee613adebb2ee57df81dbf122a0745d1d53c91b25d506ee84ba9bb523d1609263138e7bea58e255549a6ef6d8e75d612c5922842a1f42a6a4a2ad8eeeedb69f2bf7c5977f9605877e686130fd2cb4d27f70ddb562cd2c9ec6e64aac957c44720ae16e7151b421d43dbff2687e6626fb95e311e95f33dd2b10645b38cfa6ef93d817a2c96e7186ca2b3095681798ce4cb2d4c5ce1c2bc5332e8b40b93a444c240df06d541963d52daede0d6d7dc7ef5eb216a8be943eeb7ea61cfe186097afaedee9f40041efb2c2a1334c2260f29f10c35112c6ed8b58320a0440bccf71f1bffd3b6ceb79792eefb9380fb8847bee4fe70197b6dcae6fabccefa41718108cd89b00ade1794cb35ced57f9d0b39196efe9a4654673437a4038e8d9d1673f83b683c3089827958a518d9a622c96fffd34dc20020a2a4d843d0cb00b0c0bd9f25629746bd099143b5503f3eede03d379e47c9949e470aec0c30441c0be8e7515e02273b7fd675a673c0e8db30d7ce09711611143b6de95c8c077de05690c6dd316f6252a64a426289f48c35d901114cf90d396a4fb43d73241afbda52485c5355f622895ba3cbbb5bac07765b044c2264f8866e997450a38cd6b1c234723832dd0116bbff6056ab28520a5df4ccc3377ec8398e2cc5c0e6a1dfc1be3eb2e3d07767c58403ffb4ad2fb6f84a53f3f13236d30a592da6597b0ba7bdc69264477daadda5e5db302ed548dc12f794f24672845c177cc21dad3602d213a9eb5e0caad6a05ef61d3664ebc9f1a966fc91f8d0587bc5b1f71bec8bf25d78c337f98b6ec32eae81630d92f45edd9a1d5971d643c9a190af430cb6a18749fbfb210a0ee793a0765d7ec4bdee7763ed62f0fb088dd95e627794338f7de2a0084c2701d13e0f0080ac316be16764c62c49cb538421f6ea17e26a92cc3ff3d55fca44b99715b6569f07caabb74eef9b776f55f6a64b870e867f9377faf97ff1c6e987c3adc7b8d224f4e81a3fdf9311be56a11166f0db4e66addc0c25d243c8388bdcb76f5255e78ffbb51773520255c0a744e2a7e56bfd8a4ab3eaf4ecbbdb5a6d6cec0b1909bd924c269fd6fba9d826ddd7984f8e75e21b3ce036a96f98eb4ff4c072ce2b42ced7421a34d35f4e31c8a714a1bea3d6ace450642fd8f1f8f5e47a054bcaa78daa24242e1da27bc7dce4b5516472b4b53919f74217c0a34b3664cf2946e180801ceddd85c177c981fea63dc3022bc976d527329487b8365f3fdfbd691e792fd3e916637d1fa6f56cca6ff1225ef8b388022f7a024e4ecc144399b1f1b4516adfdde4e062e873a977ffaea6779f46a7b79747829663b73d2dc11cff27950f2c8229170fb1cf3aae43ba9b04afcaf86f66efb99a37b89ab5dbab541401bd27f4650be9c5475ce6931404275d8e5b144f8dda52048efcfcfe54c9f2f8a06e01406ea585bb4a0438d3fdeffb03313c82afe7ac06903350fc8b7237e3336d51dd84f20fc5eb57c4a964cb0e5edbf55e5cb8e20098df11bfd07338bb8a09605a4e3d794852ef2c5a6e49e2e744668a270103b0c47b06fd13c79f39f5f800912636b459cd31fa39e3ef2eb9500bc5468c8bb950f77d0f7d03bc91cd72d5adaf76d0ea33a919eb0040d654535a15ce34c42c09a8a8d778b2b1a56ab41152a787ba2be76b9b54ba4342b61b46024d38f3e84270bbef334e77d09064f09339498a76d0e809da250f4b5f3cc207929159ebe8623d751036ae3fdc4b5e42b3726cb37830cd35c2f8df51c3d0a8fd8e18bb9c3d30f342ea1c47f6204c1a45e5e1fb3e95fc353b4c77e33d1239b9effe48313c82b21a10d493c75dd0676f378b6ee12adab69ea37d7a24bc66f262d1d6c2529b3ed5e0010679ba7ef47c1c5aa0c18e5d1f43973fe744f7ba4da187cde31112d2d78dce8ac142613e503f4b74b20a7b2743da2a830dc8fe829471996f29b05340be772cece75fb7abf9390fea5c63a1325cd51fd1a63695364886d22032cb3c11a7d15285252a9318fb26c0b1aae57af3094a18b0be8dc03b385efbb81b3d7fe8d0592661f421f0510e6b0d4547bff045ccddf03af0299bdf1e11390fe3b6194951d49fd1193a71ea47dbbb98c6912c6bc60e8f5f3580826ed32980ef8636d87de558463bdb44c824dde043d484ad48f3303b99c3eef15296724459bbbb857db64f1e0d078c392bc3ec5fb7c3be12eb4a872c1ca33cbada45d2efb8e111062eb508b683dc3bc5a8e33e2dc807883c0b7fcb11c2b8ec1e5b0a337ffb3c1c0645f2c3fd3421ce536438af44239722215f41e7122b9624de9fdfa21818871068cf7c980443cf36df230573311fc882ffa10ec404867ad00728cb6d0c97bdc3fff0fb5331856878eaa68e108a46bd3f5cd5293a9c8df6e67a969ebc32f4d7f78b825290ffb4cd07fd37b350f44a3f8b578b5e1e11d4cff1258e28f9682a3fddc9a57c8fd24e1996373e0fb74aa7401566bb4ce9ba74c845e9c5daae30b0773ef6181735fff120103fef0955206f985299b8eb7effec32ba21993b2fd5de9c1391bb2da103fa6c91461a3ddbe84dcbf20ba9c85402dbd90194b48a4a03bd311834ef71b9049db22e30c69693325511f7832cf61c9d9b635166ccec60af5d2e88620eb5aeb82080520cb33d244640106ccc6e1807abcf07f10cd3c7a662998b6b34109b496c3de7259b2d5d4204a94b2dd8c4af5a8d90eac6af9b785de0ef7cdc9a1aa90deed84ef69a4e23650348c7ec5de0ad662d0c682cffcfa3afd7eaf3cc40e094a1b86b6b841123ecf70b9ac2f48649d7d4fc06c60d1ed7142d463e912ffad3bbcd2ab51c217e56367415fd2c320640369f4eb02e5a119bfcfc224b44ee46e696eb59fa5aca54be9a3a914a251a578ff753980e05440c26269bf22623a753302c54de7f8c0e04a2adb364f11476e9bc9d8d39d2bf826e0edfc56e676f6f5c928676d779bf4eb415ba87c1e1ccdf3e375bc24ad115fc2b90fe3174bc998e74072879a9285fdb853fc642f948293d8a16f4125fcd5ee243480c962650502e8c2744f9b8511a1e89a406362d9f15e135185218383b2c314df4fd8e7496a3fbb7ca0b9e842014264a2a47aa2d58c533fcc00d9309fdec7ed09148a62fcfa9391ade43d1ec6c7ce2460723b6958c9501ca47ca1114e36e670dc6fd8c8c9ca263014d8a5890d31fe8ebcd19e615a841586308d1ecb3a46e2c5a9646416fb1b9a9e95c0050803a81f71e8cd7cbf2eb07d3bbc1a5cda2f9855eec976b45bdddd71262f37443d4fba90bf563ae8008eb95c9f1a6a44d855b7a5def6d4f5930b05c585e7296df214dfe6d7ff7f8a33bed0630537cff9e73f00ed371c223283208a2ef1e62214eadf2bbac5b29e4c2d02efeecc0ade1d151f8b16718549f877d4b11c70e37b0da648811d6a58d8f2f7cf69662c80c3cf54931b278aa44e8c7127dbeccf7aa949e47d721a41aec67f86cd27944828ae92cf65b74d3e172444d9fb95ff5e6b38f4a37f83f91b328d6c4cce07b1438fc9f7062a4bfa45523a44f86c2a82cc0984891ab5f810939698ddff77a2c658f580cb439fe6903c0b870221ebb5f448a034cad0603442fc7f8aa42dee13deb7a15a7f9d4bff527c23ff853fb3459195a12aa87d2994238c37053f18b440bfd1ede2c86f589d13378a73034ebd4ecf4e8c1ef2d6037abf52d287246c7f90115302258e6a20f52dae4361900f48c3b519b9477f9045c6171aa72ffa93a7d20c04828d078fcc227fcc47c0da39fac8a5133e639c606e6b7a32b46d57b6733d7d4202aa1a73f0f72ce2457ee12fe2fbe2fc26c3d28f14b2ccb30087c56b9f47b62792eca02f7e54137583c6353c95dff6fe679365de79e211b447d2eaa02da584216e63821f73c33b3acfef8b1a7a5b1ef6c0ee712f7dc31ac7b308604dec8160759c1a6880dcbe9be5021bc93755854d9624a534d09bb00285b294d1452348141a5a148f33ef7709417a8e1c6edceca2fc2796ffdc708bc22d730aabcde2388603fc50c91f40628c5e2cda118e47b7848151647ec343cab8683d2a7becdae4c2fb019216cc85826d335b0f654352394346bb651f08f6bba9f137b793caff3b8373b1d740eb28d4ecb0cd00d59022c357da3d18338c150442e2c416d7bffc1b70306c9a2d2e380006b09060fc95cb381a8b8d990f9bea6d7c43b1f889b7a952755b69abd712f51c860de01e949246676ca91ea30c3a45ddf0ff4442b59e048e5bcb08a6b01972357d537fb8d1f5a4fba8965df2d05f0cef9a5255757f36e2fb3f5dbfb8dc8399fdde1918b559d3bdfa444785ef499810986347afb867eb766a01439e00a20b00c634eb2387f29bf7588ed78a2091dcb54c4e071352c5ca7dbb1ed41c63713982922413883b5c8c52e493bf2e4540886b64eed48110e01bba10d32e7a150f21ad66aaab2621c80efc7918b3914f7ce489aa0d592e1701004e784a8f93766da0f2843e8076d6d47c18f21cc675818b1e35fa6ba0b534910d34d2e42884310e73562eba9fd7d65dcc23fc43699a87173088cdf5499963b754ac9a9e6cd7e98aed3716eae1b23116e29c370ca65b81278953bc009446f2cc8ec85a7957d157a6e05e9585abbb926552da170a3a57fd3f09ad5e8b082c0dd7f19416072dc390c1131989c0c9f8e699b5ff38d611d27f5a2e532b49594a4a5dac06e890be23b306ad22a3a38ffa20f0dcbd6a0136836fff99eb9248abe3b9cd128676ac3950012bb6b1343ab9ef40d26c4a59b9c0131c10a06cef5d6f1c37d0bedde98ca8576eadf9d1ddc21b11a7f2198477ef42a82cec0f703a2bfbec57b3ab64fbbb7351ff071557ab05feead94bfc1ced0efec90df304ffbe44c93c3530d449d9651471b501528f3028b3517d2e45d123aeb6bf4af766f6fe401d836c121eb32d523943b5a4f561d350ae4409d30492c1425ef742f52fbdc2f07fdae3111b750718ca49af7ee67add4066baacdabfe386ad62c227940bb6237ff7773f6ed1554966f0df829e808bc7ae42226a5223bff04724b1618c4bdf9e562bb166bc17ff8cf81fe957a5979ec17b7e5488f625049e51b87f7d2a5c6c4ea886525870046b6bb3ad11dd27e8be75184c610f0b88138b85d17653e17688e0ba97274c242a4f9fcfbb5bd2570ce8662ef867201ce1d8bb05b0ec4520f42fbd6072343828455dc797066691b8f6f85e8bf6f3cce9ccbff35f4dc967325c33eed6a6bf9e8ce953465cac5cd4aef568aed792c59d482e85b414585815cfda3ea1eb9f82eddf0439baa375ac2b9bd47423ed9360a792c311e7ce9bb2e2b35df8f2e22dba0a9a1befbf77a4152adbd984ea71f26db47210d5bda171c960f53ebdd5c42f7ab7732cd7ca838e1b7d80eade188248565997bf693ba8198ab64a3c0bf867c7770298ed4375b1b43a58a0ffcf7714b15d905c7cce9bf502083a8fea1caf754416fe2e88599aa867127aa77bb3e3c74330ad08cc2a0fb898e6dc59f06fc7422500b7c7670d794665db97dfdbf53277da5b49e0df8797595f5e213cb4036cb541e6ef82b2bd3218035f66089842a0fd3c339dc56157fe9bbf10694a7033bb11100ffa2aa547149b37a960e0156f8a4ca52a05df078662b6c048963e2bb2e964bf8b5846e4751ffddb373a20d4a7e3fd3ab923dbaa9a2fa48016d352e02b09ef0455c73f0f06d6be8701d60ed333c0bf13dfe1b82ba7810e91804903ff8fa133ea6047714d82e74e1793500a4fa3e102520bf74ae7a644bc29eb064200263447ae92f243a6744c6cdc440b56e15a57deacfd6f7bfcb40239c4559d305740e5193f524f217f5ce43e8d85866627a4337318e3190f9f4a1c7364f083e76f66672fe03a0a73b9b26aa45a3cd52d99ccb9aba277440c1220141d23964193b0bc12c06a227fe92f2e73aa1bd0fcea70bbc53ebf34c46b68acc6679c688fe6038892d6e1d605da889f539b7b7cbad646d72f2d8892b31ebea588965faab882e5bbc056b0341243ef1195fb716f19f0b52aa37d40307a1bb7394139026c11221f989c0ec2a8fffdeb1bf8f7b3eb2681343e93934a89df528fec8f40334fa75fb6b7e71123fe3240108601e7351a6def27fdf88ae45e962022d39b9e1dbd3ca1bf4fc67f4fbffe59855138f6a63797f9ac30e2ba7752f8632f609d9e243bd365844104b96b577aaa265a6267af55a7aa24286fdf01d8fb37a0ef1db2de1e3d83f9fd8379a00cdba2c0e57478c953065a4e5698fa583c2433f8f289fc47ee39a10bcdf67d64244e9137f9258dae7f75499904f9d10aa1c53d1b3be25764c8078d6b6415be28016b14d02a3f4e443a42c885b4161bc8cbe8b1baee76752473c36fa3d0ba085e8c2e880d105db6b08958607674f58804f6cc22e1d8d9b08458cb5d1ffe016eaa40110502f414aff45e39197ca2495597c81ed073c7d3933de17fc3b7ae704216bb607fdbcf78adf807f94b6b9081583954eb4b4cb8df945bf34da40d1084dd66efda0f3f433ad3b4ee9e165399c7ca792c025619b87c73160c2b940f44275b9203bf428706776e05fe3a37c62f6db3839918abf2de27c062fbe335141a43e26e9f80ee58b6fecb6ed5112d4f42c15762deee22f44611e5df5c88a49cb81c0d47038d932cd453f9b767f86387b2bd2c4511f5ee4b09bd1e5c7d35e4ccad0b083a89f5ec0130a09a93d33b2be47eb35c94c4461e8af51fbba6721b7faa05bf82a8231197fdee2320cd9a535f0e8b3853f8876b6a6d338a0e16f329148b1cc3f18141fee5477f969497c92385890d4a98774c48fb2ca3bc76a0512ede4dad728594f44744bf4010e24857b326709ad94808a1c381e57492e5082c10b4808143516482043c58c4860b36ca60809ce59d6e21fd77bc7500962f3f83c6da5d7008775bac24ad32d1169332e4955d7b95f318e8a04bc900871c30e6f77039b0a167d4e830ae65c7b9ccab34dd7d389f22765b97c213dc4ead2e33ef181ea5a6e8d13b3e8aa512d5a58d9b4584fe700f45fbf955819c2226e5c5466f4d3a25cd4c7f4746ea57cfc50aad68d64b3076d7a4c891c5e98a10391b2dc7f814d417b93ae0c1a9fa9a9ca9d420ac7f7718dbbdbfacb5b765003496535968be0fabadce84ae3ad2a2c9f5bc017a86a9628a35034da490d5cee954e31423c78d66e96182bb3b73f0af0036565dbaebd8becb597812a3a15aaf1f5c9f9ec809ed2e3f88ec2241a6362140f416973c60f33e58864314ca9956628b34562a63c7c23c81fe53f916f633951d1a6dd64843ee0dce4f7aa80f9125e6a50aa41ee87deea95281545d06018674d803a4700741fec570c016e517207a6d37616bd22a23bb3287beb101dbacc9f5802002641e68dd0cd4347a5559af124067584e9877643485c8591722b94858bc043dc20d180f78bb978d9542029089ef74d2afdf113d2a2a27315ed36c01b1924ceef07330edef7ba038c17068e118e01fdd045c0d988447c66a458661717c9efa843d5060b7622f2627e4d6f67e7b1b802a9433d2ef2e17a77485976af9222e4b69d21e90b529970e991a00d91519d125fdfd62d080a7d2926a4067940c4959a957404da3f363d91b61da2d8fca69d0aa7480551e82b8d602ca0eefbe2809bbbed85f7f9832e2f0aa8ae96e8915380bb2fe6dfd045bab23050c9e9d1f060657af531a041469b214c8f28f328a1bececc8fcbe44edc4875b057fdb69a089737ee30671132c5785d1379598861e16fdd8c6621f482ccc4b19f241c04161ae074492fcb5a3ff65cea5eefee5cffc3b830b6e7c0c8a0d7af8289bfadb09231577ba0b4d2fb905b1e46661a79664ac796007466b8c7963787c4abc3613ebcd9204495aeca319c909e17eb9c3cd81256d4bf0a3032aab11f70b4331462929d334a00c9c7e0f7c2e125c466ed63149b19be8ccf5cbd2319ab53ef50a0a739f075025b0036c625b190383793cb6a24e06d066e97f541019ee2b41b31a2a239a2f6d0bcee712437eff5f94ce21c9e3b1b82d2e454969df244812ea5b69a03e011c08beaa71feb51501afccaaca150af8979abdb346b7581d1f95528c5bfeab00f4a06d69f3fcb1d8a573d05faf12a6ee68b772b217a6f5f18ffd9e8f80c38b6bc7abf958439d54d1778ba1b0bbe26bc1512312daa200e523a8987e8c017097551a4308304abea29de6ee45b563faf2f5f75892c5bf9f9ce75983c9759f17030ae0ccf6b28060789b8ab2cb0fc616c28aeac45835a398f0c0dcc7bbf6b33c88029e5cc7da1761b6d73fbfd65e259dd6fd3908580e4ed0199a69bf944d2aea94dfe27edf2f2f760e8b98d9698674e1eeee5862f71e24ef7593533bb6e3bd1b8d0bf07ade438ff3f82d5ac9e373f2807c2081e235b9e4bb92617e222ec4bf0903bf538d1769c7c426d10b404e30914e86c5bc899531d5ee593509762dc1cc5461750c042549fe743e1e9ec70fed3ccb1de8e43131ee0ece883ff9dfa5927aa0c485776863c7b5f2fc6f912b1979aa49044806a8b43f1b947106d9a08b6b27bb5881668001e4277d2da3925d3682d6007f19e0f3b3d8571918b7a652235f5d90a186109e98d53d8da019217cc007719846b48a3b98b4be39151567532dd32d9c33c00859fd132e3f2a4c5e327626ac7c604ecf07328b413d9c93b1d470e4fe21ecd3dbef6b3400120c60842946fcd53fa144dfde00b2f0c8203427d7f88bd04986143cc633971b2c667e36e9d9bf4d808464c496cf82ca93fca40cba3e63ebf893a495ba46c419b4f8cdaf964b69dae79f897dfb2a11cc08bf840ccc5494ea9f602489a714947d19ae479f3edb0837fb9ff83814fe1990dd5563b9e0aec7d5751e4e9dbfdafd70a635a6dc6d9d59816385fafb9b152bd04e69bc6aaa3cd32d2d064b6a6864a873335762ffc298315442cee4038ecc5f9e7ab3a0d620b2cf27f95e1b66087994abf1d0055bb97dd1d3edcf99dde50dfbc7749df1f1e4a4d68946b0d2da67f7404dd1d8947b6183936dcb3b777db723a23c94fbbf208eaf5a65bc35aa9770ce67e9885e6d6d3e0bc5c89261ed302fbd24cbe7225cd3127f6eb13443001ab4b9be680e8dc81ffc03ab6610b3a23c46969aaeb5b63df4559d0df53d16c3cc48cad7bdafd29b30edf1278e2a2d314ae9fd13e6b58c92fe95e4670ae9c8eef5cf52af71bee3921f16fce53f426614d6daa92cfe2bbeed4faf52eb9a37a81b6a3cb3c0c548290624697cc4215fe013b5061686e7f918028697941dd3bb47efe8b8507d4cc8dfeaeac7f9c7002d480230441c746652559af95bbf3ca925e4c20d5a2ce913fda3a9a071977f2ecc9cf39ee98796df929a26205bd1f43a8ebf3f9334275e9821008db4bbb4c4a8f0aac0d3e54ac0e76f99a22868e62a7d7096195f4bf0d40cd2ec46ecfed514172b89eb63640211a146d3a0f8cfc82b2f3455afef2c1bc0446cc5bcca27a3545fea4777ed6ccb399dcd719d5f5a549b8b5246e6ff81450ca5fa047de9c6f6ea8f93c543596686e2a08fd86466d9c58a1d6babb45181a6d87f433a271839c56a33c4c55943ec7f3115c7ff4eeb4ce04e76be29c56fd165f334602d3e433385e9639eb53847cf3dec9fd0d3b8517156a2ed97ebd5d994d76942f6c57d9e86f8b740c8f93cabe45608e9c6479be60fd8db0576cc95cd06387b19229f75bb82c11fd32996d128046ca12b657fb7f54b91dd2b66eae812bdf971865003737ac07f953f3ef1c753b223c0635c23d0e15fbea0088748b3860ccb54781eb04b4957e851646e5c69893e2f3bfff7b3221dee358b78c7887865d51bea7f37fe10b61f13726acdb994d0c554d43e739d131194b9316286d37f3d2b12e75f65c228a72b4382e7c383acc4b4b670a2d9287c4709ddd0f8424ca6b83c8336270f417fc6904a57440162bbbe080a1ba034e264692c2d298d5b30ff50c1abc5b911ae11e34cf1e44c9a7b7d633f5e94950463328ac35afaf3e7fd99366d0fdf57979b7fac4441218630a7249f9d1f27872ef8c7972929fcb5cf271fd3f5f986fa394878cb649c1114a10493342fd6a0356fe2b152089fb30bb2f4f226d92f2ab9d6f938a9dcd487ff9fe624e49834a3c527b5434da89df3193568cd524b6ace77a4d69f6d6e14ea24e87f3093c1f438a3cf267d85b651f1d7cfd7e5a176c9f5dcbbef5805654c9421e6380597ed0d6912b4ffe88e2a3856a133d74a616b7ef75363a9cd472ba9b17fc2963e89d6146700b3b6bc31069d993f4d7f627b654801f91730677a49295aea30ad746b1fdfac6d54ac854665c4ff5fd3de3b957abce291f0fcc2ef47c748301ff87c15278dcd4c4b0c07510d8bfb400856248ce22fae0b2061aaf00ace98c724410cfe3ad6068633dc514a80652de101b62e77698a7205214a46045fa2eb18efcbdb865815c347f0f7f5fd1441dabbc84e62000c200824cc1e5c7ae60bbff0f3a9a5f566f4e16e8593e0896c4c9fd99a528f462f00e86435121bdb85b8329497b357ff1ba98c06442b963fd05217f77c914542f472ec8270d17aee2728b86d9aec4cfa479a513e2c6698740e4a51e8b1dd66e422c821fc12ef03fd3a6ae0ed51adf6bbec7e5ebab0abb2ea26db200b7385e8b4b1f4efa0576e17469924361114d83d3591bd6ee5c8743420b986c96356900141d76d77200252e40b9d25f6effa02483730ef1514f185d18bdcd27291c3c31a2d5dbdb2f424fb3fa15b24524c10b6e6dfe114a613b784129448ebd9bce38198714566d01adf2b35f84b249efe9aa551f41487ce3ea179a7afe7fa990f8c019a6e47bca1571576550d13c68895bb4c3f4e5b6e90d2ce3207cbb9225c6e3d6dbdf3dc9c0ef31b2883fbcaf384243ce5c79cf9743b7dd3be68c81c6fbee822b4400cd0d49c871ac42b108953ef2d606f11a44816e1e02910925dc6a4c45513aebc2703383485312dcb6443dc9417aee8a5a81f10611e10f37823281b67f7b47dd20e871a0af0694c37023a4f4e9a4b80d83ac65d73d63043a701d816be10a86c8d1c0d8c148451dd8d59112b2cfdd05bfbd59c7a06f56bf5c5fb2db886d7f1813331cb1d10dcffe6a3d5410edbf648deb31b84f6fa458daa811e604e69b338c6507f22fea30b62ba5bb51ec018dee398affee7f7ee0fb583501c9ab4430e11b2f2bc6371e9797389b09466118003d2e78d01009fa6f43d7849eb21ad8d0e9b5bbda9e9b76bedb6235f10b473cc29c1940c2db05c56e1130d43649ac716ed5fbd33e9edd0075cd5a246922a786176a053f86c537d28b2c9efbdf83ff49f29c480676601949c17ba73d68117853b6b2393914f46cd9cc80f9cf268fb2865cbb8ce13f5c26518c384a47b4ce5b359cd636ab32170bb27933d0b2477875e63f85a4f93a6100d68d4636443931caa51b9b399f1da0d4ba3a006e9bbcf5c68cfc0ce020f15566100c655f23846637775bcf822f2cff7ef5d0f5b1a05e072efd99ad21654d244fa0d2c44f03515544a664481c19c8314cf21774cbe63f597fb3bd93c0bede86ea43752355ead639f6b757a0c4c49f6604215e45006097f8c53a305df733b78dc66bc2ee2b849a5c07f5fd7b34d3241f23c924f3c676b1a41a291742ec9e247dd135b769c9b7b80763b827b37863146d9f2f4f13ef907957c6018feee2dfdbb1f0684f9ad54f29b913a95187df1f18f06210edf1c2630b32077535b95c6bc3bbdcabe5ffc94d01fe75d06a289fa988e2c9e7eb5abbef930a26de8b34ad5d5c99a3abe734a2eefdac7d974aa736b00aac8dc3d960f83c95dbfc7fd409f4e0e2e3da592b4a34bcf02ce135804ffeb8f43b78cabe5992727eb1f63a0a913736da88e0a63edcb1113a13eb7136f7ff46119b5ee23e8d47822da8eaf8dbd451d3b9a5b6ff5922ea3b782ec002b0ca6fa1ec1bd8b2aa972e27852232de5cb4fa48a2979c6eac1449f67b399dfd8b77f02a792ae66fda91a6c6e817888a140af0562002e09e259b9db80bfffb39d029865fa4c558945c030f507f037e77bfc8443c8d800b88ad1c13d8aa364cb61040f8d010be7b4c893783a739b3c9f45dbb119ccdd9e456f11c553980c8bd107bb853a07ff9b586904ff24eb1c4655ca8d38b518e42a79637852ab9a573236d726cdfedd394ac0589d13c0f3f78fbc203b8d19e77b53234dec118e01fe42f687f4ade22cf3a68dd941b62e4c5189543a9f4d05be7c15553f26039de84f173445e381177c3a8c80b1a5e0d13a585ce96e50b53adfc8f109a9037137ca8bed5b8ccd46e85302431b69b6fa471fc1c184afffd838beb4ee1be72ada88f63970e140adacb05a06ede2ce04a9538ea7fa07deb797c4e6fb9411ef805fe9b287a663dfe7fd2bfdc0e61e8c7df0e113af9c0778eac0d63449830aee78f470c946f959b7f434c741dd7d60d2560c7508f78cbb3b67acbec486f95bf13247273adba2c811a61da87dc4607aa2eaf7d5eaff79589ef82c1adcaf788fdebf7eefbd504a322a6e1978a095ac2251ad6180a9bd7160db953137c380e5799bd610b5091bff36498a86fe07e1dae6386f097987d532476a70b6a51d82350b2465eb06f979c3adf4fa1561928243044d069288de875a12a73249d9dba92617b389801ddda74dcd00dc6a1f7ea1c3faa71d99ff7001defe445351c8eac5b202811812655558678e2a140f9dc2848cf0f79254e499125e186641ef3105815a4313b1581bf813ac5bd37a3a0ed3650224ac97739278fc967b0b4113d74477f80c94471fa7ff8af9ff615429327c289f3a1757874b4320059fb5296ad3c556623f96049f42b0500fd89257ae145396e03dd5b2eb0f0a9ef91d3441cd768956d4c62ae305c08ea7f01524679b00a5a15ac251b74cd223bcf1bb5805ca43e071de35d2fc06b48065c6002397bd4691099fb513837e21af96c2cd638c9d49f1e8ada14233c600aa872e8556a94890b47d720684df826344cf1c0225107f9455d4c45718058dbf90b61850a4d7f57b47a3d25793f7ddd1dfaa1af03f53e521304cf4a63d4259e683bb60eb00aab6a34bece0b5785091aa83c874894d2013ea5950a185c0807448a62295dd196ef1154bfc8977f788ea8be609b6f56415c7a8ebf2f643350b201f1552c4720f053386e55966dad0fcfd63c5507a029d81b38ec0c5b7e90916adafffa7318b086852a36d2e9e963ff3ee9a0b3488e65df7d894391093a37eca543fe3b8fcf48f679d087971267014366e9d51280d2c1f1d56c5cadbed0d1100c874151ffb5a74723abfe6bbd7663619d5375d22391d31a6a3b1f6cf5d240db5b9bcb36fff0a2e7dc1a6d39bbe275e1f35223d63efd4d594fac050e3b7eb79bdc090f7eb29c666c7fd4d76bce22def7d9218fa12a75344b6e10782ffc5e1339e8c9edbe6912fc1f361748f03d56a323249e539ee7d28faba7e5c639441f54bc8ffe97e5ed4e10939ee7c1dbd3fd011f4271dcd7820d56688fc094b3e7d44b0b2f24bde3fbf3234edb4c93f920f4889c7e09c1d6dbdd8a138c638ec4e3a52b46a831e58a647bb2b4ca49cddaba301b848229e8ca468c449fab73d84f5744900bce98bd289fe7f2d46158d65e16a0f925ac476f6b46bcf52f7972f1d2477de2a63d1f9cb9769fc40bc5fc8440c458a18977ee00a1805a2015df979d3ebf318b7df485464e9dd3613b86faf77758f612d26e1d50bfc828cb0c1da1c6ba6808d725fae0522f243fdd5e97bd6e126fa56dec82b32a690fe1e89c64bd0ce42127efb2882dee587a3669846c094acdb8543d736f71d7363f2e5c040c53568bcc7a49520880f8e1298c2ac84045a2e96aa33ae886df5af218031df576a3889ff15eb74d6ad179f4cfe53b9ea2a63b3dedddcf0ca670a0710c6f7ae5cd6d39a83826bbaf041f2d903a7390df630a4b52ee5d2fbbd4e0ed45c948df67970e9c5905ab16276d748c66e88538e8f9ebceae0fe5fa734a75d6c225c593bd88232595521695a2f94d0dd431b924a9c48f50144b7ad3019f03d771efbf5a9ecc54e9a7b951aeef263584de89cd527a4df63a7fc0a422d5ce9dee34af6ddde3c2bd52734c37bfc94a528806e902850a3986626ad76a0ef76192c18b56c51e25169b2064039148e976512b26138fc9359ba1ef715e1668af3a67bcb4b572a34894b07270fd46dc297d75123180b7e4317723f80ab187fbaf03387c7d0f2925f3ff3438c66f41672b023267b005ac8fd5ba782b7d9cfa5841c613742d0cfde7f3bfcf2e02f5105612d066b5f395de08f001de20d420de146663f7a4e1b537dab7b50086c6fad3cff1db89274fbd07d6ed16aa6dbd2c5ada51c0900e04497a480f3d9f54acfc3a38a4bba3af5495ec10c5a0cd3a686ec3efa0d991ddcbe3498e9f2a68c254dc4bf8ba70897b1e94f399cac4cd8ba4e0bf30a4055c596b2a13f24d0c859c1840393a562ed65039e606b86a7469681e436964287cdf5abe48e5ef983d8a086e74b2b1bacdf28c6b16753990f6b054680e9567b507b95c1e45ed43334dcab3f3e517a9edd17e74478a8622fe511ff758bbb30e8e625b00ee0682cc4cb606000ac68ef45677beb04ce32e115244daae104bb76c088ff8f9d138a3a46e43942ec2740a2289c6308da701a72d481274f10c4beadcccd3a4540e9e9250be522a857ed820ce6d79788d1359d609e48ff3d63d409d0027f0cf15169a6f70f24d890f0b7d7bbb16c133b23215d5068998480b4c7ab2589744f3ae45d92ba94e4b840d40e256a55c0d27c089796f7fc101d457699fbf562b2800f810ca45b15aa1092e9e15028b385a389268199493665628a9e32c54a5d9e3155e7b768bb33169f5555755cbe009b6327b82aa9c4cce11e6ca43292e3024b9a2f5794904d51f9994f851c58444c4ee85950120ae89a64a209fbc000b441c6b18db7856d487f7d7306a735dbced1af754f75e8f77d93426fb17badeb80e82471093dd8d339d9bf11573a8626e2aaf4af97a5ea612958e33fb702bed2bb43676b2070582b580597454e7e98583d6fe58c375aa5a2795e93b96cc3e001ff2fa0df8fcddaae70a1ab9c15d6e352821f3d7e4d4f2ece6646a65ec992246b3cd5c7597c084bf4983a3b5ecd5d4daa7df568856c70e4eff6063b673fd658bf16ba31e0a10551c33cae586ccb10d42c4269d1a284981002c3eb143aec6b705ae9612930ac42d42ca13897515d613490db1aa3f8c70c3975e6de5d59023b7081a5fdeb8cf92eef40fbff6f71bf7558542474c6cc60d603ece3565658f0af6b79d60aaa29986cb5281f6f3a74a3c705efae93cbef884949a9ad8e19212db2390eb8138c41526a79259056b5fc91a46d74467f66541baee1552ce2c149cbef06eca698e02711703700c72c2941791aea5a10d531fd3fe435f103ba61576353f2324d56d61a205c45e61f7160420c5dfbe2f9f65bbea15c6a734aac427fb7b0127830a105c9e40b226ac4cad7960c7c58a31cabeaf9fd58d73343f44e6e5c357ecbc4120e20959665c85bd25804e3d0e1585abb5b07ec7c56c953ba2102b5cdb8afe8686c6e9f8ded45b48c4b940b922355bf34e28712855a254cf75a9e67fda3e23da0baa928ad0de644415c99ecbebababe8760a98ca1032fce5565cd850f0004e8c2f3f26fc57df682f6f9583ae6d51ae31e146cbef89beca4a82d84637f800b5f2bee9f89a874cc77d73ad031a3595de31f99187de9f9745848a150e102fdbcba400cdcddb91137a9872af7044280f1d0a946a2959fe9867b5cd12e48f0ba9ef02fc31aa01f99ab318a39d5c4a59948590e4ca9612fd7c85485667aaa3f4fc21fca999de9518e1b60c0c10d93c334e20b0f4053181d07985404854aa11b7e9b6dcfd9b41bbafc7be40b3ad194d029b75a0b08c1eda23ccd509b750e7466fb29df09db370ee61797002d00b30d17510feb87c6dc12d2cd56d5efd153bdff0af430afb56985b85de829ae3b6bae47820bafd67185f143f65150e67c28d4625b5311ffd26d53375d2135d27f602143bb3e33cd3e38e056b6ce97a70b9f5c984cfcad11efe1ca6b602a5807309a323785dc491a56b0b14b802a995f1b4d4080e7a64fa0866c0a5fa36fb5ac7d6b24f8b5a742fe500be2dc96674e826b8783e5e692b2d0c5e7b90724c71b823424a7bed26eb9ad088656f72bddbed0d612a39bf949a18f6f217863bcfb27a669e6885b6ea5e62c1898c2b3d688f73247a74ca1a328e3825f76f3bb80fa97c1897f21ddf483967db2f975070aa3d38e22cf72e638751ad810c6e8f60f08049079339f0d71f383582cf7fe0b43ca43bef3b726b97fa69b4c0411d2ad9a087170c411dbd7cf71ffc9844c4d12c1bf38ccedc4619ec7c1ad41a368bfd0a2f99049cb448c0b5c29c7ce0f7bf958900052f4816ff31d7fe6eb2ca8142ebcff9dff860c56eaeeedf89e5efc6553e7a793eaa72430422d1ac5e9005cdf5ab2b654caad56ac4802bfdfb08e39dddf90e5eb040fcc5ef927cd4b809d6b7a76164c2aab84b651cf8e234c313d4efb6a1fca027b493f43e5b8d0c0a1330d185e0deae495069f604eb8edb66910d88baee181354a2a39d006cc0167ebda8b961a8d2df23e87cd94b90bd37ea14e80655626e1931cf2cbbd5983db0f66cea7c0e38f0ead245d9ad9fa06464569f4e22ea82973ddf38ee2694c86552cb3484bf883fd55fe00bac26880ec4c1d860c85fb976e14afcee7826d483fe53efc18c5d0ce0458cd2edf2b7f3d108476b3575ff5f79af167898b9ef3201167776c68649bb8c3425fb414b8aa6008d09ce60d65fc986db918f47b45cd3a7114d5e45f15dc6302a6f24e87eb5ffd4ec3252df373f0f4eedef680b20d21162605a240aa147cf0ef9f2fdf5dad38d99fdeffb71f26162f39eb81a9abab8368ea7b604b60f41823f9ada52463d1e5e6973a60996967707abb0be6809b763a62b501fc68d32a596855bd7f39046aab4dda6382a277e54aa0dbde3ca3556ee867fcd507eff8bc112906fef35e6dbcab491904e02b098db3591789dac59e9d09a1f132399ed05a19040d3ec1e1b3884dde6eaafa9f7199cfdd563f4a2f45a166118c9f7e6394904223d601f658ded7594c9f2f637bc3129a75fa42fc90aac4e8e31b080134d09fc9fdd149f0a2d213b6e9cb3cbf6ccbf42acd4b6e79ac1e75ec1b234325007fa693aebdd31612eeebd64076794d94baca1c94fe3ffaab7083261f583affbacc2ed2a492c15d67f062dd975d30210c3d82ccd4e376308b43f80524e82275d01769149aa7c04a634a0aab4a16e886a6bfacf5c49ba4ea77bd7d8245492d00c5ae2fd67112c0d0d84d3d31b064fc3ddfb01a1e545198dd23ad1b994466eed8054e05d0fb6c631fecef55d8345592e4597d8c14a11d4346b89bb3e7a9c1d0dee5d6786ce0e4b8d44934d55ba5eb133b864d45ddf3b0d5df84fe44ee834f544cbc80abeca9bfe437c4578baf63d659c26b25dadb444940d4bd45075a9ba6df8b7fc9ba3dd2edc5fea4e56f2d8b99dfafe5a93e42706889c5a238c144d2a4ee3105ea33fe8d2963fc2299255a84a83bb0180e1e8ff79544097f93e607b5dd4f0948e1344f4416f26d6841a114d8985dd936b5bffee10e8a177385ab30e511f58e2ede9e4744089ace76c276b42dbe85252f63bc471396fd43675add0eb662d45ec24c555287cc8be7cc47fcbea19491edb2a4b1abededbec294c5fe9c3e14066be6003fcedf01e543bda0f501878d54f51f10b48e8f354eb38c3636f6c423002c04782f56028e867d4f4e161d08de89cf61b57c917935394bd0cb81a72630f3fc3ea3f08bfd68e2ca4a02c4ba3093a1fb9594bc7c2f04a9269ae44ed51450aa91bc425e2ffdeb7744e852d01654541fbe68b133b2baf40f0b5d16fd927e7227fe6716546c4fb340a73ebd04d862468776e4faaa52f75e65194d9656e223ef576a3b3d968f9d3812dec90a6bccf15b056fa884c9cb46d9d6f025ef5fb5d98622dd490d20b4c9dea395d97215edb7698c886ef34fae7d539190a8c742f484e4e27e860537843c5fdde7ffc78c39dbc970699c1dae41882d8ec9e8bd6ef14b4a6cacaa1b0a0f8e2123b074e48f545b9cf5a71d7fbb1fa85edc305a7346a9619f4891b587fecbfe97cdcdd6ff4ab6f3cd1536d97a879e5e90f821073adcb63538e2054285d412b8602357502c3cd81f868866b4f1e3a3a1adbeffc718e35a9d817d3d459f6abf602b1f060861fdb863a84e4fd26fdf610a580f69df8b866e3a3fcbe52ca863ffaabeb657b547ef6d100f19707cea2a44c8fa83eaf10ad3d4a9896802fac61d51a96b2da9032d0d545bd56d319150df0d6f245fed7a2167b9b4d24d59baaaf9d8f66c1a22499a0a42e1b2697c2c221b5f3136de5160580f3873681bd4869e4cd2d41500924fc8abbe8aa42f3b5a946eaa4e77539def6677f229967147cc7fbd3ee6da1d3f5abdbeced5a2ff4c99176f95c2d616925c408d3e0a9c87fc739612db58351be4330bb0279c35ab634fbb16ae94fd530cbba40d15b292cafc1a2ffa3bd4d2ff6db7618a658a3277b54e77281996f2f5623042741ee1bf2c5cd5d983704ac5681a56ac2efc738fa974910c25487edb4a0664dfcf3edd2bf6d70a9e5bcc40d8dbe5dea091d2548b6046c3355a358abefd3fadf8e1695a47e6678828a9ac76e5116b6d76af6960d22bead1f75746c6bb5031a809f6d304f097d2805c5c2ea0c895f6077baefdcbc6b711d3558973a36ba6be5e03e7e4f68a65a09f0a54dff92c8df06070db07214596a38b7d1b1d85fa052382370b0756163f6ad80474ffbdebea3c94148a2381034226a076f32450ea96f38636b69fd0e4d812e846af8649fcbc0886bc48bc9a2bdf86227ac4165697c5edc1397ea76d19891289313549e751120bccc92ee9d698dfe556b23e6774c273c7b2f60fe90ea6332a4c6ef593e5e8f44027fd720c52dc99c6feb58330feee859b8ed2bdf5df59c8836d4517b6b1e9820b259d947e367b162ad00fe944435cc64057b712baacaa24df596a689a783e8f8647a71d214ff500f3f667d0588399662eb88d082beeb925336ce22358c46799a042e55014739af52e706ecc109f715c9e1fa54dc54bc99dcd646c52171a7fb73e3e2fe6c4aacd4c03609e375a778a065fe866f2f6339b499a5123b8d1ab8740fb92bc1f74a9dad6be2fa2056cffedce54c1439e02db2e8ee6374c29eeceda1bb6d6f8fa89668300a1d9471a058d5df83225ca78f892f9a6090a775c343a53d5427d2e2c6378a7be69536282d8660370a04a456c0923e35cc66df5713e03c1618990f993f9310a4694f347c0291dd781d2bad8cab1d09d3fa021400c7925c9b2db7bd0f95871e9ebacd1cc231b19b2de2cee5f275ffb56c3a7fdc1c51331b09583cbc91f341b77f0b5b290febdc8f5fb262bfcbe50c0a88195f17aa7632c56ac363b893adf2050b32d6a85c050b9c3d16920d207e97402ef7406ddf9e5ebed40baad1d0d96bc67b78b9939f02b46ba389d7f7c52513e5f0c5a803a0a9c066ff59e52ebb3e09d68cca706c97236a731e0c7ca439f23a950ba164649237fa833a3b40690ae14d5810b9da5bb42055763b18ef35f6668618af5107db5e599bf401b40c3ae27e19d27db3f57923155a9f1fb70f3c061f6d7d8275bde7f564081f23a4a80a74575d96815e3426d2ca11e9fd3088f442e17b2a5e7381e7d91ddaaec2fe7b3b6789c6a6513e445006b54c37a9929b8923ca5bd77f3b31f233d09fa9c784f9805a80208377774edc17383a5f5636b5f6f1a7408e256821a110cf0255ff6cdb50c70b62fe04b54ecdb3e2bf38d1e4b1c38b7ed2a067eef8316aead09dbf754d93e9a12a7f0bd8c219f81e30e63ea58313bb38c75b8ebe3332b558ccbfed0ecf5e8a27c72c46b80ef20c78b635231eb978ccfdf846ca96a1fbb5ec348af9cdff4fc8cc9f10dfba1812ace8243e8746fe21f21dd28e658fcc03ea3355f44ea23f801fe3d1437c0cb25062c9734e11ccfc0e0c696c7db41a064b65e5c562457773e1afc955af69de9593e0236e562687a818285c009f0b5027145d86758e0bb6586325d7011475dcff64a34945f198a297a97b83a8e9754711bbbf2733d4f2c2f0f57f928e36f5918b103831cab558dc7dc3f02e7ca564734f9d1e0f70f98aca240e7a063968c7b0aeb095a384bc9407c40a0e629fdbaff151564202b7deb447003933fe1c80da69ac61c472a697b8df9d0125e93d1730810d37d662e04913b96072039050a0ad36814af77129343f16690a63113985b52c20c2d02991515f8b76be50dff8d115fdc2c91d232b07a193729484f26c7efe760f06af154149cc12bf438e6610085b0d43b2408b50f5e6b0f6ea202bb7491194a2322c3a69b1a9af42b1c1f2dcd8c51f1859f63614ae507dae8ac919c16a3d7db4c33d1907e99d3406039073b9af2f2b5925fa1b503a590c2c70e45b78b44d0805f29b82a92ef4cce43c5d3da7d3d0b1bc9097fc788e2c324db1811bbe6a9abc7b2e72df3e6c52ea62458afecb6e8f886ae26ae8fdc28e55f076b8e114f5d13bf06ea717996559aed87ab91d3d772e3c6eb9033bdca1bdf96c6dbd2ee9c442f9db2056e1c73baa8bd378be395c18925ba78b5ad7ea9d4ba030b57019521666060e5629cee180171359a3e9c9f89baed61f2557aad80b28a816aae1272cbed3245ef3af44fb20f49f7cb48573d46ebb6f158292446fe19c563289b4231fc31dba4b219fc8f128812c8746c97110d6856e49e8e861b7e5296c1e6c6c28ae72c06de77564ae70f0eaf3ab5130def90805e58e6353451862b59738b1015141fc651130ec91213c90bd266cc820a25ca4335a41600f10c260b03a17bba29172ae66b4ad2db7608e40a4f2a40a998a28ab7dc4d5c31339c1f1e67dabe83ca7e44d41554efbe2d41602240e5073a563e5e96e672da2423e7fc7c53579f43e1ca5f4e301124217e467971cccbe18d3186f1b0c4165a85665a2c5cd99d060d6c8de64109dccdba67cf8f1ad1be81c05375f237104205e4db9a50d24a68e6e41a81c8e49f0f6528f47b08750e17bdae6c0182149980f1bf00bdc6e8ac869045ddf56553e72a710e01304a5a9af9b998f9650fe1d2f7cc7e6bbab5f44c686eff02e6d27bbdff7ef09adafc5e053deeb9deb5b3ffb58b1167874c5064256e089288a9ec1301f6828cb090681b07a590f22c72b4f2a8f86187d61f64a4d2b3f40cf63aaecd446dce6d5b515ba29d7a25e0a1db413eaec66a66b8521020f83f2f925a3dfefe5bd59c1f4a971cff7eaa70d25a8d08d2e4e56b9721fd9ba37208c033d2ea57149db8daeedf5448d2bac28e8e946fb2558b6dc4296cb889fb8041e8475338cc309c8d5ce9cb8c237fb61a5f0434657d883f8e6ffa989cbdad826373e91bcfb9f9e84e080d6b2482c077cc6ebafc47b5975ac4ddef25c15eb318405abd67a9eca41edefe36712f818be18d1dcd5bebec27af9a5a69f66195f0614617047cbb447dcc60acff62ff4747f1f50882a2091446542fb72058efa8d4acb182e4efbe8f7bd14d255d3cc37dee7dcf6c1c1af69d9d8754849f58c72659680f3747255ad82ea84856cd8ea3c6d772a0037444a7fd21c984fb1064bc850ced161b29326047f8afd52c8a6a75a16f6f7e5bf9113e24017a31a396617568d94bdb7025180b52ecea4bf6e8fae969ca6a84900cdb337fd07ba6d30f746994d7fb19cf16c8ab11ca61e8447bd36566e410efcb668ffad7eb2bccde34b243934411e0a5658d79266cd276a51dd1b9c007ff8e7fdbec7f4cf529a3dabf5a71c4c5e768ec0d05c1e1172230b6af0e52aa3f3bd2c13a6a9087d1e244fdc1a7cda34b45e29ea0c4f6d2d4a966e018ebaaf41b927de2902152dc47885c53f6806cb1430b4c1aba7d7c7c80522f23d0bc99949537d46106e6e5387b32babfd60affe8699669a45ddff0d1031a21f000cda25be629a99181d90cc2d29b2115732ded8f0a56968da0c4511f85e68888ab000100bb20211c6e2568844ad43a861c2022a98e0ade247afc48813959adca5cc750d48546d9608f0fbc8c114de08314a963ecc504198bd99acf493946b10467e763cbce4100767863e8b15a4afe1c8d62a7bf8b6415734b6b3ba4c7710a40fc96c6743111a813af003fffd5a64f6e59c2da7952bce0a792f767281fec2333ca274c1a8e2bd2965fc606febc1ffe423ef3ebf26b1d978157d8cc20816ab8a5e9a2567efc898a25c19aadf2b31030d7a8e5bc3d6aa3b92e79216ee18bf2134075bbf8e951a1c76f3ac68c16f3bd22966686d057a641f1e5fd1d54af5e7426eb7e878036a9669bfb22d1ce4296c19830e0930afd676bf8579bf7b7f10c784c9695a3e95bb888021a9029ee31b3f295fbf40999a7877d35f9377bcfa5b11083b259cb9ad18bf08cf55abd594a7a2d57830857e6dc702c092fd53514bc4dc8fe86ccb9e96f3d11bf0de81f48bcf08f5ac973342ec5953c771c0218deee5115d5ea2f4807f3531013511ada67765715d178d61b6a953d0bab029cd6c48fc3702e17e8e56cd76f25f95501fc2ed204b2835da3237898fd9a9635b1c437e3a8ca7f144dcc1cffef3d409e54558fe38444e305e55af6380ce07f1e1f20fc0b0e9af4567d05b0b82a08ecdb90252af08dbb6a00d3c1a34d9b4aea97e2e944cd0ecda898f90aed426d4ec874cf8f06d1be85c093c9b2a2cd4bf354f87c35f322f43052f37fb38b6535a895c959ef01bb7f5e671e066d37e77678f7f89b7f952eca1b890f0dbe5e8622ad3890dbe6ec68bf187d949a8eb3d311fad693f5d68b87547e351caaf7161c35968dfa79592a21258090d1f565f7b496aed90b47b3619dd768f4f5c9df99f1235f021c97c0f8f1924fa976ffff7bd997c23701915383aef85caa203bb8491acc75c57e6121c99d1bafce614ccbcc676d0d7716617850961e6ead990db4005d86ef5b1299d4db746b6aa12c845a0e0e989c849c630fea27a1684c74fb8737ff00fece03770aa699f9ee9512deb728f655d96e83b4814a07109e453eab896589d69dfded5d5ef58947c22c6ba76d0717927cbf257a5766a42cf703d3e681d0d7e9e03a93cfc91754407b298f7690e68dc884a886d9cf69de9a6984f01fe849f8280f5dd6756d1cb6a68548a81f1b57ae4cd29dffbd71685793b73b171971bf82a89e5bf5a48850cd1ba6ded1a62cdd5b9c2f8384f827b6c7acb32631263bf97e042aa0c747b68aab61aeaaf7c859836527777de1393b39a260385f1f91b6898aa300cfe0ab7757f38b4afabf17b87b92ad2f19679a69b4f36fa82a3aa64ff1ae701fe1301f50e187c6d03ad61b32bac5c3539670ae6386c66cdac19db65ec2cf8d5150fe25aeb27e2a340286e73d322feeae25190f1c349a736ff8c65802d233fb21da63a1b9f3c872c5e97ba8da1018502aab95d41f827acfad0272a312c9920ded0adf2db8bd96e9a88578444a04001b1f1bd9f74de7786b70a67db72e6c6a6ac1d839efa979afb4c6f4a53d383edc0e7068830c64b6c853bbbc6a0f4de564c84048072c8f70ac561b78ee61c471c3b37dc39ae77f9080e5ebf1e2b3548212fb25e202ad8f611f2ea9e006c59d0727584fcadabb0897fc0de0f48595c5d6a6d33b94fd3c75d9837aea5ef3d6a2b88bba996c64487ee235841af181ee8e3e6c4fec152c96a08dfc762ce33058fcee57124a7e4794a1fb6b9bf041b1ea95c6802c4bc2365254ddb8cb82121cea0d45acde982f0573d8956811a936b9dab3a7c23c24a3d9f1316c7e772b6c113fc2361e5cbc96c2094bdf940a5975d6ae7a3141d08690b3a2462c686d9bf687e7bedc07602ed2c95ea33c6561c8fda2ba81cc93d2f5cdf45cebef70fee4dcdd87aa1dd6397c1311de9f7a81b9bfe558fde7f82f72a6843d9168138d44d1dde4ec6bd7ff7e4d915ec3017a49221ed7d55c26cf22b3d5865953dd20bf7d40a2940330fd1b62625378ba4f3541a1728e13b50992aa6553b96f958863beeed290980c06beb4088a011b0ccc5f9a4d50fd662b116b9b6fee8c4b8e6c7450125b9e959cc80ba2d651d3985e1a4161cb78d3b5bd2c7f61d87ef7f39e7010a4bb744ade28b8a861dc9b56be9c27e472e52f136c8ab21ce15c0a9f11379df43b7da4c8947f3670e1fd77635fbf6fda431457938407adbe06cc4d18b08fe6ed5fdebaffaa4d82297ed7606109092e5e5a3e125cc5fde5a8dd2d5eb8157e37d5dc64400b909541dd2543b7ef28a0af89011bc12a747f87b8c4880af88aa9107c6aae6e8c4a869e32d6e4aaeb8cefea976684eb97670b1187922415ab775b84eee4b3ec8235d67b3ede627661d693ed9b2c3aa4e2a72545a0582843d896456d3134388bc032b3b11a01a6c9a4b51d4d87bcfa142201541c4d74ad6febeb10e3fe23eea1bbf267f910198fd287af325551ff1957333cc3cb5e8259ff7daddd1edfa295ba73f1fc3894986116250d7bf0fd37c0b924d29b7958194fadc12afaa0e36e8dcc9ae14122baeadfd32766513cada6de2bb4413f463882ae58e3b9fb61b348d52ee24f1433b3eaf961003e8bc0c662168b135b2d514d6d610aefcc570084db409b1f60a345c04df01689990637b182a5597d621e74644f2234fbc30cb62f5d9afd153fd0aa893e974ca778e2ffcb3748e58ebb28f4df9190ad1de6fee2dc62172989560d2d781b66174b9d719e79e977a805cafe8009db6cbeee7ea8ceecea75f8f3b814dc4ac07b1e6b46c57eef3163f9f2c65190e7cf0f65fdc17bbadf1cf3400a91f8be13ebf24b1a096b0f5d30b9fc672058c0ed9fa7a2321a9c78eeb8771384f588a6ec1e5301242a242c686fc958dc2b78463f206b3d628b7f7f85ac34e222cd781dc520c42e9632cc20e3e221258eaf6f97c8ca5c3f83f62e42f485714ea1a7b36db52d65ebd8df6df8727791b86126b0cb5380e8f5861640a0d3b27caa13316bbe91bac0f5b6edede05864bf0473607078bb711d072fdfdc11604fbdece8a78882238b74e0d79ebec25ba9da62ce71d4f7ae35a767e6bf1c339ba78cbad5c3141a37596c956ac3ea33753ea027d75993b8743fc6c4aa0fc3ffc85bb0eebd69a8cfb5d8523dc294dbda6d9913b2bd1ce6a6d11408e4d20400bb1107a97c00b320aec6f4c393a354f41952a2c14dee54d21e986ef4731fc06a99ea34a61701f778849c4bb33c83bdbbe6ec25f07da592b9842ac414a85fff67f5f7e17d8d439bd9fca241d6d5cadf2d33e1a4150e3d69c2c14b1463746aa41814d8d2eba22b3f4f0be1dd5bd365a3ddbed08d280278a6f5a147d5f394487683dffbf66fe0a2a7c1c29dfadd8cfe09ce58231a2a747c727a57d545286f8da6284dbdbddde063c9c935a8c782844cc2b5d0edeb43bbc4018a2135b2ad617d3771d2e0c784f73588425d5d9deafee10e8d7630ca680212e5b9dad7f75869602d47ec836aa24ca1c3ff345fb4978e605ea87ff5f4f6f9e9afcca4af8fbeb1267d20b154825e9f7d1a22136490a66de725c601d8f737b8b3d87db031706837e987ed2e67d48d7f6b60d4ea95bf58a689243ce1b9a4373a92e96a4e36396d0d9be57e819c66d6ca328f245648c1d048137c29159a432c6012ce7a58cef348c49f09feb06482992ebf81fbf6b235d9e83efa37c54b0710700d8371503386e9d77ea50805ac7ad64ae7ac3db8d4c9298cec2631ceabed77e1f59e60164bcfab150b6b7ec97ba5a553173a2f5dae17162db0a233597303ea4067f36f9dc865699865f2e2f87e046a7010b7ced0fbb75e8248b7ccd03ce1b6c820f308747b09682fc0fbe7ad1bcb25fe86574390e1f3c1cb5108b717a2197cf4174219bdb8d482cbadf3405d49ad392d7aebf7397f68fca8e79401ae3f4f9b68405fcf075729a660f66fc76949d3f88d816b5f6f595fcbceede915cf4a2d1943845462c7c79b3fa9237fde8f029a19662d7ef92a5966c3aad68687c963f6ba0ac33cf62f2c00962e8019a751111f1d2a5a322d2f4b03643b36748cf2d7cb4161aded97b2d29692ba37ffbb01f369c9aeef67f7bf40bbc8f3193cdf264f5a1c777abd6f4a3d5d57c5f5c55910d11a6f3ee315ba9c0414f1fd3a743d5e1237e2bf7d62477d09036bda2342c64bfe5418de3e35041f641cbef6b50fa9070c525fda2b2b5e8e0286a8df4e22380c97d473d30e86c156b1beb826eb868b43e46fae5d05e29b7822569e469770cccbb513c3d903a9dfb497bf23bb701c0047e0e84c1df5bf8f4560af390f93d5531b6ce09c548a0227f657b5a2be8cbec1eff51d49b66004fc97b4e4ded965587833ca7e6a9681a76e1b7c1adc15b7e28704644d27088f14f73f5508ba45bcab0334a8c9583a812001e40e50261977eb2f005a2004e0ded1c5fdcf8cfc95f3dec40681928a51489a6e07da90b01d0d3b93d048c8441920f6a45e220ac053695be6959e8d9b459076b39be3d8431d54cfdf0e8735c19c7a4c3262192539b4ddfef545fae224bb6e1213dd5fa255c499c71659d031b2cf59efebee0e22ff3ee64c1ffad462e288148b7fd38d760d923e96f9d1ed0eae8952188bb4dfcfb73b4932eaed9ecafe67a1c4b5b30bf7318feee0c80bbebdb14af9087f0e39ed89a0f7f62866fe5b3d8d6ba22f6ae12df5010eb70c2c14742c5496492a59120dcc43344677a2b7bd88c4db5d849b68969a54f766061b9130e88a47df58baa4d1727b2508b2cc53334911e7c7a01873ad1d5f2d6c74d4ec5797814c1e2c1fd2345e4d204a9bdebfe032a3470d689eecf2bca5c6fb3617b6e62dc7e1e97566bb736fb3f133cd109e8be6a8aa5ec9b622d0ca2d16915c08e8ba0fdf2d581ca534c922a9624b2fa4c511470a60c1d314616005ae10d7ea9b8a021bc333b0221a623981827d3dcd471b02d8a49410e512acb47d1caa3647a128d7fc730aa312bd9e2799f6fe2f6d669f6a4f16209cd235a8d9008985063a76f7f7d77152f99b1ed7f7319a7022a86c00931ae8be92cb53fd555c31898e63558c0a8e686fd2218a69535ecce293b991f4c727ff6dae18a946f25c86bf5414cfbc2dff89a36049b3ecf2b47c6112727f4996defc34900c4d0048825ff0ffe77c0a3224dd45a79d2edf2202b42266963158b357829891fe39690039e7e1610bf57af9d7eee70afe2106b11681d8e48d6858652151c74f53592ff41dd840c4fdabce9e72e9f868f7f335a6e2e5ee3a1ae27c94a4a518f635cd935720d57924e749be25320fbe92cf6d1e3d21a57ff7d43d975b949ee8cdfab7ad30f480e8455fc7676b2f7875f145142078287dd7b725543b57ef3f4bf2d53367fb3871ba97fc2200395bc4564d4dd049071ff05a97e9ccf9cb391aeaaa3274f04e2b11ec8cc802f56950a5125fdeeb07448f629f812191e3b1cc963e11c9535da4d08e5aeb6d47c2496044606e50fe1a3ed6949ad87bd6f4c0ede13cb1e968f86383f84f66fd0b7d0a452e4ddd7d091195f6ae52a7f00ff4f6a638e6056c98d6caff53a2d273a52f384a79bcbb02b8a8316a5176644c668197d8af2040a8a9b6fcd5e9e48fc8f5a8c59b61cde7bddd4663f0793dcc066e5524454adca9ce0880ddc9e120dedd39d3f86199208245087502a1e1d185d80604acdc464d804a336b22df18b2bca4afc63232ca52bb70fcbf005bb36fe7a86eb169c2cfb201b06bb16006067dafce2e7364460d88962125c2d9b245b7570a199e1915477d96bbc01643ff351b7c649f37bf5cdcaac591239915d9fcded5f6ca082b2b6a3469429f813cd6697d84ddec5acc3167165547814e2860f7828bf447441c37840cc71167477117b9261fb63f715c66f1f125c073726b887b4233f27fe24e2485240b6d115c4f0c2e0145bdebbfafeff3facc68f5c7886592e45162587d207ba1954fae18f646015b049d4dc23c9c30c8becaf7b19555c64d0f6da885b4f9ce783356e215a6112a3001ade10bcfbb365b61375400565e5edca63fae32b70cf51d9355c578e0cabbd5c3353f5b429e9ed2a6bab59bb8680a14dc36613483f1053717ba069541feacb20817d2e427f2188c2893bc9952a1d962110d911c563612d2c8aefecf472064de65934930f5e3c07d1e823f0a12c5ee477a9b97eb9ff3aa440e13bc0b900672e233abcecda9c34e731527fee84096ff50197ae269da2c8a57dbdd1cb8dff15397fe63ee88e319e849db3fbac537cdbacfb0989b8e382b26eb8e0dcf4b86be5f380cb239c13464a5b65d128019cc01ee84a2e564f8f98cc66085e1f1f30b200be6c52582652b66eaed28f067102e234cde8d6250d6a3a40dcd8fca2f3b4df591658de1e0ddab81e88059c86afff2c3b9e78edf6ba2d2bac65d156baa9732480388f1dea9036c69ed6da3bcaa29805e00b6105855b96c2b0ee30794fbd2d628cb9a6bfdafb278ac3b076cac3ac32ad78de97923f2b7acf6df12d7708e558dfe9e8fcfba0e9064bf393203a1fec5d3d46c64b6dc33abe33ec71bcc8e6e7c6de586eaaaff27bebd1e360995870b417a11183c3e1b30fcb33c140e42bf62847a2f724fd84586f3a677b6febb52f1917c46d9312d0ef4de0a6b69b0bc9fb502790fef199f784303fe54410b2120a83a5e2c89159bbcd2a8c1219768ed38404c05b203e2b0aeca7958d855c98c01de5d7a4a31de283b2d45a98fd758dbbc7e0effbe322995c0db7db1b5ee853b1be3adc74030507cb7786aa20d79b523be7559e529e87533d64b75ed7fc2be35e106a70cb523ffbbe6cc69cc00bc83c39757e5908905f3256aabdb708671adf4cf4253eed6fb295fab731cf3d32e8c96e0b2c583f58b155d1f3bceb84a877f7928f53d1583df32d9aca1798ba3d6ee0bfef9e1b3d6db107a4659b2d089555f583a2a3a17a2006215d1907442e8eea120c273adfc43190ab3cd4ae74575bf1110bbfe56ea50e7d791de33e5f9bef43ef252a67fb08ff3c48e526487285ed9908883eb3e80cdcefbfddd65f0bdbf23f143a183390a935f92a010ba6c8c9284059bea5bde8133cdf3e493c57e27608a461c9bc23c4a8f945cd2595175328e0324e4f18d161c7f446e1f8336ae11e681aff905f94a167bb95c2b1d9974861d52df9e6259dc9613c840411de0b6469d88f7e24be0fe0634e77afe5d54a4bfda11e53f6cb343c4d89c4b842a4a4dca3936064d4b0c407014b17278165a66360b2dacf7dcaae91f1549bb71f47c2b2a2af21790f7b3c37b2df602defb7f7b14d3f66b319d8fad85d35e246fdf67a99d7ba9e5fefb3056fb0e15568e4642fa4f07ace193e920c00e32c7b3796bcfff99684fd96dd66f3b9dd6ae4441f0858b97a07e03bd57b321dc759d26eed212a1c645d6d883a00b8d9dc88e7e223bf90145092ab7ce618294e7381d4b2184674b60afb78dc55941e4a74b45539377f53a46ecbe850a96cd1137a00ef5fd2601c2444814deee7ed69123f413949dbce139fa0c9486b9196ade19108e08927ffaf88f6f671116e3ffb61705efc1d8e0c04649077d67eca799107758c93ce770b674e8f09f56b7788d4461f19cab540d9d48ff2c4c726faaeb4c592504cee66044ae395b8caadbea590bf3037c45c75d7d43a07cacb1c591b063ae4335894b53f1c7d8b4620eb91606d7366338396546e7be3740adf21440f147ce86af90e205cad83ad3708a4edeb0a1b7adfebee34368f3b51d785c0c08b9bf8b7e505d152b6caf3b637329d0094b80a27de706afba061b08978174fb303063452560673532c56751c79d7d3061519ee28447ad25d1865a369a0ed872fd6d500bb7a2b3bac1e5b1939a2afa4ea0f3c7378c2ba5ad203d115933c50efc3a97ee330e78db7d1f6e08b51b2317b560e755b0e79cfcadf86bbffcde95e704f0508d3a55bd796ac924e1f38f52e4d672e6a6f03844ed698bdcfbe5a5a4a847fe51fb5774bf4777a0eb827504bf8a16a070acefe35d604009f27218a2f8a3413c290d0d8d5a7bfa4c1de91a83c608a59851175fe6536bc0001d57244f9c668ccea889c55856803b4d988b94d6b1f1678a1c8aa6db2aad1b658bcb35eabee08b2242fd7e1fec7f7befa09d9c4cec927fcf4d7972ee03c9f7fe29b6bf047eb4419fc6998b246b70024b11c49df5248d9e7ca431f2b7a1438011380bc4c47e8b3c5d4feca602a48045f833ec26ebf3fd4ca84a2e30c8ef1e88d83d796233c27e323e235cfc24a1d5206894cac12efc7abc1a860d57c1b67ec0ed84450060c5dc29ef19ac4d5757f425e5a61d74e39dd5310cc977a883398c24eb0c9644214ac45d9119c8654ea855e7a1e6590ba6d8bd9d90aa4515e4ffd37b39ffbd256f97c193bc75ab3b77489f6a3518461ce1e48514097eea2fff9bd5e3444b1d056aaea8fe107657272e16af1438c4029962297d8ac52080ee457775de037df286388aacb8f3fafb0a69b0d03fff28379d16f6ba9881d6fbf51cd0011c71cad7248ced4f1f0cba4da5d2417911620b8ca9311693969f898e9303a644ca017fc663642b1e9092eef113da117d15fd25a9cdf861fedfa923f4fec0971851692f1509d84cb6e387c148aee0bbd526c9c13e9f59790fcb7c1b29381fa3821458610a1fe7f3235d6e874ad3871fd733222bd064960a609100ed1807836640c182889c840d87397fe71be492f144bd93682e05ee73c9b01fc71e6dfaa2e5cc04b8638f7d74a04c9c25060cf969e64226637449e717b7ea8aadc69e4437bcc281306f0bfc1dc22fe7be2763e3a8081d7b9dc5268d78bd8f53145da70e06f7dd4f42866400c7feafb824044932fa741035a618cd7fabf6efd0a1b370d02cc54fbdcd78923c52b61cae2df0fb7c24e751aff986f4114ada419ad742852dd7ab24080e61b55e93eba344b0a4b9eecb50396eef41cb8d6430535cb51c1951e4064d5b2d6dd3fd19e06bbfe521b11161793a5879ef9bbf1f4a364d09faf6735f93522f59532b5e86eaa8adbfb0856ac676abf54c677f24c75e7f0a06a782a18e3145f05deb250d1fa85d5ded8b590c890bb36e13c1a54b42e194d8f9c62cd0325d7fc89bdef1c34a867cf97bf507b9b394b13c1f9d03e5cd8f2b112f3784749af0d7d96891b01485addfc43f5fdbd5fb6dd95d03b951907a691491debfcb95b5cdbd3b045363f521c1e6de13b7a33b39789c4c4e3a9a3e76800703f341a887a8b860a3f7e921e8f081a65f579707536b6f23a524684d0c4d024b47ba8f4af3d6e766f9b21339a8b8b945d4fcefbe5a79c36aa47254c4b4b8b96bfe8fa2cabecc8d40cfa4636ef66984169001e4a902989b4c20235e6de60dfe57d09fe33370ff7cbe41da3e855dc193e13c5d002bdba54cda161bce76fd6d3c5cd979a6c7dd54bde3fa047d0e86603bc6335ed89fd0124005b41843bc59530da4cd41a36a0b42af163185ce8b8eddc97da0571dcfe90f324711e9a79bdfe88012e006008571a7e7bbd386e85c10d9921aea681a4b08a34f2b3403fe2ef203f8646190a0aadc1f829a573422e1dd7bc6a82cad19fb6f2d37a3787948824befa71c191fc848fccb829032a1edbb31731b4f2f53771b5316ed5fa50ed395252c86ee92f096aab2ff33c799a55d3b09ec5720d2fe49d0a1b95b17b09efa337c7b3bb84b496112eae25aac5a6b123b2380d346c8b296cac0bd4a3db4f4074a806661b249010d44b73b8c1dd28e5f9ee5723abf4a06afbd9e12062c713a89b98d99fafabe6747ea15ff2bda4d295369b233f89fc14cb222c01bbd4e3aeb9d46237402a9fbce652ba518230afc26a372810ebfb21b5792fbf6868b193a28adc7243bfd618c19bfd72ac3c64483514a65f7f485007408546f452c2aa79cea1bff62237ddefb6b6006b0defac711cd326312c17d9f05b831ed79a5993b2819d6cacacd582f700afa36c69046df33f40d791e1586d1f5d5dae84b65e5874c08c1f5224c37a690793bb00a3ddd9811830f14f3249ac38886bd3f2cb4981392ee0ab5a00de5f3b2b5f20a58e9734b07641053c0841c8b4ae1f5151ada4a64526cf8000ac927556b0bb5a94a42ce59bfd031ccde3ed619544db3d90d4ed7d9dd0f46a1ceae2830a7e1d87fb15a589266b31efb14127962bff608141de7d5dc6a2389edbff276d6ae42b9441d42b7bfa74f6d7d17d5c6a59cb3700163626c2068ab92237a329c774c8293f477d988cadd0738bc1360e6780dde796e5d50ada6c09793995eab55c29458b117098567004b10c3e58f2e2c3977a54d49e95ba117b57a59733a014371155babfd6977dcc0c9d78789c5f827f10e28312aa154b5fd1f010c24213dd203d8aed798e9fad01a121badc2fca534fc2664b164c47feaa13ad581668a9f8481732c2d4e1408c6598e7fcf49040643bb690d1e201e201011ac1b2733d6e78f169951fc2e6951e7d341ff448f878c87c856361603a73ab0b2dfb1ed44de63e14bd04f7de280912bda50ad7e53fac82de4596edc95b8c099421ffa5436aaf3324421c8d1f57cf028b0d45f8ccbe4c4aa23e0f357dcdf448b5f39f15f059ce92f03c9b8fd4e3fd8c520cc5f00496bc69ea087b54aa6b7839be5dd241ec14f4a2a1807b99f1faa96ea578819b1618c12bf72564ad1b2b5900cb03c27c48bd2112df0c9743d30852dc569ef8fd49981efabe059d84889d69c6302f48b0b1dbcdda9dfdd557a08f7bba8c9285942863eda8a21bc6b0e4bd378b5f4864a7b7eaf10f5fb436f0b58ea9aed4968d17f345538cf29fd6b1763d2dad5901fc777fc132da98fb14af8db0aa24cc018fae69e3e07a340610ad44ca5797d4d08fd75fbabb431963396c7dc52dae496e2272297ff4f7f17e633ffab9a45b6f9a7aff78f5606526bdb0f532c53a406c775667e02f69e11d2920b9a8e0a37ba49ce424c52e3666f1bddff060da3bd385b115ddcb5fe5c98c1e2dbb01e5ca6c44dd8605645d4f0da88b89656181e3fe2779311498354ddb38a25fc94a191d964bf7bab6a518da31c8844d21a9da3d3e6af1f9d79170fad416afd67589dc47aa76a3eb4cf6200b6c149932448c0b2d24571a33218e90ffba8c266cf3ba146f92de7308afd447c34fc7110b9abda2232ec5bdcedf0835456c51f5a688d46114ec19a1302487f3cf00c999ac4a7130c5e0caaf8d806e0fdb25e3c3d65eebf4a4f3ef37dfffc1f1cf8c643f024ef49007f0d51f7fc35052905fe01060952c75d7e2e68f3db831c2a957edc8b0d716f37d71969b001d8f9b13fe74cae72831d317688689d9701d084bd3ea9439713fed65f48a6cff4a6ddc5635b2ccc019a65e2279dff914df63ac04d7f88f586254cb30ecff5d6bc59fd423978929571d8a4efd78dcf1fa4078083d8dd76f49c748e29fa2c082862887d1149f9bb22f0ccfc1534c396824b644761d3f8259b666236bb605735f32f4f1fd2b51463f2075305507e230587bc32b51c0f9b95efb6cb54a058f7acbe0db17b279c808dddaa76b4a8f7e1b7b41962d12af97c8cc2fed875711ffd90c930dd39327fb75c0683b7a60d48c10498b118cbc9e8b6db9caea760d65fea4864fd25f80a6455af64268cfee276ec5a76de426b2996c6fe21a5810875fb48f6e6b40bb170ef5d3fcd578b81252a93cbecec08ffdc637f6e5483b71ef790dc7757f373c0bfafb8150f036ba16161d313eecc0851673fd42351ef8d706a6efa9ecf5b049c726293c2ec55aa87596efa5c381db183a114fb94283a1c219acaf0316f69fc3c860f0226825d6b0a41ce7407da3df598310b2d76530d15309e405eabe96e27f10450d74a0236fa1566cb3f44d0267962d925f6b5501d919dd22b32c1a1975c2153095ece72f206d4b2f4413630f02c0487042cd15a1fe2b64a194e1297419c404c627fbd59e7740e2f9aa4ca933d3302651c2924e4f5dd549430586557f1abb445c3f97919f617cd5ed85d14a9a98b7e6185e3c9e34dd73cda62e2bd0bfe0ef276c0b746770995702ef4cf83c254b41ead65b3345e50a98f6c01165857ad1d8e3c0c620bb795b6c178ee1c8bf3632c8166b2471fff58288bc0add12a5f091ad78fa35ef1c0ac0d9cd764c93c68d840e538bd8f58800fdedaed3e6eb47b41bb0e3852ab8ef93b40e4ede7e4caddebc5ffa2323a69724b6f94c3e24f823758f54426df0bbc0c2820115bf109ad463ef13630963c183313378c6013751dcb613f72de8892fd7becbfe15847a7bab3a0baa4f337f08b57fc73752e2be57e3cd2a8c0244639fb6528a23b7ab2a6938edde1db944e92febb461c739ab3d547af65d3d3cd8bfbb9dce38f379ff73906a4da6f649ba5528212edaf27ef602e41405f959156ed12877c3932e4e9bc2f2bbd2a3dd69afd020e5b7b9de6a8866a632c300f85dbba2c4525f9c546db04f869c70c666d663c7dc449393468fc787c8c3af528a14bdc39d4f65afe8164601ffbb835a7796bfcfbbe29e79d570f15c2ddbd209487320720181d5359b9a383ccf647d4753cb9f4d38f7e522d21812c588e204fdbdf75ac4c5d605ea5ec854beddf822cadec4b3cc03441a426950ab3392b300e7689db35ee9bc1cee063ecbb2dfe215842ea20a9fa49b98bb9d477f1bf68ae4e7d223cfc5f2ec67b192232045a3df039821661acea7fc26116d7ff52de4faaba54cede789b353cb7827b9985bd311b63b19aa6c664714959774ca34aeebdcce21eefb3d15f93dea4378cfcbf1d47e6e49a5212b6a96bcdd0ad6f43601f19deb8ca617357febd1fc38b506594ebda58266a6b96629b98857d2cbbfb8f6afd721382eca06a857a27e108b4257c49b9372d6be72f57da066047d285a9106fa6f9cdff8c436f5e2bd5a3c0cdddb8e95eff3dbb36d9404237de19089a66ace5b09645f34fe70e4146dfe752d7cc24176461c9e8d138083f0c6c37ab8d68b0e17e3573d15909d8f2ffd177447aab308168f39c23d92db5be023d05e59fe4147f93a73ed106980c3e91027d9eef105d4d4269a69434f0942dab298489cfb544e5b886dd277ddbb1693a2bd61b19db9938a3b148401adc8b47b7a44b3d914f5b028cc167081bda25e299429b9eaf11d2ec55cd194c44c36dc8201a920036aef13ef7e2078c33652f75a5a61a13181a255c632997a7f458190db0bfa95279b32650dd38d5bb1866423c1e0156770137a35c40772a03c5e0eeff06f2c208c9260c44f39d2fd7dd3bc6c4be1b4afd577151a3d24f4030e5efb2fc648782e6c1531f1677a946a07029e43efb300f3500343f816faaed99d98bc99fdadf6f0909a7bc7ee261c9ac5b3422d7bdfc1f6b171db14d61b916b28d69e9e90a6d9e37d20d92aa07f5ff5c7213b2c4fc1b49cb539172e8da8b674d991ebe2d6b0a2c01d37947744f8c1610b48c56babf705b4d6b60d62d6f69e798ec2fe45ab10a7c31f993f47b7281a72a4168f93527a9b35c502beb579d47de4d6be6a28a2eb610a6fe74658fe0aa9c922a7b4337b0ed263ec27754d1c90bf252b944d221b1d6f5b2201c6a8a007cecada296084c4504da5382aa1f40738f0c9d574c6ead13bb33c7546f591473bbc0f66fe5d8fe0491571c32c5dd0f097e5fc305dc22c1590ff5aeb78deabfcc25b1fd7b033e1d0ed8c4129ceeeff7002f75aaee3cb19bff3b4225b378a9825fd1251a25392e82413fa6c14b624599fdc5ea1241e2998b93e4e167b1ae211804281a35ad9d8df42c76ce0da128389f60196cee6b7f06114a9ac82270ac566ab61f5d61b9740299e61c8bf301ec95edfe083f706374000ca99d0e8358f2f0e0527bc43b97559dd8a65f6b6feccae470fdec52b30764b2f526f32b9cc84b27855e22b4ef379d064fbf593d1002b887e910dd15967e12f65ffa0f575b8392afaa9e3652003d6d932e85a673ba4e0738a0fd6bcbbdd0fdcb1c7e7ee91bc6ce83bae6efa70fc6f426ff8ccb599aca71218e35c8e0538417f325aad6296b6161dae16c33fca2dc6c75faa1463216ea8b48c8d81ac08007fd428485ddded0ce2dbc2da4ff75ee43cc2a8db3c8c22007d77cc7fbddc21064101a1e9d313b8781e3988c73e8ac695ed174938124c04203cda251ab4bd4f867789db14f667297451efcdee8b7352028cd190ef061817e8083c870003db36c3876362c41d6f27e9a27f70db296de6be49b0b6abf84af7f8b60f3e7a5674ceac91e45b1fd5e7bab28eb6b6b66e214976af36d65c623c42f8be439e8ea33effa9504236fd58d2fb3ca2fdd04da2c2e92f7ec21b1ef0dca237cce05f28f6934f8eb5988f02868592ed17074e42fdf2055efcb41006b73be5e11a3712bc3754419f0245192e310e80c184f748f145950a5668d963a8a3364de7d753583ff383b7f91c58c3c1fda915a02da529e392a4d4a120554c56229335d0edf06c2c5ed929d873948e5fc018e55785d504bc9ca28ede26fa918ffb40c44d2463e27200f026a10c47287aba62a02d40c8d989edc630b3162f16f8871bed65ad0b578579e4df829208f7d2c994f0a8d210498fc234b9da19d1adba4ed7a34846f2a54f318246f3c18fd2071e65dfbd717951160fa653372d12485c7c04181f425223ba2c1c6d8b5aec8f33c8d3d00cc4580a807b3c8d7de5d8f85a4586ebc52fb3f3cf6ad0ef78b38d5fa4a921fd11a7e700c602c6616b262b7d678b88341aae344bc2b64e4bdc0fec7ffbe5f472de0d4bf7a3a9bf3e1b0e3894de06ea0beead64b29c7586f43bf1e6d6766ca68a42d18ebb8815dbadd4bb6cc25c0e49f41a5a529edb6292f19c2c639b453dbb3971ae29e27990de1c9e31131fede794fe217bda4983be739ad328b27fc7def7aee50921598819e5b9464e53f6ace40c5eeb041d6518bfb9553d019391fcb50ddbf74f7b9ac6bf41bf72e437ff3d56a19097c55554f22c365c68801f2b81c876a0b72c14f8ebcaf641b56abd5b2306281a00ebc115536fc1739477be3ad6f347c4b6dfc861c3af5a4f376dec4cb327b712320cb21896540fbf521fd0f26249fc910c4b5316f0605334b0b0ae750b94f20ebaa38602e86743b819edc5c7ff7aa9a505049f2df5d6890b3d1132e894c2b6d7618e96f1cd34e1d283a443c81ce159e3c78c7426914b0f70cf33be99546b03651eb60a0a544bc3294304d63350f378977685beb6419274e5a411ced7d784dcb518896764d70257f97d0fbd6957745af0c9e8f3aea8cf3604cad4a25fa0b2847628ce89e8827b67cc2cee06f9bd9a6fd11278cad52ce98ecdec044f11b7e6db951dd12db0d889fddfd0a1806820e61d44bfba3278675441d93b35f3997816a468832a220a51bd1be686a8eb302b13e0a4e691f94a0b50e66359ce2d69d268ec3bef771aa1368940d016191acaf82ea4afa651bccf24402ffd5e276edb5d5d3d49d164c53626a90a30920be3b02cefa78e077e4ec7555406142f399452b9edb16fc6ef953d94f45b30d9d19c83ffbe5a5280f28aff78bafb6468f5738cb5d8123fcbe54a869b619a4ee41d5850f4bddfffd8f38dec317f5cfa5e1c81b7ef6e14fcfff8e4a0656d8b6b2f42ed7d4de7d2e409a3ae5e5a17582b71eb9f3167dc523fe126fcf77128f691ffee3a0c10549a7c51dd2f114ca2f1a3e425fde85e9ce45c05c9a34f570d50a8af20981afe6614a6dd44e2677157cae933e4c6e1104f79bdac2bcba6b7e09195726c0499d43eea9032d1a65f18d8f45dd0be24a0d19c95f5c338ca18a637abc6835241355dcf8aa1a4b7ad0bf9186fa3130248a9521703b072ff8a039ad0a1825ff98cb4bf8cce8433f460e58a22c2ef12278903604568fe7c90a8ab78535c6238d29ee624512340d4c45cf3f827de43cae7555276666abc886918e5e7564ca6a0334ca7f9f39798ad0525f80bc64edd5a62f6eac95565d9849259948b4d63f2f8d9fa70290ec291091f996fb206702c519bc19ccdd0305db42299619b19ffed905bde89941552bfca9762c031d3a0d11f0537ad3c4cd56f65f347c45f0957a08a84a7e7b965e166cf5c1c5c0e3966d6271be64890748a6dcfc096ef342c1fe2dae566c1bd4038ba0fda50e65b3718cd71fa7bab948d131c2fb2027ad710e2a962f6a24c91e15b0022b16d82e1fd993adb3cc64d3096c5897424024509946796789f0466381c803c68040ca760f492780b9e77fca55c8a580ff125f82ea27e4ab6a3edc5dd7598f8f453c9211a8b68c6612d9cc40641303a46012ae5b00a42d0d51b63e34ead83b4f6019078c4a1a5e5b5ff4c8768f22b4433abb738552c1869eb63d5973fbdf228b1d50b2dcb0c6ce4987ed12a057aae69ab16b21e7ac608e94ee6474be17705fedf47f7600fffd79c75d13f0bcdd52a05ca42224ffd332feb686ef9a7b1476f8bde5698207e777e74d0bd62f4037ef400c5ac1a2126ff4ae1189d2b7903eb1b2ba6855304a633799f38759a3193030cf8405e57151f9d37ba539555061cdde513dcc13c6092533995362ba9bfa00989b56a3109fa65986bbcef7efd87e85e122109dc4606e45f441213018eaff72026647093805e21a5e77d19fbe208a335a04d9bc89d1d035fef18ee6ffc560dc4b1d228903e8d919961ae1f6642d1be6d7d2083470b913cf18c04a0e9a60146c5811fef17c1ade070ec4e8285881e6f71491f169d438fee2952374fcef3c4f025aa559d135e59d3da4d6f559235f01526c1594634d97f0abadcaa0ccd792a48458e778647fd1720229a8820792968bc53cea6f6647955f5e2380ae5ca976c308ef85cba54b4ad0f9bdc20afc7a923242494a6092124f52026781781b62bf459ea6b09b4a968259cfc867b825c4f0cf6621d87faa952f5fcf4ef7cf6130700cab72b002af8644c41ed5dc257613f294d8ef4dc86b8d25337aaa2b72b92c9f0a4dac420f0d43f4939d92d34c30f7426d68c3c23bda03b8437ad5c031a2202ad3423140e8e5dc4e0a7f9bc456ab6a8ac63bfd2ae590d1d4cc0dc65a1599fa8a5e033e1780db8927ab38d569de3ffd5ea79a0bc5ff9dd79b706364a7cfb8a457a1a132a5786633f7012e88803b9c08e56fc2e693e323f2f5608d320d90213e3b69cdbe10a0880e95ed99f56d7bfaf0d224f3a27b90e6fc6a127ec05fd6ecd976d936d6ef5287a8ef8947ab2111b1fb7f7747f8ad8da8221c3a069fc5a4cde3dcbb3231b7ac71c5fa8951adb7b7a33f718913ea2f387d924363d63f00fd4f33bdba5344a776ac42db1c326352bcfee8bb93c8e42c7871c428783499c20b2568c2b500f5966eaa8397fd46786f71474aabc4be6ca220b41e29853c7757074d3e52547acf3c0e1064cdce0651415444aa1a30b1cf5b5419a8ad6168cbdb94e57d9c8758a2d35984f99e50c40760a2deddd9147d7b2e5c4dc7be8601ff68382a50a9ec47c95083ac6dc0776b4eef4031c59373f9513fffa0ba228a3a87dbbad29e13244229d31eedafd407705d3ac3abbff9bd35c6b3c9a0f591d83a33cb5561abe6bf73aabe3e8687a81135aaae22720da6eb45b25580fd372dbf50e65d19ad2272d395482e12fe763bd8e70b618a8a18cfd99663121527ae7e178b64cf9a5774bb7ad792df8750d7daec06bb3a584d1bac90f48ff8507d65129c084fe038141d0f47c77f3c4971ef57b1ee623d94be3b79bd772fa85f7b703183d9bce97b2cdc9b90cdbc9f99750153e895087defd534c64f2d7041ba8062bff3aa91da4928e15680031663f1b71b6c0fed554f96e9f4d682dcc2bb2024f4a2bd223a3b4330a0d0a26d4839ad6a15e9f7d4f14112195a99bf4cc59d4b6d85d08b613c78782a0e00c6d262714219c487a8cee86e76fbe7ad25edce0168fe74f0afd5442aaacaf4ff6a58eaf9d121da8f11b852f435e51abfe8e4ef9aca71d4d4e421897f4c55dc87739efffdcea6fa558195cb0b904cc8275228e49d24eb525876446b8ed5bfc3477200ad03e0fe8832fe3ac518e24491f71afc30d6c2c1196ce3e47c7b50e9fd66c665797c83d93d9d35d8de61a913be8c8d632490ef7bd05e5520f459f6c92a261187dd55e68bfaec191ed258dff13c8f4d64c466c8cbf96d79ef6fe122caf23b9b9615b78bf73c8e8942ebcf3675ef3a8f6e8c237ec1bbef8eac25d7e49969f0195746d9a67cd1b986e3f5d0d89a9e6f656ce5f2e7ce03a2baf27267a7e6f09310a7651f8f8aee063594c4440f2ccf04e8967b235cf56fe49e0b60b4c8ab77f71a3cbefab45478ad36cdbcbf8e3f2a1f121215f737b9458a4d2404505b82defabe7a869aa8aa70ca588745bab1648ca4e53ed45cee83ea3120600609d8c0dbfc433327463544420d7ce19913b7a823bf9b69297ba85828e7c2a37da5e982fd0d97f0f281c6089934d7230aacb6d67855069af951c43c3a3d222f87439ae50ba1b3056ca0bc874dd441737792dabc48ee1c4fcf811b32902ce40c8b4b69c536fdfbce9999dc4cfdabbb4d70ba0e73e035c1b2262321ad9324ae6399806c5e3aff79ea7264f8e7680f6a09698902876092bd73d3f46820aaa4085d068f44f669b9785189726b045c4b49124bd33ad1bc0541ba9812909949fe21c7d6f6989d5bdbf3f2c9413fe335e84d64c95d239b5e886a7116dde327b746dc584330fdf579cbc30b8a7e824fe7a0153744706d4b660865f56a456592942f1510e40229ea873cc3af0244a83103fee04b4405be89db8fd75e786d870b41af1a0ef93a72e5f3a97039c3bef94456ca3e21d8c6e84784486ea8518ddfdcc6826d279de7e663f16b8014fd5e5fca84529c89e79f8d928b85ca356c1967b5dd879fbdc0d20384a0e8fdd586868d37796393b5bf81183972b8d74ba0893cbee7ccdba163b73778075b9d80f0451622ea45bf2134a3adbe61380ddc09c6937607abbe39f86f920f82122b35bf2df437926f957c02e548ee01a61125a1396d6e75bd3e2ea8c68404964b2cb45c644a028d90a04eea2bcb16d0d3bcfb17e45e75c0ad623064306ffaca7b1b657e85a0a8a2dbd12e2957a03c9082b039278609e9c46b1610272b20d72edcc36a61ae42b580d5b8296fa28dd9943ddd88ed32caf600a8ebbaa056da3229fda211f5690b68958effac0fb849c3d3cc65d5af3bb6b8bbe10e03fbcc08987e1f5a129355aaa5cbbf7922097794d7a7eb211851404b3ef8d328292218f9d280ccbdb222de78c10bfbbd6deff917570cb3fa5c7a2a0e2a47f7b15138e1cd51b6b2c41dfb204b96bbe3c04050f771d1e9a7a531966da1b43832e325cb5527244921cc0c6c575652dcd7c4868b5d0065e4910ba5d9588d615bb5aa150b65352b3d1846f06a95b05f1f2a8f922f61f10dddac74c09a7821c125a92c66ef53173d45e93d2c1b8a4537e9a056444ac12e71784e83f4dcedc0f0b945ad22e9e6d76f5a66217cda79435da438d4294018548154319a2f4ba7e2c047a382529505fd9d2424ef88ca097f5768e0238928c6a5e2d00576633c270dd642c22a1b5dacf45188f3eb631fa8e00167a858ec44a97a687e382a980b92b8e6c785861e28dca231ceffa58760fffdeeec78f82b60ca390450bb6d808fba87ba71c8a8f7c931f7c887682e61e5aeef782a12853db9b973addec024faf28a42331c986da2d90cb5a2c4a204321db79544037182c368ad844cf7e294aa8124e6ff4cac25b117c6cc39adcf29c460a5fe6bdd203532bb716cb3a462b716c2efbcd92463e495eed56140cb4fdead6f65ba096166bb201822fb4b11664592c29b63b54f4b63e9e4909cafe5f462d160f8cb6c4e7a083e5f99371df9bd2cb4dec23ad6376eb24f1611d393302ccebd6eb95e0470c25b227328c791de911b2f6eeac31d35d1ba9215b3f5bcebf05d0d178ae6ab729b39c7dbad22d44ddf4ec797852c1790ae6312d93ec8af26bb66c2d1a5eee2e3dbf61e1f077fc35173af2d904199f580807487ddc6808e88086b1cf063641671a7cc27b80836103e573a1087bb724e80febf8bb6eaa2108161a2b0ae038506a0c38f49c9f333c9225e62cd4b82c890d4e8f5e258301ff64ce5ced22039379df9a95764ee6e5608f6e4146ba577e7aaf0f91b46e48c28ee90cc26d0bd2765d0170f6b874e15989073c7328c103ae7cb79aae619c5e66a12fe48e8d9c200a11a1a20b6f4120900806800f62014a55d0302d3532b4d5fe9bcead16fea05e82294c263ce5857693a75dbfd5c8e1db596fecd9a00a2fb2648fa120bcbb85405631a810be70bc29d9d20675486de68d55c19e7b35ee7c119cb38c302c2b1117482304fa53f4be710c25d25f6541037bb43aa25d1fed9b3ba6b3a37ef8d6125d53aae0a0f698afda4917f0c1a9d9f4cb5e833f0e2c9906b0ef111b3d8cf20fc16ef3695bb758115d30af5266bcebf1de188f1b31b4a0d591b7edf4b25b0b155cca98e901dc01cd32489a1ee9add6a13b84b8a9bd7499da7180ac9441f99af53b22775d1473911455d70e00b77196694d12d8a91f1c7f7559f9c79e41afcfbfa5d15ded230ed67c3a3818b2e9ad8a72789545c0b7b215d327d52f8100e44cbd22622108eba723846212b1b6444f7293b5e918567925d00fa0a4bad8f59fe1a8b8233fdcc0e6b04bfd22b139980c7bd1b6cd4f421560baef888a4a727e9a2b6f615195f633f6597b5ffbed246a4e0c45b220d23d14096e57af5608d1cd51000663f1f5fdc703bc571084d0a648592545d98ea32b9892dc6b81a0a5ae7587113d6e1785feb0f5682f55acbdeac2572a8ec7f89062591b8ce94e77fa63d188d71fc18503d1f8a1b4ac803e5ceaad111555c5553afca3379de2b5c1e3f1ba9edf5ab4b6e570b40a619aeceb25d8cafd5a39f93cad291dd6b63129f17314f232259cce1357208a0f1caf03f84bf772baba20eb872eafe00a9b273f1394a664b630331c6fb492a002057a9f93c794dd38e8d107750e1f5ab477c88b0647d67d15a1d6070c60e9dd8eac232d1c467722e17b82ddd89f9c0be81ad6e334efd9b1ad1fbd5bb6f358c9f1586cc38865dbe0fa007376fcf2edf53dfb6ae51df7e5743dc78209444a0e017db35889cd05db3e68396745ef3ea3f7bbe767de6f17ba062aab6e06c166e2583f62e1117957fb607677e38c03a3718d3b6b89be107b2607e7e4166af726b1cf24efdd9469e8327e3abee888ad461164bbba1260b43b85995ed5faa18d3162e880391958a88a1acdceaabdff61887ef0941497ab7731283c867a0275652ac3e87c8a46a7010fffb13052e49cc2bf20cfefaf7eba6c254899aecd7af06d8796c0cd25cfc0f9234f6e6180aa35b3bcc2beab3b08f16f8dd54cc95ed486688a685e93bedbb47b5e5c973d92aab436696dc56b4af55080cbf4f05d0972c23eca0849283da18a281e143926d758e718fa45ecc24ff774d2c2c47d36374e643863d234bc4596968592472284086220f6e369def97d6de51abc948ddd10afd2016d3fca95215c1523c8ba2f626ff4fb4886f65f9e5c95575711f9fe121dbb5d6aab3566c8dd773ecace00d19a0289ddcfbe79bbca3b3f9538460c6b01baf6ff744f8f1f6ea5c9e11bc52cf121e69f9520d60f992414872965e0602cfdeab145bba5eeba53afccf58f44a33e15df27c8855f1abaac7d78eef9ab7b1f348a0ac224584bcccd75aca63f1b2ad4b98b8658ed7e1a5ff7b65a508b096c1eb6a3332643739bf04cae3370faed282a35b6d6b70bed5cdc5169364d78c038bf9e447f1627b8769338b239e36281de54a2003ceabaaaff71ffa10d2f463855c33c71bc7e06da3be9ed07902564b7eb61fa27f9082f16f55bb6e5fe7999630384133dbfdadf46e2bc33ff718e80150499aec48906d6086e4f04651c2b893e708f31ba27f2025fdc8397c84ff71406842c4e6dc7c8a01ef1c243247ca4333d589883784993128368cbe581a9eadc16c4cc33b5c56e22f54b8edc356916b45affa9d80fd35d47dfa79b301268e5499ccc30debc52ee730f2c42ee19e5a5dffae7cfd4a2b99c4ed08c68f446b07a1ef6f3868410048702467850f5751ce0a26d0ace3a3985d0f0b3c07dd340e33769ec74b0c529ca73a5495a8b8c3e7ab508dbe2725887125dcca865a4059438a0c7995fa1529e4ea44e94799b6237d7121499692a4d335b53cce1e32404380e0bc185f44bc33b1bce335dfc54eb288ab5a5ef27550a37e46ef2ba9e23bddbf5e177b55e691e09b519cd42331ccf5be51ebb146fa56fa48bed6d1aa7be90bb0f671ff4ed038ced9d8371fef9cc6f191881a34aa6952654970a530284cf1d42807149cf0cf3de63d836cb0e90db35424ed853c15deb9cf98caee3ea972ff7d27f2416953ba0dd20d7d16d3b09e52a43654b092a0a14406c8b2abf27582fe00a18d6f7bbec02d3f099cf5c8e70fdc885472dd7e129317a953ed428e9a520db9aeec81908e3fead02db61f360338ccce63771054b9566733fd0f4d5047be9fc5a333ea626d88d1e8d398b83080f48a408864e198c4e2b3706f6e80771164742fe405ee3e50f776ad837733f65dc86791594449eb046abb15c2b42b23e644aaac54b73aace855a4229540165bf5b8d94e0963c7cf3359b467b00db127e6f6194f2926da6eb0bd73dd1d2dee116dbd1d1dd1fd7f89123dda86086a23450a7af34fdb79d873f8671cd381d8c0f80fbe6cf1c697f2be6171719f3f0c3ce381482595fa9a78ab87cc9658d8e5b83267caf2fb57a75a88faabcdaea0443afd8debbf68cda278c18ecc8dc89527ac4638aaea8fec6d016813577c6f26eb5d940ddc532657662932721b74113d48d7ab8b9a6d08623c1292338e2138cb48020adc7142a5acbb4ae25173adce9a6f20f55be1adb7e197adf81fde7ed8b0e82969a5392520dde77ea5c1850a5be72b381f05d546e884229947de4d52e69e9477ba3e737f831544b25e774d35be90e8f37dbf59ee84e329974d171193421b9d1f42b6510c61043ae94ff38eb93ce706119f329ac4c847f2c3add75faf49b5d0a395e6604a6b8731aca6180f07fefaf7d26891789701a8c92d7adfa1ccbcaf5cc716ba89f2ef26fcce88707c6571eaa2e55805d6c8431a78ccaa0e00af44877e901b32862e780c560bb6fe579b79167fcab1b9d958ae531addbc8a01179f208a183e532d6d28a6d5e697c2ce30be155e6cfc9c96db2c450cb90ed38e0377658d75b2a0cabfaacf48a2e90664da793aca09d936912c31b18bcf125f8de9e861a6b61257940d8fdf5c8fb3f961500f6491d10b09e56e9037ec9fc9c5b3f4ec4a08a93f643927386fb1f7b82f770976a2920c3dd51c0b8664c3c1fc5f5577e8c5784cb55bf5dc14e180d216c2d3bf37774b6705365ddf7420395c4f8cd57033673ede08c792acd5a6b9942aaaf567ebda59b97fa3740a8513c2e98d9f9f2d3f635366bd735646fbf998b43334649461f7217193ffdc382dcf221b2425943897a8453c8c20494c59553f9f2dde9e6eb012554bbb0d98966b69a2ffe9818c0f754d194b0acbaa9898df1088a810f9893bbede7dad51d58457970eb5c37e07ad7f3a87ec7fae498e0efff63cf26c847dec6d0b43f71e513aacd555ce143cbf0b2de1ae1cfa17d1b4a453900e77a7042b455ac3010f81d8f0b1020e48576fbce61a5cdcfdd6a4d8ba6cf14a72ea055fac65fd6603ee1f6132e558cbaf0293e5f5e4458d2f6f57b159efba249035e623508b6ebf4212880537054d2638794f65aaa8017b1f7982b3196940545698acf38825e190a4d7268936d38994caad4700a22b921d8f0d6372ef9543cad36d2c8db167953e174b33e0d71375cc296a8dce8b4f66a3ab868106131e54cb21e3a355baf2c2d04da339f4cb36cece67733a25e54195ffdb08eae0350b891fbefa1bf40f8d6c5513615f3ff0ff8a3be412c2a747327b6f737fd8790f5e0078615abc18d3428362aa08763522cfa86e07ad9eb7fcbfa9ab43f7329fc910353ba011cf50b5519ae25f0e6741357fafde7acac2807104c9acfbe107bcb1cd9b1aec4feccf4531585bf8fd1a9b1f3a14267f86ab85ada513e80795cb990bcde6edd3c214cf431902ef30e6c7c5c83f85fa64d81e62b969f925fda617700727896341006b5cfd71cec0966bdea79116667600b7b8fca3f7f5c38a598c544eb4b9c4ed471dd82012e8a7c5ba1adcfa7dd8ba392fc7ae6e2b716743aef3ec95544ed8557085520c693341f11519377fff8dcad507808df581eea2eecd79a526324d2c9de1c05645fdf97976a695738fa74cb609f13c38ea66361a2d05b085fb33b72d973dcfdcbd0e3a88c15cc8981d57b9493fc8d17368bba45767940f" +} diff --git a/test/contract/sequencerInbox.spec.4844.ts b/test/contract/sequencerInbox.spec.4844.ts new file mode 100644 index 00000000..c8752e74 --- /dev/null +++ b/test/contract/sequencerInbox.spec.4844.ts @@ -0,0 +1,598 @@ +/* + * Copyright 2019-2020, Offchain Labs, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-env node, mocha */ + +import { ethers } from 'hardhat' +import { BigNumber } from '@ethersproject/bignumber' +import { JsonRpcProvider, TransactionReceipt } from '@ethersproject/providers' +import { expect } from 'chai' +import { + Bridge, + Bridge__factory, + GasRefunder__factory, + Inbox, + Inbox__factory, + MessageTester, + MessageTester__factory, + RollupMock__factory, + SequencerInbox__factory, + TransparentUpgradeableProxy__factory, +} from '../../build/types' +import { applyAlias } from './utils' +import { Event } from '@ethersproject/contracts' +import { Interface } from '@ethersproject/abi' +import { + BridgeInterface, + MessageDeliveredEvent, +} from '../../build/types/src/bridge/Bridge' +import { Signer, Wallet, constants, utils } from 'ethers' +import { + keccak256, + parseEther, + solidityKeccak256, + solidityPack, +} from 'ethers/lib/utils' +import { Toolkit4844 } from './toolkit4844' +import { SequencerInbox } from '../../build/types/src/bridge/SequencerInbox' +import { InboxMessageDeliveredEvent } from '../../build/types/src/bridge/AbsInbox' +import { SequencerBatchDeliveredEvent } from '../../build/types/src/bridge/ISequencerInbox' + +describe('SequencerInbox', async () => { + const findMatchingLogs = ( + receipt: TransactionReceipt, + iFace: TInterface, + eventTopicGen: (i: TInterface) => string + ): TEvent['args'][] => { + const logs = receipt.logs.filter( + log => log.topics[0] === eventTopicGen(iFace) + ) + return logs.map(l => iFace.parseLog(l).args as TEvent['args']) + } + + const getMessageDeliveredEvents = (receipt: TransactionReceipt) => { + const bridgeInterface = Bridge__factory.createInterface() + return findMatchingLogs( + receipt, + bridgeInterface, + i => i.getEventTopic(i.getEvent('MessageDelivered')) + ) + } + + const sendDelayedTx = async ( + sender: Signer, + inbox: Inbox, + bridge: Bridge, + messageTester: MessageTester, + l2Gas: number, + l2GasPrice: number, + nonce: number, + destAddr: string, + amount: BigNumber, + data: string + ) => { + const countBefore = ( + await bridge.functions.delayedMessageCount() + )[0].toNumber() + const sendUnsignedTx = await inbox + .connect(sender) + .sendUnsignedTransaction(l2Gas, l2GasPrice, nonce, destAddr, amount, data) + const sendUnsignedTxReceipt = await sendUnsignedTx.wait() + + const countAfter = ( + await bridge.functions.delayedMessageCount() + )[0].toNumber() + expect(countAfter, 'Unexpected inbox count').to.eq(countBefore + 1) + + const senderAddr = applyAlias(await sender.getAddress()) + + const messageDeliveredEvent = getMessageDeliveredEvents( + sendUnsignedTxReceipt + )[0] + const l1BlockNumber = sendUnsignedTxReceipt.blockNumber + const blockL1 = await sender.provider!.getBlock(l1BlockNumber) + const baseFeeL1 = blockL1.baseFeePerGas!.toNumber() + const l1BlockTimestamp = blockL1.timestamp + const delayedAcc = await bridge.delayedInboxAccs(countBefore) + + // need to hex pad the address + const messageDataHash = ethers.utils.solidityKeccak256( + ['uint8', 'uint256', 'uint256', 'uint256', 'uint256', 'uint256', 'bytes'], + [ + 0, + l2Gas, + l2GasPrice, + nonce, + ethers.utils.hexZeroPad(destAddr, 32), + amount, + data, + ] + ) + expect( + messageDeliveredEvent.messageDataHash, + 'Incorrect messageDataHash' + ).to.eq(messageDataHash) + + const messageHash = ( + await messageTester.functions.messageHash( + 3, + senderAddr, + l1BlockNumber, + l1BlockTimestamp, + countBefore, + baseFeeL1, + messageDataHash + ) + )[0] + + const prevAccumulator = messageDeliveredEvent.beforeInboxAcc + expect(prevAccumulator, 'Incorrect prev accumulator').to.eq( + countBefore === 0 + ? ethers.utils.hexZeroPad('0x', 32) + : await bridge.delayedInboxAccs(countBefore - 1) + ) + + const nextAcc = ( + await messageTester.functions.accumulateInboxMessage( + prevAccumulator, + messageHash + ) + )[0] + + expect(delayedAcc, 'Incorrect delayed acc').to.eq(nextAcc) + + return { + baseFeeL1: baseFeeL1, + deliveredMessageEvent: messageDeliveredEvent, + l1BlockNumber, + l1BlockTimestamp, + delayedAcc, + l2Gas, + l2GasPrice, + nonce, + destAddr, + amount, + data, + senderAddr, + inboxAccountLength: countAfter, + } + } + + const fundAccounts = async ( + wallet: Wallet, + length: number, + amount: BigNumber + ): Promise => { + let key = wallet.privateKey + const wallets: Wallet[] = [] + + for (let index = 0; index < length; index++) { + key = keccak256(key) + const nextWallet = new Wallet(key).connect(wallet.provider) + if ((await nextWallet.getBalance()).lt(amount)) { + await ( + await wallet.sendTransaction({ + to: nextWallet.address, + value: amount, + }) + ).wait() + } + wallets.push(nextWallet) + } + + return wallets + } + + const setupSequencerInbox = async ( + fundingWallet: Wallet, + maxDelayBlocks = 10, + maxDelayTime = 0 + ) => { + const accounts = await fundAccounts(fundingWallet, 5, utils.parseEther('1')) + + const admin = accounts[0] + const adminAddr = await admin.getAddress() + const user = accounts[1] + const deployer = accounts[2] + const rollupOwner = accounts[3] + const batchPoster = accounts[4] + + // update the addresses below and uncomment to avoid redeploying + // return connectAddreses(user, deployer, batchPoster, { + // user: '0x870204e93ca485a6676E264EB0d7df4cD0246203', + // bridge: '0x95491D63100cc7a21155247329007ca294fC752B', + // inbox: '0x00eb941BD8B89E0396A983c870fa74DA4aC5ecFB', + // sequencerInbox: '0x87fEe873425A65Bb2A11dFf6E15B4Ce25e7AFccD', + // messageTester: '0x68BCf73c6b36ae3f20b2fD06c2d4651538Ae02a6', + // batchPoster: '0x328375c90F01Dcb114888DA36e3832F69Ad0BB57', + // gasRefunder: '0x33B1355B2F3BE116eB1c8226CF3B0a433259459C' + // }) + + const rollupMockFac = new RollupMock__factory(deployer) + const rollupMock = await rollupMockFac.deploy( + await rollupOwner.getAddress() + ) + + const reader4844 = await Toolkit4844.deployReader4844(fundingWallet) + + const sequencerInboxFac = new SequencerInbox__factory(deployer) + const seqInboxTemplate = await sequencerInboxFac.deploy( + 117964, + reader4844.address, + false + ) + const inboxFac = new Inbox__factory(deployer) + const inboxTemplate = await inboxFac.deploy(117964) + + const bridgeFac = new Bridge__factory(deployer) + const bridgeTemplate = await bridgeFac.deploy() + await rollupMock.deployed() + await inboxTemplate.deployed() + await bridgeTemplate.deployed() + await seqInboxTemplate.deployed() + + const transparentUpgradeableProxyFac = + new TransparentUpgradeableProxy__factory(deployer) + + const bridgeProxy = await transparentUpgradeableProxyFac.deploy( + bridgeTemplate.address, + adminAddr, + '0x' + ) + const sequencerInboxProxy = await transparentUpgradeableProxyFac.deploy( + seqInboxTemplate.address, + adminAddr, + '0x' + ) + const inboxProxy = await transparentUpgradeableProxyFac.deploy( + inboxTemplate.address, + adminAddr, + '0x' + ) + await bridgeProxy.deployed() + await inboxProxy.deployed() + await sequencerInboxProxy.deployed() + + const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) + const bridgeAdmin = await bridgeFac + .attach(bridgeProxy.address) + .connect(rollupOwner) + const sequencerInbox = await sequencerInboxFac + .attach(sequencerInboxProxy.address) + .connect(user) + await (await bridgeAdmin.initialize(rollupMock.address)).wait() + await ( + await sequencerInbox.initialize(bridgeProxy.address, { + delayBlocks: maxDelayBlocks, + delaySeconds: maxDelayTime, + futureBlocks: 10, + futureSeconds: 3000, + }) + ).wait() + + const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() + await ( + await inbox.initialize(bridgeProxy.address, sequencerInbox.address) + ).wait() + await (await bridgeAdmin.setDelayedInbox(inbox.address, true)).wait() + + await (await bridgeAdmin.setSequencerInbox(sequencerInbox.address)).wait() + const messageTester = await new MessageTester__factory(deployer).deploy() + await messageTester.deployed() + + const gasRefunderFac = new GasRefunder__factory(deployer) + const gasRefunder = await gasRefunderFac.deploy() + await gasRefunder.deployed() + // fund the gas refunder + await ( + await deployer.sendTransaction({ + to: gasRefunder.address, + value: parseEther('0.2'), + }) + ).wait() + await (await gasRefunder.allowContracts([sequencerInbox.address])).wait() + await (await gasRefunder.allowRefundees([batchPoster.address])).wait() + await (await gasRefunder.setExtraGasMargin(35000)).wait() + + const res = { + user, + bridge: bridge, + inbox: inbox, + sequencerInbox: sequencerInbox, + messageTester, + batchPoster, + gasRefunder, + } + + // comment this in to print the addresses that can then be re-used to avoid redeployment + // let consoleRes: { [index: string]: string } = {} + // Object.entries(res).forEach(r => (consoleRes[r[0]] = r[1].address)) + // console.log(consoleRes) + + return res + } + + it('can send normal batch', async () => { + const privKey = + 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' + const prov = new JsonRpcProvider('http://127.0.0.1:8545') + const wallet = new Wallet(privKey).connect(prov) + + const { + user, + inbox, + bridge, + messageTester, + sequencerInbox, + batchPoster, + gasRefunder, + } = await setupSequencerInbox(wallet) + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + + const subMessageCount = await bridge.sequencerReportedSubMessageCount() + const balBefore = await batchPoster.getBalance() + await ( + await sequencerInbox + .connect(batchPoster) + .functions[ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + await bridge.sequencerMessageCount(), + '0x0042', + await bridge.delayedMessageCount(), + gasRefunder.address, + subMessageCount, + subMessageCount.add(1) + ) + ).wait() + expect((await batchPoster.getBalance()).gt(balBefore), 'Refund not enough') + }) + + it('can send blob batch', async () => { + const privKey = + 'cb5790da63720727af975f42c79f69918580209889225fa7128c92402a6d3a65' + const prov = new JsonRpcProvider('http://127.0.0.1:8545') + const wallet = new Wallet(privKey).connect(prov) + + const { + user, + inbox, + bridge, + messageTester, + sequencerInbox, + batchPoster, + gasRefunder, + } = await setupSequencerInbox(wallet) + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + const subMessageCount = await bridge.sequencerReportedSubMessageCount() + const afterDelayedMessagesRead = await bridge.delayedMessageCount() + const sequenceNumber = await bridge.sequencerMessageCount() + + const balBefore = await batchPoster.getBalance() + const txHash = await Toolkit4844.sendBlobTx( + batchPoster.privateKey.substring(2), + sequencerInbox.address, + ['0x0142', '0x0143'], + sequencerInbox.interface.encodeFunctionData( + 'addSequencerL2BatchFromBlobs', + [ + sequenceNumber, + afterDelayedMessagesRead, + gasRefunder.address, + subMessageCount, + subMessageCount.add(1), + ] + ) + ) + + expect((await batchPoster.getBalance()).gt(balBefore), 'Refund not enough') + + const batchSendTx = await Toolkit4844.getTx(txHash) + const blobHashes = (batchSendTx as any)['blobVersionedHashes'] as string[] + const batchSendReceipt = await Toolkit4844.getTxReceipt(txHash) + const { + timestamp: blockTimestamp, + number: blockNumber, + baseFeePerGas, + } = await wallet.provider.getBlock(batchSendReceipt.blockNumber) + + const timeBounds = await getTimeBounds( + blockNumber, + blockTimestamp, + sequencerInbox + ) + const dataHash = formDataBlobHash( + timeBounds, + afterDelayedMessagesRead.toNumber(), + blobHashes + ) + const batchDeliveredEvent = batchSendReceipt.logs + .filter( + (b: any) => + b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && + b.topics[0] === + sequencerInbox.interface.getEventTopic('SequencerBatchDelivered') + ) + .map( + (l: any) => sequencerInbox.interface.parseLog(l).args + )[0] as SequencerBatchDeliveredEvent['args'] + if (!batchDeliveredEvent) throw new Error('missing batch event') + + const seqMessageCountAfter = ( + await bridge.sequencerMessageCount() + ).toNumber() + const delayedMessageCountAfter = ( + await bridge.delayedMessageCount() + ).toNumber() + + // -2 since we add a message to the from the sequencer inbox + const beforeAcc = + seqMessageCountAfter > 1 + ? await bridge.sequencerInboxAccs(seqMessageCountAfter - 2) + : constants.HashZero + expect(batchDeliveredEvent.beforeAcc, 'before acc').to.eq(beforeAcc) + // -2 since we add the batch spending report + const delayedAcc = + delayedMessageCountAfter > 0 + ? await bridge.delayedInboxAccs(delayedMessageCountAfter - 2) + : constants.HashZero + expect(batchDeliveredEvent.delayedAcc, 'delayed acc').to.eq(delayedAcc) + const afterAcc = solidityKeccak256( + ['bytes32', 'bytes32', 'bytes32'], + [beforeAcc, dataHash, delayedAcc] + ) + expect(batchDeliveredEvent.afterAcc, 'after acc').to.eq(afterAcc) + + // check the spending report was submitted + const inboxMsgDeliveredEvent = batchSendReceipt.logs + .filter( + (b: any) => + b.address.toLowerCase() === sequencerInbox.address.toLowerCase() && + b.topics[0] === + sequencerInbox.interface.getEventTopic('InboxMessageDelivered') + ) + .map( + (l: any) => sequencerInbox.interface.parseLog(l).args + )[0] as InboxMessageDeliveredEvent['args'] + + const spendingTimestamp = + '0x' + inboxMsgDeliveredEvent.data.substring(2, 66) + const spendingBatchPoster = + '0x' + inboxMsgDeliveredEvent.data.substring(66, 106) + const spendingDataHash = + '0x' + inboxMsgDeliveredEvent.data.substring(106, 170) + const spendingSeqMessageIndex = + '0x' + inboxMsgDeliveredEvent.data.substring(170, 234) + const spendingBlockBaseFee = + '0x' + inboxMsgDeliveredEvent.data.substring(234, 298) + const spendingExtraGas = + '0x' + inboxMsgDeliveredEvent.data.substring(298, 314) + + expect( + BigNumber.from(spendingTimestamp).eq(blockTimestamp), + 'spending timestamp' + ).to.eq(true) + expect(spendingBatchPoster.toLowerCase(), 'spending batch poster').to.eq( + (await batchPoster.getAddress()).toLowerCase() + ) + expect(spendingDataHash, 'spending data hash').to.eq(dataHash) + expect( + BigNumber.from(spendingSeqMessageIndex).eq(sequenceNumber), + 'spending seq message index' + ).to.eq(true) + + if (baseFeePerGas == null) { + throw new Error('Missing base fee') + } + expect( + BigNumber.from(spendingBlockBaseFee).eq(baseFeePerGas), + `spending basefee: ${BigNumber.from(spendingBlockBaseFee).toString()}` + ).to.eq(true) + expect( + BigNumber.from(spendingExtraGas).gt(0), // blob spending is normalized into extra gas + `spending extra gas: ${BigNumber.from(spendingExtraGas).toString()}` + ).to.eq(true) + }) + + const getTimeBounds = async ( + blockNumber: number, + blockTimestamp: number, + sequencerInbox: SequencerInbox + ): Promise<{ + maxBlock: number + minBlocks: number + minTimestamp: number + maxTimestamp: number + }> => { + const [delayBlocks, futureBlocks, delaySeconds, futureSeconds] = + await sequencerInbox.maxTimeVariation() + return { + minBlocks: + blockNumber > delayBlocks.toNumber() + ? blockNumber - delayBlocks.toNumber() + : 0, + maxBlock: blockNumber + futureBlocks.toNumber(), + minTimestamp: + blockTimestamp > delaySeconds.toNumber() + ? blockTimestamp - delaySeconds.toNumber() + : 0, + maxTimestamp: blockTimestamp + futureSeconds.toNumber(), + } + } + + const formDataBlobHash = ( + timeBounds: { + maxBlock: number + minBlocks: number + minTimestamp: number + maxTimestamp: number + }, + afterDelayedMessagesRead: number, + blobHashes: string[] + ) => { + const header = solidityPack( + ['uint64', 'uint64', 'uint64', 'uint64', 'uint64'], + [ + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlocks, + timeBounds.maxBlock, + afterDelayedMessagesRead, + ] + ) + + return keccak256( + solidityPack( + ['bytes', 'bytes', 'bytes'], + [ + header, + Toolkit4844.DATA_BLOB_HEADER_FLAG, + solidityPack(['bytes32[]'], [blobHashes]), + ] + ) + ) + } +}) diff --git a/test/contract/sequencerInboxForceInclude.spec.ts b/test/contract/sequencerInboxForceInclude.spec.ts index 8d4d2ac5..fcaf2055 100644 --- a/test/contract/sequencerInboxForceInclude.spec.ts +++ b/test/contract/sequencerInboxForceInclude.spec.ts @@ -26,6 +26,7 @@ import { Inbox, Inbox__factory, MessageTester, + RollupMock__factory, SequencerInbox, SequencerInbox__factory, TransparentUpgradeableProxy__factory, @@ -38,6 +39,8 @@ import { MessageDeliveredEvent, } from '../../build/types/src/bridge/Bridge' import { Signer } from 'ethers' +import { Toolkit4844 } from './toolkit4844' +import { data } from './batchData.json' const mineBlocks = async (count: number, timeDiffPerBlock = 14) => { const block = (await network.provider.send('eth_getBlockByNumber', [ @@ -193,9 +196,7 @@ describe('SequencerInboxForceInclude', async () => { messageDataHash ) if (expectedErrorType) { - await expect(forceInclusionTx).to.be.revertedWith( - `reverted with custom error '${expectedErrorType}()'` - ) + await expect(forceInclusionTx).to.be.revertedWith(expectedErrorType) } else { await (await forceInclusionTx).wait() @@ -219,16 +220,29 @@ describe('SequencerInboxForceInclude', async () => { const admin = accounts[0] const adminAddr = await admin.getAddress() const user = accounts[1] - const dummyRollup = accounts[2] + // const dummyRollup = accounts[2] + const rollupOwner = accounts[3] + const batchPoster = accounts[4] + // const batchPosterManager = accounts[5] + + const rollupMockFac = (await ethers.getContractFactory( + 'RollupMock' + )) as RollupMock__factory + const rollup = await rollupMockFac.deploy(await rollupOwner.getAddress()) + const reader4844 = await Toolkit4844.deployReader4844(admin) const sequencerInboxFac = (await ethers.getContractFactory( 'SequencerInbox' )) as SequencerInbox__factory - const seqInboxTemplate = await sequencerInboxFac.deploy() + const seqInboxTemplate = await sequencerInboxFac.deploy( + 117964, + reader4844.address, + false + ) const inboxFac = (await ethers.getContractFactory( 'Inbox' )) as Inbox__factory - const inboxTemplate = await inboxFac.deploy() + const inboxTemplate = await inboxFac.deploy(117964) const bridgeFac = (await ethers.getContractFactory( 'Bridge' )) as Bridge__factory @@ -252,17 +266,14 @@ describe('SequencerInboxForceInclude', async () => { adminAddr, '0x' ) - const bridge = await bridgeFac.attach(bridgeProxy.address).connect(user) const bridgeAdmin = await bridgeFac .attach(bridgeProxy.address) - .connect(dummyRollup) + .connect(rollupOwner) const sequencerInbox = await sequencerInboxFac .attach(sequencerInboxProxy.address) .connect(user) - const inbox = await inboxFac.attach(inboxProxy.address).connect(user) - - await bridge.initialize(await dummyRollup.getAddress()) + await bridge.initialize(rollup.address) await sequencerInbox.initialize(bridgeProxy.address, { delayBlocks: maxDelayBlocks, @@ -270,11 +281,26 @@ describe('SequencerInboxForceInclude', async () => { futureBlocks: 10, futureSeconds: 3000, }) + + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() + + const inbox = await inboxFac.attach(inboxProxy.address).connect(user) + await inbox.initialize(bridgeProxy.address, sequencerInbox.address) await bridgeAdmin.setDelayedInbox(inbox.address, true) await bridgeAdmin.setSequencerInbox(sequencerInbox.address) + await ( + await sequencerInbox + .connect(rollupOwner) + .setIsBatchPoster(await batchPoster.getAddress(), true) + ).wait() + const messageTester = (await ( await ethers.getContractFactory('MessageTester') ).deploy()) as MessageTester @@ -283,18 +309,103 @@ describe('SequencerInboxForceInclude', async () => { user, bridge: bridge, inbox: inbox, - sequencerInbox: sequencerInbox, + sequencerInbox: sequencerInbox as SequencerInbox, messageTester, inboxProxy, inboxTemplate, + batchPoster, bridgeProxy, + rollup, + rollupOwner, } } + it('can add batch', async () => { + const { user, inbox, bridge, messageTester, sequencerInbox, batchPoster } = + await setupSequencerInbox() + + await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + + const messagesRead = await bridge.delayedMessageCount() + const seqReportedMessageSubCount = + await bridge.sequencerReportedSubMessageCount() + await ( + await sequencerInbox + .connect(batchPoster) + .functions[ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + 0, + data, + messagesRead, + ethers.constants.AddressZero, + seqReportedMessageSubCount, + seqReportedMessageSubCount.add(10), + { gasLimit: 10000000 } + ) + ).wait() + }) + it('can force-include', async () => { const { user, inbox, bridge, messageTester, sequencerInbox } = await setupSequencerInbox() + const delayedTx = await sendDelayedTx( + user, + inbox, + bridge, + messageTester, + 1000000, + 21000000000, + 0, + await user.getAddress(), + BigNumber.from(10), + '0x1010' + ) + + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) + + await forceIncludeMessages( + sequencerInbox, + delayedTx.inboxAccountLength, + delayedTx.deliveredMessageEvent.kind, + delayedTx.l1BlockNumber, + delayedTx.l1BlockTimestamp, + delayedTx.baseFeeL1, + delayedTx.senderAddr, + delayedTx.deliveredMessageEvent.messageDataHash + ) + }) + + it('can force-include-with-max-seqReportedCount', async () => { + const { user, inbox, bridge, messageTester, batchPoster, sequencerInbox } = + await setupSequencerInbox() + + await sequencerInbox + .connect(batchPoster) + [ + 'addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)' + ]( + 0, + '0x', + 0, + ethers.constants.AddressZero, + 0, + ethers.constants.MaxUint256 + ) + const delayedTx = await sendDelayedTx( user, inbox, @@ -309,7 +420,7 @@ describe('SequencerInboxForceInclude', async () => { ) const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + await mineBlocks(maxTimeVariation[0].toNumber()) await forceIncludeMessages( sequencerInbox, @@ -352,8 +463,8 @@ describe('SequencerInboxForceInclude', async () => { '0xdeadface' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) await forceIncludeMessages( sequencerInbox, @@ -417,8 +528,8 @@ describe('SequencerInboxForceInclude', async () => { '0x10101010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber()) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber()) await forceIncludeMessages( sequencerInbox, @@ -448,8 +559,8 @@ describe('SequencerInboxForceInclude', async () => { '0x1010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() - await mineBlocks(maxTimeVariation.delayBlocks.toNumber() - 1, 5) + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() + await mineBlocks(delayBlocks.toNumber() - 1, 5) await forceIncludeMessages( sequencerInbox, @@ -480,10 +591,10 @@ describe('SequencerInboxForceInclude', async () => { '0x1010' ) - const maxTimeVariation = await sequencerInbox.maxTimeVariation() + const [delayBlocks, , ,] = await sequencerInbox.maxTimeVariation() // mine a lot of blocks - but use a short time per block // this should mean enough blocks have passed, but not enough time - await mineBlocks(maxTimeVariation.delayBlocks.toNumber() + 1, 5) + await mineBlocks(delayBlocks.toNumber() + 1, 5) await forceIncludeMessages( sequencerInbox, @@ -508,7 +619,7 @@ describe('SequencerInboxForceInclude', async () => { ethers.constants.AddressZero, '0x' ) - ).to.revertedWith('NotForked()') + ).to.revertedWith('NotForked') }) it('should fail to call sendUnsignedTransactionToFork', async function () { @@ -522,14 +633,14 @@ describe('SequencerInboxForceInclude', async () => { 0, '0x' ) - ).to.revertedWith('NotForked()') + ).to.revertedWith('NotForked') }) it('should fail to call sendWithdrawEthToFork', async function () { const { inbox } = await setupSequencerInbox() await expect( inbox.sendWithdrawEthToFork(0, 0, 0, 0, ethers.constants.AddressZero) - ).to.revertedWith('NotForked()') + ).to.revertedWith('NotForked') }) it('can upgrade Inbox', async () => { diff --git a/test/contract/toolkit4844.ts b/test/contract/toolkit4844.ts new file mode 100644 index 00000000..258a2400 --- /dev/null +++ b/test/contract/toolkit4844.ts @@ -0,0 +1,136 @@ +import { execSync } from 'child_process' +import { ContractFactory, Signer, ethers } from 'ethers' +import * as http from 'http' +import { IReader4844, IReader4844__factory } from '../../build/types' +import { JsonRpcProvider } from '@ethersproject/providers' +import { bytecode as Reader4844Bytecode } from '../../out/yul/Reader4844.yul/Reader4844.json' + +const wait = async (ms: number) => + new Promise(res => { + setTimeout(res, ms) + }) + +export class Toolkit4844 { + public static DATA_BLOB_HEADER_FLAG = '0x50' // 0x40 | 0x10 + + public static postDataToGeth(body: any): Promise { + return new Promise((resolve, reject) => { + const options = { + hostname: '127.0.0.1', + port: 8545, + path: '/', + method: 'POST', + headers: { + 'Content-Type': 'application/json;charset=UTF-8', + 'Content-Length': Buffer.byteLength(JSON.stringify(body)), + }, + } + + const req = http.request(options, res => { + let data = '' + + // Event emitted when a chunk of data is received + res.on('data', chunk => { + data += chunk + }) + + // Event emitted when the response is fully received + res.on('end', () => { + resolve(JSON.parse(data)) + }) + }) + + // Handle any errors + req.on('error', error => { + reject(error) + }) + + // Send the POST data + req.write(JSON.stringify(body)) + + // Close the request + req.end() + }) + } + + public static async getTx( + txHash: string + ): Promise { + const body = { + method: 'eth_getTransactionByHash', + params: [txHash], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static async getTxReceipt( + txHash: string + ): Promise { + const body = { + method: 'eth_getTransactionReceipt', + params: [txHash], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static async chainId(): Promise { + const body = { + method: 'eth_chainId', + params: [], + id: Date.now(), + jsonrpc: '2.0', + } + return (await this.postDataToGeth(body))['result'] + } + + public static isReplacementError(err: string) { + const errRegex = + /Error while sending transaction: replacement transaction underpriced:/ + const match = err.match(errRegex) + return Boolean(match) + } + + public static async waitUntilBlockMined( + blockNumber: number, + provider: JsonRpcProvider + ) { + while ((await provider.getBlockNumber()) <= blockNumber) { + await wait(300) + } + } + + public static async sendBlobTx( + privKey: string, + to: string, + blobs: string[], + data: string + ) { + const blobStr = blobs.reduce((acc, blob) => acc + ' -b ' + blob, '') + const blobCommand = `docker run --network=nitro-testnode_default ethpandaops/goomy-blob@sha256:8fd6dfe19bedf43f485f1d5ef3db0a0af569c1a08eacc117d5c5ba43656989f0 blob-sender -p ${privKey} -r http://geth:8545 -t ${to} -d ${data} --gaslimit 1000000${blobStr} 2>&1` + const res = execSync(blobCommand).toString() + const txHashRegex = /0x[a-fA-F0-9]{64}/ + const match = res.match(txHashRegex) + if (match) { + await wait(10000) + return match[0] + } else { + throw new Error('Error sending blob tx:\n' + res) + } + } + + public static async deployReader4844(wallet: Signer): Promise { + const contractFactory = new ContractFactory( + IReader4844__factory.abi, + Reader4844Bytecode, + wallet + ) + const reader4844 = await contractFactory.deploy() + await reader4844.deployed() + + return IReader4844__factory.connect(reader4844.address, wallet) + } +} diff --git a/test/contract/validatorWallet.spec.ts b/test/contract/validatorWallet.spec.ts index 90e1a5d1..8bf305c6 100644 --- a/test/contract/validatorWallet.spec.ts +++ b/test/contract/validatorWallet.spec.ts @@ -5,6 +5,7 @@ import { ValidatorWalletCreator__factory, ValidatorWallet, RollupMock, + RollupMock__factory, } from '../../build/types' import { initializeAccounts } from './utils' @@ -14,6 +15,7 @@ describe('Validator Wallet', () => { let accounts: Awaited> let owner: ArrayElement let executor: ArrayElement + let rollupOwner: ArrayElement let walletCreator: ValidatorWalletCreator let wallet: ValidatorWallet let rollupMock1: RollupMock @@ -26,8 +28,9 @@ describe('Validator Wallet', () => { walletCreator = await WalletCreator.deploy() await walletCreator.deployed() - owner = await accounts[0] - executor = await accounts[1] + owner = accounts[0] + executor = accounts[1] + rollupOwner = accounts[2] const walletCreationTx = await (await walletCreator.createWallet([])).wait() const events = walletCreationTx.logs @@ -45,9 +48,15 @@ describe('Validator Wallet', () => { await wallet.setExecutor([await executor.getAddress()], [true]) await wallet.transferOwnership(await owner.getAddress()) - const RollupMock = await ethers.getContractFactory('RollupMock') - rollupMock1 = (await RollupMock.deploy()) as RollupMock - rollupMock2 = (await RollupMock.deploy()) as RollupMock + const RollupMock = (await ethers.getContractFactory( + 'RollupMock' + )) as RollupMock__factory + rollupMock1 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock + rollupMock2 = (await RollupMock.deploy( + await rollupOwner.getAddress() + )) as RollupMock await accounts[0].sendTransaction({ to: wallet.address, @@ -92,11 +101,13 @@ describe('Validator Wallet', () => { await expect( wallet.connect(executor).executeTransaction(data, rollupMock1.address, 0) - ).to.be.revertedWith( - `OnlyOwnerDestination("${await owner.getAddress()}", "${await executor.getAddress()}", "${ - rollupMock1.address - }")` ) + .to.be.revertedWith('OnlyOwnerDestination') + .withArgs( + `${await owner.getAddress()}`, + `${await executor.getAddress()}`, + `${rollupMock1.address}` + ) await expect( wallet.connect(owner).executeTransaction(data, rollupMock1.address, 0) ).to.emit(rollupMock1, 'WithdrawTriggered') @@ -126,10 +137,12 @@ describe('Validator Wallet', () => { [rollupMock1.address, rollupMock2.address], [0, 0] ) - ).to.be.revertedWith( - `OnlyOwnerDestination("${await owner.getAddress()}", "${await executor.getAddress()}", "${ - rollupMock2.address - }")` ) + .to.be.revertedWith('OnlyOwnerDestination') + .withArgs( + `${await owner.getAddress()}`, + `${await executor.getAddress()}`, + `${rollupMock2.address}` + ) }) }) diff --git a/test/e2e/erc20rollup.ts b/test/e2e/erc20rollup.ts new file mode 100644 index 00000000..a09e5c26 --- /dev/null +++ b/test/e2e/erc20rollup.ts @@ -0,0 +1,405 @@ +import { + L1ToL2MessageGasEstimator, + L1ToL2MessageStatus, + L1TransactionReceipt, + L2Network, + L2TransactionReceipt, +} from '@arbitrum/sdk' +import { getBaseFee } from '@arbitrum/sdk/dist/lib/utils/lib' +import { JsonRpcProvider } from '@ethersproject/providers' +import { expect } from 'chai' +import { ethers, Wallet } from '@arbitrum/sdk/node_modules/ethers' +import { + ArbSys__factory, + ERC20, + ERC20Bridge__factory, + ERC20Inbox, + ERC20Inbox__factory, + ERC20__factory, + EthVault__factory, + RollupCore__factory, +} from '../../build/types' +import { setupNetworks, sleep } from '../../scripts/testSetup' +import { applyAlias } from '../contract/utils' + +export const config = { + arbUrl: 'http://localhost:8547', + ethUrl: 'http://localhost:8545', +} + +let l1Provider: JsonRpcProvider +let l2Provider: JsonRpcProvider +let _l2Network: L2Network & { nativeToken: string } +let userL1Wallet: Wallet +let userL2Wallet: Wallet +let token: ERC20 +let inbox: ERC20Inbox +const excessFeeRefundAddress = Wallet.createRandom().address +const callValueRefundAddress = Wallet.createRandom().address + +describe('ArbERC20Rollup', () => { + // setup providers and connect deployed contracts + before(async function () { + const { l2Network } = await setupNetworks(config.ethUrl, config.arbUrl) + _l2Network = l2Network + + l1Provider = new JsonRpcProvider(config.ethUrl) + l2Provider = new JsonRpcProvider(config.arbUrl) + userL1Wallet = new ethers.Wallet( + ethers.utils.sha256(ethers.utils.toUtf8Bytes('user_l1user')), + l1Provider + ) + userL2Wallet = new ethers.Wallet(userL1Wallet.privateKey, l2Provider) + token = ERC20__factory.connect(_l2Network.nativeToken, l1Provider) + inbox = ERC20Inbox__factory.connect(_l2Network.ethBridge.inbox, l1Provider) + }) + + it('should have deployed bridge contracts', async function () { + // get rollup as entry point + const rollup = RollupCore__factory.connect( + _l2Network.ethBridge.rollup, + l1Provider + ) + + // check contract refs are properly set + expect(rollup.address).to.be.eq(_l2Network.ethBridge.rollup) + expect((await rollup.sequencerInbox()).toLowerCase()).to.be.eq( + _l2Network.ethBridge.sequencerInbox + ) + expect(await rollup.outbox()).to.be.eq(_l2Network.ethBridge.outbox) + expect((await rollup.inbox()).toLowerCase()).to.be.eq( + _l2Network.ethBridge.inbox + ) + + const erc20Bridge = ERC20Bridge__factory.connect( + await rollup.bridge(), + l1Provider + ) + expect(erc20Bridge.address.toLowerCase()).to.be.eq( + _l2Network.ethBridge.bridge + ) + expect((await erc20Bridge.nativeToken()).toLowerCase()).to.be.eq( + _l2Network.nativeToken + ) + }) + + it('can deposit native token to L2', async function () { + // snapshot state before deposit + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + + /// deposit 60 tokens + const amountToDeposit = ethers.utils.parseEther('60') + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, amountToDeposit) + ).wait() + const depositTx = await inbox + .connect(userL1Wallet) + .depositERC20(amountToDeposit) + + // wait for deposit to be processed + const depositRec = await L1TransactionReceipt.monkeyPatchEthDepositWait( + depositTx + ).wait() + const l2Result = await depositRec.waitForL2(l2Provider) + expect(l2Result.complete).to.be.true + + // check user balance increased on L2 and decreased on L1 + const userL1TokenBalanceAfter = await token.balanceOf(userL1Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenBalanceAfter)).to.be.eq( + amountToDeposit + ) + const userL2BalanceAfter = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2BalanceAfter.sub(userL2Balance)).to.be.eq(amountToDeposit) + + const bridgeL1TokenBalanceAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + // bridge escrow increased + expect(bridgeL1TokenBalanceAfter.sub(bridgeL1TokenBalance)).to.be.eq( + amountToDeposit + ) + }) + + it('can issue retryable ticket (no calldata)', async function () { + // snapshot state before issuing retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const aliasL2Balance = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + const excessFeeReceiverBalance = await l2Provider.getBalance( + excessFeeRefundAddress + ) + const callValueRefundReceiverBalance = await l2Provider.getBalance( + callValueRefundAddress + ) + + //// retryables params + + const to = userL1Wallet.address + const l2CallValue = ethers.utils.parseEther('37') + const data = '0x' + + const l1ToL2MessageGasEstimate = new L1ToL2MessageGasEstimator(l2Provider) + const retryableParams = await l1ToL2MessageGasEstimate.estimateAll( + { + from: userL1Wallet.address, + to: to, + l2CallValue: l2CallValue, + excessFeeRefundAddress: excessFeeRefundAddress, + callValueRefundAddress: callValueRefundAddress, + data: data, + }, + await getBaseFee(l1Provider), + l1Provider + ) + + const tokenTotalFeeAmount = retryableParams.deposit + const gasLimit = retryableParams.gasLimit + const maxFeePerGas = retryableParams.maxFeePerGas + const maxSubmissionCost = retryableParams.maxSubmissionCost + + /// deposit 37 tokens using retryable + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, tokenTotalFeeAmount) + ).wait() + + const retryableTx = await inbox + .connect(userL1Wallet) + .createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ) + + // wait for L2 msg to be executed + await waitOnL2Msg(retryableTx) + + // check balances after retryable is processed + const userL1TokenAfter = await token.balanceOf(userL1Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenAfter)).to.be.eq( + tokenTotalFeeAmount + ) + + const userL2After = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2After.sub(userL2Balance)).to.be.eq(l2CallValue) + + const aliasL2BalanceAfter = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + expect(aliasL2BalanceAfter).to.be.eq(aliasL2Balance) + + const excessFeeReceiverBalanceAfter = await l2Provider.getBalance( + excessFeeRefundAddress + ) + expect(excessFeeReceiverBalanceAfter).to.be.gte(excessFeeReceiverBalance) + + const callValueRefundReceiverBalanceAfter = await l2Provider.getBalance( + callValueRefundAddress + ) + expect(callValueRefundReceiverBalanceAfter).to.be.eq( + callValueRefundReceiverBalance + ) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenAfter.sub(bridgeL1TokenBalance)).to.be.eq( + tokenTotalFeeAmount + ) + }) + + it('can issue retryable ticket', async function () { + // deploy contract on L2 which will be retryable's target + const ethVaultContract = await new EthVault__factory( + userL2Wallet.connect(l2Provider) + ).deploy() + await ethVaultContract.deployed() + + // snapshot state before retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const aliasL2Balance = await l2Provider.getBalance( + applyAlias(userL2Wallet.address) + ) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + const excessFeeReceiverBalance = await l2Provider.getBalance( + excessFeeRefundAddress + ) + const callValueRefundReceiverBalance = await l2Provider.getBalance( + callValueRefundAddress + ) + + //// retryables params + + const to = ethVaultContract.address + const l2CallValue = ethers.utils.parseEther('45') + // calldata -> change 'version' field to 11 + const newValue = 11 + const data = new ethers.utils.Interface([ + 'function setVersion(uint256 _version)', + ]).encodeFunctionData('setVersion', [newValue]) + + const l1ToL2MessageGasEstimate = new L1ToL2MessageGasEstimator(l2Provider) + const retryableParams = await l1ToL2MessageGasEstimate.estimateAll( + { + from: userL1Wallet.address, + to: to, + l2CallValue: l2CallValue, + excessFeeRefundAddress: excessFeeRefundAddress, + callValueRefundAddress: callValueRefundAddress, + data: data, + }, + await getBaseFee(l1Provider), + l1Provider + ) + + const tokenTotalFeeAmount = retryableParams.deposit + const gasLimit = retryableParams.gasLimit + const maxFeePerGas = retryableParams.maxFeePerGas + const maxSubmissionCost = retryableParams.maxSubmissionCost + + /// execute retryable + await ( + await token + .connect(userL1Wallet) + .approve(_l2Network.ethBridge.inbox, tokenTotalFeeAmount) + ).wait() + + const retryableTx = await inbox + .connect(userL1Wallet) + .createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + data + ) + + // wait for L2 msg to be executed + await waitOnL2Msg(retryableTx) + + // check balances after retryable is processed + const userL1TokenAfter = await token.balanceOf(userL2Wallet.address) + expect(userL1TokenBalance.sub(userL1TokenAfter)).to.be.eq( + tokenTotalFeeAmount + ) + + const userL2After = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2After).to.be.eq(userL2Balance) + + const ethVaultBalanceAfter = await l2Provider.getBalance( + ethVaultContract.address + ) + expect(ethVaultBalanceAfter).to.be.eq(l2CallValue) + + const ethVaultVersion = await ethVaultContract.version() + expect(ethVaultVersion).to.be.eq(newValue) + + const aliasL2BalanceAfter = await l2Provider.getBalance( + applyAlias(userL1Wallet.address) + ) + expect(aliasL2BalanceAfter).to.be.eq(aliasL2Balance) + + const excessFeeReceiverBalanceAfter = await l2Provider.getBalance( + excessFeeRefundAddress + ) + expect(excessFeeReceiverBalanceAfter).to.be.gte(excessFeeReceiverBalance) + + const callValueRefundReceiverBalanceAfter = await l2Provider.getBalance( + callValueRefundAddress + ) + expect(callValueRefundReceiverBalanceAfter).to.be.eq( + callValueRefundReceiverBalance + ) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenAfter.sub(bridgeL1TokenBalance)).to.be.eq( + tokenTotalFeeAmount + ) + }) + + it('can withdraw funds from L2 to L1', async function () { + // snapshot state before issuing retryable + const userL1TokenBalance = await token.balanceOf(userL1Wallet.address) + const userL2Balance = await l2Provider.getBalance(userL2Wallet.address) + const bridgeL1TokenBalance = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + + /// send L2 to L1 TX + const arbSys = ArbSys__factory.connect( + '0x0000000000000000000000000000000000000064', + l2Provider + ) + const withdrawAmount = ethers.utils.parseEther('3') + const withdrawTx = await arbSys + .connect(userL2Wallet) + .sendTxToL1(userL1Wallet.address, '0x', { + value: withdrawAmount, + }) + const withdrawReceipt = await withdrawTx.wait() + const l2Receipt = new L2TransactionReceipt(withdrawReceipt) + + // wait until dispute period passes and withdrawal is ready for execution + await sleep(5 * 1000) + + const messages = await l2Receipt.getL2ToL1Messages(userL1Wallet) + const l2ToL1Msg = messages[0] + const timeToWaitMs = 60 * 1000 + await l2ToL1Msg.waitUntilReadyToExecute(l2Provider, timeToWaitMs) + + // execute + await (await l2ToL1Msg.execute(l2Provider)).wait() + + // check balances after withdrawal is processed + const userL1TokenAfter = await token.balanceOf(userL2Wallet.address) + expect(userL1TokenAfter.sub(userL1TokenBalance)).to.be.eq(withdrawAmount) + + const userL2BalanceAfter = await l2Provider.getBalance(userL2Wallet.address) + expect(userL2BalanceAfter).to.be.lte(userL2Balance.sub(withdrawAmount)) + + const bridgeL1TokenAfter = await token.balanceOf( + _l2Network.ethBridge.bridge + ) + expect(bridgeL1TokenBalance.sub(bridgeL1TokenAfter)).to.be.eq( + withdrawAmount + ) + }) +}) + +async function waitOnL2Msg(tx: ethers.ContractTransaction) { + const retryableReceipt = await tx.wait() + const l1TxReceipt = new L1TransactionReceipt(retryableReceipt) + const messages = await l1TxReceipt.getL1ToL2Messages(l2Provider) + + // 1 msg expected + const messageResult = await messages[0].waitForStatus() + const status = messageResult.status + expect(status).to.be.eq(L1ToL2MessageStatus.REDEEMED) +} diff --git a/test/foundry/AbsBridge.t.sol b/test/foundry/AbsBridge.t.sol new file mode 100644 index 00000000..1ce9737b --- /dev/null +++ b/test/foundry/AbsBridge.t.sol @@ -0,0 +1,522 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/IBridge.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "../../src/test-helpers/EthVault.sol"; + +abstract contract AbsBridgeTest is Test { + IBridge public bridge; + + address public user = address(100); + address public userB = address(101); + + address public rollup = address(1000); + address public inbox; + address public outbox = address(1002); + address public seqInbox = address(1003); + + /* solhint-disable func-name-mixedcase */ + function test_enqueueSequencerMessage_NoDelayedMsgs() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // enqueue sequencer msg + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 0; + uint256 prevMessageCount = 0; + uint256 newMessageCount = 15; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid newMessageCount" + ); + bytes32 seqInboxEntry = keccak256(abi.encodePacked(bytes32(0), dataHash, bytes32(0))); + assertEq(bridge.sequencerInboxAccs(0), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 1, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 0, "Invalid seqMessageIndex"); + assertEq(beforeAcc, 0, "Invalid beforeAcc"); + assertEq(delayedAcc, 0, "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_IncludeDelayedMsgs() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + vm.stopPrank(); + + // enqueue sequencer msg with 2 delayed msgs + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 2; + uint256 prevMessageCount = 0; + uint256 newMessageCount = 15; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid sequencerReportedSubMessageCount" + ); + bytes32 seqInboxEntry = keccak256( + abi.encodePacked(bytes32(0), dataHash, bridge.delayedInboxAccs(1)) + ); + assertEq(bridge.sequencerInboxAccs(0), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 1, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 0, "Invalid seqMessageIndex"); + assertEq(beforeAcc, 0, "Invalid beforeAcc"); + assertEq(delayedAcc, bridge.delayedInboxAccs(1), "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_SecondEnqueuedMsg() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox and seq inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + vm.stopPrank(); + + // enqueue 2nd sequencer msg with additional delayed msgs + vm.prank(seqInbox); + bytes32 dataHash = keccak256("blob"); + uint256 afterDelayedMessagesRead = 3; + uint256 prevMessageCount = 10; + uint256 newMessageCount = 20; + (uint256 seqMessageIndex, bytes32 beforeAcc, bytes32 delayedAcc, bytes32 acc) = bridge + .enqueueSequencerMessage( + dataHash, + afterDelayedMessagesRead, + prevMessageCount, + newMessageCount + ); + + // checks + assertEq( + bridge.sequencerReportedSubMessageCount(), + newMessageCount, + "Invalid sequencerReportedSubMessageCount" + ); + bytes32 seqInboxEntry = keccak256( + abi.encodePacked(bridge.sequencerInboxAccs(0), dataHash, bridge.delayedInboxAccs(2)) + ); + assertEq(bridge.sequencerInboxAccs(1), seqInboxEntry, "Invalid sequencerInboxAccs entry"); + assertEq(bridge.sequencerMessageCount(), 2, "Invalid sequencerMessageCount"); + assertEq(seqMessageIndex, 1, "Invalid seqMessageIndex"); + assertEq(beforeAcc, bridge.sequencerInboxAccs(0), "Invalid beforeAcc"); + assertEq(delayedAcc, bridge.delayedInboxAccs(2), "Invalid delayedAcc"); + assertEq(acc, seqInboxEntry, "Invalid acc"); + } + + function test_enqueueSequencerMessage_revert_BadSequencerMessageNumber() public { + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // put some msgs to delayed inbox and seq inbox + vm.startPrank(seqInbox); + bridge.submitBatchSpendingReport(address(1), keccak256("1")); + bridge.submitBatchSpendingReport(address(2), keccak256("2")); + bridge.submitBatchSpendingReport(address(3), keccak256("3")); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, 0, 10); + vm.stopPrank(); + + // setting wrong msg counter shall revert + vm.prank(seqInbox); + uint256 incorrectPrevMsgCount = 300; + vm.expectRevert( + abi.encodeWithSelector(BadSequencerMessageNumber.selector, 10, incorrectPrevMsgCount) + ); + bridge.enqueueSequencerMessage(keccak256("seq"), 2, incorrectPrevMsgCount, 10); + } + + function test_enqueueSequencerMessage_revert_NonSeqInboxCall() public { + // enqueueSequencerMessage shall revert + vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); + bridge.enqueueSequencerMessage(keccak256("msg"), 0, 0, 10); + } + + function test_submitBatchSpendingReport() public { + address sender = address(250); + bytes32 messageDataHash = keccak256(abi.encode("msg")); + + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 0, + 0, + seqInbox, + 13, + sender, + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // submit report + vm.prank(seqInbox); + uint256 count = bridge.submitBatchSpendingReport(sender, messageDataHash); + + // checks + assertEq(count, 0, "Invalid count"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid msg count"); + } + + function test_submitBatchSpendingReport_TwoInRow() public { + address sender = address(250); + bytes32 messageDataHash = keccak256(abi.encode("msg")); + + // submit 1st report + vm.prank(rollup); + bridge.setSequencerInbox(seqInbox); + vm.prank(seqInbox); + bridge.submitBatchSpendingReport(sender, messageDataHash); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 1, + bridge.delayedInboxAccs(0), + seqInbox, + 13, + sender, + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // submit 2nd report + vm.prank(seqInbox); + uint256 count = bridge.submitBatchSpendingReport(sender, messageDataHash); + + // checks + assertEq(count, 1, "Invalid count"); + assertEq(bridge.delayedMessageCount(), 2, "Invalid msg count"); + } + + function test_submitBatchSpendingReport_revert_NonSeqInboxCall() public { + // submitBatchSpendingReport shall revert + vm.expectRevert(abi.encodeWithSelector(NotSequencerInbox.selector, address(this))); + bridge.submitBatchSpendingReport(address(2), keccak256("msg")); + } + + function test_setSequencerInbox() public { + // expect event + vm.expectEmit(true, true, true, true); + emit SequencerInboxUpdated(seqInbox); + + // set seqInbox + vm.prank(address(bridge.rollup())); + bridge.setSequencerInbox(seqInbox); + + // checks + assertEq(bridge.sequencerInbox(), seqInbox, "Invalid seqInbox"); + } + + function test_setSequencerInbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setSequencerInbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setSequencerInbox(seqInbox); + } + + function test_setDelayedInbox_enableInbox() public { + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, true); + + // enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + assertEq(inbox, bridge.allowedDelayedInboxList(0), "Invalid allowedDelayedInboxList"); + } + + function test_setDelayedInbox_disableInbox() public { + // initially enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, false); + + // disable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, false); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + vm.expectRevert(); + bridge.allowedDelayedInboxList(0); + } + + function test_setDelayedInbox_ReEnableInbox() public { + // initially enable inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, true); + + // enable again inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), true, "Invalid allowedDelayedInboxes"); + assertEq(inbox, bridge.allowedDelayedInboxList(0), "Invalid allowedDelayedInboxList"); + } + + function test_setDelayedInbox_ReDisableInbox() public { + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxToggle(inbox, false); + + // disable again inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, false); + + // checks + assertEq(bridge.allowedDelayedInboxes(inbox), false, "Invalid allowedDelayedInboxes"); + vm.expectRevert(); + bridge.allowedDelayedInboxList(0); + } + + function test_setDelayedInbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setDelayedInbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setDelayedInbox(inbox, true); + } + + function test_setOutbox_EnableOutbox() public { + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, true); + + // enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // checks + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + assertEq(outbox, bridge.allowedOutboxList(0), "Invalid allowedOutboxList"); + } + + function test_setOutbox_DisableOutbox() public { + // initially enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, false); + + // disable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, false); + + // checks + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + vm.expectRevert(); + bridge.allowedOutboxList(0); + } + + function test_setOutbox_ReEnableOutbox() public { + // initially enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, true); + + // enable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // checks + assertEq(bridge.allowedOutboxes(outbox), true, "Invalid allowedOutboxes"); + assertEq(outbox, bridge.allowedOutboxList(0), "Invalid allowedOutboxList"); + } + + function test_setOutbox_ReDisableOutbox() public { + // expect event + vm.expectEmit(true, true, true, true); + emit OutboxToggle(outbox, false); + + // disable outbox + vm.prank(rollup); + bridge.setOutbox(outbox, false); + + // checks + assertEq(bridge.allowedOutboxes(outbox), false, "Invalid allowedOutboxes"); + vm.expectRevert(); + bridge.allowedOutboxList(0); + } + + function test_setOutbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setOutbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + bridge.setOutbox(outbox, true); + } + + function test_setOutbox_revert_InvalidOutboxSet() public { + address invalidOutbox = address(type(uint160).max); + + // setOutbox shall revert + vm.expectRevert(abi.encodeWithSelector(InvalidOutboxSet.selector, invalidOutbox)); + vm.prank(rollup); + bridge.setOutbox(invalidOutbox, true); + } + + function test_setSequencerReportedSubMessageCount() public { + uint256 newCount = 1234; + + vm.prank(rollup); + AbsBridge(address(bridge)).setSequencerReportedSubMessageCount(newCount); + + assertEq( + bridge.sequencerReportedSubMessageCount(), + newCount, + "Invalid sequencerReportedSubMessageCount" + ); + } + + function test_setSequencerReportedSubMessageCount_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setOutbox shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + AbsBridge(address(bridge)).setSequencerReportedSubMessageCount(123); + } + + /**** + **** Event declarations + ***/ + + event SequencerInboxUpdated(address newSequencerInbox); + event InboxToggle(address indexed inbox, bool enabled); + event OutboxToggle(address indexed outbox, bool enabled); + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + event BridgeCallTriggered( + address indexed outbox, + address indexed to, + uint256 value, + bytes data + ); +} diff --git a/test/foundry/AbsInbox.t.sol b/test/foundry/AbsInbox.t.sol new file mode 100644 index 00000000..c97bb3ef --- /dev/null +++ b/test/foundry/AbsInbox.t.sol @@ -0,0 +1,411 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; + +abstract contract AbsInboxTest is Test { + IInboxBase public inbox; + IBridge public bridge; + + uint256 public constant MAX_DATA_SIZE = 117_964; + + address public user = address(100); + address public rollup = address(1000); + address public seqInbox = address(1001); + + /* solhint-disable func-name-mixedcase */ + function test_getProxyAdmin() public { + assertNotEq(inbox.getProxyAdmin(), address(0), "Invalid proxy admin"); + } + + function test_setAllowList() public { + address[] memory users = new address[](2); + users[0] = address(300); + users[1] = address(301); + + bool[] memory allowed = new bool[](2); + allowed[0] = true; + allowed[0] = false; + + vm.expectEmit(true, true, true, true); + emit AllowListAddressSet(users[0], allowed[0]); + emit AllowListAddressSet(users[1], allowed[1]); + + vm.prank(rollup); + inbox.setAllowList(users, allowed); + + assertEq(inbox.isAllowed(users[0]), allowed[0], "Invalid isAllowed user[0]"); + assertEq(inbox.isAllowed(users[1]), allowed[1], "Invalid isAllowed user[1]"); + } + + function test_setAllowList_revert_InvalidLength() public { + address[] memory users = new address[](1); + users[0] = address(300); + + bool[] memory allowed = new bool[](2); + allowed[0] = true; + allowed[0] = false; + + vm.expectRevert("INVALID_INPUT"); + vm.prank(rollup); + inbox.setAllowList(users, allowed); + } + + function test_setOutbox_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10_000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setAllowList shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + + address[] memory users = new address[](2); + users[0] = address(300); + bool[] memory allowed = new bool[](2); + allowed[0] = true; + inbox.setAllowList(users, allowed); + } + + function test_setAllowListEnabled_EnableAllowList() public { + assertEq(inbox.allowListEnabled(), false, "Invalid initial value for allowList"); + + vm.expectEmit(true, true, true, true); + emit AllowListEnabledUpdated(true); + + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + assertEq(inbox.allowListEnabled(), true, "Invalid allowList"); + } + + function test_setAllowListEnabled_DisableAllowList() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + assertEq(inbox.allowListEnabled(), true, "Invalid initial value for allowList"); + + vm.expectEmit(true, true, true, true); + emit AllowListEnabledUpdated(false); + + vm.prank(rollup); + inbox.setAllowListEnabled(false); + + assertEq(inbox.allowListEnabled(), false, "Invalid allowList"); + } + + function test_setAllowListEnabled_revert_AlreadyEnabled() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + assertEq(inbox.allowListEnabled(), true, "Invalid initial value for allowList"); + + vm.expectRevert("ALREADY_SET"); + vm.prank(rollup); + inbox.setAllowListEnabled(true); + } + + function test_setAllowListEnabled_revert_AlreadyDisabled() public { + vm.prank(rollup); + vm.expectRevert("ALREADY_SET"); + inbox.setAllowListEnabled(false); + } + + function test_setAllowListEnabled_revert_NonOwnerCall() public { + // mock the owner() call on rollup + address mockRollupOwner = address(10_000); + vm.mockCall( + rollup, + abi.encodeWithSelector(IOwnable.owner.selector), + abi.encode(mockRollupOwner) + ); + + // setAllowListEnabled shall revert + vm.expectRevert( + abi.encodeWithSelector( + NotRollupOrOwner.selector, + address(this), + rollup, + mockRollupOwner + ) + ); + + inbox.setAllowListEnabled(true); + } + + function test_pause() public { + assertEq( + (PausableUpgradeable(address(inbox))).paused(), + false, + "Invalid initial paused state" + ); + + vm.prank(rollup); + inbox.pause(); + + assertEq((PausableUpgradeable(address(inbox))).paused(), true, "Invalid paused state"); + } + + function test_unpause() public { + vm.prank(rollup); + inbox.pause(); + assertEq( + (PausableUpgradeable(address(inbox))).paused(), + true, + "Invalid initial paused state" + ); + vm.prank(rollup); + inbox.unpause(); + + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + } + + function test_initialize_revert_NonDelegated() public { + ERC20Inbox inb = new ERC20Inbox(MAX_DATA_SIZE); + vm.expectRevert("Function must be called through delegatecall"); + inb.initialize(bridge, ISequencerInbox(seqInbox)); + } + + function test_sendL2MessageFromOrigin() public { + // L2 msg params + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDeliveredFromOrigin(0); + + // send L2 msg -> tx.origin == msg.sender + vm.prank(user, user); + uint256 msgNum = inbox.sendL2MessageFromOrigin(data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendL2MessageFromOrigin_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_L1Forked() public { + vm.chainId(10); + vm.expectRevert(abi.encodeWithSelector(L1Forked.selector)); + vm.prank(user, user); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2MessageFromOrigin_revert_NotOrigin() public { + vm.expectRevert(abi.encodeWithSelector(NotOrigin.selector)); + inbox.sendL2MessageFromOrigin(abi.encodePacked("some msg")); + } + + function test_sendL2Message() public { + // L2 msg params + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, data); + + // send L2 msg -> tx.origin == msg.sender + vm.prank(user, user); + uint256 msgNum = inbox.sendL2Message(data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendL2Message_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendL2Message_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendL2Message_revert_L1Forked() public { + vm.chainId(10); + vm.expectRevert(abi.encodeWithSelector(L1Forked.selector)); + vm.prank(user, user); + inbox.sendL2Message(abi.encodePacked("some msg")); + } + + function test_sendUnsignedTransaction() public { + // L2 msg params + uint256 maxFeePerGas = 0; + uint256 gasLimit = 10; + uint256 nonce = 3; + uint256 value = 300; + bytes memory data = abi.encodePacked("test data"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + L2MessageType_unsignedEOATx, + gasLimit, + maxFeePerGas, + nonce, + uint256(uint160(user)), + value, + data + ) + ); + + // send TX + vm.prank(user, user); + uint256 msgNum = inbox.sendUnsignedTransaction( + gasLimit, + maxFeePerGas, + nonce, + user, + value, + data + ); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendUnsignedTransaction_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + vm.prank(user); + inbox.sendUnsignedTransaction(10, 10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendUnsignedTransaction_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendUnsignedTransaction(10, 10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendUnsignedTransaction_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.expectRevert(GasLimitTooLarge.selector); + vm.prank(user, user); + inbox.sendUnsignedTransaction(tooBigGasLimit, 10, 10, user, 10, abi.encodePacked("data")); + } + + function test_sendContractTransaction() public { + // L2 msg params + uint256 maxFeePerGas = 0; + uint256 gasLimit = 10; + uint256 value = 300; + bytes memory data = abi.encodePacked("test data"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + L2MessageType_unsignedContractTx, + gasLimit, + maxFeePerGas, + uint256(uint160(user)), + value, + data + ) + ); + + // send TX + vm.prank(user); + uint256 msgNum = inbox.sendContractTransaction(gasLimit, maxFeePerGas, user, value, data); + + //// checks + assertEq(msgNum, 0, "Invalid msgNum"); + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_sendContractTransaction_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + inbox.sendContractTransaction(10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendContractTransaction_revert_NotAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + vm.prank(user, user); + inbox.sendContractTransaction(10, 10, user, 10, abi.encodePacked("test data")); + } + + function test_sendContractTransaction_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.expectRevert(GasLimitTooLarge.selector); + vm.prank(user); + inbox.sendContractTransaction(tooBigGasLimit, 10, user, 10, abi.encodePacked("data")); + } + + /** + * + * Event declarations + * + */ + + event AllowListAddressSet(address indexed user, bool val); + event AllowListEnabledUpdated(bool isEnabled); + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum); +} + +contract Sender {} diff --git a/test/foundry/AbsOutbox.t.sol b/test/foundry/AbsOutbox.t.sol new file mode 100644 index 00000000..98e92958 --- /dev/null +++ b/test/foundry/AbsOutbox.t.sol @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/IOutbox.sol"; +import "../../src/bridge/IBridge.sol"; + +abstract contract AbsOutboxTest is Test { + IOutbox public outbox; + IBridge public bridge; + + address public user = address(100); + address public rollup = address(1000); + address public seqInbox = address(1001); + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + + assertEq(outbox.l2ToL1Sender(), address(0), "Invalid l2ToL1Sender"); + assertEq(outbox.l2ToL1Block(), 0, "Invalid l2ToL1Block"); + assertEq(outbox.l2ToL1EthBlock(), 0, "Invalid l2ToL1EthBlock"); + assertEq(outbox.l2ToL1Timestamp(), 0, "Invalid l2ToL1Timestamp"); + assertEq(outbox.l2ToL1OutputId(), bytes32(0), "Invalid l2ToL1OutputId"); + } +} diff --git a/test/foundry/Bridge.t.sol b/test/foundry/Bridge.t.sol new file mode 100644 index 00000000..7e7dc4a4 --- /dev/null +++ b/test/foundry/Bridge.t.sol @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "./AbsBridge.t.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; + +contract BridgeTest is AbsBridgeTest { + IEthBridge public ethBridge; + + // msg details + uint8 public kind = 7; + bytes32 public messageDataHash = keccak256(abi.encodePacked("some msg")); + uint256 public ethAmount = 2 ether; + + function setUp() public { + inbox = address(1001); + + // deploy eth and bridge + bridge = Bridge(TestUtil.deployProxy(address(new Bridge()))); + ethBridge = IEthBridge(address(bridge)); + + // init bridge + ethBridge.initialize(IOwnable(rollup)); + + // fund user account + vm.deal(user, 10 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + ethBridge.initialize(IOwnable(rollup)); + } + + function test_initialize_revert_NonDelegated() public { + IEthBridge noTokenBridge = new Bridge(); + vm.expectRevert("Function must be called through delegatecall"); + noTokenBridge.initialize(IOwnable(rollup)); + } + + function test_enqueueDelayedMessage() public { + // inbox will move ETH to bridge + vm.deal(inbox, ethAmount); + uint256 inboxEthBalanceBefore = address(inbox).balance; + uint256 bridgeEthBalanceBefore = address(bridge).balance; + + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // expect event + vm.expectEmit(true, true, true, true); + vm.fee(70); + uint256 baseFeeToReport = block.basefee; + emit MessageDelivered( + 0, + 0, + inbox, + kind, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + baseFeeToReport, + uint64(block.timestamp) + ); + + // enqueue msg inbox->bridge + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: ethAmount}(kind, userAliased, messageDataHash); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethAmount, + "Invalid bridge eth balance" + ); + + uint256 inboxEthBalanceAfter = address(inbox).balance; + assertEq(inboxEthBalanceBefore - inboxEthBalanceAfter, ethAmount, "Invalid inbox balance"); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_TwoInRow() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + vm.deal(inbox, ethAmount); + uint256 inboxEthBalanceBefore = address(inbox).balance; + uint256 bridgeEthBalanceBefore = address(bridge).balance; + + // 1st enqueue msg + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: 1 ether}(2, address(400), messageDataHash); + + // expect event + vm.expectEmit(true, true, true, true); + emit MessageDelivered( + 1, + bridge.delayedInboxAccs(0), + inbox, + 8, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + block.basefee, + uint64(block.timestamp) + ); + + // enqueue msg inbox->bridge + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + ethBridge.enqueueDelayedMessage{value: 1 ether}(8, userAliased, messageDataHash); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethAmount, + "Invalid bridge eth balance" + ); + + uint256 inboxEthBalanceAfter = address(inbox).balance; + assertEq(inboxEthBalanceBefore - inboxEthBalanceAfter, ethAmount, "Invalid inbox balance"); + + assertEq(bridge.delayedMessageCount(), 2, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_revert_UseTokenForFees() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // enqueue msg + hoax(inbox); + vm.expectRevert(); + IERC20Bridge(address(bridge)).enqueueDelayedMessage(kind, user, messageDataHash, 1000); + } + + function test_enqueueDelayedMessage_revert_NotDelayedInbox() public { + hoax(inbox); + vm.expectRevert(abi.encodeWithSelector(NotDelayedInbox.selector, inbox)); + ethBridge.enqueueDelayedMessage{value: ethAmount}(kind, user, messageDataHash); + } + + function test_executeCall_EmptyCalldata() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + uint256 withdrawalAmount = 3 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, user, withdrawalAmount, ""); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({to: user, value: withdrawalAmount, data: ""}); + + //// checks + assertTrue(success, "Execute call failed"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore - bridgeEthBalanceAfter, + withdrawalAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceAfter - userEthBalanceBefore, + withdrawalAmount, + "Invalid user eth balance" + ); + } + + function test_executeCall_WithCalldata() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 vaultEthBalanceBefore = address(vault).balance; + + // call params + uint256 newVaultVersion = 7; + uint256 withdrawalAmount = 3 ether; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertTrue(success, "Execute call failed"); + assertEq(vault.version(), newVaultVersion, "Invalid newVaultVersion"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore - bridgeEthBalanceAfter, + withdrawalAmount, + "Invalid bridge eth balance" + ); + + uint256 vaultEthBalanceAfter = address(vault).balance; + assertEq( + vaultEthBalanceAfter - vaultEthBalanceBefore, + withdrawalAmount, + "Invalid vault eth balance" + ); + } + + function test_executeCall_UnsuccessfulCall() public { + // fund bridge with some eth + vm.deal(address(bridge), 10 ether); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 vaultEthBalanceBefore = address(vault).balance; + + // call params + uint256 withdrawalAmount = 3 ether; + bytes memory revertingData = abi.encodeWithSelector(EthVault.justRevert.selector); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, revertingData); + + //// execute call - do call which reverts + vm.prank(outbox); + (bool success, bytes memory returnData) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: revertingData + }); + + //// checks + assertEq(success, false, "Execute shall be unsuccessful"); + assertEq(vault.version(), 0, "Invalid vaultVersion"); + + // get revert reason + assembly { + returnData := add(returnData, 0x04) + } + string memory revertReason = abi.decode(returnData, (string)); + assertEq(revertReason, "bye", "Invalid revert reason"); + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceBefore, + bridgeEthBalanceAfter, + "Invalid bridge eth balance after unsuccessful call" + ); + + uint256 vaultEthBalanceAfter = address(vault).balance; + assertEq( + vaultEthBalanceAfter, + vaultEthBalanceBefore, + "Invalid vault eth balance after unsuccessful call" + ); + } + + function test_executeCall_revert_NotOutbox() public { + vm.expectRevert(abi.encodeWithSelector(NotOutbox.selector, address(this))); + bridge.executeCall({to: user, value: 0.1 ether, data: ""}); + } + + function test_executeCall_revert_NotContract() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(234); + vm.expectRevert(abi.encodeWithSelector(NotContract.selector, address(to))); + vm.prank(outbox); + bridge.executeCall({to: to, value: 0.1 ether, data: "some data"}); + } +} diff --git a/test/foundry/BridgeCreator.t.sol b/test/foundry/BridgeCreator.t.sol new file mode 100644 index 00000000..f6178d76 --- /dev/null +++ b/test/foundry/BridgeCreator.t.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/rollup/BridgeCreator.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/bridge/AbsInbox.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract BridgeCreatorTest is Test { + BridgeCreator public creator; + address public owner = address(100); + uint256 public constant MAX_DATA_SIZE = 117_964; + IReader4844 dummyReader4844 = IReader4844(address(137)); + + BridgeCreator.BridgeContracts ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, false), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, true), + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); + + function setUp() public { + vm.prank(owner); + creator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); + } + + function getEthBasedTemplates() internal view returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; + ( + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox + ) = creator.ethBasedTemplates(); + return templates; + } + + function getErc20BasedTemplates() internal view returns (BridgeCreator.BridgeContracts memory) { + BridgeCreator.BridgeContracts memory templates; + ( + templates.bridge, + templates.sequencerInbox, + templates.inbox, + templates.rollupEventInbox, + templates.outbox + ) = creator.erc20BasedTemplates(); + return templates; + } + + function assertEq( + BridgeCreator.BridgeContracts memory a, + BridgeCreator.BridgeContracts memory b + ) internal { + assertEq(address(a.bridge), address(b.bridge), "Invalid bridge"); + assertEq(address(a.sequencerInbox), address(b.sequencerInbox), "Invalid seqInbox"); + assertEq(address(a.inbox), address(b.inbox), "Invalid inbox"); + assertEq( + address(a.rollupEventInbox), + address(b.rollupEventInbox), + "Invalid rollup event inbox" + ); + assertEq(address(a.outbox), address(b.outbox), "Invalid outbox"); + } + + /* solhint-disable func-name-mixedcase */ + function test_constructor() public { + assertEq(getEthBasedTemplates(), ethBasedTemplates); + assertEq(getErc20BasedTemplates(), erc20BasedTemplates); + } + + function test_updateTemplates() public { + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ + bridge: Bridge(address(200)), + sequencerInbox: SequencerInbox(address(201)), + inbox: Inbox(address(202)), + rollupEventInbox: RollupEventInbox(address(203)), + outbox: Outbox(address(204)) + }); + + vm.prank(owner); + creator.updateTemplates(templs); + + assertEq(getEthBasedTemplates(), templs); + } + + function test_updateERC20Templates() public { + BridgeCreator.BridgeContracts memory templs = BridgeCreator.BridgeContracts({ + bridge: ERC20Bridge(address(400)), + sequencerInbox: SequencerInbox(address(401)), + inbox: ERC20Inbox(address(402)), + rollupEventInbox: ERC20RollupEventInbox(address(403)), + outbox: ERC20Outbox(address(404)) + }); + + vm.prank(owner); + creator.updateERC20Templates(templs); + + assertEq(getErc20BasedTemplates(), templs); + } + + function test_createEthBridge() public { + address proxyAdmin = address(300); + address rollup = address(301); + address nativeToken = address(0); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + 10, + 20, + 30, + 40 + ); + timeVars.delayBlocks; + + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( + proxyAdmin, + rollup, + nativeToken, + timeVars + ); + ( + IBridge bridge, + ISequencerInbox seqInbox, + IInboxBase inbox, + IRollupEventInbox eventInbox, + IOutbox outbox + ) = ( + contracts.bridge, + contracts.sequencerInbox, + contracts.inbox, + contracts.rollupEventInbox, + contracts.outbox + ); + + // bridge + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + + // seqInbox + assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + + // inbox + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); + + // rollup event inbox + assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + + // outbox + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + + // revert fetching native token + vm.expectRevert(); + IERC20Bridge(address(bridge)).nativeToken(); + } + + function test_createERC20Bridge() public { + address proxyAdmin = address(300); + address rollup = address(301); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)) + ); + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + 10, + 20, + 30, + 40 + ); + timeVars.delayBlocks; // TODO: what is this? + + BridgeCreator.BridgeContracts memory contracts = creator.createBridge( + proxyAdmin, + rollup, + nativeToken, + timeVars + ); + ( + IBridge bridge, + ISequencerInbox seqInbox, + IInboxBase inbox, + IRollupEventInbox eventInbox, + IOutbox outbox + ) = ( + contracts.bridge, + contracts.sequencerInbox, + contracts.inbox, + contracts.rollupEventInbox, + contracts.outbox + ); + + // bridge + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq( + address(IERC20Bridge(address(bridge)).nativeToken()), + nativeToken, + "Invalid nativeToken ref" + ); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + + // seqInbox + assertEq(address(seqInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(seqInbox.rollup()), rollup, "Invalid rollup ref"); + ( + uint256 _delayBlocks, + uint256 _futureBlocks, + uint256 _delaySeconds, + uint256 _futureSeconds + ) = seqInbox.maxTimeVariation(); + assertEq(_delayBlocks, timeVars.delayBlocks, "Invalid delayBlocks"); + assertEq(_futureBlocks, timeVars.futureBlocks, "Invalid futureBlocks"); + assertEq(_delaySeconds, timeVars.delaySeconds, "Invalid delaySeconds"); + assertEq(_futureSeconds, timeVars.futureSeconds, "Invalid futureSeconds"); + + // inbox + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), address(seqInbox), "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq(AbsInbox(address(inbox)).paused(), false, "Invalid paused status"); + + // rollup event inbox + assertEq(address(eventInbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(eventInbox.rollup()), rollup, "Invalid rollup ref"); + + // outbox + assertEq(address(outbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(outbox.rollup()), rollup, "Invalid rollup ref"); + } +} diff --git a/test/foundry/CacheManager.t.sol b/test/foundry/CacheManager.t.sol new file mode 100644 index 00000000..abb3bdf9 --- /dev/null +++ b/test/foundry/CacheManager.t.sol @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "../../src/chain/CacheManager.sol"; + +contract CacheManagerTest is Test { + CacheManager public cacheManager; + CachedItem[] public expectedCache; + + uint256 internal constant MAX_PAY = 100_000_000 ether; + + ArbWasmMock internal constant ARB_WASM = ArbWasmMock(address(0x71)); + ArbWasmCacheMock internal constant ARB_WASM_CACHE = ArbWasmCacheMock(address(0x72)); + + constructor() { + uint64 cacheSize = 1_000_000; + uint64 decay = 0.1 ether; + cacheManager = new CacheManager(cacheSize, decay); + require(cacheManager.cacheSize() == cacheSize, "wrong cache size"); + require(cacheManager.decay() == decay, "wrong decay rate"); + + vm.etch(address(0x6b), type(ArbOwnerPublicMock).runtimeCode); + vm.etch(address(0x71), type(ArbWasmMock).runtimeCode); + vm.etch(address(0x72), type(ArbWasmCacheMock).runtimeCode); + } + + struct CachedItem { + bytes32 codehash; + uint256 bid; + uint256 size; + } + + function test_randomBids() external { + for (uint256 epoch = 0; epoch < 4; epoch++) { + for (uint256 round = 0; round < 512; round++) { + // roll one of 256 random codehashes + bytes32 codehash = keccak256(abi.encodePacked("code", epoch, round)); + codehash = keccak256(abi.encodePacked(uint256(codehash) % 256)); + + // roll a random bid + uint256 pay = uint256(keccak256(abi.encodePacked("value", epoch, round))) % MAX_PAY; + uint256 bid = pay + block.timestamp * uint256(cacheManager.decay()); + + // determine the expected insertion index on success and the bid needed + uint256 index; + uint256 asmSize = ARB_WASM.codehashAsmSize(codehash); + uint256 cumulativeCacheSize = asmSize; + uint256 neededBid; + for (; index < expectedCache.length; index++) { + if (bid >= expectedCache[index].bid) { + break; + } + cumulativeCacheSize += expectedCache[index].size; + if (cumulativeCacheSize > cacheManager.cacheSize()) { + neededBid = expectedCache[index].bid; + break; + } + } + + if (ARB_WASM_CACHE.codehashIsCached(codehash)) { + vm.expectRevert( + abi.encodeWithSelector(CacheManager.AlreadyCached.selector, codehash) + ); + } else if (neededBid > 0) { + vm.expectRevert( + abi.encodeWithSelector(CacheManager.BidTooSmall.selector, bid, neededBid) + ); + } else { + // insert the item by moving over those to the right + expectedCache.push(CachedItem(bytes32(0), 0, 0)); + for (uint256 j = expectedCache.length - 1; j > index; j--) { + expectedCache[j] = expectedCache[j - 1]; + } + expectedCache[index] = CachedItem(codehash, bid, asmSize); + + // pop any excess cache elements + for (index++; index < expectedCache.length; index++) { + cumulativeCacheSize += expectedCache[index].size; + if (cumulativeCacheSize > cacheManager.cacheSize()) { + break; + } + } + while (index < expectedCache.length) { + expectedCache.pop(); + } + } + + cacheManager.placeBid{value: pay}(codehash); + + require( + ARB_WASM_CACHE.numCached() == expectedCache.length, + "wrong number of cached items" + ); + for (uint256 j = 0; j < expectedCache.length; j++) { + require( + ARB_WASM_CACHE.codehashIsCached(expectedCache[j].codehash), + "codehash not cached" + ); + } + + if (round == 768) { + uint256 newCacheSize = 500_000 + + (uint256(keccak256(abi.encodePacked("cacheSize", epoch))) % 1_000_000); + cacheManager.setCacheSize(uint64(newCacheSize)); + } + } + + cacheManager.evictAll(); + require(ARB_WASM_CACHE.numCached() == 0, "cached items after evictAll"); + delete expectedCache; + } + require(ARB_WASM_CACHE.uselessCalls() == 0, "useless ArbWasmCache calls"); + } +} + +contract ArbOwnerPublicMock { + address payable constant NETWORK_FEE_ACCOUNT = payable(address(0xba5eba11)); + + function getNetworkFeeAccount() external pure returns (address payable) { + return NETWORK_FEE_ACCOUNT; + } + + // pretend all smart contracts are chain owners + function isChainOwner(address addr) external view returns (bool) { + uint256 codeSize; + assembly { + codeSize := extcodesize(addr) + } + return codeSize > 0; + } +} + +contract ArbWasmMock { + // returns a non-uniform distribution of mock code sizes + function codehashAsmSize(bytes32 codehash) external pure returns (uint64) { + uint256 size; + for (uint256 i = 0; i < 3; i++) { + size += uint256(keccak256(abi.encodePacked(codehash, i))) % 65536; + } + return uint64(size); + } +} + +contract ArbWasmCacheMock { + mapping(bytes32 => bool) public codehashIsCached; + uint256 public numCached; + uint256 public uselessCalls; + + function cacheCodehash(bytes32 codehash) external { + if (codehashIsCached[codehash]) { + uselessCalls++; + return; + } + codehashIsCached[codehash] = true; + numCached++; + } + + function evictCodehash(bytes32 codehash) external { + if (!codehashIsCached[codehash]) { + uselessCalls++; + return; + } + codehashIsCached[codehash] = false; + numCached--; + } +} diff --git a/test/foundry/ChallengeManager.t.sol b/test/foundry/ChallengeManager.t.sol new file mode 100644 index 00000000..0a46b8af --- /dev/null +++ b/test/foundry/ChallengeManager.t.sol @@ -0,0 +1,62 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/challenge/ChallengeManager.sol"; + +contract ChallengeManagerTest is Test { + IChallengeResultReceiver resultReceiver = IChallengeResultReceiver(address(137)); + ISequencerInbox sequencerInbox = ISequencerInbox(address(138)); + IBridge bridge = IBridge(address(139)); + IOneStepProofEntry osp = IOneStepProofEntry(address(140)); + IOneStepProofEntry newOsp = IOneStepProofEntry(address(141)); + address proxyAdmin = address(141); + ChallengeManager chalmanImpl = new ChallengeManager(); + + function deploy() public returns (ChallengeManager) { + ChallengeManager chalman = ChallengeManager( + address(new TransparentUpgradeableProxy(address(chalmanImpl), proxyAdmin, "")) + ); + chalman.initialize(resultReceiver, sequencerInbox, bridge, osp); + assertEq( + address(chalman.resultReceiver()), + address(resultReceiver), + "Result receiver not set" + ); + assertEq( + address(chalman.sequencerInbox()), + address(sequencerInbox), + "Sequencer inbox not set" + ); + assertEq(address(chalman.bridge()), address(bridge), "Bridge not set"); + assertEq(address(chalman.osp()), address(osp), "OSP not set"); + return chalman; + } + + function testPostUpgradeInit() public { + ChallengeManager chalman = deploy(); + + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(chalman))).upgradeToAndCall( + address(chalmanImpl), + abi.encodeWithSelector(ChallengeManager.postUpgradeInit.selector, newOsp) + ); + + assertEq(address(chalman.osp()), address(newOsp), "New osp not set"); + } + + function testPostUpgradeInitFailsNotAdmin() public { + ChallengeManager chalman = deploy(); + + vm.expectRevert(abi.encodeWithSelector(NotOwner.selector, address(151), proxyAdmin)); + vm.prank(address(151)); + chalman.postUpgradeInit(osp); + } + + function testPostUpgradeInitFailsNotDelCall() public { + vm.expectRevert(bytes("Function must be called through delegatecall")); + vm.prank(proxyAdmin); + chalmanImpl.postUpgradeInit(osp); + } +} diff --git a/test/foundry/ERC20Bridge.t.sol b/test/foundry/ERC20Bridge.t.sol new file mode 100644 index 00000000..fc1d2acb --- /dev/null +++ b/test/foundry/ERC20Bridge.t.sol @@ -0,0 +1,404 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "./AbsBridge.t.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/IEthBridge.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; + +import "forge-std/console.sol"; + +contract ERC20BridgeTest is AbsBridgeTest { + IERC20Bridge public erc20Bridge; + IERC20 public nativeToken; + + uint256 public constant MAX_DATA_SIZE = 117_964; + + // msg details + uint8 public kind = 7; + bytes32 public messageDataHash = keccak256(abi.encodePacked("some msg")); + uint256 public tokenFeeAmount = 30; + + function setUp() public { + // deploy token and bridge + nativeToken = new ERC20PresetMinterPauser("Appchain Token", "App"); + bridge = ERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + erc20Bridge = IERC20Bridge(address(bridge)); + + // init bridge + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + + // deploy inbox + inbox = address(TestUtil.deployProxy(address(new ERC20Inbox(MAX_DATA_SIZE)))); + IERC20Inbox(address(inbox)).initialize(bridge, ISequencerInbox(seqInbox)); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq( + address(erc20Bridge.nativeToken()), + address(nativeToken), + "Invalid nativeToken ref" + ); + assertEq(address(bridge.rollup()), rollup, "Invalid rollup ref"); + assertEq(bridge.activeOutbox(), address(0), "Invalid activeOutbox ref"); + } + + function test_initialize_revert_ZeroAddressToken() public { + IERC20Bridge noTokenBridge = ERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + vm.expectRevert(abi.encodeWithSelector(InvalidTokenSet.selector, address(0))); + noTokenBridge.initialize(IOwnable(rollup), address(0)); + } + + function test_initialize_revert_ReInit() public { + vm.expectRevert("Initializable: contract is already initialized"); + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + } + + function test_initialize_revert_NonDelegated() public { + IERC20Bridge noTokenBridge = new ERC20Bridge(); + vm.expectRevert("Function must be called through delegatecall"); + noTokenBridge.initialize(IOwnable(rollup), address(nativeToken)); + } + + function test_enqueueDelayedMessage() public { + // add fee tokens to inbox + ERC20PresetMinterPauser(address(nativeToken)).mint(inbox, tokenFeeAmount); + + // snapshot + uint256 userNativeTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 inboxNativeTokenBalanceBefore = nativeToken.balanceOf(address(inbox)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // approve bridge to escrow tokens + vm.prank(user); + nativeToken.approve(address(bridge), tokenFeeAmount); + + // expect event + vm.expectEmit(true, true, true, true); + vm.fee(70); + uint256 baseFeeToReport = 0; + emit MessageDelivered( + 0, + 0, + inbox, + kind, + AddressAliasHelper.applyL1ToL2Alias(user), + messageDataHash, + baseFeeToReport, + uint64(block.timestamp) + ); + + // enqueue msg + address userAliased = AddressAliasHelper.applyL1ToL2Alias(user); + vm.prank(inbox); + erc20Bridge.enqueueDelayedMessage(kind, userAliased, messageDataHash, tokenFeeAmount); + + //// checks + uint256 userNativeTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userNativeTokenBalanceAfter, + userNativeTokenBalanceBefore, + "Invalid user token balance" + ); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceAfter - bridgeNativeTokenBalanceBefore, + tokenFeeAmount, + "Invalid bridge token balance" + ); + + uint256 inboxNativeTokenBalanceAfter = nativeToken.balanceOf(address(inbox)); + assertEq( + inboxNativeTokenBalanceBefore - inboxNativeTokenBalanceAfter, + tokenFeeAmount, + "Invalid inbox token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_enqueueDelayedMessage_revert_UseEthForFees() public { + // allow inbox + vm.prank(rollup); + bridge.setDelayedInbox(inbox, true); + + // enqueue msg + hoax(inbox); + vm.expectRevert(); + IEthBridge(address(bridge)).enqueueDelayedMessage{value: 0.1 ether}( + kind, + user, + messageDataHash + ); + } + + function test_enqueueDelayedMessage_revert_NotDelayedInbox() public { + vm.prank(inbox); + vm.expectRevert(abi.encodeWithSelector(NotDelayedInbox.selector, inbox)); + erc20Bridge.enqueueDelayedMessage(kind, user, messageDataHash, tokenFeeAmount); + } + + function test_executeCall_EmptyCalldata() public { + // fund bridge native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // call params + uint256 withdrawalAmount = 15; + bytes memory data = ""; + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, user, withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall(user, withdrawalAmount, data); + + //// checks + assertTrue(success, "Execute call failed"); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceAfter - userTokenBalanceBefore, + withdrawalAmount, + "Invalid user token balance" + ); + } + + function test_executeCall_ExtraCall() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // native token balances + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 vaultNativeTokenBalanceBefore = nativeToken.balanceOf(address(vault)); + + // call params + uint256 withdrawalAmount = 15; + uint256 newVaultVersion = 7; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call + vm.prank(outbox); + (bool success, ) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertTrue(success, "Execute call failed"); + assertEq(vault.version(), newVaultVersion, "Invalid newVaultVersion"); + + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge native token balance" + ); + + uint256 vaultNativeTokenBalanceAfter = nativeToken.balanceOf(address(vault)); + assertEq( + vaultNativeTokenBalanceAfter - vaultNativeTokenBalanceBefore, + withdrawalAmount, + "Invalid vault native token balance" + ); + } + + function test_executeCall_UnsuccessfulExtraCall() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // native token balances + uint256 bridgeNativeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 vaultNativeTokenBalanceBefore = nativeToken.balanceOf(address(vault)); + + // call params + uint256 withdrawalAmount = 15; + bytes memory data = abi.encodeWithSelector(EthVault.justRevert.selector); + + // expect event + vm.expectEmit(true, true, true, true); + emit BridgeCallTriggered(outbox, address(vault), withdrawalAmount, data); + + //// execute call - do call which reverts + vm.prank(outbox); + (bool success, bytes memory returnData) = bridge.executeCall({ + to: address(vault), + value: withdrawalAmount, + data: data + }); + + //// checks + assertEq(success, false, "Execute shall be unsuccessful"); + assertEq(vault.version(), 0, "Invalid vaultVersion"); + + // get and assert revert reason + assembly { + returnData := add(returnData, 0x04) + } + string memory revertReason = abi.decode(returnData, (string)); + assertEq(revertReason, "bye", "Invalid revert reason"); + + // bridge successfully sent native token even though extra call was unsuccessful (we didn't revert it) + uint256 bridgeNativeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeNativeTokenBalanceBefore - bridgeNativeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge native token balance after unsuccessful extra call" + ); + + // vault successfully recieved native token even though extra call was unsuccessful (we didn't revert it) + uint256 vaultNativeTokenBalanceAfter = nativeToken.balanceOf(address(vault)); + assertEq( + vaultNativeTokenBalanceAfter - vaultNativeTokenBalanceBefore, + withdrawalAmount, + "Invalid vault native token balance after unsuccessful call" + ); + } + + function test_executeCall_UnsuccessfulNativeTokenTransfer() public { + // fund bridge with native tokens + ERC20PresetMinterPauser(address(nativeToken)).mint(address(bridge), 15); + + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // deploy some contract that will be call receiver + EthVault vault = new EthVault(); + + // call params + uint256 withdrawalAmount = 100_000_000; + uint256 newVaultVersion = 9; + bytes memory data = abi.encodeWithSelector(EthVault.setVersion.selector, newVaultVersion); + + //// execute call - do call which reverts on native token transfer due to invalid amount + vm.prank(outbox); + vm.expectRevert("ERC20: transfer amount exceeds balance"); + bridge.executeCall({to: address(vault), value: withdrawalAmount, data: data}); + } + + function test_executeCall_revert_NotOutbox() public { + vm.expectRevert(abi.encodeWithSelector(NotOutbox.selector, address(this))); + bridge.executeCall({to: user, value: 10, data: ""}); + } + + function test_executeCall_revert_NotContract() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(234); + vm.expectRevert(abi.encodeWithSelector(NotContract.selector, address(to))); + vm.prank(outbox); + bridge.executeCall({to: to, value: 10, data: "some data"}); + } + + function test_executeCall_revert_CallTargetNotAllowed() public { + // allow outbox + vm.prank(rollup); + bridge.setOutbox(outbox, true); + + // executeCall shall revert when 'to' is not contract + address to = address(nativeToken); + vm.expectRevert(abi.encodeWithSelector(CallTargetNotAllowed.selector, to)); + vm.prank(outbox); + bridge.executeCall({to: to, value: 10, data: "some data"}); + } + + function test_executeCall_revert_CallNotAllowed() public { + // deploy and initi bridge contracts + address _rollup = makeAddr("rollup"); + address _outbox = makeAddr("outbox"); + address _gateway = address(new MockGateway()); + address _nativeToken = address(new MockBridgedToken(_gateway)); + IERC20Bridge _bridge = IERC20Bridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + _bridge.initialize(IOwnable(_rollup), address(_nativeToken)); + + // allow outbox + vm.prank(_rollup); + _bridge.setOutbox(_outbox, true); + + // fund bridge + MockBridgedToken(_nativeToken).transfer(address(_bridge), 100 ether); + + // executeCall shall revert when call changes balance of the bridge + address to = _gateway; + uint256 withdrawAmount = 25 ether; + bytes memory data = abi.encodeWithSelector( + MockGateway.withdraw.selector, + MockBridgedToken(_nativeToken), + withdrawAmount + ); + vm.expectRevert(abi.encodeWithSelector(CallNotAllowed.selector)); + vm.prank(_outbox); + _bridge.executeCall({to: to, value: 10, data: data}); + } +} + +contract MockBridgedToken is ERC20 { + address public gateway; + + constructor(address _gateway) ERC20("MockBridgedToken", "TT") { + gateway = _gateway; + _mint(msg.sender, 1_000_000 ether); + } + + function bridgeBurn(address account, uint256 amount) external { + require(msg.sender == gateway, "ONLY_GATEWAY"); + _burn(account, amount); + } +} + +contract MockGateway { + function withdraw(MockBridgedToken token, uint256 amount) external { + token.bridgeBurn(msg.sender, amount); + } +} diff --git a/test/foundry/ERC20Inbox.t.sol b/test/foundry/ERC20Inbox.t.sol new file mode 100644 index 00000000..a4680eda --- /dev/null +++ b/test/foundry/ERC20Inbox.t.sol @@ -0,0 +1,661 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsInbox.t.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Inbox.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; + +contract ERC20InboxTest is AbsInboxTest { + IERC20 public nativeToken; + IERC20Inbox public erc20Inbox; + + function setUp() public { + // deploy token, bridge and inbox + nativeToken = new ERC20PresetMinterPauser("Appchain Token", "App"); + bridge = IBridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + inbox = IInboxBase(TestUtil.deployProxy(address(new ERC20Inbox(MAX_DATA_SIZE)))); + erc20Inbox = IERC20Inbox(address(inbox)); + + // init bridge and inbox + IERC20Bridge(address(bridge)).initialize(IOwnable(rollup), address(nativeToken)); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + vm.prank(rollup); + bridge.setDelayedInbox(address(inbox), true); + + // fund user account + ERC20PresetMinterPauser(address(nativeToken)).mint(user, 1000 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), seqInbox, "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + + assertEq(IERC20(nativeToken).allowance(address(inbox), address(bridge)), type(uint256).max); + } + + function test_depositERC20_FromEOA() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + depositAmount, + "Invalid user token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_FromEOA_InboxPrefunded() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // prefund inbox with native token amount needed to pay for fees + ERC20PresetMinterPauser(address(nativeToken)).mint(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceBefore, userTokenBalanceAfter, "Invalid user token balance"); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_FromContract() public { + uint256 depositAmount = 300; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + uint256 delayedMsgCountBefore = bridge.delayedMessageCount(); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), depositAmount); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + ); + + // deposit tokens -> tx.origin != msg.sender + vm.prank(user); + erc20Inbox.depositERC20(depositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + depositAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + depositAmount, + "Invalid user token balance" + ); + + uint256 delayedMsgCountAfter = bridge.delayedMessageCount(); + assertEq(delayedMsgCountAfter - delayedMsgCountBefore, 1, "Invalid delayed message count"); + } + + function test_depositERC20_revert_NativeTokenTransferFails() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // deposit tokens + vm.prank(user); + uint256 invalidDepositAmount = 1_000_000; + vm.expectRevert("ERC20: insufficient allowance"); + erc20Inbox.depositERC20(invalidDepositAmount); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq(bridgeTokenBalanceAfter, bridgeTokenBalanceBefore, "Invalid bridge token balance"); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceBefore, userTokenBalanceAfter, "Invalid user token balance"); + + assertEq(bridge.delayedMessageCount(), 0, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromEOA() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.createRetryableTicket({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromContract() public { + address sender = address(new Sender()); + ERC20PresetMinterPauser(address(nativeToken)).mint(address(sender), 1000); + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 senderTokenBalanceBefore = nativeToken.balanceOf(address(sender)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(sender); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + uint256 uintAlias = uint256(uint160(AddressAliasHelper.applyL1ToL2Alias(sender))); + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uintAlias, + uintAlias, + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable + vm.prank(sender); + erc20Inbox.createRetryableTicket({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 senderTokenBalanceAfter = nativeToken.balanceOf(sender); + assertEq( + senderTokenBalanceBefore - senderTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + tokenTotalFeeAmount: 200, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_OnlyAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.prank(user, user); + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + tokenTotalFeeAmount: 200, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientValue() public { + uint256 tooSmallTokenTotalFeeAmount = 3; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 1; + + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + InsufficientValue.selector, + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + tooSmallTokenTotalFeeAmount + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tooSmallTokenTotalFeeAmount, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_RetryableDataTracer() public { + uint256 tokenTotalFeeAmount = 300; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 1; + bytes memory data = abi.encodePacked("xy"); + + // revert as maxFeePerGas == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + gasLimit = 1; + maxFeePerGas = 2; + + // revert as gasLimit == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + } + + function test_createRetryableTicket_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.prank(user, user); + vm.expectRevert(GasLimitTooLarge.selector); + erc20Inbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: tooBigGasLimit, + maxFeePerGas: 2, + tokenTotalFeeAmount: uint256(type(uint64).max) * 3, + data: abi.encodePacked("data") + }); + } + + function test_unsafeCreateRetryableTicket_FromEOA() public { + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + erc20Inbox.unsafeCreateRetryableTicket({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_FromContract() public { + address sender = address(new Sender()); + ERC20PresetMinterPauser(address(nativeToken)).mint(address(sender), 1000); + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 senderTokenBalanceBefore = nativeToken.balanceOf(address(sender)); + + uint256 tokenTotalFeeAmount = 300; + + // approve inbox to fetch tokens + vm.prank(sender); + nativeToken.approve(address(inbox), tokenTotalFeeAmount); + + // retyrable params + uint256 l2CallValue = 10; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 100; + uint256 maxFeePerGas = 2; + bytes memory data = abi.encodePacked("some msg"); + + // expect event (address shall not be aliased) + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + tokenTotalFeeAmount, + maxSubmissionCost, + uint256(uint160(sender)), + uint256(uint160(sender)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable + vm.prank(sender); + erc20Inbox.unsafeCreateRetryableTicket({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tokenTotalFeeAmount, + data: data + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 senderTokenBalanceAfter = nativeToken.balanceOf(sender); + assertEq( + senderTokenBalanceBefore - senderTokenBalanceAfter, + tokenTotalFeeAmount, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_NotRevertingOnInsufficientValue() public { + uint256 tooSmallTokenTotalFeeAmount = 3; + uint256 l2CallValue = 100; + uint256 maxSubmissionCost = 0; + uint256 gasLimit = 10; + uint256 maxFeePerGas = 2; + + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + // approve inbox to fetch tokens + vm.prank(user); + nativeToken.approve(address(inbox), tooSmallTokenTotalFeeAmount); + + vm.prank(user, user); + erc20Inbox.unsafeCreateRetryableTicket({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + tokenTotalFeeAmount: tooSmallTokenTotalFeeAmount, + data: abi.encodePacked("data") + }); + + //// checks + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceAfter - bridgeTokenBalanceBefore, + tooSmallTokenTotalFeeAmount, + "Invalid bridge token balance" + ); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq( + userTokenBalanceBefore - userTokenBalanceAfter, + tooSmallTokenTotalFeeAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_calculateRetryableSubmissionFee() public { + assertEq(inbox.calculateRetryableSubmissionFee(1, 2), 0, "Invalid ERC20 submission fee"); + } +} diff --git a/test/foundry/ERC20Outbox.t.sol b/test/foundry/ERC20Outbox.t.sol new file mode 100644 index 00000000..f97e96be --- /dev/null +++ b/test/foundry/ERC20Outbox.t.sol @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsOutbox.t.sol"; +import "../../src/bridge/ERC20Bridge.sol"; +import "../../src/bridge/ERC20Outbox.sol"; +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract ERC20OutboxTest is AbsOutboxTest { + ERC20Outbox public erc20Outbox; + ERC20Bridge public erc20Bridge; + IERC20 public nativeToken; + + function setUp() public { + // deploy token, bridge and outbox + nativeToken = new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000, address(this)); + bridge = IBridge(TestUtil.deployProxy(address(new ERC20Bridge()))); + erc20Bridge = ERC20Bridge(address(bridge)); + outbox = IOutbox(TestUtil.deployProxy(address(new ERC20Outbox()))); + erc20Outbox = ERC20Outbox(address(outbox)); + + // init bridge and outbox + erc20Bridge.initialize(IOwnable(rollup), address(nativeToken)); + erc20Outbox.initialize(IBridge(bridge)); + + vm.prank(rollup); + bridge.setOutbox(address(outbox), true); + + // fund user account + nativeToken.transfer(user, 1_000); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize_WithdrawalAmount() public { + assertEq(erc20Outbox.l2ToL1WithdrawalAmount(), 0, "Invalid withdrawalAmount"); + } + + function test_executeTransaction() public { + // fund bridge with some tokens + vm.startPrank(user); + nativeToken.approve(address(bridge), 100); + nativeToken.transfer(address(bridge), 100); + vm.stopPrank(); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0x7e87df146feb0900d5a441d1d081867190b34395307698f4e879c8164cd9a7f9, + 0x7e87df146feb0900d5a441d1d081867190b34395307698f4e879c8164cd9a7f9 + ); + + // create msg receiver on L1 + ERC20L2ToL1Target target = new ERC20L2ToL1Target(); + target.setOutbox(address(outbox)); + + //// execute transaction + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 targetTokenBalanceBefore = nativeToken.balanceOf(address(target)); + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15; + bytes memory data = abi.encodeWithSignature("receiveHook()"); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: address(target), + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: data + }); + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq( + bridgeTokenBalanceBefore - bridgeTokenBalanceAfter, + withdrawalAmount, + "Invalid bridge token balance" + ); + + uint256 targetTokenBalanceAfter = nativeToken.balanceOf(address(target)); + assertEq( + targetTokenBalanceAfter - targetTokenBalanceBefore, + withdrawalAmount, + "Invalid target token balance" + ); + + /// check context was properly set during execution + assertEq(uint256(target.l2Block()), 300, "Invalid l2Block"); + assertEq(uint256(target.timestamp()), 1234, "Invalid timestamp"); + assertEq(uint256(target.outputId()), 12, "Invalid outputId"); + assertEq(target.sender(), user, "Invalid sender"); + assertEq(uint256(target.l1Block()), 20, "Invalid l1Block"); + assertEq(uint256(target.withdrawalAmount()), withdrawalAmount, "Invalid withdrawalAmount"); + } + + function test_executeTransaction_revert_CallTargetNotAllowed() public { + // // fund bridge with some tokens + vm.startPrank(user); + nativeToken.approve(address(bridge), 100); + nativeToken.transfer(address(bridge), 100); + vm.stopPrank(); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0x5b6cd410f78e45e55eeb02133b8e72e6ca122c59b667eed4f214e374d808058e, + 0x5b6cd410f78e45e55eeb02133b8e72e6ca122c59b667eed4f214e374d808058e + ); + + //// execute transaction + uint256 bridgeTokenBalanceBefore = nativeToken.balanceOf(address(bridge)); + uint256 userTokenBalanceBefore = nativeToken.balanceOf(address(user)); + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15; + + address invalidTarget = address(nativeToken); + + vm.expectRevert(abi.encodeWithSelector(CallTargetNotAllowed.selector, invalidTarget)); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: invalidTarget, + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: "" + }); + + uint256 bridgeTokenBalanceAfter = nativeToken.balanceOf(address(bridge)); + assertEq(bridgeTokenBalanceBefore, bridgeTokenBalanceAfter, "Invalid bridge token balance"); + + uint256 userTokenBalanceAfter = nativeToken.balanceOf(address(user)); + assertEq(userTokenBalanceAfter, userTokenBalanceBefore, "Invalid user token balance"); + } +} + +/** + * Contract for testing L2 to L1 msgs + */ +contract ERC20L2ToL1Target { + address public outbox; + + uint128 public l2Block; + uint128 public timestamp; + bytes32 public outputId; + address public sender; + uint96 public l1Block; + uint256 public withdrawalAmount; + + function receiveHook() external payable { + l2Block = uint128(IOutbox(outbox).l2ToL1Block()); + timestamp = uint128(IOutbox(outbox).l2ToL1Timestamp()); + outputId = IOutbox(outbox).l2ToL1OutputId(); + sender = IOutbox(outbox).l2ToL1Sender(); + l1Block = uint96(IOutbox(outbox).l2ToL1EthBlock()); + withdrawalAmount = ERC20Outbox(outbox).l2ToL1WithdrawalAmount(); + } + + function setOutbox(address _outbox) external { + outbox = _outbox; + } +} diff --git a/test/foundry/Inbox.t.sol b/test/foundry/Inbox.t.sol new file mode 100644 index 00000000..9b345781 --- /dev/null +++ b/test/foundry/Inbox.t.sol @@ -0,0 +1,637 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsInbox.t.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/Inbox.sol"; +import "../../src/bridge/IInbox.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/ISequencerInbox.sol"; +import "../../src/libraries/AddressAliasHelper.sol"; + +contract InboxTest is AbsInboxTest { + IInbox public ethInbox; + + function setUp() public { + // deploy token, bridge and inbox + bridge = IBridge(TestUtil.deployProxy(address(new Bridge()))); + inbox = IInboxBase(TestUtil.deployProxy(address(new Inbox(MAX_DATA_SIZE)))); + ethInbox = IInbox(address(inbox)); + + // init bridge and inbox + IEthBridge(address(bridge)).initialize(IOwnable(rollup)); + inbox.initialize(bridge, ISequencerInbox(seqInbox)); + vm.prank(rollup); + bridge.setDelayedInbox(address(inbox), true); + + // fund user account + vm.deal(user, 10 ether); + } + + /* solhint-disable func-name-mixedcase */ + function test_initialize() public { + assertEq(address(inbox.bridge()), address(bridge), "Invalid bridge ref"); + assertEq(address(inbox.sequencerInbox()), seqInbox, "Invalid seqInbox ref"); + assertEq(inbox.allowListEnabled(), false, "Invalid allowListEnabled"); + assertEq((PausableUpgradeable(address(inbox))).paused(), false, "Invalid paused state"); + } + + function test_depositEth_FromEOA() public { + uint256 depositAmount = 2 ether; + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered(0, abi.encodePacked(user, depositAmount)); + + // deposit tokens -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.depositEth{value: depositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + depositAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + depositAmount, + "Invalid user eth balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_depositEth_FromContract() public { + uint256 depositAmount = 1.2 ether; + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked(AddressAliasHelper.applyL1ToL2Alias(user), depositAmount) + ); + + // deposit tokens -> tx.origin != msg.sender + vm.prank(user); + ethInbox.depositEth{value: depositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + depositAmount, + "Invalid bridge eth balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + depositAmount, + "Invalid eth token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_depositEth_revert_EthTransferFails() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + // deposit too many eth shall fail + vm.prank(user); + uint256 invalidDepositAmount = 300 ether; + vm.expectRevert(); + ethInbox.depositEth{value: invalidDepositAmount}(); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq(bridgeEthBalanceAfter, bridgeEthBalanceBefore, "Invalid bridge token balance"); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq(userEthBalanceBefore, userEthBalanceAfter, "Invalid user token balance"); + + assertEq(bridge.delayedMessageCount(), 0, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromEOA() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 ethToSend = 0.3 ether; + + // retryable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000002 ether; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.createRetryableTicket{value: ethToSend}({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + ethToSend, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_FromContract() public { + address sender = address(new Sender()); + vm.deal(sender, 10 ether); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 senderEthBalanceBefore = sender.balance; + + uint256 ethToSend = 0.3 ether; + + // retryable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000001 ether; + + // expect event + uint256 uintAlias = uint256(uint160(AddressAliasHelper.applyL1ToL2Alias(sender))); + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uintAlias, + uintAlias, + gasLimit, + maxFeePerGas, + abi.encodePacked("some msg").length, + abi.encodePacked("some msg") + ) + ); + + // create retryable + vm.prank(sender); + ethInbox.createRetryableTicket{value: ethToSend}({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("some msg") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 senderEthBalanceAfter = address(sender).balance; + assertEq( + senderEthBalanceBefore - senderEthBalanceAfter, + ethToSend, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_createRetryableTicket_revert_WhenPaused() public { + vm.prank(rollup); + inbox.pause(); + + vm.expectRevert("Pausable: paused"); + ethInbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_OnlyAllowed() public { + vm.prank(rollup); + inbox.setAllowListEnabled(true); + + vm.prank(user, user); + vm.expectRevert(abi.encodeWithSelector(NotAllowedOrigin.selector, user)); + ethInbox.createRetryableTicket({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 10, + maxFeePerGas: 1, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientValue() public { + uint256 tooSmallEthAmount = 1 ether; + uint256 l2CallValue = 2 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 200000; + uint256 maxFeePerGas = 0.00000002 ether; + + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + InsufficientValue.selector, + maxSubmissionCost + l2CallValue + gasLimit * maxFeePerGas, + tooSmallEthAmount + ) + ); + ethInbox.createRetryableTicket{value: tooSmallEthAmount}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_RetryableDataTracer() public { + uint256 msgValue = 3 ether; + uint256 l2CallValue = 1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100000; + uint256 maxFeePerGas = 1; + bytes memory data = abi.encodePacked("xy"); + + // revert as maxFeePerGas == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + msgValue, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + ethInbox.createRetryableTicket{value: msgValue}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + gasLimit = 1; + maxFeePerGas = 2; + + // revert as gasLimit == 1 is magic value + vm.prank(user, user); + vm.expectRevert( + abi.encodeWithSelector( + RetryableData.selector, + user, + user, + l2CallValue, + msgValue, + maxSubmissionCost, + user, + user, + gasLimit, + maxFeePerGas, + data + ) + ); + ethInbox.createRetryableTicket{value: msgValue}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + } + + function test_createRetryableTicket_revert_GasLimitTooLarge() public { + uint256 tooBigGasLimit = uint256(type(uint64).max) + 1; + + vm.deal(user, uint256(type(uint64).max) * 3); + vm.prank(user, user); + vm.expectRevert(GasLimitTooLarge.selector); + ethInbox.createRetryableTicket{value: uint256(type(uint64).max) * 3}({ + to: user, + l2CallValue: 100, + maxSubmissionCost: 0, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: tooBigGasLimit, + maxFeePerGas: 2, + data: abi.encodePacked("data") + }); + } + + function test_createRetryableTicket_revert_InsufficientSubmissionCost() public { + uint256 tooSmallMaxSubmissionCost = 5; + bytes memory data = abi.encodePacked("msg"); + + // simulate 23 gwei basefee + vm.fee(23000000000); + uint256 submissionFee = ethInbox.calculateRetryableSubmissionFee( + data.length, + block.basefee + ); + + // call shall revert + vm.prank(user, user); + vm.expectRevert( + abi.encodePacked( + InsufficientSubmissionCost.selector, + submissionFee, + tooSmallMaxSubmissionCost + ) + ); + ethInbox.createRetryableTicket{value: 1 ether}({ + to: user, + l2CallValue: 100, + maxSubmissionCost: tooSmallMaxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: 60000, + maxFeePerGas: 0.00000001 ether, + data: data + }); + } + + function test_unsafeCreateRetryableTicket_FromEOA() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 ethToSend = 0.3 ether; + + // retryable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000002 ether; + bytes memory data = abi.encodePacked("some msg"); + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + data.length, + data + ) + ); + + // create retryable -> tx.origin == msg.sender + vm.prank(user, user); + ethInbox.unsafeCreateRetryableTicket{value: ethToSend}({ + to: address(user), + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: data + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + ethToSend, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_FromContract() public { + address sender = address(new Sender()); + vm.deal(sender, 10 ether); + + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 senderEthBalanceBefore = sender.balance; + + uint256 ethToSend = 0.3 ether; + + // retryable params + uint256 l2CallValue = 0.1 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 100_000; + uint256 maxFeePerGas = 0.000000001 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(sender)), + l2CallValue, + ethToSend, + maxSubmissionCost, + uint256(uint160(sender)), + uint256(uint160(sender)), + gasLimit, + maxFeePerGas, + abi.encodePacked("some msg").length, + abi.encodePacked("some msg") + ) + ); + + // create retryable + vm.prank(sender); + ethInbox.unsafeCreateRetryableTicket{value: ethToSend}({ + to: sender, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: sender, + callValueRefundAddress: sender, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("some msg") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + ethToSend, + "Invalid bridge token balance" + ); + + uint256 senderEthBalanceAfter = address(sender).balance; + assertEq( + senderEthBalanceBefore - senderEthBalanceAfter, + ethToSend, + "Invalid sender token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_unsafeCreateRetryableTicket_NotRevertingOnInsufficientValue() public { + uint256 bridgeEthBalanceBefore = address(bridge).balance; + uint256 userEthBalanceBefore = address(user).balance; + + uint256 tooSmallEthAmount = 1 ether; + uint256 l2CallValue = 2 ether; + uint256 maxSubmissionCost = 0.1 ether; + uint256 gasLimit = 200000; + uint256 maxFeePerGas = 0.00000002 ether; + + // expect event + vm.expectEmit(true, true, true, true); + emit InboxMessageDelivered( + 0, + abi.encodePacked( + uint256(uint160(user)), + l2CallValue, + tooSmallEthAmount, + maxSubmissionCost, + uint256(uint160(user)), + uint256(uint160(user)), + gasLimit, + maxFeePerGas, + abi.encodePacked("data").length, + abi.encodePacked("data") + ) + ); + + vm.prank(user, user); + ethInbox.unsafeCreateRetryableTicket{value: tooSmallEthAmount}({ + to: user, + l2CallValue: l2CallValue, + maxSubmissionCost: maxSubmissionCost, + excessFeeRefundAddress: user, + callValueRefundAddress: user, + gasLimit: gasLimit, + maxFeePerGas: maxFeePerGas, + data: abi.encodePacked("data") + }); + + //// checks + + uint256 bridgeEthBalanceAfter = address(bridge).balance; + assertEq( + bridgeEthBalanceAfter - bridgeEthBalanceBefore, + tooSmallEthAmount, + "Invalid bridge token balance" + ); + + uint256 userEthBalanceAfter = address(user).balance; + assertEq( + userEthBalanceBefore - userEthBalanceAfter, + tooSmallEthAmount, + "Invalid user token balance" + ); + + assertEq(bridge.delayedMessageCount(), 1, "Invalid delayed message count"); + } + + function test_calculateRetryableSubmissionFee() public { + // 30 gwei fee + uint256 basefee = 30000000000; + vm.fee(basefee); + uint256 datalength = 10; + + assertEq( + inbox.calculateRetryableSubmissionFee(datalength, 0), + (1400 + 6 * datalength) * basefee, + "Invalid eth retryable submission fee" + ); + } +} diff --git a/test/foundry/Outbox.t.sol b/test/foundry/Outbox.t.sol new file mode 100644 index 00000000..3b7d9cd4 --- /dev/null +++ b/test/foundry/Outbox.t.sol @@ -0,0 +1,117 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "./AbsOutbox.t.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/Outbox.sol"; + +contract OutboxTest is AbsOutboxTest { + Outbox public ethOutbox; + Bridge public ethBridge; + + function setUp() public { + // deploy bridge and outbox + bridge = IBridge(TestUtil.deployProxy(address(new Bridge()))); + ethBridge = Bridge(address(bridge)); + outbox = IOutbox(TestUtil.deployProxy(address(new Outbox()))); + ethOutbox = Outbox(address(outbox)); + + // init bridge and outbox + ethBridge.initialize(IOwnable(rollup)); + ethOutbox.initialize(IBridge(bridge)); + + vm.prank(rollup); + bridge.setOutbox(address(outbox), true); + } + + /* solhint-disable func-name-mixedcase */ + function test_executeTransaction() public { + // fund bridge with some ether + vm.deal(address(bridge), 100 ether); + + // store root + vm.prank(rollup); + outbox.updateSendRoot( + 0xc86f4eaf8efb31147795fb05564f8777abc3220d4caeb0227c6c69c115931dda, + 0xc86f4eaf8efb31147795fb05564f8777abc3220d4caeb0227c6c69c115931dda + ); + + // create msg receiver on L1 + L2ToL1Target target = new L2ToL1Target(); + target.setOutbox(address(outbox)); + + //// execute transaction + uint256 bridgeBalanceBefore = address(bridge).balance; + uint256 targetBalanceBefore = address(target).balance; + + bytes32[] memory proof = new bytes32[](5); + proof[0] = bytes32(0x1216ff070e3c87b032d79b298a3e98009ddd13bf8479b843e225857ca5f950e7); + proof[1] = bytes32(0x2b5ee8f4bd7664ca0cf31d7ab86119b63f6ff07bb86dbd5af356d0087492f686); + proof[2] = bytes32(0x0aa797064e0f3768bbac0a02ce031c4f282441a9cd8c669086cf59a083add893); + proof[3] = bytes32(0xc7aac0aad5108a46ac9879f0b1870fd0cbc648406f733eb9d0b944a18c32f0f8); + proof[4] = bytes32(0x477ce2b0bc8035ae3052b7339c7496531229bd642bb1871d81618cf93a4d2d1a); + + uint256 withdrawalAmount = 15 ether; + bytes memory data = abi.encodeWithSignature("receiveHook()"); + outbox.executeTransaction({ + proof: proof, + index: 12, + l2Sender: user, + to: address(target), + l2Block: 300, + l1Block: 20, + l2Timestamp: 1234, + value: withdrawalAmount, + data: data + }); + + uint256 bridgeBalanceAfter = address(bridge).balance; + assertEq( + bridgeBalanceBefore - bridgeBalanceAfter, + withdrawalAmount, + "Invalid bridge balance" + ); + + uint256 targetBalanceAfter = address(target).balance; + assertEq( + targetBalanceAfter - targetBalanceBefore, + withdrawalAmount, + "Invalid target balance" + ); + + /// check context was properly set during execution + assertEq(uint256(target.l2Block()), 300, "Invalid l2Block"); + assertEq(uint256(target.timestamp()), 1234, "Invalid timestamp"); + assertEq(uint256(target.outputId()), 12, "Invalid outputId"); + assertEq(target.sender(), user, "Invalid sender"); + assertEq(uint256(target.l1Block()), 20, "Invalid l1Block"); + assertEq(uint256(target.withdrawalAmount()), withdrawalAmount, "Invalid withdrawalAmount"); + } +} + +/** + * Contract for testing L2 to L1 msgs + */ +contract L2ToL1Target { + address public outbox; + + uint128 public l2Block; + uint128 public timestamp; + bytes32 public outputId; + address public sender; + uint96 public l1Block; + uint256 public withdrawalAmount; + + function receiveHook() external payable { + l2Block = uint128(IOutbox(outbox).l2ToL1Block()); + timestamp = uint128(IOutbox(outbox).l2ToL1Timestamp()); + outputId = IOutbox(outbox).l2ToL1OutputId(); + sender = IOutbox(outbox).l2ToL1Sender(); + l1Block = uint96(IOutbox(outbox).l2ToL1EthBlock()); + withdrawalAmount = msg.value; + } + + function setOutbox(address _outbox) external { + outbox = _outbox; + } +} diff --git a/test/foundry/RollupCreator.t.sol b/test/foundry/RollupCreator.t.sol new file mode 100644 index 00000000..68b8ebe2 --- /dev/null +++ b/test/foundry/RollupCreator.t.sol @@ -0,0 +1,538 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/rollup/RollupCreator.sol"; +import "../../src/rollup/RollupAdminLogic.sol"; +import "../../src/rollup/RollupUserLogic.sol"; +import "../../src/rollup/ValidatorUtils.sol"; +import "../../src/rollup/ValidatorWalletCreator.sol"; +import "../../src/challenge/ChallengeManager.sol"; +import "../../src/osp/OneStepProver0.sol"; +import "../../src/osp/OneStepProverMemory.sol"; +import "../../src/osp/OneStepProverMath.sol"; +import "../../src/osp/OneStepProverHostIo.sol"; +import "../../src/osp/OneStepProofEntry.sol"; +import "../../src/mocks/UpgradeExecutorMock.sol"; +import "../../src/rollup/DeployHelper.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; + +contract RollupCreatorTest is Test { + RollupCreator public rollupCreator; + address public rollupOwner = makeAddr("rollupOwner"); + address public deployer = makeAddr("deployer"); + IRollupAdmin public rollupAdmin; + IRollupUser public rollupUser; + DeployHelper public deployHelper; + IReader4844 dummyReader4844 = IReader4844(address(137)); + + // 1 gwei + uint256 public constant MAX_FEE_PER_GAS = 1_000_000_000; + uint256 public constant MAX_DATA_SIZE = 117_964; + + BridgeCreator.BridgeContracts public ethBasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, false), + inbox: new Inbox(MAX_DATA_SIZE), + rollupEventInbox: new RollupEventInbox(), + outbox: new Outbox() + }); + BridgeCreator.BridgeContracts public erc20BasedTemplates = + BridgeCreator.BridgeContracts({ + bridge: new ERC20Bridge(), + sequencerInbox: new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, true), + inbox: new ERC20Inbox(MAX_DATA_SIZE), + rollupEventInbox: new ERC20RollupEventInbox(), + outbox: new ERC20Outbox() + }); + + /* solhint-disable func-name-mixedcase */ + function setUp() public { + //// deploy rollup creator and set templates + vm.startPrank(deployer); + rollupCreator = new RollupCreator(); + deployHelper = new DeployHelper(); + + // deploy BridgeCreators + BridgeCreator bridgeCreator = new BridgeCreator(ethBasedTemplates, erc20BasedTemplates); + + IUpgradeExecutor upgradeExecutorLogic = new UpgradeExecutorMock(); + + ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin _rollupAdmin, + IRollupUser _rollupUser + ) = _prepareRollupDeployment(); + + rollupAdmin = _rollupAdmin; + rollupUser = _rollupUser; + + //// deploy creator and set logic + rollupCreator.setTemplates( + bridgeCreator, + ospEntry, + challengeManager, + _rollupAdmin, + _rollupUser, + upgradeExecutorLogic, + address(new ValidatorUtils()), + address(new ValidatorWalletCreator()), + deployHelper + ); + + vm.stopPrank(); + } + + function test_createEthRollup() public { + vm.startPrank(deployer); + + // deployment params + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("wasm"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + chainConfig: "abc", + genesisBlockNum: 15_000_000, + sequencerInboxMaxTimeVariation: timeVars + }); + + // prepare funds + uint256 factoryDeploymentFunds = 1 ether; + vm.deal(deployer, factoryDeploymentFunds); + uint256 balanceBefore = deployer.balance; + + /// deploy rollup + address[] memory batchPosters = new address[](1); + batchPosters[0] = makeAddr("batch poster 1"); + address batchPosterManager = makeAddr("batch poster manager"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPosters: batchPosters, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + batchPosterManager: batchPosterManager + }); + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + deployParams + ); + + vm.stopPrank(); + + /// common checks + + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); + assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); + assertTrue(rollup.sequencerInbox().isBatchPoster(batchPosters[0]), "Invalid batch poster"); + assertEq( + rollup.sequencerInbox().batchPosterManager(), + batchPosterManager, + "Invalid batch poster manager" + ); + + // check proxy admin for non-rollup contracts + address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + + assertEq( + _getProxyAdmin(address(rollup.sequencerInbox())), + proxyAdminExpectedAddress, + "Invalid seqInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.bridge())), + proxyAdminExpectedAddress, + "Invalid bridge's proxyAdmin owner" + ); + assertEq( + rollup.inbox().getProxyAdmin(), + proxyAdminExpectedAddress, + "Invalid inbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.outbox())), + proxyAdminExpectedAddress, + "Invalid outbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.rollupEventInbox())), + proxyAdminExpectedAddress, + "Invalid rollupEventInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.challengeManager())), + proxyAdminExpectedAddress, + "Invalid challengeManager's proxyAdmin owner" + ); + + // check upgrade executor owns proxyAdmin + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); + assertEq( + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + upgradeExecutorExpectedAddress, + "Invalid proxyAdmin's owner" + ); + + // upgrade executor owns rollup + assertEq( + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" + ); + assertEq( + _getProxyAdmin(rollupAddress), + upgradeExecutorExpectedAddress, + "Invalid rollup's proxyAdmin owner" + ); + + // check rollupOwner has executor role + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); + assertTrue( + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" + ); + + // check funds are refunded + uint256 balanceAfter = deployer.balance; + uint256 factoryDeploymentCost = deployHelper.getDeploymentTotalCost( + rollup.inbox(), + MAX_FEE_PER_GAS + ); + assertEq(balanceBefore - balanceAfter, factoryDeploymentCost, "Invalid balance"); + } + + function test_createErc20Rollup() public { + vm.startPrank(deployer); + address nativeToken = address( + new ERC20PresetFixedSupply("Appchain Token", "App", 1_000_000 ether, deployer) + ); + + // deployment params + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("wasm"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + chainConfig: "abc", + genesisBlockNum: 15_000_000, + sequencerInboxMaxTimeVariation: timeVars + }); + + // approve fee token to pay for deployment of L2 factories + uint256 expectedCost = 0.1247 ether + + 4 * + (1400 * 100_000_000_000 + 100_000 * 1_000_000_000); + IERC20(nativeToken).approve(address(rollupCreator), expectedCost); + + /// deploy rollup + address[] memory batchPosters = new address[](1); + batchPosters[0] = makeAddr("batch poster 1"); + address batchPosterManager = makeAddr("batch poster manager"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPosters: batchPosters, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: nativeToken, + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + batchPosterManager: batchPosterManager + }); + + address rollupAddress = rollupCreator.createRollup(deployParams); + + vm.stopPrank(); + + /// common checks + + /// rollup creator + assertEq(IOwnable(address(rollupCreator)).owner(), deployer, "Invalid rollupCreator owner"); + + /// rollup proxy + assertEq(_getPrimary(rollupAddress), address(rollupAdmin), "Invalid proxy primary impl"); + assertEq(_getSecondary(rollupAddress), address(rollupUser), "Invalid proxy secondary impl"); + + /// rollup check + RollupCore rollup = RollupCore(rollupAddress); + assertTrue(address(rollup.sequencerInbox()) != address(0), "Invalid seqInbox"); + assertTrue(address(rollup.bridge()) != address(0), "Invalid bridge"); + assertTrue(address(rollup.inbox()) != address(0), "Invalid inbox"); + assertTrue(address(rollup.outbox()) != address(0), "Invalid outbox"); + assertTrue(address(rollup.rollupEventInbox()) != address(0), "Invalid rollupEventInbox"); + assertTrue(address(rollup.challengeManager()) != address(0), "Invalid challengeManager"); + assertTrue(rollup.isValidator(validators[0]), "Invalid validator set"); + assertTrue(rollup.isValidator(validators[1]), "Invalid validator set"); + assertTrue( + ISequencerInbox(address(rollup.sequencerInbox())).isBatchPoster(batchPosters[0]), + "Invalid batch poster" + ); + assertEq( + ISequencerInbox(address(rollup.sequencerInbox())).batchPosterManager(), + batchPosterManager, + "Invalid batch poster manager" + ); + + // native token check + IBridge bridge = RollupCore(address(rollupAddress)).bridge(); + assertEq( + IERC20Bridge(address(bridge)).nativeToken(), + nativeToken, + "Invalid native token ref" + ); + + // check proxy admin for non-rollup contracts + address proxyAdminExpectedAddress = computeCreateAddress(address(rollupCreator), 1); + + assertEq( + _getProxyAdmin(address(rollup.sequencerInbox())), + proxyAdminExpectedAddress, + "Invalid seqInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.bridge())), + proxyAdminExpectedAddress, + "Invalid bridge's proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.inbox())), + proxyAdminExpectedAddress, + "Invalid inbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.outbox())), + proxyAdminExpectedAddress, + "Invalid outbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.rollupEventInbox())), + proxyAdminExpectedAddress, + "Invalid rollupEventInbox' proxyAdmin owner" + ); + assertEq( + _getProxyAdmin(address(rollup.challengeManager())), + proxyAdminExpectedAddress, + "Invalid challengeManager's proxyAdmin owner" + ); + + // check upgrade executor owns proxyAdmin + address upgradeExecutorExpectedAddress = computeCreateAddress(address(rollupCreator), 4); + assertEq( + ProxyAdmin(_getProxyAdmin(address(rollup.sequencerInbox()))).owner(), + upgradeExecutorExpectedAddress, + "Invalid proxyAdmin's owner" + ); + + // upgrade executor owns rollup + assertEq( + IOwnable(rollupAddress).owner(), + upgradeExecutorExpectedAddress, + "Invalid rollup owner" + ); + assertEq( + _getProxyAdmin(rollupAddress), + upgradeExecutorExpectedAddress, + "Invalid rollup's proxyAdmin owner" + ); + + // check rollupOwner has executor role + AccessControlUpgradeable executor = AccessControlUpgradeable( + upgradeExecutorExpectedAddress + ); + assertTrue( + executor.hasRole(keccak256("EXECUTOR_ROLE"), rollupOwner), + "Invalid executor role" + ); + } + + function test_upgrade() public { + vm.startPrank(deployer); + + // deployment params + ISequencerInbox.MaxTimeVariation memory timeVars = ISequencerInbox.MaxTimeVariation( + ((60 * 60 * 24) / 15), + 12, + 60 * 60 * 24, + 60 * 60 + ); + Config memory config = Config({ + confirmPeriodBlocks: 20, + extraChallengeTimeBlocks: 200, + stakeToken: address(0), + baseStake: 1000, + wasmModuleRoot: keccak256("wasm"), + owner: rollupOwner, + loserStakeEscrow: address(200), + chainId: 1337, + chainConfig: "abc", + genesisBlockNum: 15_000_000, + sequencerInboxMaxTimeVariation: timeVars + }); + + // prepare funds + uint256 factoryDeploymentFunds = 0.2 ether; + vm.deal(deployer, factoryDeploymentFunds); + + /// deploy rollup + address[] memory batchPosters = new address[](1); + batchPosters[0] = makeAddr("batch poster 1"); + address batchPosterManager = makeAddr("batch poster manager"); + address[] memory validators = new address[](2); + validators[0] = makeAddr("validator1"); + validators[1] = makeAddr("validator2"); + + RollupCreator.RollupDeploymentParams memory deployParams = RollupCreator + .RollupDeploymentParams({ + config: config, + batchPosters: batchPosters, + validators: validators, + maxDataSize: MAX_DATA_SIZE, + nativeToken: address(0), + deployFactoriesToL2: true, + maxFeePerGasForRetryables: MAX_FEE_PER_GAS, + batchPosterManager: batchPosterManager + }); + address rollupAddress = rollupCreator.createRollup{value: factoryDeploymentFunds}( + deployParams + ); + + vm.stopPrank(); + + //// upgrade inbox + RollupCore rollup = RollupCore(rollupAddress); + address inbox = address(rollup.inbox()); + address proxyAdmin = computeCreateAddress(address(rollupCreator), 1); + IUpgradeExecutor upgradeExecutor = IUpgradeExecutor( + computeCreateAddress(address(rollupCreator), 4) + ); + + Dummy newLogicImpl = new Dummy(); + bytes memory data = abi.encodeWithSelector( + ProxyUpgradeAction.perform.selector, + address(proxyAdmin), + inbox, + address(newLogicImpl) + ); + + address upgradeAction = address(new ProxyUpgradeAction()); + vm.prank(rollupOwner); + upgradeExecutor.execute(upgradeAction, data); + + // check upgrade was successful + assertEq(_getImpl(inbox), address(newLogicImpl)); + } + + function _prepareRollupDeployment() + internal + returns ( + IOneStepProofEntry ospEntry, + IChallengeManager challengeManager, + IRollupAdmin rollupAdminLogic, + IRollupUser rollupUserLogic + ) + { + //// deploy challenge stuff + ospEntry = new OneStepProofEntry( + new OneStepProver0(), + new OneStepProverMemory(), + new OneStepProverMath(), + new OneStepProverHostIo() + ); + challengeManager = new ChallengeManager(); + + //// deploy rollup logic + rollupAdminLogic = IRollupAdmin(new RollupAdminLogic()); + rollupUserLogic = IRollupUser(new RollupUserLogic()); + + return (ospEntry, challengeManager, rollupAdminLogic, rollupUserLogic); + } + + function _getProxyAdmin(address proxy) internal view returns (address) { + bytes32 adminSlot = bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1); + return address(uint160(uint256(vm.load(proxy, adminSlot)))); + } + + function _getImpl(address proxy) internal view returns (address) { + bytes32 implSlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); + return address(uint160(uint256(vm.load(proxy, implSlot)))); + } + + function _getPrimary(address proxy) internal view returns (address) { + bytes32 primarySlot = bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1); + return address(uint160(uint256(vm.load(proxy, primarySlot)))); + } + + function _getSecondary(address proxy) internal view returns (address) { + bytes32 secondarySlot = bytes32( + uint256(keccak256("eip1967.proxy.implementation.secondary")) - 1 + ); + return address(uint160(uint256(vm.load(proxy, secondarySlot)))); + } +} + +contract ProxyUpgradeAction { + function perform( + address admin, + address payable target, + address newLogic + ) public payable { + ProxyAdmin(admin).upgrade(TransparentUpgradeableProxy(target), newLogic); + } +} + +contract Dummy { + function dummy() public {} +} diff --git a/test/foundry/SequencerInbox.t.sol b/test/foundry/SequencerInbox.t.sol new file mode 100644 index 00000000..92902d68 --- /dev/null +++ b/test/foundry/SequencerInbox.t.sol @@ -0,0 +1,614 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.4; + +import "forge-std/Test.sol"; +import "./util/TestUtil.sol"; +import "../../src/bridge/Bridge.sol"; +import "../../src/bridge/SequencerInbox.sol"; +import {ERC20Bridge} from "../../src/bridge/ERC20Bridge.sol"; +import "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetMinterPauser.sol"; + +contract RollupMock { + address public immutable owner; + + constructor(address _owner) { + owner = _owner; + } +} + +contract SequencerInboxTest is Test { + // cannot reference events outside of the original contract until 0.8.21 + // we currently use 0.8.9 + event MessageDelivered( + uint256 indexed messageIndex, + bytes32 indexed beforeInboxAcc, + address inbox, + uint8 kind, + address sender, + bytes32 messageDataHash, + uint256 baseFeeL1, + uint64 timestamp + ); + event InboxMessageDelivered(uint256 indexed messageNum, bytes data); + event SequencerBatchDelivered( + uint256 indexed batchSequenceNumber, + bytes32 indexed beforeAcc, + bytes32 indexed afterAcc, + bytes32 delayedAcc, + uint256 afterDelayedMessagesRead, + IBridge.TimeBounds timeBounds, + IBridge.BatchDataLocation dataLocation + ); + + Random RAND = new Random(); + address rollupOwner = address(137); + uint256 maxDataSize = 10000; + ISequencerInbox.MaxTimeVariation maxTimeVariation = + ISequencerInbox.MaxTimeVariation({ + delayBlocks: 10, + futureBlocks: 10, + delaySeconds: 100, + futureSeconds: 100 + }); + address dummyInbox = address(139); + address proxyAdmin = address(140); + IReader4844 dummyReader4844 = IReader4844(address(137)); + + uint256 public constant MAX_DATA_SIZE = 117964; + + function deployRollup(bool isArbHosted) internal returns (SequencerInbox, Bridge) { + RollupMock rollupMock = new RollupMock(rollupOwner); + Bridge bridgeImpl = new Bridge(); + Bridge bridge = Bridge( + address(new TransparentUpgradeableProxy(address(bridgeImpl), proxyAdmin, "")) + ); + + bridge.initialize(IOwnable(address(rollupMock))); + vm.prank(rollupOwner); + bridge.setDelayedInbox(dummyInbox, true); + + SequencerInbox seqInboxImpl = new SequencerInbox( + maxDataSize, + isArbHosted ? IReader4844(address(0)) : dummyReader4844, + false + ); + SequencerInbox seqInbox = SequencerInbox( + address(new TransparentUpgradeableProxy(address(seqInboxImpl), proxyAdmin, "")) + ); + seqInbox.initialize(bridge, maxTimeVariation); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + vm.prank(rollupOwner); + bridge.setSequencerInbox(address(seqInbox)); + + return (seqInbox, bridge); + } + + function deployFeeTokenBasedRollup() internal returns (SequencerInbox, ERC20Bridge) { + RollupMock rollupMock = new RollupMock(rollupOwner); + ERC20Bridge bridgeImpl = new ERC20Bridge(); + ERC20Bridge bridge = ERC20Bridge( + address(new TransparentUpgradeableProxy(address(bridgeImpl), proxyAdmin, "")) + ); + address nativeToken = address(new ERC20PresetMinterPauser("Appchain Token", "App")); + + bridge.initialize(IOwnable(address(rollupMock)), nativeToken); + vm.prank(rollupOwner); + bridge.setDelayedInbox(dummyInbox, true); + + /// this will result in 'hostChainIsArbitrum = true' + vm.mockCall( + address(100), + abi.encodeWithSelector(ArbSys.arbOSVersion.selector), + abi.encode(uint256(11)) + ); + SequencerInbox seqInboxImpl = new SequencerInbox( + maxDataSize, + IReader4844(address(0)), + true + ); + SequencerInbox seqInbox = SequencerInbox( + address(new TransparentUpgradeableProxy(address(seqInboxImpl), proxyAdmin, "")) + ); + seqInbox.initialize(bridge, maxTimeVariation); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + vm.prank(rollupOwner); + bridge.setSequencerInbox(address(seqInbox)); + + return (seqInbox, bridge); + } + + function expectEvents( + IBridge bridge, + SequencerInbox seqInbox, + bytes memory data, + bool hostChainIsArbitrum, + bool isUsingFeeToken + ) internal { + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + IBridge.TimeBounds memory timeBounds; + if (block.timestamp > maxTimeVariation.delaySeconds) { + timeBounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds); + } + timeBounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds); + if (block.number > maxTimeVariation.delayBlocks) { + timeBounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks); + } + timeBounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks); + bytes32 dataHash = keccak256( + bytes.concat( + abi.encodePacked( + timeBounds.minTimestamp, + timeBounds.maxTimestamp, + timeBounds.minBlockNumber, + timeBounds.maxBlockNumber, + uint64(delayedMessagesRead) + ), + data + ) + ); + + bytes32 beforeAcc = bytes32(0); + bytes32 delayedAcc = bridge.delayedInboxAccs(delayedMessagesRead - 1); + bytes32 afterAcc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc)); + + if (!isUsingFeeToken) { + uint256 expectedReportedExtraGas = 0; + if (hostChainIsArbitrum) { + // set 0.1 gwei basefee + uint256 basefee = 100000000; + vm.fee(basefee); + // 30 gwei TX L1 fees + uint256 l1Fees = 30000000000; + vm.mockCall( + address(0x6c), + abi.encodeWithSignature("getCurrentTxL1GasFees()"), + abi.encode(l1Fees) + ); + expectedReportedExtraGas = l1Fees / basefee; + } + + bytes memory spendingReportMsg = abi.encodePacked( + block.timestamp, + msg.sender, + dataHash, + sequenceNumber, + block.basefee, + uint64(expectedReportedExtraGas) + ); + + // spending report + vm.expectEmit(); + emit MessageDelivered( + delayedMessagesRead, + delayedAcc, + address(seqInbox), + L1MessageType_batchPostingReport, + tx.origin, + keccak256(spendingReportMsg), + block.basefee, + uint64(block.timestamp) + ); + + // spending report event in seq inbox + vm.expectEmit(); + emit InboxMessageDelivered(delayedMessagesRead, spendingReportMsg); + } + + // sequencer batch delivered + vm.expectEmit(); + emit SequencerBatchDelivered( + sequenceNumber, + beforeAcc, + afterAcc, + delayedAcc, + delayedMessagesRead, + timeBounds, + IBridge.BatchDataLocation.TxInput + ); + } + + bytes biggerData = + hex"00a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890a4567890"; + + function testAddSequencerL2BatchFromOrigin() public { + (SequencerInbox seqInbox, Bridge bridge) = deployRollup(false); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = biggerData; // 00 is BROTLI_MESSAGE_HEADER_FLAG + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage(delayedInboxKind, delayedInboxSender, messageDataHash); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + // set 60 gwei basefee + uint256 basefee = 60000000000; + vm.fee(basefee); + expectEvents(bridge, seqInbox, data, false, false); + + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + /* solhint-disable func-name-mixedcase */ + function testConstructor() public { + SequencerInbox seqInboxLogic = new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, false); + assertEq(seqInboxLogic.maxDataSize(), MAX_DATA_SIZE, "Invalid MAX_DATA_SIZE"); + assertEq(seqInboxLogic.isUsingFeeToken(), false, "Invalid isUsingFeeToken"); + + SequencerInbox seqInboxProxy = SequencerInbox(TestUtil.deployProxy(address(seqInboxLogic))); + assertEq(seqInboxProxy.maxDataSize(), MAX_DATA_SIZE, "Invalid MAX_DATA_SIZE"); + assertEq(seqInboxProxy.isUsingFeeToken(), false, "Invalid isUsingFeeToken"); + + SequencerInbox seqInboxLogicFeeToken = new SequencerInbox( + MAX_DATA_SIZE, + dummyReader4844, + true + ); + assertEq(seqInboxLogicFeeToken.maxDataSize(), MAX_DATA_SIZE, "Invalid MAX_DATA_SIZE"); + assertEq(seqInboxLogicFeeToken.isUsingFeeToken(), true, "Invalid isUsingFeeToken"); + + SequencerInbox seqInboxProxyFeeToken = SequencerInbox( + TestUtil.deployProxy(address(seqInboxLogicFeeToken)) + ); + assertEq(seqInboxProxyFeeToken.maxDataSize(), MAX_DATA_SIZE, "Invalid MAX_DATA_SIZE"); + assertEq(seqInboxProxyFeeToken.isUsingFeeToken(), true, "Invalid isUsingFeeToken"); + } + + function testInitialize() public { + Bridge _bridge = Bridge( + address(new TransparentUpgradeableProxy(address(new Bridge()), proxyAdmin, "")) + ); + _bridge.initialize(IOwnable(address(new RollupMock(rollupOwner)))); + + address seqInboxLogic = address(new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, false)); + SequencerInbox seqInboxProxy = SequencerInbox(TestUtil.deployProxy(seqInboxLogic)); + seqInboxProxy.initialize(IBridge(_bridge), maxTimeVariation); + + assertEq(seqInboxProxy.isUsingFeeToken(), false, "Invalid isUsingFeeToken"); + assertEq(address(seqInboxProxy.bridge()), address(_bridge), "Invalid bridge"); + assertEq(address(seqInboxProxy.rollup()), address(_bridge.rollup()), "Invalid rollup"); + } + + function testInitialize_FeeTokenBased() public { + ERC20Bridge _bridge = ERC20Bridge( + address(new TransparentUpgradeableProxy(address(new ERC20Bridge()), proxyAdmin, "")) + ); + address nativeToken = address(new ERC20PresetMinterPauser("Appchain Token", "App")); + _bridge.initialize(IOwnable(address(new RollupMock(rollupOwner))), nativeToken); + + address seqInboxLogic = address(new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, true)); + SequencerInbox seqInboxProxy = SequencerInbox(TestUtil.deployProxy(seqInboxLogic)); + seqInboxProxy.initialize(IBridge(_bridge), maxTimeVariation); + + assertEq(seqInboxProxy.isUsingFeeToken(), true, "Invalid isUsingFeeToken"); + assertEq(address(seqInboxProxy.bridge()), address(_bridge), "Invalid bridge"); + assertEq(address(seqInboxProxy.rollup()), address(_bridge.rollup()), "Invalid rollup"); + } + + function testInitialize_revert_NativeTokenMismatch_EthFeeToken() public { + Bridge _bridge = Bridge( + address(new TransparentUpgradeableProxy(address(new Bridge()), proxyAdmin, "")) + ); + _bridge.initialize(IOwnable(address(new RollupMock(rollupOwner)))); + + address seqInboxLogic = address(new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, true)); + SequencerInbox seqInboxProxy = SequencerInbox(TestUtil.deployProxy(seqInboxLogic)); + + vm.expectRevert(abi.encodeWithSelector(NativeTokenMismatch.selector)); + seqInboxProxy.initialize(IBridge(_bridge), maxTimeVariation); + } + + function testInitialize_revert_NativeTokenMismatch_FeeTokenEth() public { + ERC20Bridge _bridge = ERC20Bridge( + address(new TransparentUpgradeableProxy(address(new ERC20Bridge()), proxyAdmin, "")) + ); + address nativeToken = address(new ERC20PresetMinterPauser("Appchain Token", "App")); + _bridge.initialize(IOwnable(address(new RollupMock(rollupOwner))), nativeToken); + + address seqInboxLogic = address(new SequencerInbox(MAX_DATA_SIZE, dummyReader4844, false)); + SequencerInbox seqInboxProxy = SequencerInbox(TestUtil.deployProxy(seqInboxLogic)); + + vm.expectRevert(abi.encodeWithSelector(NativeTokenMismatch.selector)); + seqInboxProxy.initialize(IBridge(_bridge), maxTimeVariation); + } + + function testAddSequencerL2BatchFromOrigin_ArbitrumHosted() public { + // this will result in 'hostChainIsArbitrum = true' + vm.mockCall( + address(100), + abi.encodeWithSelector(ArbSys.arbOSVersion.selector), + abi.encode(uint256(11)) + ); + (SequencerInbox seqInbox, Bridge bridge) = deployRollup(true); + + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"00567890"; + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage(delayedInboxKind, delayedInboxSender, messageDataHash); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + expectEvents(bridge, seqInbox, data, true, false); + + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testAddSequencerL2BatchFromOrigin_ArbitrumHostedFeeTokenBased() public { + (SequencerInbox seqInbox, ERC20Bridge bridge) = deployFeeTokenBasedRollup(); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = hex"80567890"; + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage(delayedInboxKind, delayedInboxSender, messageDataHash, 0); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + // set 40 gwei basefee + uint256 basefee = 40000000000; + vm.fee(basefee); + + expectEvents(IBridge(address(bridge)), seqInbox, data, true, true); + + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testAddSequencerL2BatchFromOriginReverts() public { + (SequencerInbox seqInbox, Bridge bridge) = deployRollup(false); + address delayedInboxSender = address(140); + uint8 delayedInboxKind = 3; + bytes32 messageDataHash = RAND.Bytes32(); + bytes memory data = biggerData; // 00 is BROTLI_MESSAGE_HEADER_FLAG + + vm.prank(dummyInbox); + bridge.enqueueDelayedMessage(delayedInboxKind, delayedInboxSender, messageDataHash); + + uint256 subMessageCount = bridge.sequencerReportedSubMessageCount(); + uint256 sequenceNumber = bridge.sequencerMessageCount(); + uint256 delayedMessagesRead = bridge.delayedMessageCount(); + + vm.expectRevert(abi.encodeWithSelector(NotOrigin.selector)); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, false); + + vm.expectRevert(abi.encodeWithSelector(NotBatchPoster.selector)); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.prank(rollupOwner); + seqInbox.setIsBatchPoster(tx.origin, true); + + bytes memory bigData = bytes.concat( + seqInbox.BROTLI_MESSAGE_HEADER_FLAG(), + RAND.Bytes(maxDataSize - seqInbox.HEADER_LENGTH()) + ); + vm.expectRevert( + abi.encodeWithSelector( + DataTooLarge.selector, + bigData.length + seqInbox.HEADER_LENGTH(), + maxDataSize + ) + ); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + bigData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + bytes memory authenticatedData = bytes.concat(seqInbox.DATA_BLOB_HEADER_FLAG(), data); + vm.expectRevert(abi.encodeWithSelector(InvalidHeaderFlag.selector, authenticatedData[0])); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber, + authenticatedData, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + + vm.expectRevert( + abi.encodeWithSelector(BadSequencerNumber.selector, sequenceNumber, sequenceNumber + 5) + ); + vm.prank(tx.origin); + seqInbox.addSequencerL2BatchFromOrigin( + sequenceNumber + 5, + data, + delayedMessagesRead, + IGasRefunder(address(0)), + subMessageCount, + subMessageCount + 1 + ); + } + + function testPostUpgradeInitAlreadyInit() public returns (SequencerInbox, SequencerInbox) { + (SequencerInbox seqInbox, ) = deployRollup(false); + SequencerInbox seqInboxImpl = new SequencerInbox(maxDataSize, dummyReader4844, false); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall( + address(seqInboxImpl), + abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector) + ); + return (seqInbox, seqInboxImpl); + } + + function testPostUpgradeInit( + uint64 delayBlocks, + uint64 futureBlocks, + uint64 delaySeconds, + uint64 futureSeconds + ) public { + vm.assume(delayBlocks != 0 || futureBlocks != 0 || delaySeconds != 0 || futureSeconds != 0); + + (SequencerInbox seqInbox, SequencerInbox seqInboxImpl) = testPostUpgradeInitAlreadyInit(); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall( + address(seqInboxImpl), + abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector) + ); + + vm.store(address(seqInbox), bytes32(uint256(4)), bytes32(uint256(delayBlocks))); // slot 4: delayBlocks + vm.store(address(seqInbox), bytes32(uint256(5)), bytes32(uint256(futureBlocks))); // slot 5: futureBlocks + vm.store(address(seqInbox), bytes32(uint256(6)), bytes32(uint256(delaySeconds))); // slot 6: delaySeconds + vm.store(address(seqInbox), bytes32(uint256(7)), bytes32(uint256(futureSeconds))); // slot 7: futureSeconds + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall( + address(seqInboxImpl), + abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector) + ); + + ( + uint256 delayBlocks_, + uint256 futureBlocks_, + uint256 delaySeconds_, + uint256 futureSeconds_ + ) = seqInbox.maxTimeVariation(); + assertEq(delayBlocks_, delayBlocks); + assertEq(futureBlocks_, futureBlocks); + assertEq(delaySeconds_, delaySeconds); + assertEq(futureSeconds_, futureSeconds); + + vm.expectRevert(abi.encodeWithSelector(AlreadyInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall( + address(seqInboxImpl), + abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector) + ); + } + + function testPostUpgradeInitBadInit( + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds + ) public { + vm.assume(delayBlocks > uint256(type(uint64).max)); + vm.assume(futureBlocks > uint256(type(uint64).max)); + vm.assume(delaySeconds > uint256(type(uint64).max)); + vm.assume(futureSeconds > uint256(type(uint64).max)); + + (SequencerInbox seqInbox, SequencerInbox seqInboxImpl) = testPostUpgradeInitAlreadyInit(); + + vm.store(address(seqInbox), bytes32(uint256(4)), bytes32(delayBlocks)); // slot 4: delayBlocks + vm.store(address(seqInbox), bytes32(uint256(5)), bytes32(futureBlocks)); // slot 5: futureBlocks + vm.store(address(seqInbox), bytes32(uint256(6)), bytes32(delaySeconds)); // slot 6: delaySeconds + vm.store(address(seqInbox), bytes32(uint256(7)), bytes32(futureSeconds)); // slot 7: futureSeconds + vm.expectRevert(abi.encodeWithSelector(BadPostUpgradeInit.selector)); + vm.prank(proxyAdmin); + TransparentUpgradeableProxy(payable(address(seqInbox))).upgradeToAndCall( + address(seqInboxImpl), + abi.encodeWithSelector(SequencerInbox.postUpgradeInit.selector) + ); + } + + function testSetMaxTimeVariation( + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds + ) public { + vm.assume(delayBlocks <= uint256(type(uint64).max)); + vm.assume(futureBlocks <= uint256(type(uint64).max)); + vm.assume(delaySeconds <= uint256(type(uint64).max)); + vm.assume(futureSeconds <= uint256(type(uint64).max)); + (SequencerInbox seqInbox, ) = deployRollup(false); + vm.prank(rollupOwner); + seqInbox.setMaxTimeVariation( + ISequencerInbox.MaxTimeVariation({ + delayBlocks: delayBlocks, + futureBlocks: futureBlocks, + delaySeconds: delaySeconds, + futureSeconds: futureSeconds + }) + ); + } + + function testSetMaxTimeVariationOverflow( + uint256 delayBlocks, + uint256 futureBlocks, + uint256 delaySeconds, + uint256 futureSeconds + ) public { + vm.assume(delayBlocks > uint256(type(uint64).max)); + vm.assume(futureBlocks > uint256(type(uint64).max)); + vm.assume(delaySeconds > uint256(type(uint64).max)); + vm.assume(futureSeconds > uint256(type(uint64).max)); + (SequencerInbox seqInbox, ) = deployRollup(false); + vm.expectRevert(abi.encodeWithSelector(BadMaxTimeVariation.selector)); + vm.prank(rollupOwner); + seqInbox.setMaxTimeVariation( + ISequencerInbox.MaxTimeVariation({ + delayBlocks: delayBlocks, + futureBlocks: futureBlocks, + delaySeconds: delaySeconds, + futureSeconds: futureSeconds + }) + ); + } +} diff --git a/test/foundry/util/TestUtil.sol b/test/foundry/util/TestUtil.sol new file mode 100644 index 00000000..def8120c --- /dev/null +++ b/test/foundry/util/TestUtil.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.4; + +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +library TestUtil { + function deployProxy(address logic) public returns (address) { + ProxyAdmin pa = new ProxyAdmin(); + return address(new TransparentUpgradeableProxy(address(logic), address(pa), "")); + } +} + +contract Random { + bytes32 seed = bytes32(uint256(0x137)); + + function Bytes32() public returns (bytes32) { + seed = keccak256(abi.encodePacked(seed)); + return seed; + } + + function Bytes(uint256 length) public returns (bytes memory) { + require(length > 0, "Length must be greater than 0"); + bytes memory randomBytes = new bytes(length); + + for (uint256 i = 0; i < length; i++) { + Bytes32(); + randomBytes[i] = bytes1(uint8(uint256(seed) % 256)); + } + + return randomBytes; + } +} diff --git a/test/signatures/Bridge b/test/signatures/Bridge new file mode 100644 index 00000000..667c6a85 --- /dev/null +++ b/test/signatures/Bridge @@ -0,0 +1,25 @@ +{ + "acceptFundsFromOldBridge()": "e77145f4", + "activeOutbox()": "ab5d8943", + "allowedDelayedInboxList(uint256)": "e76f5c8d", + "allowedDelayedInboxes(address)": "ae60bd13", + "allowedOutboxList(uint256)": "945e1147", + "allowedOutboxes(address)": "413b35bd", + "delayedInboxAccs(uint256)": "d5719dc2", + "delayedMessageCount()": "eca067ad", + "enqueueDelayedMessage(uint8,address,bytes32)": "8db5993b", + "enqueueSequencerMessage(bytes32,uint256,uint256,uint256)": "86598a56", + "executeCall(address,uint256,bytes)": "9e5d4c49", + "initialize(address)": "c4d66de8", + "rollup()": "cb23bcb5", + "sequencerInbox()": "ee35f327", + "sequencerInboxAccs(uint256)": "16bf5579", + "sequencerMessageCount()": "0084120c", + "sequencerReportedSubMessageCount()": "5fca4a16", + "setDelayedInbox(address,bool)": "47fb24c5", + "setOutbox(address,bool)": "cee3d728", + "setSequencerInbox(address)": "4f61f850", + "setSequencerReportedSubMessageCount(uint256)": "f81ff3b3", + "submitBatchSpendingReport(address,bytes32)": "7a88b107", + "updateRollupAddress(address)": "919cc706" +} diff --git a/test/signatures/BridgeCreator b/test/signatures/BridgeCreator new file mode 100644 index 00000000..33340999 --- /dev/null +++ b/test/signatures/BridgeCreator @@ -0,0 +1,10 @@ +{ + "createBridge(address,address,address,(uint256,uint256,uint256,uint256))": "b4a5cc34", + "erc20BasedTemplates()": "76768ab9", + "ethBasedTemplates()": "11f02227", + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "transferOwnership(address)": "f2fde38b", + "updateERC20Templates((address,address,address,address,address))": "1bb7c6cc", + "updateTemplates((address,address,address,address,address))": "d94d6e0a" +} diff --git a/test/signatures/ChallengeManager b/test/signatures/ChallengeManager new file mode 100644 index 00000000..3807c4ff --- /dev/null +++ b/test/signatures/ChallengeManager @@ -0,0 +1,19 @@ +{ + "bisectExecution(uint64,(uint256,uint256,bytes32[],uint256),bytes32[])": "a521b032", + "bridge()": "e78cea92", + "challengeExecution(uint64,(uint256,uint256,bytes32[],uint256),uint8[2],bytes32[2],uint256)": "fb7be0a1", + "challengeInfo(uint64)": "7fd07a9c", + "challenges(uint256)": "8f1d3776", + "clearChallenge(uint64)": "56e9df97", + "createChallenge(bytes32,uint8[2],(bytes32[2],uint64[2])[2],uint64,address,address,uint256,uint256)": "14eab5e7", + "currentResponder(uint64)": "23a9ef23", + "initialize(address,address,address,address)": "f8c8765e", + "isTimedOut(uint64)": "9ede42b9", + "oneStepProveExecution(uint64,(uint256,uint256,bytes32[],uint256),bytes)": "d248d124", + "osp()": "f26a62c6", + "postUpgradeInit(address)": "c474d2c5", + "resultReceiver()": "3504f1d7", + "sequencerInbox()": "ee35f327", + "timeout(uint64)": "1b45c86a", + "totalChallengesCreated()": "5ef489e6" +} diff --git a/test/signatures/DeployHelper b/test/signatures/DeployHelper new file mode 100644 index 00000000..93ff0c75 --- /dev/null +++ b/test/signatures/DeployHelper @@ -0,0 +1,16 @@ +{ + "ERC1820_DEPLOYER()": "290302ce", + "ERC1820_PAYLOAD()": "2e796641", + "ERC1820_VALUE()": "db633c3e", + "ERC2470_DEPLOYER()": "55e34a6b", + "ERC2470_PAYLOAD()": "89cf8ae6", + "ERC2470_VALUE()": "9ed2c6f0", + "NICK_CREATE2_DEPLOYER()": "ef77e71a", + "NICK_CREATE2_PAYLOAD()": "1b9a680c", + "NICK_CREATE2_VALUE()": "4367d652", + "ZOLTU_CREATE2_DEPLOYER()": "d3a3faab", + "ZOLTU_CREATE2_PAYLOAD()": "75ae22b5", + "ZOLTU_VALUE()": "dd0c625a", + "getDeploymentTotalCost(address,uint256)": "acd7d02a", + "perform(address,address,uint256)": "d7c641e7" +} diff --git a/test/signatures/ERC20Bridge b/test/signatures/ERC20Bridge new file mode 100644 index 00000000..c37821d6 --- /dev/null +++ b/test/signatures/ERC20Bridge @@ -0,0 +1,26 @@ +{ + "acceptFundsFromOldBridge()": "e77145f4", + "activeOutbox()": "ab5d8943", + "allowedDelayedInboxList(uint256)": "e76f5c8d", + "allowedDelayedInboxes(address)": "ae60bd13", + "allowedOutboxList(uint256)": "945e1147", + "allowedOutboxes(address)": "413b35bd", + "delayedInboxAccs(uint256)": "d5719dc2", + "delayedMessageCount()": "eca067ad", + "enqueueDelayedMessage(uint8,address,bytes32,uint256)": "75d81e25", + "enqueueSequencerMessage(bytes32,uint256,uint256,uint256)": "86598a56", + "executeCall(address,uint256,bytes)": "9e5d4c49", + "initialize(address,address)": "485cc955", + "nativeToken()": "e1758bd8", + "rollup()": "cb23bcb5", + "sequencerInbox()": "ee35f327", + "sequencerInboxAccs(uint256)": "16bf5579", + "sequencerMessageCount()": "0084120c", + "sequencerReportedSubMessageCount()": "5fca4a16", + "setDelayedInbox(address,bool)": "47fb24c5", + "setOutbox(address,bool)": "cee3d728", + "setSequencerInbox(address)": "4f61f850", + "setSequencerReportedSubMessageCount(uint256)": "f81ff3b3", + "submitBatchSpendingReport(address,bytes32)": "7a88b107", + "updateRollupAddress(address)": "919cc706" +} diff --git a/test/signatures/ERC20Inbox b/test/signatures/ERC20Inbox new file mode 100644 index 00000000..04176030 --- /dev/null +++ b/test/signatures/ERC20Inbox @@ -0,0 +1,22 @@ +{ + "allowListEnabled()": "22bd5c1c", + "bridge()": "e78cea92", + "calculateRetryableSubmissionFee(uint256,uint256)": "a66b327d", + "createRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,uint256,bytes)": "549e8426", + "depositERC20(uint256)": "b79092fd", + "getProxyAdmin()": "8b3240a0", + "initialize(address,address)": "485cc955", + "isAllowed(address)": "babcc539", + "maxDataSize()": "e8eb1dc3", + "pause()": "8456cb59", + "paused()": "5c975abb", + "sendContractTransaction(uint256,uint256,address,uint256,bytes)": "8a631aa6", + "sendL2Message(bytes)": "b75436bb", + "sendL2MessageFromOrigin(bytes)": "1fe927cf", + "sendUnsignedTransaction(uint256,uint256,uint256,address,uint256,bytes)": "5075788b", + "sequencerInbox()": "ee35f327", + "setAllowList(address[],bool[])": "e3de72a5", + "setAllowListEnabled(bool)": "efeadb6d", + "unpause()": "3f4ba83a", + "unsafeCreateRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,uint256,bytes)": "b9b9a688" +} diff --git a/test/signatures/ERC20Outbox b/test/signatures/ERC20Outbox new file mode 100644 index 00000000..f577c95d --- /dev/null +++ b/test/signatures/ERC20Outbox @@ -0,0 +1,23 @@ +{ + "OUTBOX_VERSION()": "c75184df", + "bridge()": "e78cea92", + "calculateItemHash(address,address,uint256,uint256,uint256,uint256,bytes)": "9f0c04bf", + "calculateMerkleRoot(bytes32[],uint256,bytes32)": "007436d3", + "executeTransaction(bytes32[],uint256,address,address,uint256,uint256,uint256,uint256,bytes)": "08635a95", + "executeTransactionSimulation(uint256,address,address,uint256,uint256,uint256,uint256,bytes)": "288e5b10", + "initialize(address)": "c4d66de8", + "isSpent(uint256)": "5a129efe", + "l2ToL1BatchNum()": "11985271", + "l2ToL1Block()": "46547790", + "l2ToL1EthBlock()": "8515bc6a", + "l2ToL1OutputId()": "72f2a8c7", + "l2ToL1Sender()": "80648b02", + "l2ToL1Timestamp()": "b0f30537", + "l2ToL1WithdrawalAmount()": "cbf96f63", + "postUpgradeInit()": "95fcea78", + "rollup()": "cb23bcb5", + "roots(bytes32)": "ae6dead7", + "spent(uint256)": "d5b5cc23", + "updateRollupAddress()": "6ae71f12", + "updateSendRoot(bytes32,bytes32)": "a04cee60" +} diff --git a/test/signatures/Inbox b/test/signatures/Inbox new file mode 100644 index 00000000..4e884c6b --- /dev/null +++ b/test/signatures/Inbox @@ -0,0 +1,30 @@ +{ + "allowListEnabled()": "22bd5c1c", + "bridge()": "e78cea92", + "calculateRetryableSubmissionFee(uint256,uint256)": "a66b327d", + "createRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,bytes)": "679b6ded", + "createRetryableTicketNoRefundAliasRewrite(address,uint256,uint256,address,address,uint256,uint256,bytes)": "1b871c8d", + "depositEth()": "439370b1", + "depositEth(uint256)": "0f4d14e9", + "getProxyAdmin()": "8b3240a0", + "initialize(address,address)": "485cc955", + "isAllowed(address)": "babcc539", + "maxDataSize()": "e8eb1dc3", + "pause()": "8456cb59", + "paused()": "5c975abb", + "postUpgradeInit(address)": "c474d2c5", + "sendContractTransaction(uint256,uint256,address,uint256,bytes)": "8a631aa6", + "sendL1FundedContractTransaction(uint256,uint256,address,bytes)": "5e916758", + "sendL1FundedUnsignedTransaction(uint256,uint256,uint256,address,bytes)": "67ef3ab8", + "sendL1FundedUnsignedTransactionToFork(uint256,uint256,uint256,address,bytes)": "e6bd12cf", + "sendL2Message(bytes)": "b75436bb", + "sendL2MessageFromOrigin(bytes)": "1fe927cf", + "sendUnsignedTransaction(uint256,uint256,uint256,address,uint256,bytes)": "5075788b", + "sendUnsignedTransactionToFork(uint256,uint256,uint256,address,uint256,bytes)": "00f72382", + "sendWithdrawEthToFork(uint256,uint256,uint256,uint256,address)": "70665f14", + "sequencerInbox()": "ee35f327", + "setAllowList(address[],bool[])": "e3de72a5", + "setAllowListEnabled(bool)": "efeadb6d", + "unpause()": "3f4ba83a", + "unsafeCreateRetryableTicket(address,uint256,uint256,address,address,uint256,uint256,bytes)": "6e6e8a6a" +} diff --git a/test/signatures/Outbox b/test/signatures/Outbox new file mode 100644 index 00000000..cdfc5a24 --- /dev/null +++ b/test/signatures/Outbox @@ -0,0 +1,22 @@ +{ + "OUTBOX_VERSION()": "c75184df", + "bridge()": "e78cea92", + "calculateItemHash(address,address,uint256,uint256,uint256,uint256,bytes)": "9f0c04bf", + "calculateMerkleRoot(bytes32[],uint256,bytes32)": "007436d3", + "executeTransaction(bytes32[],uint256,address,address,uint256,uint256,uint256,uint256,bytes)": "08635a95", + "executeTransactionSimulation(uint256,address,address,uint256,uint256,uint256,uint256,bytes)": "288e5b10", + "initialize(address)": "c4d66de8", + "isSpent(uint256)": "5a129efe", + "l2ToL1BatchNum()": "11985271", + "l2ToL1Block()": "46547790", + "l2ToL1EthBlock()": "8515bc6a", + "l2ToL1OutputId()": "72f2a8c7", + "l2ToL1Sender()": "80648b02", + "l2ToL1Timestamp()": "b0f30537", + "postUpgradeInit()": "95fcea78", + "rollup()": "cb23bcb5", + "roots(bytes32)": "ae6dead7", + "spent(uint256)": "d5b5cc23", + "updateRollupAddress()": "6ae71f12", + "updateSendRoot(bytes32,bytes32)": "a04cee60" +} diff --git a/test/signatures/RollupAdminLogic b/test/signatures/RollupAdminLogic new file mode 100644 index 00000000..65a3167e --- /dev/null +++ b/test/signatures/RollupAdminLogic @@ -0,0 +1,73 @@ +{ + "_stakerMap(address)": "e8bd4922", + "amountStaked(address)": "ef40a670", + "baseStake()": "76e7e23b", + "bridge()": "e78cea92", + "chainId()": "9a8a0592", + "challengeManager()": "023a96fe", + "confirmPeriodBlocks()": "2e7acfa6", + "createNitroMigrationGenesis((((bytes32[2],uint64[2]),uint8),((bytes32[2],uint64[2]),uint8),uint64))": "7b83a3fe", + "currentChallenge(address)": "69fd251c", + "extraChallengeTimeBlocks()": "771b2f97", + "firstUnresolvedNode()": "d735e21d", + "forceConfirmNode(uint64,bytes32,bytes32)": "2f7968e8", + "forceCreateNode(uint64,uint256,(((bytes32[2],uint64[2]),uint8),((bytes32[2],uint64[2]),uint8),uint64),bytes32)": "470dce4e", + "forceRefundStaker(address[])": "7c75c298", + "forceResolveChallenge(address[],address[])": "f38c9379", + "getNode(uint64)": "92c8134c", + "getNodeCreationBlockForLogLookup(uint64)": "f63a434a", + "getStaker(address)": "a23c44b1", + "getStakerAddress(uint64)": "6ddd3744", + "inbox()": "fb0e722b", + "initialize((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),(address,address,address,address,address,address,address,address,address,address))": "28ff127a", + "isStaked(address)": "6177fd18", + "isStakedOnLatestConfirmed(address)": "dcd030aa", + "isValidator(address)": "facd743b", + "isZombie(address)": "91c657e8", + "lastStakeBlock()": "8640ce5f", + "latestConfirmed()": "65f7f80d", + "latestNodeCreated()": "7ba9534a", + "latestStakedNode(address)": "3e96576e", + "loserStakeEscrow()": "f065de3f", + "minimumAssertionPeriod()": "45e38b64", + "nodeHasStaker(uint64,address)": "aa65af48", + "outbox()": "ce11e6ab", + "pause()": "8456cb59", + "paused()": "5c975abb", + "proxiableUUID()": "52d1902d", + "removeOldOutbox(address)": "567ca41b", + "resume()": "046f7da2", + "rollupDeploymentBlock()": "1b1689e9", + "rollupEventInbox()": "aa38a6e7", + "sequencerInbox()": "ee35f327", + "setBaseStake(uint256)": "06ae5851", + "setConfirmPeriodBlocks(uint64)": "ce66d05c", + "setDelayedInbox(address,bool)": "47fb24c5", + "setExtraChallengeTimeBlocks(uint64)": "6136fe2e", + "setInbox(address)": "53b60c4a", + "setLoserStakeEscrow(address)": "fc8ffa03", + "setMinimumAssertionPeriod(uint256)": "948d6588", + "setOutbox(address)": "ff204f3b", + "setOwner(address)": "13af4035", + "setSequencerInbox(address)": "4f61f850", + "setStakeToken(address)": "0397d458", + "setValidator(address[],bool[])": "a3ffb772", + "setValidatorWhitelistDisabled(bool)": "a2b4f1d8", + "setWasmModuleRoot(bytes32)": "89384960", + "stakeToken()": "51ed6a30", + "stakerCount()": "dff69787", + "totalWithdrawableFunds()": "71ef232c", + "upgradeBeacon(address,address)": "848bf918", + "upgradeSecondaryTo(address)": "0d40a0fd", + "upgradeSecondaryToAndCall(address,bytes)": "9846129a", + "upgradeTo(address)": "3659cfe6", + "upgradeToAndCall(address,bytes)": "4f1ef286", + "validatorUtils()": "014cc92c", + "validatorWalletCreator()": "bc45e0ae", + "validatorWhitelistDisabled()": "12ab3d3b", + "wasmModuleRoot()": "8ee1a126", + "withdrawableFunds(address)": "2f30cabd", + "zombieAddress(uint256)": "d01e6602", + "zombieCount()": "63721d6b", + "zombieLatestStakedNode(uint256)": "f33e1fac" +} diff --git a/test/signatures/RollupCore b/test/signatures/RollupCore new file mode 100644 index 00000000..01125d8e --- /dev/null +++ b/test/signatures/RollupCore @@ -0,0 +1,44 @@ +{ + "_stakerMap(address)": "e8bd4922", + "amountStaked(address)": "ef40a670", + "baseStake()": "76e7e23b", + "bridge()": "e78cea92", + "chainId()": "9a8a0592", + "challengeManager()": "023a96fe", + "confirmPeriodBlocks()": "2e7acfa6", + "currentChallenge(address)": "69fd251c", + "extraChallengeTimeBlocks()": "771b2f97", + "firstUnresolvedNode()": "d735e21d", + "getNode(uint64)": "92c8134c", + "getNodeCreationBlockForLogLookup(uint64)": "f63a434a", + "getStaker(address)": "a23c44b1", + "getStakerAddress(uint64)": "6ddd3744", + "inbox()": "fb0e722b", + "isStaked(address)": "6177fd18", + "isStakedOnLatestConfirmed(address)": "dcd030aa", + "isValidator(address)": "facd743b", + "isZombie(address)": "91c657e8", + "lastStakeBlock()": "8640ce5f", + "latestConfirmed()": "65f7f80d", + "latestNodeCreated()": "7ba9534a", + "latestStakedNode(address)": "3e96576e", + "loserStakeEscrow()": "f065de3f", + "minimumAssertionPeriod()": "45e38b64", + "nodeHasStaker(uint64,address)": "aa65af48", + "outbox()": "ce11e6ab", + "paused()": "5c975abb", + "rollupDeploymentBlock()": "1b1689e9", + "rollupEventInbox()": "aa38a6e7", + "sequencerInbox()": "ee35f327", + "stakeToken()": "51ed6a30", + "stakerCount()": "dff69787", + "totalWithdrawableFunds()": "71ef232c", + "validatorUtils()": "014cc92c", + "validatorWalletCreator()": "bc45e0ae", + "validatorWhitelistDisabled()": "12ab3d3b", + "wasmModuleRoot()": "8ee1a126", + "withdrawableFunds(address)": "2f30cabd", + "zombieAddress(uint256)": "d01e6602", + "zombieCount()": "63721d6b", + "zombieLatestStakedNode(uint256)": "f33e1fac" +} diff --git a/test/signatures/RollupCreator b/test/signatures/RollupCreator new file mode 100644 index 00000000..6c6f761a --- /dev/null +++ b/test/signatures/RollupCreator @@ -0,0 +1,16 @@ +{ + "bridgeCreator()": "f860cefa", + "challengeManagerTemplate()": "9c683d10", + "createRollup(((uint64,uint64,address,uint256,bytes32,address,address,uint256,string,uint64,(uint256,uint256,uint256,uint256)),address[],uint256,address,bool,uint256,address[],address))": "331f9b0b", + "l2FactoriesDeployer()": "ac0425bc", + "osp()": "f26a62c6", + "owner()": "8da5cb5b", + "renounceOwnership()": "715018a6", + "rollupAdminLogic()": "9dba3241", + "rollupUserLogic()": "9d4798e3", + "setTemplates(address,address,address,address,address,address,address,address,address)": "ac9a97b4", + "transferOwnership(address)": "f2fde38b", + "upgradeExecutorLogic()": "030cb85e", + "validatorUtils()": "014cc92c", + "validatorWalletCreator()": "bc45e0ae" +} diff --git a/test/signatures/RollupUserLogic b/test/signatures/RollupUserLogic new file mode 100644 index 00000000..e0b35889 --- /dev/null +++ b/test/signatures/RollupUserLogic @@ -0,0 +1,71 @@ +{ + "VALIDATOR_AFK_BLOCKS()": "4ceccfe5", + "_stakerMap(address)": "e8bd4922", + "addToDeposit(address)": "45c5b2c7", + "amountStaked(address)": "ef40a670", + "baseStake()": "76e7e23b", + "bridge()": "e78cea92", + "chainId()": "9a8a0592", + "challengeManager()": "023a96fe", + "completeChallenge(uint256,address,address)": "0357aa49", + "confirmNextNode(bytes32,bytes32)": "5eb405d5", + "confirmPeriodBlocks()": "2e7acfa6", + "countStakedZombies(uint64)": "5c617e94", + "countZombiesStakedOnChildren(uint64)": "6d08d0a2", + "createChallenge(address[2],uint64[2],uint8[2],(bytes32[2],uint64[2])[2],uint64,bytes32,uint256[2],bytes32[2])": "6f57644e", + "currentChallenge(address)": "69fd251c", + "currentRequiredStake()": "4d26732d", + "extraChallengeTimeBlocks()": "771b2f97", + "firstUnresolvedNode()": "d735e21d", + "getNode(uint64)": "92c8134c", + "getNodeCreationBlockForLogLookup(uint64)": "f63a434a", + "getStaker(address)": "a23c44b1", + "getStakerAddress(uint64)": "6ddd3744", + "inbox()": "fb0e722b", + "initialize(address)": "c4d66de8", + "isERC20Enabled()": "cd205fda", + "isStaked(address)": "6177fd18", + "isStakedOnLatestConfirmed(address)": "dcd030aa", + "isValidator(address)": "facd743b", + "isZombie(address)": "91c657e8", + "lastStakeBlock()": "8640ce5f", + "latestConfirmed()": "65f7f80d", + "latestNodeCreated()": "7ba9534a", + "latestStakedNode(address)": "3e96576e", + "loserStakeEscrow()": "f065de3f", + "minimumAssertionPeriod()": "45e38b64", + "newStakeOnExistingNode(uint64,bytes32)": "ced01cfb", + "newStakeOnNewNode((((bytes32[2],uint64[2]),uint8),((bytes32[2],uint64[2]),uint8),uint64),bytes32,uint256)": "4774e576", + "nodeHasStaker(uint64,address)": "aa65af48", + "outbox()": "ce11e6ab", + "owner()": "8da5cb5b", + "paused()": "5c975abb", + "proxiableUUID()": "52d1902d", + "reduceDeposit(uint256)": "1e83d30f", + "rejectNextNode(address)": "6b94c33b", + "removeOldZombies(uint256)": "edfd03ed", + "removeWhitelistAfterFork()": "c2c2e68e", + "removeWhitelistAfterValidatorAfk()": "18baaab9", + "removeZombie(uint256,uint256)": "7e2d2155", + "requireUnresolved(uint256)": "2b2af0ab", + "requireUnresolvedExists()": "67425daf", + "requiredStake(uint256,uint64,uint64)": "b0ebedc7", + "returnOldDeposit(address)": "7427be51", + "rollupDeploymentBlock()": "1b1689e9", + "rollupEventInbox()": "aa38a6e7", + "sequencerInbox()": "ee35f327", + "stakeOnExistingNode(uint64,bytes32)": "1aeb55a0", + "stakeOnNewNode((((bytes32[2],uint64[2]),uint8),((bytes32[2],uint64[2]),uint8),uint64),bytes32,uint256)": "54ce8961", + "stakeToken()": "51ed6a30", + "stakerCount()": "dff69787", + "totalWithdrawableFunds()": "71ef232c", + "validatorUtils()": "014cc92c", + "validatorWalletCreator()": "bc45e0ae", + "validatorWhitelistDisabled()": "12ab3d3b", + "wasmModuleRoot()": "8ee1a126", + "withdrawStakerFunds()": "61373919", + "withdrawableFunds(address)": "2f30cabd", + "zombieAddress(uint256)": "d01e6602", + "zombieCount()": "63721d6b", + "zombieLatestStakedNode(uint256)": "f33e1fac" +} diff --git a/test/signatures/SequencerInbox b/test/signatures/SequencerInbox new file mode 100644 index 00000000..18c3db02 --- /dev/null +++ b/test/signatures/SequencerInbox @@ -0,0 +1,39 @@ +{ + "BROTLI_MESSAGE_HEADER_FLAG()": "16af91a7", + "DAS_MESSAGE_HEADER_FLAG()": "f60a5091", + "DATA_AUTHENTICATED_FLAG()": "e5a358c8", + "DATA_BLOB_HEADER_FLAG()": "2cbf74e5", + "HEADER_LENGTH()": "27957a49", + "TREE_DAS_MESSAGE_HEADER_FLAG()": "6c890450", + "ZERO_HEAVY_MESSAGE_HEADER_FLAG()": "02c99275", + "addSequencerL2Batch(uint256,bytes,uint256,address,uint256,uint256)": "e0bc9729", + "addSequencerL2BatchFromBlobs(uint256,uint256,address,uint256,uint256)": "3e5aa082", + "addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address)": "6f12b0c9", + "addSequencerL2BatchFromOrigin(uint256,bytes,uint256,address,uint256,uint256)": "8f111f3c", + "batchCount()": "06f13056", + "batchPosterManager()": "cc2a1a0c", + "bridge()": "e78cea92", + "dasKeySetInfo(bytes32)": "715ea34b", + "forceInclusion(uint256,uint8,uint64[2],uint256,address,bytes32)": "f1981578", + "getKeysetCreationBlock(bytes32)": "258f0495", + "inboxAccs(uint256)": "d9dd67ab", + "initialize(address,(uint256,uint256,uint256,uint256))": "1f7a92b2", + "invalidateKeysetHash(bytes32)": "84420860", + "isBatchPoster(address)": "71c3e6fe", + "isSequencer(address)": "6d46e987", + "isUsingFeeToken()": "92d9f782", + "isValidKeysetHash(bytes32)": "1637be48", + "maxDataSize()": "e8eb1dc3", + "maxTimeVariation()": "ebea461d", + "postUpgradeInit()": "95fcea78", + "reader4844()": "8d910dde", + "removeDelayAfterFork()": "96cc5c78", + "rollup()": "cb23bcb5", + "setBatchPosterManager(address)": "1ff64790", + "setIsBatchPoster(address,bool)": "6e7df3e7", + "setIsSequencer(address,bool)": "1f956632", + "setMaxTimeVariation((uint256,uint256,uint256,uint256))": "b31761f8", + "setValidKeyset(bytes)": "d1ce8da8", + "totalDelayedMessagesRead()": "7fa3a40e", + "updateRollupAddress()": "6ae71f12" +} diff --git a/test/signatures/test-sigs.bash b/test/signatures/test-sigs.bash new file mode 100755 index 00000000..4ff16cc3 --- /dev/null +++ b/test/signatures/test-sigs.bash @@ -0,0 +1,17 @@ +#!/bin/bash +output_dir="./test/signatures" +for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager ERC20Bridge ERC20Inbox ERC20Outbox BridgeCreator DeployHelper RollupCreator +do + echo "Checking for signature changes in $CONTRACTNAME" + [ -f "$output_dir/$CONTRACTNAME" ] && mv "$output_dir/$CONTRACTNAME" "$output_dir/$CONTRACTNAME-old" + forge inspect "$CONTRACTNAME" methods > "$output_dir/$CONTRACTNAME" + diff "$output_dir/$CONTRACTNAME-old" "$output_dir/$CONTRACTNAME" + if [[ $? != "0" ]] + then + CHANGED=1 + fi +done +if [[ $CHANGED == 1 ]] +then + exit 1 +fi \ No newline at end of file diff --git a/test/storage/Bridge b/test/storage/Bridge new file mode 100644 index 00000000..9ed7f48a --- /dev/null +++ b/test/storage/Bridge @@ -0,0 +1,15 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------------|------------------------------------------------|------|--------|-------|------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/Bridge.sol:Bridge | +| _initializing | bool | 0 | 1 | 1 | src/bridge/Bridge.sol:Bridge | +| allowedDelayedInboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 1 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedOutboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 2 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedDelayedInboxList | address[] | 3 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| allowedOutboxList | address[] | 4 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| _activeOutbox | address | 5 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| delayedInboxAccs | bytes32[] | 6 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| sequencerInboxAccs | bytes32[] | 7 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| sequencerInbox | address | 9 | 0 | 20 | src/bridge/Bridge.sol:Bridge | +| sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/Bridge.sol:Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/Bridge.sol:Bridge | diff --git a/test/storage/Bridge.dot b/test/storage/Bridge.dot deleted file mode 100644 index e35ab1d8..00000000 --- a/test/storage/Bridge.dot +++ /dev/null @@ -1,27 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -7 [label="Bridge \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <5> mapping\(address=\>InOutInfo\): allowedDelayedInboxesMap (32) } | { <8> mapping\(address=\>InOutInfo\): allowedOutboxesMap (32) } | { <10> address[]: allowedDelayedInboxList (32) } | { <12> address[]: allowedOutboxList (32) } | { unallocated (12) | address: _activeOutbox (20) } | { <15> bytes32[]: delayedInboxAccs (32) } | { <17> bytes32[]: sequencerInboxAccs (32) } | { unallocated (12) | IOwnable: rollup (20) } | { unallocated (12) | address: sequencerInbox (20) } | { uint256: sequencerReportedSubMessageCount (32) }}}"] - -1 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -2 [label="InOutInfo \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: index (32) } | { unallocated (31) | bool: allowed (1) }}}"] - -3 [label="address[]: allowedDelayedInboxList \<\\>\n0x11987c15ef5ed64ec2e3cd9cfc79d7bd155aea3982ea59f35a5e6b5c1593a54b | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -4 [label="address[]: allowedOutboxList \<\\>\n0x68f9c7fa29c0442459fc0d2760448ff932de4dd67b90b4a6ac1899621cfd70a7 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="bytes32[]: delayedInboxAccs \<\\>\n0x5ff1374942f1d7624ea1478457e8132b05531ee44999ffc0f33a70926c6a0d30 | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - -6 [label="bytes32[]: sequencerInboxAccs \<\\>\n0x995663702627f3d8fc4237c51a46b303536bb17f3f65e07c08ad05fecbf4d88e | {{ slot| 0 } | { type: variable (bytes) | { bytes32 (32) }}}"] - - 7:5 -> 1 - 7:8 -> 2 - 7:10 -> 3 - 7:12 -> 4 - 7:15 -> 5 - 7:17 -> 6 -} \ No newline at end of file diff --git a/test/storage/ChallengeManager b/test/storage/ChallengeManager new file mode 100644 index 00000000..85c7f035 --- /dev/null +++ b/test/storage/ChallengeManager @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------------|---------------------------------------------------|------|--------|-------|-----------------------------------------------------| +| totalChallengesCreated | uint64 | 0 | 0 | 8 | src/challenge/ChallengeManager.sol:ChallengeManager | +| challenges | mapping(uint256 => struct ChallengeLib.Challenge) | 1 | 0 | 32 | src/challenge/ChallengeManager.sol:ChallengeManager | +| resultReceiver | contract IChallengeResultReceiver | 2 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| sequencerInbox | contract ISequencerInbox | 3 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| bridge | contract IBridge | 4 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | +| osp | contract IOneStepProofEntry | 5 | 0 | 20 | src/challenge/ChallengeManager.sol:ChallengeManager | diff --git a/test/storage/ChallengeManager.dot b/test/storage/ChallengeManager.dot deleted file mode 100644 index d566805f..00000000 --- a/test/storage/ChallengeManager.dot +++ /dev/null @@ -1,9 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -1 [label="ChallengeManager \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: \.variable (bytes) | { unallocated (24) | uint64: totalChallengesCreated (8) } | { mapping\(uint256=\>ChallengeLib.Challenge\): challenges (32) } | { unallocated (12) | IChallengeResultReceiver: resultReceiver (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOneStepProofEntry: osp (20) }}}"] - -} \ No newline at end of file diff --git a/test/storage/ERC20Bridge b/test/storage/ERC20Bridge new file mode 100644 index 00000000..1b0d838b --- /dev/null +++ b/test/storage/ERC20Bridge @@ -0,0 +1,16 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------------|------------------------------------------------|------|--------|-------|----------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| _initializing | bool | 0 | 1 | 1 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedDelayedInboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 1 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedOutboxesMap | mapping(address => struct AbsBridge.InOutInfo) | 2 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedDelayedInboxList | address[] | 3 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| allowedOutboxList | address[] | 4 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| _activeOutbox | address | 5 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| delayedInboxAccs | bytes32[] | 6 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerInboxAccs | bytes32[] | 7 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| rollup | contract IOwnable | 8 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerInbox | address | 9 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| sequencerReportedSubMessageCount | uint256 | 10 | 0 | 32 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| __gap | uint256[40] | 11 | 0 | 1280 | src/bridge/ERC20Bridge.sol:ERC20Bridge | +| nativeToken | address | 51 | 0 | 20 | src/bridge/ERC20Bridge.sol:ERC20Bridge | diff --git a/test/storage/ERC20Inbox b/test/storage/ERC20Inbox new file mode 100644 index 00000000..58f398df --- /dev/null +++ b/test/storage/ERC20Inbox @@ -0,0 +1,12 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|--------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| _initializing | bool | 0 | 1 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[50] | 1 | 0 | 1600 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| _paused | bool | 51 | 0 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[49] | 52 | 0 | 1568 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| bridge | contract IBridge | 101 | 0 | 20 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| sequencerInbox | contract ISequencerInbox | 102 | 0 | 20 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| allowListEnabled | bool | 102 | 20 | 1 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| isAllowed | mapping(address => bool) | 103 | 0 | 32 | src/bridge/ERC20Inbox.sol:ERC20Inbox | +| __gap | uint256[47] | 104 | 0 | 1504 | src/bridge/ERC20Inbox.sol:ERC20Inbox | diff --git a/test/storage/ERC20Outbox b/test/storage/ERC20Outbox new file mode 100644 index 00000000..09e2c38c --- /dev/null +++ b/test/storage/ERC20Outbox @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|---------|--------------------------------|------|--------|-------|----------------------------------------| +| rollup | address | 0 | 0 | 20 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| spent | mapping(uint256 => bytes32) | 2 | 0 | 32 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| roots | mapping(bytes32 => bytes32) | 3 | 0 | 32 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| context | struct AbsOutbox.L2ToL1Context | 4 | 0 | 128 | src/bridge/ERC20Outbox.sol:ERC20Outbox | +| __gap | uint256[42] | 8 | 0 | 1344 | src/bridge/ERC20Outbox.sol:ERC20Outbox | diff --git a/test/storage/Inbox b/test/storage/Inbox new file mode 100644 index 00000000..0551822e --- /dev/null +++ b/test/storage/Inbox @@ -0,0 +1,12 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|------------------|--------------------------|------|--------|-------|----------------------------| +| _initialized | bool | 0 | 0 | 1 | src/bridge/Inbox.sol:Inbox | +| _initializing | bool | 0 | 1 | 1 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[50] | 1 | 0 | 1600 | src/bridge/Inbox.sol:Inbox | +| _paused | bool | 51 | 0 | 1 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[49] | 52 | 0 | 1568 | src/bridge/Inbox.sol:Inbox | +| bridge | contract IBridge | 101 | 0 | 20 | src/bridge/Inbox.sol:Inbox | +| sequencerInbox | contract ISequencerInbox | 102 | 0 | 20 | src/bridge/Inbox.sol:Inbox | +| allowListEnabled | bool | 102 | 20 | 1 | src/bridge/Inbox.sol:Inbox | +| isAllowed | mapping(address => bool) | 103 | 0 | 32 | src/bridge/Inbox.sol:Inbox | +| __gap | uint256[47] | 104 | 0 | 1504 | src/bridge/Inbox.sol:Inbox | diff --git a/test/storage/Inbox.dot b/test/storage/Inbox.dot deleted file mode 100644 index 218aaeec..00000000 --- a/test/storage/Inbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="Inbox \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (11) | bool: allowListEnabled (1) | ISequencerInbox: sequencerInbox (20) } | { mapping\(address=\>bool\): isAllowed (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - - 3:53 -> 1 - 3:104 -> 2 -} \ No newline at end of file diff --git a/test/storage/Outbox b/test/storage/Outbox new file mode 100644 index 00000000..d161ae3b --- /dev/null +++ b/test/storage/Outbox @@ -0,0 +1,8 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|---------|--------------------------------|------|--------|-------|------------------------------| +| rollup | address | 0 | 0 | 20 | src/bridge/Outbox.sol:Outbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/Outbox.sol:Outbox | +| spent | mapping(uint256 => bytes32) | 2 | 0 | 32 | src/bridge/Outbox.sol:Outbox | +| roots | mapping(bytes32 => bytes32) | 3 | 0 | 32 | src/bridge/Outbox.sol:Outbox | +| context | struct AbsOutbox.L2ToL1Context | 4 | 0 | 128 | src/bridge/Outbox.sol:Outbox | +| __gap | uint256[42] | 8 | 0 | 1344 | src/bridge/Outbox.sol:Outbox | diff --git a/test/storage/Outbox.dot b/test/storage/Outbox.dot deleted file mode 100644 index 089e0020..00000000 --- a/test/storage/Outbox.dot +++ /dev/null @@ -1,12 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -2 [label="Outbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 } | { type: \.variable (bytes) | { unallocated (12) | address: rollup (20) } | { unallocated (12) | IBridge: bridge (20) } | { mapping\(uint256=\>bytes32\): spent (32) } | { mapping\(bytes32=\>bytes32\): roots (32) } | { <10> L2ToL1Context: context (128) }}}"] - -1 [label="L2ToL1Context \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint128: l1Block (16) | uint128: l2Block (16) } | { unallocated (16) | uint128: timestamp (16) } | { bytes32: outputId (32) } | { unallocated (12) | address: sender (20) }}}"] - - 2:10 -> 1 -} \ No newline at end of file diff --git a/test/storage/RollupAdminLogic b/test/storage/RollupAdminLogic new file mode 100644 index 00000000..7832c870 --- /dev/null +++ b/test/storage/RollupAdminLogic @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|--------------------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupAdminLogic.sol:RollupAdminLogic | diff --git a/test/storage/RollupAdminLogic.dot b/test/storage/RollupAdminLogic.dot deleted file mode 100644 index f998ff51..00000000 --- a/test/storage/RollupAdminLogic.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupAdminLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInbox: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupCore b/test/storage/RollupCore new file mode 100644 index 00000000..4480b0cc --- /dev/null +++ b/test/storage/RollupCore @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|--------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupCore.sol:RollupCore | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupCore.sol:RollupCore | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupCore.sol:RollupCore | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupCore.sol:RollupCore | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupCore.sol:RollupCore | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupCore.sol:RollupCore | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupCore.sol:RollupCore | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupCore.sol:RollupCore | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupCore.sol:RollupCore | diff --git a/test/storage/RollupCore.dot b/test/storage/RollupCore.dot deleted file mode 100644 index f97adc58..00000000 --- a/test/storage/RollupCore.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupCore \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: extraChallengeTimeBlocks (8) | uint64: confirmPeriodBlocks (8) } | { uint256: chainId (32) } | { uint256: baseStake (32) } | { bytes32: wasmModuleRoot (32) } | { unallocated (12) | IInbox: inbox (20) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOutbox: outbox (20) } | { unallocated (12) | ISequencerInbox: sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: challengeManager (20) } | { unallocated (12) | address: validatorUtils (20) } | { unallocated (12) | address: validatorWalletCreator (20) } | { unallocated (12) | address: loserStakeEscrow (20) } | { unallocated (12) | address: stakeToken (20) } | { uint256: minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): isValidator (32) } | { uint64: _lastStakeBlock (8) | uint64: _latestNodeCreated (8) | uint64: _firstUnresolvedNode (8) | uint64: _latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): _nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): _nodeStakers (32) } | { <141> address[]: _stakerList (32) } | { <147> mapping\(address=\>Staker\): _stakerMap (32) } | { <151> Zombie[]: _zombies (32) } | { mapping\(address=\>uint256\): _withdrawableFunds (32) } | { uint256: totalWithdrawableFunds (32) } | { uint256: rollupDeploymentBlock (32) } | { unallocated (31) | bool: validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): _nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/RollupUserLogic b/test/storage/RollupUserLogic new file mode 100644 index 00000000..27139d25 --- /dev/null +++ b/test/storage/RollupUserLogic @@ -0,0 +1,38 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------------------|-----------------------------------------------|------|--------|-------|------------------------------------------------| +| _initialized | bool | 0 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _initializing | bool | 0 | 1 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| __gap | uint256[50] | 1 | 0 | 1600 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _paused | bool | 51 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| __gap | uint256[49] | 52 | 0 | 1568 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| confirmPeriodBlocks | uint64 | 101 | 0 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| extraChallengeTimeBlocks | uint64 | 101 | 8 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| chainId | uint256 | 102 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| baseStake | uint256 | 103 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| wasmModuleRoot | bytes32 | 104 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| inbox | contract IInboxBase | 105 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| bridge | contract IBridge | 106 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| outbox | contract IOutbox | 107 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| sequencerInbox | contract ISequencerInbox | 108 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| rollupEventInbox | contract IRollupEventInbox | 109 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| challengeManager | contract IChallengeManager | 110 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorUtils | address | 111 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorWalletCreator | address | 112 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| loserStakeEscrow | address | 113 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| stakeToken | address | 114 | 0 | 20 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| minimumAssertionPeriod | uint256 | 115 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| isValidator | mapping(address => bool) | 116 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _latestConfirmed | uint64 | 117 | 0 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _firstUnresolvedNode | uint64 | 117 | 8 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _latestNodeCreated | uint64 | 117 | 16 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _lastStakeBlock | uint64 | 117 | 24 | 8 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodes | mapping(uint64 => struct Node) | 118 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodeStakers | mapping(uint64 => mapping(address => bool)) | 119 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _stakerList | address[] | 120 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _stakerMap | mapping(address => struct IRollupCore.Staker) | 121 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _zombies | struct RollupCore.Zombie[] | 122 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _withdrawableFunds | mapping(address => uint256) | 123 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| totalWithdrawableFunds | uint256 | 124 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| rollupDeploymentBlock | uint256 | 125 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| validatorWhitelistDisabled | bool | 126 | 0 | 1 | src/rollup/RollupUserLogic.sol:RollupUserLogic | +| _nodeCreatedAtArbSysBlock | mapping(uint64 => uint256) | 127 | 0 | 32 | src/rollup/RollupUserLogic.sol:RollupUserLogic | diff --git a/test/storage/RollupUserLogic.dot b/test/storage/RollupUserLogic.dot deleted file mode 100644 index bed63789..00000000 --- a/test/storage/RollupUserLogic.dot +++ /dev/null @@ -1,30 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -8 [label="RollupUserLogic \<\\>\n | {{ slot| 0 | 1-50 | 51 | 52-100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 } | { type: \.variable (bytes) | { unallocated (30) | bool: Initializable._initializing (1) | bool: Initializable._initialized (1) } | { <53> uint256[50]: ContextUpgradeable.__gap (1600) } | { unallocated (31) | bool: PausableUpgradeable._paused (1) } | { <104> uint256[49]: PausableUpgradeable.__gap (1568) } | { unallocated (16) | uint64: RollupCore.extraChallengeTimeBlocks (8) | uint64: RollupCore.confirmPeriodBlocks (8) } | { uint256: RollupCore.chainId (32) } | { uint256: RollupCore.baseStake (32) } | { bytes32: RollupCore.wasmModuleRoot (32) } | { unallocated (12) | IInbox: RollupCore.inbox (20) } | { unallocated (12) | IBridge: RollupCore.bridge (20) } | { unallocated (12) | IOutbox: RollupCore.outbox (20) } | { unallocated (12) | ISequencerInbox: RollupCore.sequencerInbox (20) } | { unallocated (12) | IRollupEventInbox: RollupCore.rollupEventInbox (20) } | { unallocated (12) | IChallengeManager: RollupCore.challengeManager (20) } | { unallocated (12) | address: RollupCore.validatorUtils (20) } | { unallocated (12) | address: RollupCore.validatorWalletCreator (20) } | { unallocated (12) | address: RollupCore.loserStakeEscrow (20) } | { unallocated (12) | address: RollupCore.stakeToken (20) } | { uint256: RollupCore.minimumAssertionPeriod (32) } | { mapping\(address=\>bool\): RollupCore.isValidator (32) } | { uint64: RollupCore._lastStakeBlock (8) | uint64: RollupCore._latestNodeCreated (8) | uint64: RollupCore._firstUnresolvedNode (8) | uint64: RollupCore._latestConfirmed (8) } | { <138> mapping\(uint64=\>Node\): RollupCore._nodes (32) } | { mapping\(uint64=\>mapping\(address=\>bool\)\): RollupCore._nodeStakers (32) } | { <141> address[]: RollupCore._stakerList (32) } | { <147> mapping\(address=\>Staker\): RollupCore._stakerMap (32) } | { <151> Zombie[]: RollupCore._zombies (32) } | { mapping\(address=\>uint256\): RollupCore._withdrawableFunds (32) } | { uint256: RollupCore.totalWithdrawableFunds (32) } | { uint256: RollupCore.rollupDeploymentBlock (32) } | { unallocated (31) | bool: RollupCore.validatorWhitelistDisabled (1) } | { mapping\(uint64=\>uint256\): RollupCore._nodeCreatedAtArbSysBlock (32) }}}"] - -1 [label="uint256[50]: __gap \<\\>\n | {{ slot| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -2 [label="uint256[49]: __gap \<\\>\n | {{ slot| 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 } | { type: variable (bytes) | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) } | { uint256 (32) }}}"] - -3 [label="Node \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4 | 5 } | { type: variable (bytes) | { bytes32: stateHash (32) } | { bytes32: challengeHash (32) } | { bytes32: confirmData (32) } | { uint64: stakerCount (8) | uint64: noChildConfirmedBeforeBlock (8) | uint64: deadlineBlock (8) | uint64: prevNum (8) } | { uint64: createdAtBlock (8) | uint64: latestChildNumber (8) | uint64: firstChildBlock (8) | uint64: childStakerCount (8) } | { bytes32: nodeHash (32) }}}"] - -4 [label="address[]: _stakerList \<\\>\n0x315040cf50a9fea58aa3302eb9bbbb1153c7ed7311c4e1c76711b1190d535025 | {{ slot| 0 } | { type: variable (bytes) | { unallocated (12) | address (20) }}}"] - -5 [label="Staker \<\\>\n | {{ slot| 0 | 1 } | { type: variable (bytes) | { uint256: amountStaked (32) } | { unallocated (7) | bool: isStaked (1) | uint64: currentChallenge (8) | uint64: latestStakedNode (8) | uint64: index (8) }}}"] - -6 [label="Zombie \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (4) | uint64: latestStakedNode (8) | address: stakerAddress (20) }}}"] - -7 [label="Zombie[]: _zombies \<\\>\n0x8e4a4be60bf9672655845da331c63e49fa2a771e90e72dc554369cbb34aae7b8 | {{ slot| 0 } | { type: variable (bytes) | { <148> Zombie (32) }}}"] - - 8:53 -> 1 - 8:104 -> 2 - 8:138 -> 3 - 8:141 -> 4 - 8:147 -> 5 - 8:151 -> 7 - 7:148 -> 6 -} \ No newline at end of file diff --git a/test/storage/SequencerInbox b/test/storage/SequencerInbox new file mode 100644 index 00000000..c53e775e --- /dev/null +++ b/test/storage/SequencerInbox @@ -0,0 +1,14 @@ +| Name | Type | Slot | Offset | Bytes | Contract | +|-----------------------------|----------------------------------------------------------|------|--------|-------|----------------------------------------------| +| totalDelayedMessagesRead | uint256 | 0 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| bridge | contract IBridge | 1 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| rollup | contract IOwnable | 2 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isBatchPoster | mapping(address => bool) | 3 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| __LEGACY_MAX_TIME_VARIATION | struct ISequencerInbox.MaxTimeVariation | 4 | 0 | 128 | src/bridge/SequencerInbox.sol:SequencerInbox | +| dasKeySetInfo | mapping(bytes32 => struct ISequencerInbox.DasKeySetInfo) | 8 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| isSequencer | mapping(address => bool) | 9 | 0 | 32 | src/bridge/SequencerInbox.sol:SequencerInbox | +| delayBlocks | uint64 | 10 | 0 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| futureBlocks | uint64 | 10 | 8 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| delaySeconds | uint64 | 10 | 16 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| futureSeconds | uint64 | 10 | 24 | 8 | src/bridge/SequencerInbox.sol:SequencerInbox | +| batchPosterManager | address | 11 | 0 | 20 | src/bridge/SequencerInbox.sol:SequencerInbox | diff --git a/test/storage/SequencerInbox.dot b/test/storage/SequencerInbox.dot deleted file mode 100644 index f9ea05ab..00000000 --- a/test/storage/SequencerInbox.dot +++ /dev/null @@ -1,15 +0,0 @@ - -digraph StorageDiagram { -rankdir=LR -color=black -arrowhead=open -node [shape=record, style=filled, fillcolor=gray95 fontname="Courier New"] -3 [label="SequencerInbox \<\\>\n | {{ slot| 0 | 1 | 2 | 3 | 4-7 | 8 | 9 } | { type: \.variable (bytes) | { uint256: totalDelayedMessagesRead (32) } | { unallocated (12) | IBridge: bridge (20) } | { unallocated (12) | IOwnable: rollup (20) } | { mapping\(address=\>bool\): isBatchPoster (32) } | { <9> ISequencerInbox.MaxTimeVariation: maxTimeVariation (128) } | { <12> mapping\(bytes32=\>DasKeySetInfo\): dasKeySetInfo (32) } | { mapping\(address=\>bool\): isSequencer (32) }}}"] - -1 [label="ISequencerInbox.MaxTimeVariation \<\\>\n | {{ slot| 4 | 5 | 6 | 7 } | { type: variable (bytes) | { uint256: MaxTimeVariation.delayBlocks (32) } | { uint256: MaxTimeVariation.futureBlocks (32) } | { uint256: MaxTimeVariation.delaySeconds (32) } | { uint256: MaxTimeVariation.futureSeconds (32) }}}"] - -2 [label="DasKeySetInfo \<\\>\n | {{ slot| 0 } | { type: variable (bytes) | { unallocated (23) | uint64: creationBlock (8) | bool: isValidKeyset (1) }}}"] - - 3:9 -> 1 - 3:12 -> 2 -} \ No newline at end of file diff --git a/test/storage/test.bash b/test/storage/test.bash index 98a9e566..562deb0f 100755 --- a/test/storage/test.bash +++ b/test/storage/test.bash @@ -1,10 +1,11 @@ #!/bin/bash -for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager +output_dir="./test/storage" +for CONTRACTNAME in Bridge Inbox Outbox RollupCore RollupUserLogic RollupAdminLogic SequencerInbox ChallengeManager ERC20Bridge ERC20Inbox ERC20Outbox do echo "Checking storage change of $CONTRACTNAME" - [ -f "./test/storage/$CONTRACTNAME.dot" ] && mv "./test/storage/$CONTRACTNAME.dot" "./test/storage/$CONTRACTNAME-old.dot" - yarn sol2uml storage ./ -c "$CONTRACTNAME" -o "./test/storage/$CONTRACTNAME.dot" -f dot - diff "./test/storage/$CONTRACTNAME-old.dot" "./test/storage/$CONTRACTNAME.dot" + [ -f "$output_dir/$CONTRACTNAME" ] && mv "$output_dir/$CONTRACTNAME" "$output_dir/$CONTRACTNAME-old" + forge inspect "$CONTRACTNAME" --pretty storage > "$output_dir/$CONTRACTNAME" + diff "$output_dir/$CONTRACTNAME-old" "$output_dir/$CONTRACTNAME" if [[ $? != "0" ]] then CHANGED=1 diff --git a/yarn.lock b/yarn.lock index 824e092e..117dabfe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,15 @@ # yarn lockfile v1 -"@aduh95/viz.js@^3.7.0": - version "3.7.0" - resolved "https://registry.yarnpkg.com/@aduh95/viz.js/-/viz.js-3.7.0.tgz#a20d86c5fc8f6abebdc39b96a4326e10375d77c0" - integrity sha512-20Pk2Z98fbPLkECcrZSJszKos/OgtvJJR3NcbVfgCJ6EQjDNzW2P1BKqImOz3tJ952dvO2DWEhcLhQ1Wz1e9ng== +"@arbitrum/sdk@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-3.1.3.tgz#75236043717a450b569faaa087687c51d525b0c3" + integrity sha512-Dn1or7/Guc3dItuiiWaoYQ37aCDwiWTZGPIrg4yBJW27BgiDGbo0mjPDAhKTh4p5NDOWyE8bZ0vZai86COZIUA== + dependencies: + "@ethersproject/address" "^5.0.8" + "@ethersproject/bignumber" "^5.1.1" + "@ethersproject/bytes" "^5.0.8" + ethers "^5.1.0" "@babel/code-frame@^7.0.0": version "7.16.7" @@ -28,6 +33,42 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" @@ -40,22 +81,6 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@ensdomains/ens@^0.4.4": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/resolver@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - "@eslint/eslintrc@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" @@ -71,84 +96,73 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@ethereum-waffle/chai@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-3.4.4.tgz#16c4cc877df31b035d6d92486dfdf983df9138ff" - integrity sha512-/K8czydBtXXkcM9X6q29EqEkc5dN3oYenyH2a9hF7rGAApAJUpH8QBtojxOY/xQ2up5W332jqgxwp0yPiYug1g== +"@ethereum-waffle/chai@4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" + integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== dependencies: - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.5.2" + "@ethereum-waffle/provider" "4.0.5" + debug "^4.3.4" + json-bigint "^1.0.0" -"@ethereum-waffle/compiler@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-3.4.4.tgz#d568ee0f6029e68b5c645506079fbf67d0dfcf19" - integrity sha512-RUK3axJ8IkD5xpWjWoJgyHclOeEzDLQFga6gKpeGxiS/zBu+HB0W2FvsrrLalTFIaPw/CGYACRBSIxqiCqwqTQ== +"@ethereum-waffle/compiler@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" + integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== dependencies: "@resolver-engine/imports" "^0.3.3" "@resolver-engine/imports-fs" "^0.3.3" - "@typechain/ethers-v5" "^2.0.0" + "@typechain/ethers-v5" "^10.0.0" "@types/mkdirp" "^0.5.2" - "@types/node-fetch" "^2.5.5" - ethers "^5.0.1" + "@types/node-fetch" "^2.6.1" mkdirp "^0.5.1" - node-fetch "^2.6.1" - solc "^0.6.3" - ts-generator "^0.1.1" - typechain "^3.0.0" - -"@ethereum-waffle/ens@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-3.4.4.tgz#db97ea2c9decbb70b9205d53de2ccbd6f3182ba1" - integrity sha512-0m4NdwWxliy3heBYva1Wr4WbJKLnwXizmy5FfSSr5PMbjI7SIGCdCB59U7/ZzY773/hY3bLnzLwvG5mggVjJWg== - dependencies: - "@ensdomains/ens" "^0.4.4" - "@ensdomains/resolver" "^0.2.4" - ethers "^5.5.2" - -"@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" - integrity sha512-Mp0iB2YNWYGUV+VMl5tjPsaXKbKo8MDH9wSJ702l9EBjdxFf/vBvnMBAC1Fub1lLtmD0JHtp1pq+mWzg/xlLnA== - dependencies: - "@ethersproject/abi" "^5.5.0" - ethers "^5.5.2" - -"@ethereum-waffle/provider@^3.4.4": - version "3.4.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-3.4.4.tgz#398fc1f7eb91cc2df7d011272eacba8af0c7fffb" - integrity sha512-GK8oKJAM8+PKy2nK08yDgl4A80mFuI8zBkE0C9GqTRYQqvuxIyXoLmJ5NZU9lIwyWVv5/KsoA11BgAv2jXE82g== - dependencies: - "@ethereum-waffle/ens" "^3.4.4" - ethers "^5.5.2" - ganache-core "^2.13.2" - patch-package "^6.2.2" - postinstall-postinstall "^2.1.0" + node-fetch "^2.6.7" + +"@ethereum-waffle/ens@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" + integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== + +"@ethereum-waffle/mock-contract@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== + +"@ethereum-waffle/provider@4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" + integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== + dependencies: + "@ethereum-waffle/ens" "4.0.3" + "@ganache/ethereum-options" "0.1.4" + debug "^4.3.4" + ganache "7.4.3" "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== + version "3.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" merkle-patricia-tree "^4.2.4" -"@ethereumjs/blockchain@^5.5.0", "@ethereumjs/blockchain@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.2.tgz#1848abd9dc1ee56acf8cec4c84304d7f4667d027" - integrity sha512-Jz26iJmmsQtngerW6r5BDFaew/f2mObLrRZo3rskLOx1lmtMZ8+TX/vJexmivrnWgmAsTdNWhlKUYY4thPhPig== +"@ethereumjs/blockchain@^5.5.0": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== dependencies: "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.3" + "@ethereumjs/common" "^2.6.4" "@ethereumjs/ethash" "^1.1.0" debug "^4.3.3" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" level-mem "^5.0.1" lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.3.0": +"@ethereumjs/common@2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== @@ -156,21 +170,13 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.3" -"@ethereumjs/common@^2.4.0": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.2.tgz#eb006c9329c75c80f634f340dc1719a5258244df" - integrity sha512-vDwye5v0SVeuDky4MtKsu+ogkH2oFUV8pBKzH/eNBzT8oI91pKa8WyzDuYuxOQsgNgv5R34LfFDh2aaw3H4HbQ== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" - -"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.3": - version "2.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.3.tgz#39ddece7300b336276bad6c02f6a9f1a082caa05" - integrity sha512-mQwPucDL7FDYIg9XQ8DL31CnIYZwGhU5hyOO5E+BMmT71G0+RHvIT5rIkLBirJEKxV6+Rcf9aEIY0kXInxUWpQ== +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" "@ethereumjs/ethash@^1.1.0": version "1.1.0" @@ -183,7 +189,12 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@^3.2.1": +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/tx@3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== @@ -191,78 +202,57 @@ "@ethereumjs/common" "^2.6.0" ethereumjs-util "^7.1.3" -"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.1.tgz#8d941b83a602b4a89949c879615f7ea9a90e6671" - integrity sha512-xzDrTiu4sqZXUcaBxJ4n4W5FrppwxLxZB4ZDGVLtxSQR4lVuOnFR6RcUHdg1mpUhAPVrmnzLJpxaeXnPxIyhWA== +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: - "@ethereumjs/common" "^2.6.3" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" -"@ethereumjs/vm@^5.6.0": - version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.8.0.tgz#c9055f96afc13dd7b72893b57fa20027effea6fe" - integrity sha512-mn2G2SX79QY4ckVvZUfxlNUpzwT2AEIkvgJI8aHoQaNYEHhH8rmdVDIaVVgz6//PjK52BZsK23afz+WvSR0Qqw== +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + +"@ethereumjs/vm@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" + integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== + dependencies: + "@ethereumjs/block" "^3.6.0" + "@ethereumjs/blockchain" "^5.5.0" + "@ethereumjs/common" "^2.6.0" + "@ethereumjs/tx" "^3.4.0" async-eventemitter "^0.2.4" core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.4" + debug "^2.2.0" + ethereumjs-util "^7.1.3" functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" + merkle-patricia-tree "^4.2.2" rustbn.js "~0.2.0" -"@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" - integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== - dependencies: - "@ethersproject/address" ">=5.0.0-beta.128" - "@ethersproject/bignumber" ">=5.0.0-beta.130" - "@ethersproject/bytes" ">=5.0.0-beta.129" - "@ethersproject/constants" ">=5.0.0-beta.128" - "@ethersproject/hash" ">=5.0.0-beta.128" - "@ethersproject/keccak256" ">=5.0.0-beta.127" - "@ethersproject/logger" ">=5.0.0-beta.129" - "@ethersproject/properties" ">=5.0.0-beta.131" - "@ethersproject/strings" ">=5.0.0-beta.130" - -"@ethersproject/abi@5.0.7": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== - dependencies: - "@ethersproject/address" "^5.0.4" - "@ethersproject/bignumber" "^5.0.7" - "@ethersproject/bytes" "^5.0.4" - "@ethersproject/constants" "^5.0.4" - "@ethersproject/hash" "^5.0.4" - "@ethersproject/keccak256" "^5.0.3" - "@ethersproject/logger" "^5.0.5" - "@ethersproject/properties" "^5.0.3" - "@ethersproject/strings" "^5.0.4" - -"@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0", "@ethersproject/abi@^5.5.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" - integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" -"@ethersproject/abi@5.6.1", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.6.0": +"@ethersproject/abi@^5.0.0-beta.146": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.1.tgz#f7de888edeb56b0a657b672bdd1b3a1135cd14f7" integrity sha512-0cqssYh6FXjlwKWBmLm3+zH2BNARoS5u/hxbz+LpQmcDB3w0W553h2btWui1/uZp2GBM/SI3KniTuMcYyHpA5w== @@ -277,33 +267,20 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0": +"@ethersproject/abi@^5.1.2": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" - integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3" + integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg== dependencies: + "@ethersproject/address" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" + "@ethersproject/constants" "^5.6.0" + "@ethersproject/hash" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" + "@ethersproject/strings" "^5.6.0" "@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" @@ -318,16 +295,18 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.4.1", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.6.0": +"@ethersproject/abstract-provider@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" - integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061" + integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw== dependencies: - "@ethersproject/abstract-provider" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.0" "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.0" + "@ethersproject/web" "^5.6.0" "@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" @@ -340,18 +319,18 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@5.6.0", "@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.4.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.6.0": +"@ethersproject/abstract-signer@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" - integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7" + integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ== dependencies: + "@ethersproject/abstract-provider" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" + "@ethersproject/properties" "^5.6.0" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -362,23 +341,16 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/address@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" - integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/rlp" "^5.5.0" - -"@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0": +"@ethersproject/address@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" - integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012" + integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ== dependencies: + "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" "@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": version "5.7.0" @@ -387,13 +359,12 @@ dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0": +"@ethersproject/base64@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69" - integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ== + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9" + integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw== dependencies: "@ethersproject/bytes" "^5.6.0" - "@ethersproject/properties" "^5.6.0" "@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": version "5.7.0" @@ -403,16 +374,7 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.4.1", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" - integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - bn.js "^4.11.9" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -421,42 +383,28 @@ "@ethersproject/logger" "^5.7.0" bn.js "^5.2.1" -"@ethersproject/bignumber@^5.0.7": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" - integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - bn.js "^4.11.9" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.4.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== +"@ethersproject/bignumber@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26" + integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA== dependencies: + "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" + bn.js "^4.11.9" -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/bytes@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" - integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/constants@5.6.0", "@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.4.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" - integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== +"@ethersproject/bytes@^5.6.0": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== dependencies: - "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/logger" "^5.6.0" "@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": version "5.7.0" @@ -465,30 +413,14 @@ dependencies: "@ethersproject/bignumber" "^5.7.0" -"@ethersproject/constants@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" - integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== - dependencies: - "@ethersproject/bignumber" "^5.5.0" - -"@ethersproject/contracts@5.6.0", "@ethersproject/contracts@^5.4.1": +"@ethersproject/constants@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067" - integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw== + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088" + integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA== dependencies: - "@ethersproject/abi" "^5.6.0" - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" -"@ethersproject/contracts@5.7.0": +"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== @@ -504,20 +436,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@5.6.0", "@ethersproject/hash@>=5.0.0-beta.128", "@ethersproject/hash@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" - integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" @@ -533,37 +451,19 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hash@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" - integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== - dependencies: - "@ethersproject/abstract-signer" "^5.5.0" - "@ethersproject/address" "^5.5.0" - "@ethersproject/bignumber" "^5.5.0" - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/keccak256" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - "@ethersproject/properties" "^5.5.0" - "@ethersproject/strings" "^5.5.0" - -"@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0": +"@ethersproject/hash@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998" - integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw== + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2" + integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA== dependencies: "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/basex" "^5.6.0" + "@ethersproject/address" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" "@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" @@ -583,25 +483,6 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5" - integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - "@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" @@ -621,14 +502,6 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" - integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== - dependencies: - "@ethersproject/bytes" "^5.6.0" - js-sha3 "0.8.0" - "@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" @@ -637,58 +510,45 @@ "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" - integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== +"@ethersproject/keccak256@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459" + integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w== dependencies: - "@ethersproject/bytes" "^5.5.0" + "@ethersproject/bytes" "^5.6.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.6.0", "@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== - "@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/logger@^5.0.5": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" - integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== +"@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== -"@ethersproject/networks@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.1.tgz#7a21ed1f83e86121737b16841961ec99ccf5c9c7" - integrity sha512-b2rrupf3kCTcc3jr9xOWBuHylSFtbpJf79Ga7QR98ienU2UqGimPGEsYMgbI29KHJfA5Us89XwGVmxrlxmSrMg== +"@ethersproject/networks@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: - "@ethersproject/logger" "^5.6.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/networks@5.6.2", "@ethersproject/networks@^5.6.0": +"@ethersproject/networks@^5.6.0": version "5.6.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.2.tgz#2bacda62102c0b1fcee408315f2bed4f6fbdf336" integrity sha512-9uEzaJY7j5wpYGTojGp8U89mSsgQLc40PCMJLMCnFXTs7nhBveZ0t7dbqWUNrepWTszDbFkYD6WlL8DKx5huHA== dependencies: "@ethersproject/logger" "^5.6.0" -"@ethersproject/networks@5.7.0", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.0.tgz#df72a392f1a63a57f87210515695a31a245845ad" integrity sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a" - integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/sha2" "^5.6.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" @@ -697,13 +557,6 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== - dependencies: - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" @@ -711,67 +564,17 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/properties@^5.0.3": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" - integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== - dependencies: - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/providers@5.6.2", "@ethersproject/providers@^5.4.4": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.2.tgz#b9807b1c8c6f59fa2ee4b3cf6519724d07a9f422" - integrity sha512-6/EaFW/hNWz+224FXwl8+HdMRzVHt8DpPmu5MZaIQqx/K/ELnC9eY236SMV7mleCM3NnEArFwcAAxH5kUUgaRg== +"@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" -"@ethersproject/providers@5.6.4": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.4.tgz#1a49c211b57b0b2703c320819abbbfa35c83dff7" - integrity sha512-WAdknnaZ52hpHV3qPiJmKx401BLpup47h36Axxgre9zT+doa/4GC/Ne48ICPxTm0BqndpToHjpLP1ZnaxyE+vw== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/basex" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/web" "^5.6.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/providers@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.0.tgz#a885cfc7650a64385e7b03ac86fe9c2d4a9c2c63" - integrity sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA== +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -794,14 +597,6 @@ bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6" - integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@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" @@ -810,14 +605,6 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" - integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@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" @@ -826,14 +613,13 @@ "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.6.0": +"@ethersproject/rlp@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9" - integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA== + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717" + integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g== dependencies: "@ethersproject/bytes" "^5.6.0" "@ethersproject/logger" "^5.6.0" - hash.js "1.1.7" "@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" @@ -844,18 +630,6 @@ "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" - integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.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" @@ -868,19 +642,19 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.6.0", "@ethersproject/solidity@^5.4.0": +"@ethersproject/signing-key@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3" - integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww== + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042" + integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA== dependencies: - "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.0" - "@ethersproject/strings" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -892,15 +666,6 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@5.6.0", "@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" - integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/constants" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" @@ -910,29 +675,14 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/strings@^5.0.4": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" - integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== - dependencies: - "@ethersproject/bytes" "^5.5.0" - "@ethersproject/constants" "^5.5.0" - "@ethersproject/logger" "^5.5.0" - -"@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.0.0-beta.135", "@ethersproject/transactions@^5.4.0", "@ethersproject/transactions@^5.6.0": +"@ethersproject/strings@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" - integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd" + integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg== dependencies: - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" "@ethersproject/bytes" "^5.6.0" "@ethersproject/constants" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" "@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" @@ -949,14 +699,20 @@ "@ethersproject/rlp" "^5.7.0" "@ethersproject/signing-key" "^5.7.0" -"@ethersproject/units@5.6.0": +"@ethersproject/transactions@^5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c" - integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw== + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e" + integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg== dependencies: + "@ethersproject/address" "^5.6.0" "@ethersproject/bignumber" "^5.6.0" + "@ethersproject/bytes" "^5.6.0" "@ethersproject/constants" "^5.6.0" + "@ethersproject/keccak256" "^5.6.0" "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.0" + "@ethersproject/signing-key" "^5.6.0" "@ethersproject/units@5.7.0": version "5.7.0" @@ -967,28 +723,7 @@ "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/wallet@5.6.0", "@ethersproject/wallet@^5.4.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a" - integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.0" - "@ethersproject/abstract-signer" "^5.6.0" - "@ethersproject/address" "^5.6.0" - "@ethersproject/bignumber" "^5.6.0" - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/hdnode" "^5.6.0" - "@ethersproject/json-wallets" "^5.6.0" - "@ethersproject/keccak256" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.0" - "@ethersproject/signing-key" "^5.6.0" - "@ethersproject/transactions" "^5.6.0" - "@ethersproject/wordlists" "^5.6.0" - -"@ethersproject/wallet@5.7.0": +"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== @@ -1009,7 +744,18 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0": +"@ethersproject/web@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/web@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8" integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg== @@ -1020,7 +766,7 @@ "@ethersproject/properties" "^5.6.0" "@ethersproject/strings" "^5.6.0" -"@ethersproject/web@5.7.0", "@ethersproject/web@^5.7.0": +"@ethersproject/web@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.0.tgz#40850c05260edad8b54827923bbad23d96aac0bc" integrity sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA== @@ -1031,17 +777,6 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032" - integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q== - dependencies: - "@ethersproject/bytes" "^5.6.0" - "@ethersproject/hash" "^5.6.0" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.0" - "@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" @@ -1053,6 +788,68 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@ganache/ethereum-address@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" + integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== + dependencies: + "@ganache/utils" "0.1.4" + +"@ganache/ethereum-options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" + integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== + dependencies: + "@ganache/ethereum-address" "0.1.4" + "@ganache/ethereum-utils" "0.1.4" + "@ganache/options" "0.1.4" + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/ethereum-utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" + integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== + dependencies: + "@ethereumjs/common" "2.6.0" + "@ethereumjs/tx" "3.4.0" + "@ethereumjs/vm" "5.6.0" + "@ganache/ethereum-address" "0.1.4" + "@ganache/rlp" "0.1.4" + "@ganache/utils" "0.1.4" + emittery "0.10.0" + ethereumjs-abi "0.6.8" + ethereumjs-util "7.1.3" + +"@ganache/options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" + integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== + dependencies: + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/rlp@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" + integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== + dependencies: + "@ganache/utils" "0.1.4" + rlp "2.2.6" + +"@ganache/utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" + integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== + dependencies: + emittery "0.10.0" + keccak "3.0.1" + seedrandom "3.0.5" + optionalDependencies: + "@trufflesuite/bigint-buffer" "1.1.9" + "@humanwhocodes/config-array@^0.10.4": version "0.10.4" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c" @@ -1077,6 +874,11 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@hyperapp/router@^0.7.1": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@hyperapp/router/-/router-0.7.2.tgz#6a5edbeceb65bd545d7c55fd59153d7353001c0e" + integrity sha512-RXZhJzx0j1UQK/Ia9j7TQlkH1N6qOvJTTEJCIS9NrM1YJabmXGoI0owkvKxieSgXi6EKQ+wUWhXHj9s+Sy9EPA== + "@metamask/eth-sig-util@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.0.tgz#11553ba06de0d1352332c1bde28c8edd00e0dcf6" @@ -1088,11 +890,28 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== + dependencies: + "@noble/hashes" "1.3.1" + "@noble/hashes@1.0.0", "@noble/hashes@~1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.0.0.tgz#d5e38bfbdaba174805a4e649f13be9a9ed3351ae" integrity sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg== +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/secp256k1@1.5.5", "@noble/secp256k1@~1.5.2": version "1.5.5" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" @@ -1119,6 +938,215 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== + dependencies: + "@nomicfoundation/ethereumjs-util" "9.0.2" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== + dependencies: + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== + +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" + +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== + dependencies: + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz#4c858096b1c17fe58a474fe81b46815f93645c15" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz#f5f4d36d3f66752f59a57e7208cd856f3ddf6f2d" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.1" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.1" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" + +"@nomiclabs/hardhat-docker@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-docker/-/hardhat-docker-2.0.2.tgz#ae964be17951275a55859ff7358e9e7c77448846" + integrity sha512-XgGEpRT3wlA1VslyB57zyAHV+oll8KnV1TjwnxxC1tpAL04/lbdwpdO5KxInVN8irMSepqFpsiSkqlcnvbE7Ng== + dependencies: + dockerode "^2.5.8" + fs-extra "^7.0.1" + node-fetch "^2.6.0" + "@nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers@^0.3.0-beta.13": version "0.3.0-beta.13" resolved "https://registry.yarnpkg.com/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz#b96086ff768ddf69928984d5eb0a8d78cfca9366" @@ -1148,16 +1176,34 @@ "@types/sinon-chai" "^3.2.3" "@types/web3" "1.0.19" +"@offchainlabs/upgrade-executor@1.1.0-beta.0": + version "1.1.0-beta.0" + resolved "https://registry.yarnpkg.com/@offchainlabs/upgrade-executor/-/upgrade-executor-1.1.0-beta.0.tgz#c4b1375176546a18aaef01a43956abfb58250e0a" + integrity sha512-mpn6PHjH/KDDjNX0pXHEKdyv8m6DVGQiI2nGzQn0JbM1nOSHJpWx6fvfjtH7YxHJ6zBZTcsKkqGkFKDtCfoSLw== + dependencies: + "@openzeppelin/contracts" "4.7.3" + "@openzeppelin/contracts-upgradeable" "4.7.3" + "@openzeppelin/contracts-upgradeable@4.5.2": version "4.5.2" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.5.2.tgz#90d9e47bacfd8693bfad0ac8a394645575528d05" integrity sha512-xgWZYaPlrEOQo3cBj97Ufiuv79SPd8Brh4GcFYhPgb6WvAq4ppz8dWKL6h+jLAK01rUqMRp/TS9AdXgAeNvCLA== +"@openzeppelin/contracts-upgradeable@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.7.3.tgz#f1d606e2827d409053f3e908ba4eb8adb1dd6995" + integrity sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== + "@openzeppelin/contracts@4.5.0": version "4.5.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.5.0.tgz#3fd75d57de172b3743cdfc1206883f56430409cc" integrity sha512-fdkzKPYMjrRiPK6K4y64e6GzULR7R7RwxSigHS8DDp7aWDeoReqsQI+cxHV1UuhAqX69L1lAaWDxenfP+xiqzA== +"@openzeppelin/contracts@4.7.3": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== + "@resolver-engine/core@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" @@ -1200,6 +1246,11 @@ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.0.0.tgz#109fb595021de285f05a7db6806f2f48296fcee7" integrity sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA== +"@scure/base@~1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" + integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== + "@scure/bip32@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.0.1.tgz#1409bdf9f07f0aec99006bb0d5827693418d3aa5" @@ -1209,13 +1260,30 @@ "@noble/secp256k1" "~1.5.2" "@scure/base" "~1.0.0" +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip39@1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.0.0.tgz#47504e58de9a56a4bbed95159d2d6829fa491bb0" integrity sha512-HrtcikLbd58PWOkl02k9V6nXWQyoa7A0+Ek9VF7z17DDk9XZAFUcIdqfh0jJXLypmizc5/8P6OxoUeKliiWv4w== dependencies: - "@noble/hashes" "~1.0.0" - "@scure/base" "~1.0.0" + "@noble/hashes" "~1.0.0" + "@scure/base" "~1.0.0" + +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" "@sentry/core@5.30.0": version "5.30.0" @@ -1285,11 +1353,6 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": version "0.14.1" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.1.tgz#179afb29f4e295a77cc141151f26b3848abc3c46" @@ -1297,42 +1360,38 @@ dependencies: antlr4ts "^0.5.0-alpha.4" -"@solidity-parser/parser@^0.14.3": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== +"@solidity-parser/parser@^0.16.0": + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: antlr4ts "^0.5.0-alpha.4" -"@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" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== +"@tovarishfin/hardhat-yul@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@tovarishfin/hardhat-yul/-/hardhat-yul-3.0.5.tgz#84d896edfa95249073e30b0d622733e70318fc2e" + integrity sha512-DR5nqqQiv7f3bN885Kr3Z+J3LgCmYMPexIRGeS4bqPkC73Qt8nSET1NzohdJDw0HtquOPqraqDez050V0YGrfw== dependencies: - defer-to-connect "^1.0.1" + "@nomiclabs/hardhat-docker" "^2.0.0" + fs-extra "^10.1.0" + glob "^8.0.3" + solc "^0.8.17" + solpp "^0.11.5" + yulp "^0.2.3" -"@truffle/error@^0.0.14": - version "0.0.14" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.0.14.tgz#59683b5407bede7bddf16d80dc5592f9c5e5fa05" - integrity sha512-utJx+SZYoMqk8wldQG4gCVKhV8GwMJbWY7sLXFT/D8wWZTnE2peX7URFJh/cxkjTRCO328z1s2qewkhyVsu2HA== - -"@truffle/interface-adapter@^0.5.8": - version "0.5.8" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.8.tgz#76cfd34374d85849e1164de1a3d5a3dce0dc5d01" - integrity sha512-vvy3xpq36oLgjjy8KE9l2Jabg3WcGPOt18tIyMfTQX9MFnbHoQA2Ne2i8xsd4p6KfxIqSjAB53Q9/nScAqY0UQ== +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.5.3" + node-gyp-build "4.4.0" -"@truffle/provider@^0.2.24": - version "0.2.42" - resolved "https://registry.yarnpkg.com/@truffle/provider/-/provider-0.2.42.tgz#9da6a144b3c9188cdb587451dd7bd907b4c7164b" - integrity sha512-ZNoglPho4alYIjJR+sLTgX0x6ho7m4OAUWuJ50RAWmoEqYc4AM6htdrI+lTSoRrOHHbmgasv22a7rFPMnmDrTg== +"@trufflesuite/bigint-buffer@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== dependencies: - "@truffle/error" "^0.0.14" - "@truffle/interface-adapter" "^0.5.8" - web3 "1.5.3" + node-gyp-build "4.3.0" "@tsconfig/node10@^1.0.7": version "1.0.8" @@ -1362,13 +1421,6 @@ lodash "^4.17.15" ts-essentials "^7.0.1" -"@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" - integrity sha512-0xdCkyGOzdqh4h5JSf+zoWx85IusEjDcPIwNEHP8mrWSnCae4rvrqB+/gtpdNfX7zjlFlZiMeePn2r63EI3Lrw== - dependencies: - ethers "^5.0.2" - "@typechain/hardhat@^6.0.0": version "6.0.0" resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.0.0.tgz#5e305641de67276efbfaa8c37c78e38f22b22ef4" @@ -1378,9 +1430,9 @@ lodash "^4.17.15" "@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== + version "7.2.5" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz#db2cf364c159fb1f12be6cd3549f56387eaf8d73" + integrity sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg== "@types/bn.js@*", "@types/bn.js@^5.1.0": version "5.1.0" @@ -1389,7 +1441,7 @@ dependencies: "@types/node" "*" -"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": +"@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== @@ -1420,6 +1472,14 @@ dependencies: "@types/node" "*" +"@types/fs-extra@^11.0.1": + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45" + integrity sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + "@types/glob@^7.1.1": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" @@ -1433,10 +1493,17 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/jsonfile@*": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.4.tgz#614afec1a1164e7d670b4a7ad64df3e7beb7b702" + integrity sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== + 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" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.2.tgz#f33ec813c50780b547463da9ad8acac89ee457d9" + integrity sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA== "@types/levelup@^4.3.0": version "4.3.3" @@ -1447,7 +1514,19 @@ "@types/level-errors" "*" "@types/node" "*" -"@types/lru-cache@^5.1.0": +"@types/lodash-es@^4.17.8": + version "4.17.12" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.12.tgz#65f6d1e5f80539aa7cfbfc962de5def0cf4f341b" + integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3" + integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA== + +"@types/lru-cache@5.1.1", "@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" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== @@ -1469,29 +1548,29 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== -"@types/node-fetch@^2.5.5": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== +"@types/node-fetch@^2.6.1": + version "2.6.11" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" - form-data "^3.0.0" + form-data "^4.0.0" "@types/node@*": version "17.0.23" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@^10.0.3": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== -"@types/node@^12.12.6": - version "12.20.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.47.tgz#ca9237d51f2a2557419688511dab1c8daf475188" - integrity sha512-BzcaRsnFuznzOItW1WpQrDHM7plAa7GIDMZ6b5pnMbkqEtM/6WCOhvZar39oeMQP79gwvFUWjjptE7/KGcNqFg== - "@types/node@^17.0.5": version "17.0.25" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" @@ -1519,12 +1598,13 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/resolve@^0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== dependencies: "@types/node" "*" + safe-buffer "~5.1.1" "@types/secp256k1@^4.0.1": version "4.0.3" @@ -1533,6 +1613,16 @@ dependencies: "@types/node" "*" +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +"@types/semver@^7.5.0": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/sinon-chai@^3.2.3": version "3.2.8" resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.8.tgz#5871d09ab50d671d8e6dd72e9073f8e738ac61dc" @@ -1566,12 +1656,10 @@ "@types/bn.js" "*" "@types/underscore" "*" -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" +"@types/yarnpkg__lockfile@^1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.9.tgz#b3c8e8d66dc8ce79827f422a660a557cda9ded14" + integrity sha512-GD4Fk15UoP5NLCNor51YdfL9MSdldKCqOC9EssrRw3HVfar9wUZ5y8Lfnp+qVD6hIinLr8ygklDYnmlnlQo12Q== "@typescript-eslint/eslint-plugin-tslint@^5.27.1": version "5.37.0" @@ -1662,16 +1750,27 @@ "@typescript-eslint/types" "5.37.0" eslint-visitor-keys "^3.3.0" -"@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" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +JSONStream@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + integrity sha512-mn0KSip7N4e0UDPZHnqDsHECo5uGQrixQKnAskOM1BIB8hd7QKbd6il8IPRPudPHOeHiECoCFqhyMaRO9+nWyA== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1682,33 +1781,18 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abstract-leveldown@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" - 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" - 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" - integrity sha512-5mU5P1gXtsMIXg65/rsYGsi93+MlogXZ9FA8JnwKurHQg64bfXwGYVdVdijNTVNOlAsuIiOwHdvFFD5JqCJQ7A== +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" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - xtend "~4.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" abstract-leveldown@^6.2.1: version "6.3.0" @@ -1721,12 +1805,17 @@ abstract-leveldown@^6.2.1: level-supports "~1.0.0" xtend "~4.0.0" -abstract-leveldown@~2.6.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" - integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== dependencies: - xtend "~4.0.0" + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" abstract-leveldown@~6.2.1: version "6.2.3" @@ -1739,14 +1828,6 @@ abstract-leveldown@~6.2.1: level-supports "~1.0.0" xtend "~4.0.0" -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1787,11 +1868,6 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= -aes-js@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" - integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== - agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1874,11 +1950,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 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" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - 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" @@ -1898,11 +1969,21 @@ antlr4@4.7.1: resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.7.1.tgz#69984014f096e9e775f53dd9744bf994d8959773" integrity sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ== +antlr4@~4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.8.0.tgz#f938ec171be7fc2855cd3a533e87647185b32b6a" + integrity sha512-en/MxQ4OkPgGJQ3wD/muzj1uDnFSzdFIhc2+c6bHZokWkuBb6RRvFjpWhPxWLbgQvaEzldJZ0GSQpfSAaE3hqg== + 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" integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1928,35 +2009,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - 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" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -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" - integrity sha1-ZEun8JX3/898Q7Xw3DnTwfA8Bjs= - 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" - 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" @@ -1967,11 +2024,6 @@ array-back@^4.0.1: resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -1982,26 +2034,11 @@ array-uniq@1.0.3: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - asn1@~0.2.3: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" @@ -2019,11 +2056,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 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" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - ast-parents@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" @@ -2039,31 +2071,19 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.2, async-eventemitter@^0.2.4: +async-eventemitter@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" 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" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@1.x, async@^1.4.2: +async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - 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.4.0: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -2080,15 +2100,19 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -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" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +audit-ci@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/audit-ci/-/audit-ci-6.6.1.tgz#7c53808f6f94adbe60baf1d7c24f53c626619453" + integrity sha512-zqZEoYfEC4QwX5yBkDNa0h7YhZC63HWtKtP19BVq+RS0dxRBInfmHogxe4VUeOzoADQjuTLZUI7zp3Pjyl+a5g== + dependencies: + JSONStream "^1.3.5" + cross-spawn "^7.0.3" + escape-string-regexp "^4.0.0" + event-stream "4.0.1" + jju "^1.4.0" + readline-transform "1.0.0" + semver "^7.0.0" + yargs "^17.0.0" aws-sign2@~0.7.0: version "0.7.0" @@ -2100,6 +2124,14 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== +axios@^0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + axios@^0.21.1: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -2107,546 +2139,12 @@ axios@^0.21.1: dependencies: follow-redirects "^1.14.0" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.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" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -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" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -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" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^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" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^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" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -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" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^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" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^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" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^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" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^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" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^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" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -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" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^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" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^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" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - 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" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - dependencies: - babel-runtime "^6.22.0" - -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" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -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" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -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" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -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" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^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" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - 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" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - 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" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -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" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -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" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -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" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - 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" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -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" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - 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" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -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" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - 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" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -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" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -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" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -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" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -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" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^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" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -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" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -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" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - 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" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -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" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - 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" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - 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" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.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" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -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" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - 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" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^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" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -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" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.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" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -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" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -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" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babelify@^7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" - integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= - dependencies: - babel-core "^6.0.14" - object-assign "^4.0.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - 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" - integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= - dependencies: - precond "0.2" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: +base-x@^3.0.2: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -2658,18 +2156,26 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +bash-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bash-glob/-/bash-glob-2.0.0.tgz#a8ef19450783403ed93fccca2dbe09f2cf6320dc" + integrity sha512-53/NJ+t2UAkEYgQPO6aFjbx1Ue8vNNXCYaA4EljNKP1SR8A9dSQQoBmYWR8BLXO0/NDRJEMSJ4BxWihi//m3Kw== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" + bash-path "^1.0.1" component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + cross-spawn "^5.1.0" + each-parallel-async "^1.0.0" + extend-shallow "^2.0.1" + is-extglob "^2.1.1" + is-glob "^4.0.0" + +bash-path@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bash-path/-/bash-path-1.0.3.tgz#dbc9efbdf18b1c11413dcb59b960e6aa56c84258" + integrity sha512-mGrYvOa6yTY/qNCiZkPFJqWmODK68y6kmVRAJ1NNbWlNoJrUrsFxu7FU2EKg7gbrer6ttrKkF2s/E/lhRy7/OA== + dependencies: + arr-union "^3.1.0" + is-windows "^1.0.1" bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -2683,6 +2189,11 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bigint-crypto-utils@^3.0.23: + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== + bignumber.js@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" @@ -2698,47 +2209,55 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bip39@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.5.0.tgz#51cbd5179460504a63ea3c000db3f787ca051235" - integrity sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA== +bindings@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bip39@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== dependencies: + "@types/node" "11.11.6" create-hash "^1.1.0" pbkdf2 "^3.0.9" randombytes "^2.0.1" - safe-buffer "^5.0.1" - unorm "^1.3.3" -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== +bl@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" + integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww== dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" + readable-stream "^2.3.5" + safe-buffer "^5.1.1" blakejs@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.0, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bn-str-256@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/bn-str-256/-/bn-str-256-1.9.1.tgz#898cebee70a3edc3968f97b4cebbc4771025aa82" + integrity sha512-u3muv3WO5sYv9nUQsPnDGLg731yNt/MOlKPK5pmBVqClcl7tY97tyfKxw8ed44HVrpi+7dkgJgQpbXP47a3GoQ== + dependencies: + decimal.js-light "^2.5.0" + lodash "^4.17.11" bn.js@4.11.6: version "4.11.6" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= -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: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 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.0.0, bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -2748,45 +2267,6 @@ bn.js@^5.2.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" - type-is "~1.6.18" - -body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.10.3" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2802,22 +2282,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - 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" @@ -2830,12 +2294,22 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: +browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -2847,56 +2321,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^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" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -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" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.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" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== - dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" - bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" @@ -2913,21 +2337,29 @@ bs58check@^2.1.2: create-hash "^1.1.0" safe-buffer "^5.1.2" -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== +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" + 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" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -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" - integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -2940,7 +2372,7 @@ buffer-xor@^2.0.1: dependencies: safe-buffer "^5.1.1" -buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -2948,10 +2380,18 @@ buffer@^5.0.5, buffer@^5.2.1, buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== dependencies: node-gyp-build "^4.3.0" @@ -2960,63 +2400,19 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ== +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 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" - integrity sha1-P7QQx+kVWOsasiqCg0V3qmvWHUI= - 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" - integrity sha1-HRPL/3F65xWAlKqIGzXQgbOHJT4= - dependencies: - bytewise-core "^1.2.2" - typewise "^1.0.3" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cachedown@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cachedown/-/cachedown-1.0.0.tgz#d43f036e4510696b31246d7db31ebf0f7ac32d15" - integrity sha1-1D8DbkUQaWsxJG19sx6/D3rDLRU= - dependencies: - abstract-leveldown "^2.4.1" - lru-cache "^3.2.0" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@~1.0.2: +call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -3048,10 +2444,10 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== camelcase@^5.0.0: version "5.3.1" @@ -3063,16 +2459,21 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30000844: - version "1.0.30001325" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz#2b4ad19b77aa36f61f2eaf72e636d7481d55e606" - integrity sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ== +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + cbor@^5.0.2: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" @@ -3094,18 +2495,7 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3122,6 +2512,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3137,38 +2532,6 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -checkpoint-store@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" - integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= - 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" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.11: - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - chokidar@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -3199,7 +2562,7 @@ chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1, chownr@^1.1.4: +chownr@^1.0.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== @@ -3209,17 +2572,6 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - 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" @@ -3228,20 +2580,16 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - 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" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "^2.2.2" + node-gyp-build "^4.3.0" clean-stack@^2.0.0: version "2.2.0" @@ -3270,13 +2618,13 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + string-width "^2.1.1" + strip-ansi "^4.0.0" wrap-ansi "^2.0.0" cliui@^5.0.0: @@ -3297,31 +2645,20 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - mimic-response "^1.0.0" - -clone@2.1.2, clone@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" 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" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3363,15 +2700,6 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" 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" - integrity sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA== - dependencies: - array-back "^2.0.0" - find-replace "^1.0.3" - typical "^2.6.1" - 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" @@ -3402,15 +2730,25 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@^2.12.1: +commander@^11.0.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.1.0.tgz#62fdce76006a68e5c1ab3314dc92e800eb83d906" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@^2.11.0, commander@^2.12.1, commander@^2.19.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^9.2.0, commander@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c" - integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== component-emitter@^1.2.1: version "1.3.0" @@ -3422,7 +2760,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: +concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3432,88 +2770,16 @@ concat-stream@^1.5.1, concat-stream@^1.6.0, concat-stream@^1.6.2: readable-stream "^2.2.2" typedarray "^0.0.6" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - 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" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convert-svg-core@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/convert-svg-core/-/convert-svg-core-0.6.4.tgz#a38ad47f32acbb229a4fa9eec9771308c2fe1443" - integrity sha512-8mS0n7otc1lljTte4z7nDhihEakKCRq4w5ivMnIGeOZuD/OV/eDZNNEgGLV1ET3p+rMbnrZnX4lAcsf14WzD5w== - dependencies: - chalk "^4.1.2" - cheerio "^1.0.0-rc.11" - commander "^9.2.0" - file-url "^3.0.0" - get-stdin "^8.0.0" - glob "^8.0.1" - lodash.omit "^4.5.0" - lodash.pick "^4.4.0" - pollock "^0.2.0" - puppeteer "^13.7.0" - tmp "^0.2.1" - -convert-svg-to-png@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/convert-svg-to-png/-/convert-svg-to-png-0.6.4.tgz#de0f5d46042639cdfe4020b492b8b0a3c0743b4e" - integrity sha512-zHNTuVedkyuhMl+f+HMm2L7+TKDYCKFAqAmDqUr0dN7/xtgYe76PPAydjlFzeLbzEpGtEfhaA15q+ejpLaVo3g== - dependencies: - convert-svg-core "^0.6.4" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.2, cookie@^0.4.1: +cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -cookiejar@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" - integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - core-js-pure@^3.0.1: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== -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" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - 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" @@ -3524,14 +2790,6 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - cosmiconfig@^5.0.7: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -3547,14 +2805,6 @@ crc-32@^1.2.0: resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" 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" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - 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" @@ -3566,7 +2816,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: +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" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -3583,22 +2833,16 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -cross-fetch@3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -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" - integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== dependencies: - node-fetch "^2.6.7" - whatwg-fetch "^2.0.4" + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" -cross-spawn@^6.0.5: +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" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3609,7 +2853,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2: +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" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3623,47 +2867,6 @@ cross-spawn@^7.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.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" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -3676,13 +2879,6 @@ death@^1.1.0: resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" integrity sha1-AaqcQB7dknUFFEcLgmY5DGbGcxg= -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" - 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" @@ -3697,20 +2893,34 @@ debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, de dependencies: ms "2.1.2" -debug@4.3.3, debug@^4.0.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: - ms "2.1.2" + ms "2.0.0" + +debug@^2.2.0, debug@^2.6.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" -debug@^3.1.0: +debug@^3.1.0, debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -3721,17 +2931,10 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== -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" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -decompress-response@^3.2.0, decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" +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" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== deep-eql@^3.0.1: version "3.0.1" @@ -3740,18 +2943,6 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-equal@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - deep-extend@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -3762,26 +2953,6 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -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" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -deferred-leveldown@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" - 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" - integrity sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww== - dependencies: - abstract-leveldown "~5.0.0" - inherits "^2.0.3" - deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -3805,33 +2976,6 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - 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" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - 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" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -3842,36 +2986,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - detect-port@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz#d9c40e9accadd4df5cac6a782aefd014d573d1f1" @@ -3880,11 +2994,6 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -devtools-protocol@0.0.981744: - version "0.0.981744" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" - integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== - diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -3900,14 +3009,12 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + heap ">= 0.2.0" dir-glob@^3.0.1: version "3.0.1" @@ -3916,6 +3023,30 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +discontinuous-range@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" + integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ== + +docker-modem@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" + integrity sha512-lVjqCSCIAUDZPAZIeyM125HXfNvOmYYInciphNrLrylUtKyW66meAjSPXWchKVzoIYZx69TPnAepVSSkeawoIw== + dependencies: + JSONStream "1.3.2" + debug "^3.2.6" + readable-stream "~1.0.26-4" + split-ca "^1.0.0" + +dockerode@^2.5.8: + version "2.5.8" + resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" + integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== + dependencies: + concat-stream "~1.6.2" + docker-modem "^1.0.8" + tar-fs "~1.16.3" + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" @@ -3923,52 +3054,20 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -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" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== -dotignore@~0.1.2: +duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +each-parallel-async@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/each-parallel-async/-/each-parallel-async-1.0.0.tgz#91783e190000c7dd588336b2d468ebaf71980f7b" + integrity sha512-P/9kLQiQj0vZNzphvKKTgRgMnlqs5cJsxeAiuog1jrUnwv0Z3hVUwJDQiP7MnLb2I9S15nR9SRUceFT9IxtqRg== ecc-jsbn@~0.1.1: version "0.1.2" @@ -3978,17 +3077,7 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.47: - version "1.4.103" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.103.tgz#abfe376a4d70fa1e1b4b353b95df5d6dfd05da3a" - integrity sha512-c/uKWR1Z/W30Wy/sx3dkZoj4BijbXX85QKWu9jJfjho3LBAXNEGAEW3oWiGb+dotA6C6BzCTxL2/aLes7jlUeg== - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -4001,6 +3090,11 @@ elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5 minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + emoji-regex@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.0.0.tgz#96559e19f82231b436403e059571241d627c42b8" @@ -4021,22 +3115,6 @@ encode-utf8@^1.0.2: resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" 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" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -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" - integrity sha512-8CIZLDcSKxgzT+zX8ZVfgNbu8Md2wq/iqa1Y7zyVR18QBEAc0Nmzuvj/N5ykSKpfGzjM8qxbaFntLPwnVoUhZw== - dependencies: - abstract-leveldown "^5.0.0" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" - xtend "^4.0.1" - encoding-down@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" @@ -4047,14 +3125,7 @@ encoding-down@^6.3.0: level-codec "^9.0.0" level-errors "^2.0.0" -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -4068,16 +3139,16 @@ enquirer@^2.3.0, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -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" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +eol@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" + integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== + errno@~0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -4085,39 +3156,13 @@ errno@~0.1.1: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.5: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - es-abstract@^1.19.1: version "1.19.2" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.2.tgz#8f7b696d8f15b167ae3640b4060670f3d054143f" @@ -4153,43 +3198,12 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.59" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.59.tgz#71038939730eb6f4f165f1421308fb60be363bc6" - integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -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" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 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" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@1.0.5, 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" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -4433,33 +3447,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 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" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -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" - integrity sha512-WUVxWLuhMmsfenfZvFO5sbl1qFY2IqUlw/FPVmjjdElpqLsZtSG+wPe9Dz7W/sB6e80HgFKknOmKk2eNlznHug== - dependencies: - eth-query "^2.1.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.3" - ethjs-util "^0.1.3" - json-rpc-engine "^3.6.0" - pify "^2.3.0" - tape "^4.6.3" - -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" - integrity sha1-IprEbsqG1S4MmR58sq74P/D2i88= - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-gas-reporter@^0.2.24: +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" integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== @@ -4480,110 +3468,6 @@ eth-gas-reporter@^0.2.24: sha1 "^1.1.1" sync-request "^6.0.0" -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" - integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== - dependencies: - cross-fetch "^2.1.1" - eth-json-rpc-middleware "^1.5.0" - json-rpc-engine "^3.4.0" - json-rpc-error "^2.0.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" - integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== - dependencies: - async "^2.5.0" - eth-query "^2.1.2" - eth-tx-summary "^3.1.2" - ethereumjs-block "^1.6.0" - ethereumjs-tx "^1.3.3" - ethereumjs-util "^5.1.2" - ethereumjs-vm "^2.1.0" - fetch-ponyfill "^4.0.0" - json-rpc-engine "^3.6.0" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - tape "^4.6.3" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -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" - integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= - dependencies: - json-rpc-random-id "^1.0.0" - xtend "^4.0.1" - -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" - integrity sha512-4eFkMOhpGbTxBQ3AMzVf0haUX2uTur7DpWiHzWyTURa28BVJJtOkcb9Ok5TV0YvEPG61DODPW7ZUATbJTslioQ== - dependencies: - buffer "^5.2.1" - elliptic "^6.4.0" - ethereumjs-abi "0.6.5" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.0" - tweetnacl-util "^0.15.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" - integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= - dependencies: - ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" - ethereumjs-util "^5.1.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" - integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== - dependencies: - async "^2.1.2" - clone "^2.0.0" - concat-stream "^1.5.1" - end-of-stream "^1.1.0" - eth-query "^2.0.2" - ethereumjs-block "^1.4.1" - ethereumjs-tx "^1.1.1" - ethereumjs-util "^5.0.1" - ethereumjs-vm "^2.6.0" - through2 "^2.0.3" - -ethashjs@~0.0.7: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ethashjs/-/ethashjs-0.0.8.tgz#227442f1bdee409a548fb04136e24c874f3aa6f9" - integrity sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw== - dependencies: - async "^2.1.2" - buffer-xor "^2.0.1" - ethereumjs-util "^7.0.2" - miller-rabin "^4.0.0" - 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" @@ -4591,17 +3475,7 @@ ethereum-bloom-filters@^1.0.6: 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" - 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" - integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= - -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +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" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -4632,123 +3506,48 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.0.1" "@scure/bip39" "1.0.0" -ethereum-waffle@^3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-3.4.4.tgz#1378b72040697857b7f5e8f473ca8f97a37b5840" - integrity sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q== - dependencies: - "@ethereum-waffle/chai" "^3.4.4" - "@ethereum-waffle/compiler" "^3.4.4" - "@ethereum-waffle/mock-contract" "^3.4.4" - "@ethereum-waffle/provider" "^3.4.4" - ethers "^5.0.1" - -ethereumjs-abi@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" - integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= - dependencies: - bn.js "^4.10.0" - ethereumjs-util "^4.3.0" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + +ethereum-waffle@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" + integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== + dependencies: + "@ethereum-waffle/chai" "4.0.10" + "@ethereum-waffle/compiler" "4.0.3" + "@ethereum-waffle/mock-contract" "4.0.4" + "@ethereum-waffle/provider" "4.0.5" + solc "0.8.15" + typechain "^8.0.0" 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" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": - version "0.6.8" - resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0" - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -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" - integrity sha512-WP6BdscjiiPkQfF9PVfMcwx/rDvfZTjFKY0Uwc09zSQr9JfIVH87dYIJu0gNhBhpmovV4yq295fdllS925fnBA== - dependencies: - ethereumjs-util "^6.0.0" - rlp "^2.2.1" - safe-buffer "^5.1.1" - -ethereumjs-account@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" - integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== - dependencies: - ethereumjs-util "^5.0.0" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -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" - integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== - dependencies: - async "^2.0.1" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.1" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -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" - integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== - dependencies: - async "^2.0.1" - ethereum-common "0.2.0" - ethereumjs-tx "^1.2.2" - ethereumjs-util "^5.0.0" - merkle-patricia-tree "^2.1.2" - -ethereumjs-blockchain@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/ethereumjs-blockchain/-/ethereumjs-blockchain-4.0.4.tgz#30f2228dc35f6dcf94423692a6902604ae34960f" - integrity sha512-zCxaRMUOzzjvX78DTGiKjA+4h2/sF0OYL1QuPux0DHpyq8XiNoF5GYHtb++GUxVlMsMfZV7AVyzbtgcRdIcEPQ== - dependencies: - async "^2.6.1" - ethashjs "~0.0.7" - ethereumjs-block "~2.2.2" - ethereumjs-common "^1.5.0" - ethereumjs-util "^6.1.0" - flow-stoplight "^1.0.0" - level-mem "^3.0.1" - lru-cache "^5.1.1" - rlp "^2.2.2" - semaphore "^1.1.0" - -ethereumjs-common@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.0.tgz#d3e82fc7c47c0cef95047f431a99485abc9bb1cd" - 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" - 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" - integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: - ethereumjs-common "^1.5.0" + bn.js "^4.11.8" ethereumjs-util "^6.0.0" -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" - integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: - ethereum-common "^0.0.18" - ethereumjs-util "^5.0.0" + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" -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: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -4761,45 +3560,10 @@ ethereumjs-util@6.2.1, ethereumjs-util@^6.0.0, ethereumjs-util@^6.1.0, ethereumj ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^4.3.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" - integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== - dependencies: - bn.js "^4.8.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - rlp "^2.0.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" - integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^7.0.10: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4: - version "7.1.4" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.4.tgz#a6885bcdd92045b06f596c7626c3e89ab3312458" - integrity sha512-p6KmuPCX4mZIqsQzXfmSx9Y0l2hqf+VkAiwSisW3UKUFdk8ZkAt+AYaor83z2nSi6CU2zSsXMlD80hAbNEGM0A== +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, 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" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" @@ -4807,60 +3571,24 @@ ethereumjs-util@^7.0.2, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereum ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethereumjs-vm@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab" - integrity sha512-X6qqZbsY33p5FTuZqCnQ4+lo957iUJMM6Mpa6bL4UW0dxM6WmDSHuI4j/zOp1E2TDKImBGCJA9QPfc08PaNubA== +ethers-contracts@*: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethers-contracts/-/ethers-contracts-2.2.1.tgz#e2bf5dd5e157313ba454b50c646c8472fcd0a8b3" + integrity sha512-3fT2gyhoDhqp/bgaBOenmyu74dDGGO9adkBaOtEuNmFq0Yf4nwynYWJv++rDxe6Z5Dl5cBF304GhnJUVFVlfCA== dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - core-js-pure "^3.0.1" - ethereumjs-account "^3.0.0" - ethereumjs-block "^2.2.2" - ethereumjs-blockchain "^4.0.3" - ethereumjs-common "^1.5.0" - ethereumjs-tx "^2.1.2" - ethereumjs-util "^6.2.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - util.promisify "^1.0.0" + ethers-utils "^2.1.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" - integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== - dependencies: - async "^2.1.2" - async-eventemitter "^0.2.2" - ethereumjs-account "^2.0.3" - ethereumjs-block "~2.2.0" - ethereumjs-common "^1.1.0" - ethereumjs-util "^6.0.0" - fake-merkle-patricia-tree "^1.0.1" - functional-red-black-tree "^1.0.1" - merkle-patricia-tree "^2.3.2" - rustbn.js "~0.2.0" - safe-buffer "^5.1.1" - -ethereumjs-wallet@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/ethereumjs-wallet/-/ethereumjs-wallet-0.6.5.tgz#685e9091645cee230ad125c007658833991ed474" - integrity sha512-MDwjwB9VQVnpp/Dc1XzA6J1a3wgHQ4hSvA1uWNatdpOrtCbPVuQSKSyRnjLvS0a+KKMw2pvQ9Ybqpb3+eW8oNA== +ethers-utils@^2.1.0: + version "2.1.11" + resolved "https://registry.yarnpkg.com/ethers-utils/-/ethers-utils-2.1.11.tgz#b27535ca3226118be300211c39c896b1e5e21641" + integrity sha512-BfkGStBmmLjhTldmp5lifiwUeDjx/yowoWfmUnnvPNsix5PFE8IXQdY5VT/Qo1SXMgxzCe8m0Z8ysUw6Q9OmAw== dependencies: - aes-js "^3.1.1" - bs58check "^2.1.2" - ethereum-cryptography "^0.1.3" - ethereumjs-util "^6.0.0" - randombytes "^2.0.6" - safe-buffer "^5.1.2" - scryptsy "^1.2.1" - utf8 "^3.0.0" - uuid "^3.3.2" + bn.js "^4.4.0" + hash.js "^1.0.0" + js-sha3 "0.5.7" + xmlhttprequest "1.8.0" -ethers@^4.0.32, ethers@^4.0.40: +ethers@^4.0.39, ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -4875,82 +3603,10 @@ ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.1, ethers@^5.0.2: - version "5.6.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.2.tgz#e75bac7f038c5e0fdde667dba62fc223924143a2" - integrity sha512-EzGCbns24/Yluu7+ToWnMca3SXJ1Jk1BvWB7CCmVNxyOeM4LLvw2OLuIHhlkhQk1dtOcj9UMsdkxUh8RiG1dxQ== - dependencies: - "@ethersproject/abi" "5.6.0" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.1" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.2" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethers@^5.5.2: - version "5.6.4" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.4.tgz#23629e9a7d4bc5802dfb53d4da420d738744b53c" - integrity sha512-62UIfxAQXdf67TeeOaoOoPctm5hUlYgfd0iW3wxfj7qRYKDcvvy0f+sJ3W2/Pyx77R8dblvejA8jokj+lS+ATQ== - dependencies: - "@ethersproject/abi" "5.6.1" - "@ethersproject/abstract-provider" "5.6.0" - "@ethersproject/abstract-signer" "5.6.0" - "@ethersproject/address" "5.6.0" - "@ethersproject/base64" "5.6.0" - "@ethersproject/basex" "5.6.0" - "@ethersproject/bignumber" "5.6.0" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.0" - "@ethersproject/contracts" "5.6.0" - "@ethersproject/hash" "5.6.0" - "@ethersproject/hdnode" "5.6.0" - "@ethersproject/json-wallets" "5.6.0" - "@ethersproject/keccak256" "5.6.0" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.2" - "@ethersproject/pbkdf2" "5.6.0" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.4" - "@ethersproject/random" "5.6.0" - "@ethersproject/rlp" "5.6.0" - "@ethersproject/sha2" "5.6.0" - "@ethersproject/signing-key" "5.6.0" - "@ethersproject/solidity" "5.6.0" - "@ethersproject/strings" "5.6.0" - "@ethersproject/transactions" "5.6.0" - "@ethersproject/units" "5.6.0" - "@ethersproject/wallet" "5.6.0" - "@ethersproject/web" "5.6.0" - "@ethersproject/wordlists" "5.6.0" - -ethers@^5.6.9: - version "5.7.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.0.tgz#0055da174b9e076b242b8282638bc94e04b39835" - integrity sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA== +ethers@^5.1.0, ethers@^5.5.3, ethers@^5.5.4, ethers@^5.7.1: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -4967,10 +3623,10 @@ ethers@^5.6.9: "@ethersproject/json-wallets" "5.7.0" "@ethersproject/keccak256" "5.7.0" "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.0" + "@ethersproject/networks" "5.7.1" "@ethersproject/pbkdf2" "5.7.0" "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.0" + "@ethersproject/providers" "5.7.2" "@ethersproject/random" "5.7.0" "@ethersproject/rlp" "5.7.0" "@ethersproject/sha2" "5.7.0" @@ -4980,9 +3636,65 @@ ethers@^5.6.9: "@ethersproject/transactions" "5.7.0" "@ethersproject/units" "5.7.0" "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.0" + "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" +ethjs-extras@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ethjs-extras/-/ethjs-extras-0.0.7.tgz#9fb5f7f55952456b6a0836cdeda8bd376981deee" + integrity sha512-1Ml8B6AUVsY+6o1GI861zRiP1KuHnYVu7T7cRVpAAqEqukQsTuTXBbOX1VYPIe5e68+aoqn8fMTGG4FnrYZA+Q== + dependencies: + ethers-contracts "*" + ethjs-provider-http "^0.1.6" + ethjs-provider-signer "^0.1.4" + ethjs-rpc "^0.1.8" + js-sha3 "^0.7.0" + solidity-to-abi "^1.0.4" + +ethjs-format@0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/ethjs-format/-/ethjs-format-0.1.8.tgz#925ecdd965ea72a2a2daf2a122e5bf80b5ad522a" + integrity sha512-G9S+H5+XaHYLA54YVB2RxaBBVyFHtMTlnRTsIUp2+rUbrQ0kFRP6hDUz+OzRQY8tYz/A55Klgg9rG49by5rSNw== + dependencies: + bn.js "4.11.6" + ethjs-schema "0.1.4" + ethjs-util "0.1.3" + is-hex-prefixed "1.0.0" + number-to-bn "1.7.0" + strip-hex-prefix "1.0.0" + +ethjs-provider-http@0.1.6, ethjs-provider-http@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-provider-http/-/ethjs-provider-http-0.1.6.tgz#1ec5d9b4be257ef1d56a500b22a741985e889420" + integrity sha512-y054N5xyyx43KTQjgdkAEj2uEa/flwpENU5ldx/rmA0Q2yy0vyB2lsOIn/7V0uADMc4iRSHZfnFc9b9YS5Qkdw== + dependencies: + xhr2 "0.1.3" + +ethjs-provider-signer@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ethjs-provider-signer/-/ethjs-provider-signer-0.1.4.tgz#6bd5cb38a8d5b0ddf46ac1e23a60eea1716171ae" + integrity sha512-ExC8h7HnXwiHBEcMtmtpKr7OT/88+GW3Dphw9D36OM3petIr3dpPDCDB1CkDBcy5s4E7Z/irHvDydAA7/MJnug== + dependencies: + ethjs-provider-http "0.1.6" + ethjs-rpc "0.1.2" + +ethjs-rpc@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ethjs-rpc/-/ethjs-rpc-0.1.2.tgz#39a3456b51c59aeeafb5ba556589a59f2da88d26" + integrity sha512-vZ0VlCaafVn1qY6eWB7O/rOLG75wbHLpvjCYnH/OuGCVk0kytdbGi6nm3UyocHTaJLj5g0dM2fLAdwf18G6DYQ== + dependencies: + ethjs-format "0.1.8" + +ethjs-rpc@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/ethjs-rpc/-/ethjs-rpc-0.1.9.tgz#389dcd61be52e72bc47111a75805f8e45882faea" + integrity sha512-KJqT7cgTeCJQ2RY1AlVmTZVnKIUXMPg+niPN5VJKwRSzpjgfr3LTVHlGbkRCqZtOMDi0ogB2vHZaRQiZBXZTUg== + +ethjs-schema@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/ethjs-schema/-/ethjs-schema-0.1.4.tgz#0323a16333b1ace9a8f1d696a6ee63448fdd455f" + integrity sha512-fB08XJP+G00Qtv37Y8WCHn4LtQeCdmG7icFAl63L0nzT05MvCfey1E1SwjCOmDG6PGDZ9J2e3u4a+79Nb4VOdg== + ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -4991,7 +3703,15 @@ ethjs-unit@0.1.6: bn.js "4.11.6" number-to-bn "1.7.0" -ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: +ethjs-util@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.3.tgz#dfd5ea4a400dc5e421a889caf47e081ada78bb55" + integrity sha512-QqpX2dsEG2geSMG9dTMJVhfP1kGRdGMNjiHPiTjkju+X5cB0PQIwUzRr5k21pFkgF5zuLccqe83p7Gh5fFM5tQ== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -4999,22 +3719,20 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -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" - 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" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +event-stream@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-4.0.1.tgz#4092808ec995d0dd75ea4580c1df6a74db2cde65" + integrity sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA== + dependencies: + duplexer "^0.1.1" + from "^0.1.7" + map-stream "0.0.7" + pause-stream "^0.0.11" + split "^1.0.1" + stream-combiner "^0.2.2" + through "^2.3.8" -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: +evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -5022,61 +3740,18 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -express@^4.14.0: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.19.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.4.2" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.9.7" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" - setprototypeof "1.2.0" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== dependencies: - type "^2.5.0" + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" extend-shallow@^2.0.1: version "2.0.1" @@ -5085,14 +3760,6 @@ extend-shallow@^2.0.1: 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" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -5107,31 +3774,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5142,13 +3784,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" 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" - integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= - dependencies: - checkpoint-store "^1.1.0" - 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" @@ -5181,6 +3816,17 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + 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" @@ -5198,20 +3844,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -fetch-ponyfill@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" - integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= - dependencies: - node-fetch "~1.7.1" - figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -5233,20 +3865,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-url@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" - integrity sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.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" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== fill-range@^7.0.1: version "7.0.1" @@ -5255,27 +3877,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-replace@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-1.0.3.tgz#b88e7364d2d9c959559f388c66670d6130441fa0" - integrity sha1-uI5zZNLZyVlVnziMZmcNYTBEH6A= - dependencies: - array-back "^1.0.4" - test-value "^2.1.0" - find-replace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" @@ -5298,14 +3899,6 @@ find-up@5.0.0, find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.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" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^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" @@ -5313,22 +3906,6 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -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" - integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== - dependencies: - fs-extra "^4.0.3" - micromatch "^3.1.4" - 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" @@ -5375,11 +3952,6 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -flow-stoplight@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flow-stoplight/-/flow-stoplight-1.0.0.tgz#4a292c5bcff8b39fa6cc0cb1a853d86f27eeff7b" - integrity sha1-SiksW8/4s5+mzAyxqFPYbyfu/3s= - fmix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" @@ -5387,33 +3959,18 @@ fmix@^0.1.0: dependencies: imul "^1.0.0" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.12.1, follow-redirects@^1.14.0: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== -follow-redirects@^1.14.9: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== - -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" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -5428,15 +3985,6 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -5455,11 +4003,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - 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" @@ -5470,17 +4013,10 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" 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" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - 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" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +from@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== fs-constants@^1.0.0: version "1.0.0" @@ -5507,14 +4043,23 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.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" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" @@ -5544,13 +4089,6 @@ fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.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" @@ -5581,42 +4119,22 @@ functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= -ganache-core@^2.13.2: - version "2.13.2" - resolved "https://registry.yarnpkg.com/ganache-core/-/ganache-core-2.13.2.tgz#27e6fc5417c10e6e76e2e646671869d7665814a3" - integrity sha512-tIF5cR+ANQz0+3pHWxHjIwHqFXcVo0Mb+kcsNhglNFALcYo49aQpnS9dqHartqPfMFjiHh/qFoD3mYK0d/qGgw== +ganache@7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" + integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== dependencies: - abstract-leveldown "3.0.0" - async "2.6.2" - bip39 "2.5.0" - cachedown "1.0.0" - clone "2.1.2" - debug "3.2.6" - encoding-down "5.0.4" - eth-sig-util "3.0.0" - ethereumjs-abi "0.6.8" - ethereumjs-account "3.0.0" - ethereumjs-block "2.2.2" - ethereumjs-common "1.5.0" - ethereumjs-tx "2.1.2" - ethereumjs-util "6.2.1" - ethereumjs-vm "4.2.0" - heap "0.2.6" - keccak "3.0.1" - level-sublevel "6.6.4" - levelup "3.1.1" - lodash "4.17.20" - lru-cache "5.1.1" - merkle-patricia-tree "3.0.0" - patch-package "6.2.2" - seedrandom "3.0.1" - source-map-support "0.5.12" - tmp "0.1.0" - web3-provider-engine "14.2.1" - websocket "1.0.32" + "@trufflesuite/bigint-buffer" "1.1.10" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" optionalDependencies: - ethereumjs-wallet "0.6.5" - web3 "1.2.11" + bufferutil "4.0.5" + utf-8-validate "5.0.7" get-caller-file@^1.0.1: version "1.0.3" @@ -5647,30 +4165,13 @@ get-port@^3.1.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw= -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 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" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - 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" @@ -5679,11 +4180,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -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" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -5737,7 +4233,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@~7.2.0: +glob@7.2.0, glob@^7.0.0, glob@^7.1.2, glob@^7.1.3: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -5772,10 +4268,10 @@ glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5799,14 +4295,6 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -5819,11 +4307,6 @@ globals@^13.15.0: 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" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== - globby@^10.0.1: version "10.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" @@ -5850,43 +4333,6 @@ globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw== - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -5927,60 +4373,75 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-deploy@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.4.tgz#39b06d3b0ad25195071cc1f2f71649b1f9f030d0" - integrity sha512-BNMwWqaxrwb8XKrYzmCwnUzOSKzicUBk+fwd28doUNoAGFFh8kpoypkcHMzKDVdLhnamAardcfqJet73zrZoTA== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.1" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.1" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/contracts" "^5.4.1" - "@ethersproject/providers" "^5.4.4" - "@ethersproject/solidity" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wallet" "^5.4.0" +hardhat-deploy@^0.11.37: + version "0.11.37" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.11.37.tgz#6a771b859c82ae25292321a6d510d7c0eda09d2b" + integrity sha512-pohPSEEo/X9Yfv0Fc0kXBQW6JO0LNOILBGCP69Ci1COJvLht1hLjAtXt/hccyvD9qY/uwJAM75fmsf41Y9N7lg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/contracts" "^5.7.0" + "@ethersproject/providers" "^5.7.2" + "@ethersproject/solidity" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wallet" "^5.7.0" "@types/qs" "^6.9.7" axios "^0.21.1" chalk "^4.1.2" chokidar "^3.5.2" debug "^4.3.2" enquirer "^2.3.6" + ethers "^5.5.3" form-data "^4.0.0" fs-extra "^10.0.0" match-all "^1.2.6" murmur-128 "^0.2.1" qs "^6.9.4" + zksync-web3 "^0.14.3" -hardhat-gas-reporter@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.8.tgz#93ce271358cd748d9c4185dbb9d1d5525ec145e0" - integrity sha512-1G5thPnnhcwLHsFnl759f2tgElvuwdkzxlI65fC9PwxYMEe9cmjkVAAWTf3/3y8uP6ZSPiUiOW8PgZnykmZe0g== +hardhat-gas-reporter@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: array-uniq "1.0.3" - eth-gas-reporter "^0.2.24" + eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.6.6: - version "2.9.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.3.tgz#4759dc3c468c7d15f34334ca1be7d59b04e47b1e" - integrity sha512-7Vw99RbYbMZ15UzegOR/nqIYIqddZXvLwJGaX5sX4G5bydILnbjmDU6g3jMKJSiArEixS3vHAEaOs5CW1JQ3hg== +hardhat-ignore-warnings@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/hardhat-ignore-warnings/-/hardhat-ignore-warnings-0.2.9.tgz#3d323a9016cbf436e5e7a796dc18568573f974da" + integrity sha512-q1oj6/ixiAx+lgIyGLBajVCSC7qUtAoK7LS9Nr8UVHYo8Iuh5naBiVGo4RDJ6wxbDGYBkeSukUGZrMqzC2DWwA== + dependencies: + minimatch "^5.1.0" + node-interval-tree "^2.0.1" + solidity-comments "^0.0.2" + +hardhat@^2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.2.tgz#250a8c8e76029e9bfbfb9b9abee68d5b350b5d4a" + integrity sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA== dependencies: - "@ethereumjs/block" "^3.6.0" - "@ethereumjs/blockchain" "^5.5.0" - "@ethereumjs/common" "^2.6.0" - "@ethereumjs/tx" "^3.4.0" - "@ethereumjs/vm" "^5.6.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -5990,41 +4451,30 @@ hardhat@^2.6.6: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.3" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.2" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" - undici "^4.14.1" + undici "^5.14.0" uuid "^8.3.2" ws "^7.4.6" -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" @@ -6052,23 +4502,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== - 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" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== - dependencies: - has-symbol-support-x "^1.4.1" - has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" @@ -6076,38 +4514,7 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.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" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3, has@~1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -6144,10 +4551,10 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -heap@0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" - integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== hmac-drbg@^1.0.1: version "1.0.1" @@ -6158,29 +4565,11 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -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" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: +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" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - http-basic@^8.1.1: version "8.1.3" resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" @@ -6191,22 +4580,6 @@ http-basic@^8.1.1: http-response-object "^3.0.1" parse-cache-control "^1.0.1" -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -6218,11 +4591,6 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= - 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" @@ -6239,14 +4607,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -6255,6 +4615,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +hyperapp@1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/hyperapp/-/hyperapp-1.2.9.tgz#a17ec09634968a5fa5f6b7d649e7a03d9680fcf2" + integrity sha512-bIzi12am7pyQ5nc2qnQpN6GWonjdJp+AghY7j9H9L0vccM1OQ3Cqn13cZlmS9KYm91Nf9fwF4KjvbQekFBxHVw== + 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" @@ -6262,21 +4627,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: 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" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -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" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -6345,7 +4696,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -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: +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: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6388,17 +4739,10 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - 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" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== io-ts@1.10.4: version "1.10.4" @@ -6407,33 +4751,6 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -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" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - 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" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -6461,17 +4778,12 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@~2.0.3: +is-buffer@^2.0.2, 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" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: +is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -6497,20 +4809,6 @@ is-core-module@^2.9.0: 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" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - 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" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -6518,24 +4816,6 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.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" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.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" @@ -6546,33 +4826,16 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: +is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - 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" - integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= - 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" @@ -6590,18 +4853,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 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" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -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" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.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" @@ -6614,7 +4865,7 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= -is-negative-zero@^2.0.1, is-negative-zero@^2.0.2: +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" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== @@ -6626,41 +4877,17 @@ is-number-object@^1.0.4: 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" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - 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" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -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" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - 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" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -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" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.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" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -6668,11 +4895,6 @@ is-regex@^1.0.4, is-regex@^1.1.4, is-regex@~1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== - is-shared-array-buffer@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -6680,10 +4902,10 @@ is-shared-array-buffer@^1.0.1: dependencies: call-bind "^1.0.2" -is-stream@^1.0.0, 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" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -6699,18 +4921,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.8.tgz#cbaa6585dc7db43318bc5b89523ea384a6f65e79" - integrity sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - -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" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -6725,19 +4936,14 @@ is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" 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" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-weakref@^1.0.1, is-weakref@^1.0.2: +is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" -is-windows@^1.0.2: +is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -6754,7 +4960,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -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" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -6764,42 +4970,22 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - 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" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-graph-algorithms@^1.0.18: - version "1.0.18" - resolved "https://registry.yarnpkg.com/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz#f96ec87bf194f5c0a31365fa0e1d07b7b962d891" - integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== +jju@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== js-sdsl@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.4.tgz#78793c90f80e8430b7d8dc94515b6c77d98a26a6" integrity sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw== -js-sha3@0.5.7, 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" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= @@ -6809,16 +4995,16 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-sha3@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a" + integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA== + +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 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" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" @@ -6847,50 +5033,18 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -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" - integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== - dependencies: - async "^2.0.1" - babel-preset-env "^1.7.0" - babelify "^7.3.0" - json-rpc-error "^2.0.0" - promise-to-callback "^1.0.0" - safe-event-emitter "^1.0.1" - -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" - integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= - dependencies: - inherits "^2.0.1" - -json-rpc-random-id@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" - integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= - 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" @@ -6911,23 +5065,11 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - 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" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -6951,10 +5093,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsonschema@^1.2.4: version "1.4.0" @@ -6979,7 +5121,7 @@ keccak@3.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -keccak@^3.0.0: +keccak@3.0.2, keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== @@ -6988,33 +5130,26 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -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" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= +keccak@^1.0.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" + integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== dependencies: - is-buffer "^1.1.5" + bindings "^1.2.1" + inherits "^2.0.3" + nan "^2.2.1" + safe-buffer "^5.1.0" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= +keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== 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" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7033,17 +5168,12 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -klaw@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-4.0.1.tgz#8dc6f5723f05894e8e931b516a8ff15c2976d368" - integrity sha512-pgsE40/SvC7st04AHiISNewaIMUbY5V/K8b21ekiPiFoYs/EYSdsGa+FJArB1d441uq4Q8zZyIxvAzkGNlBdRw== - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: - invert-kv "^1.0.0" + invert-kv "^2.0.0" level-codec@^9.0.0: version "9.0.2" @@ -7052,23 +5182,18 @@ level-codec@^9.0.0: 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" - integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" 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" 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" - 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" @@ -7076,41 +5201,6 @@ level-errors@^2.0.0, level-errors@~2.0.0: 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" - 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" - integrity sha512-I6Heg70nfF+e5Y3/qfthJFexhRw/Gi3bIymCoXAlijZdAcLaPuWSJs3KXyTYf23ID6g0o2QF62Yh+grOXY3Rig== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.5" - xtend "^4.0.0" - -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" - integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= - dependencies: - inherits "^2.0.1" - level-errors "^1.0.3" - readable-stream "^1.0.33" - xtend "^4.0.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" - integrity sha512-nEIQvxEED9yRThxvOrq8Aqziy4EGzrxSZK+QzEFAVuJvQ8glfyZ96GB6BoI4sBbLfjMXm2w4vu3Tkcm9obcY0g== - dependencies: - inherits "^2.0.1" - readable-stream "^2.3.6" - xtend "^4.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" @@ -7120,14 +5210,6 @@ level-iterator-stream@~4.0.0: readable-stream "^3.4.0" xtend "^4.0.2" -level-mem@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-3.0.1.tgz#7ce8cf256eac40f716eb6489654726247f5a89e5" - integrity sha512-LbtfK9+3Ug1UmvvhR2DqLqXiPW1OJ5jEh0a3m9ZgAipiwpSxGj/qaVVy54RG5vAQN1nCuXqjvprCuKSCxcJHBg== - dependencies: - level-packager "~4.0.0" - memdown "~3.0.0" - level-mem@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" @@ -7144,36 +5226,15 @@ level-packager@^5.0.3: encoding-down "^6.3.0" levelup "^4.3.2" -level-packager@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-4.0.1.tgz#7e7d3016af005be0869bc5fa8de93d2a7f56ffe6" - integrity sha512-svCRKfYLn9/4CoFfi+d8krOtrp6RoX8+xm0Na5cgXMqSyRru0AnDYdLl+YI8u1FyS6gGZ94ILLZDE5dh2but3Q== - dependencies: - encoding-down "~5.0.0" - levelup "^3.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" - integrity sha512-PWYqG4Q00asOrLhX7BejSajByB4EmG2GaKHfj3h5UmmZ2duciXLPGYWIjBzLECFWUGOZWlm5B20h/n3Gs3HKew== - dependencies: - ltgt "^2.1.2" +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== -level-sublevel@6.6.4: - version "6.6.4" - resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.4.tgz#f7844ae893919cd9d69ae19d7159499afd5352ba" - integrity sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA== - dependencies: - bytewise "~1.1.0" - level-codec "^9.0.0" - level-errors "^2.0.0" - level-iterator-stream "^2.0.3" - ltgt "~2.1.1" - pull-defer "^0.2.2" - pull-level "^2.0.3" - pull-stream "^3.6.8" - typewiselite "~1.0.0" - xtend "~4.0.0" +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== level-supports@~1.0.0: version "1.0.1" @@ -7182,22 +5243,13 @@ level-supports@~1.0.0: dependencies: xtend "^4.0.2" -level-ws@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" - integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= - dependencies: - readable-stream "~1.0.15" - xtend "~2.1.1" - -level-ws@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-1.0.0.tgz#19a22d2d4ac57b18cc7c6ecc4bd23d899d8f603b" - integrity sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q== +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - inherits "^2.0.3" - readable-stream "^2.2.8" - xtend "^4.0.1" + buffer "^6.0.3" + module-error "^1.0.1" level-ws@^2.0.0: version "2.0.0" @@ -7208,28 +5260,22 @@ level-ws@^2.0.0: readable-stream "^3.1.0" xtend "^4.0.1" -levelup@3.1.1, levelup@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-3.1.1.tgz#c2c0b3be2b4dc316647c53b42e2f559e232d2189" - integrity sha512-9N10xRkUU4dShSRRFTBdNaBxofz+PGaIZO962ckboJZiNmLuhVT6FZ6ZKAsICKfUBO76ySaYU6fJWX/jnj3Lcg== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - deferred-leveldown "~4.0.0" - level-errors "~2.0.0" - level-iterator-stream "~3.0.0" - xtend "~4.0.0" + browser-level "^1.0.1" + classic-level "^1.2.0" -levelup@^1.2.1: - version "1.3.9" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" - integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== dependencies: - deferred-leveldown "~1.2.1" - level-codec "~7.0.0" - level-errors "~1.0.3" - level-iterator-stream "~1.3.0" - prr "~1.0.1" - semver "~5.4.1" - xtend "~4.0.0" + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" levelup@^4.3.2: version "4.4.0" @@ -7258,17 +5304,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -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" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^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" @@ -7285,13 +5320,6 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^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" - 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" @@ -7299,10 +5327,10 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -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" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.camelcase@^4.3.0: version "4.3.0" @@ -7314,27 +5342,12 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.omit@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" - integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== - lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7354,23 +5367,6 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -looper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" - integrity sha1-Zs0Md0rz1P7axTeU90LbVtqPCew= - -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - loupe@^2.3.1: version "2.3.4" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" @@ -7378,30 +5374,21 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" -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" - 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" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" -lru-cache@5.1.1, 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" 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" - integrity sha1-cXibO39Tmb7IVl3aOKow0qCX7+4= - dependencies: - pseudomap "^1.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" @@ -7414,32 +5401,27 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= -ltgt@^2.1.2, ltgt@~2.2.0: +ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= -ltgt@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" - integrity sha1-EIUaBtmWS5cReEQcI8nlJpjuzjQ= - make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== dependencies: - object-visit "^1.0.0" + p-defer "^1.0.0" + +map-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.0.7.tgz#8a1f07896d82b10926bd3744a2420009f88974a8" + integrity sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ== markdown-table@^1.1.3: version "1.1.3" @@ -7465,22 +5447,14 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memdown@^1.0.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" - integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== dependencies: - abstract-leveldown "~2.7.1" - functional-red-black-tree "^1.0.1" - immediate "^3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" memdown@^5.0.0: version "5.1.0" @@ -7494,60 +5468,25 @@ memdown@^5.0.0: ltgt "~2.2.0" safe-buffer "~5.2.0" -memdown@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-3.0.0.tgz#93aca055d743b20efc37492e9e399784f2958309" - integrity sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA== +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== dependencies: - abstract-leveldown "~5.0.0" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.1.1" + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - 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" 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" - integrity sha512-soRaMuNf/ILmw3KWbybaCjhx86EYeBbD8ph0edQCTed0JN/rxDt1EBN52Ajre3VyGo+91f8+/rfPIRQnnGMqmQ== - dependencies: - async "^2.6.1" - ethereumjs-util "^5.2.0" - level-mem "^3.0.1" - level-ws "^1.0.0" - readable-stream "^3.0.6" - rlp "^2.0.0" - semaphore ">=1.0.1" - -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" - integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== - dependencies: - async "^1.4.2" - ethereumjs-util "^5.0.0" - level-ws "0.0.0" - levelup "^1.2.1" - memdown "^1.0.0" - readable-stream "^2.0.0" - rlp "^2.0.0" - semaphore ">=1.0.1" - merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: version "4.2.4" resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" @@ -7560,29 +5499,10 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== micromatch@^4.0.2: version "4.0.5" @@ -7613,34 +5533,22 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 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" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -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" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= - dependencies: - dom-walk "^0.1.0" +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -7659,12 +5567,12 @@ minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== dependencies: - brace-expansion "^1.1.7" + brace-expansion "^2.0.1" minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" @@ -7680,51 +5588,18 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.5: +minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE= - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - mkdirp@0.5.5, mkdirp@0.5.x: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -7732,13 +5607,18 @@ mkdirp@0.5.5, mkdirp@0.5.x: dependencies: minimist "^1.2.5" -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: +mkdirp@^0.5.1, mkdirp@^0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -7746,10 +5626,10 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -7776,40 +5656,72 @@ mocha@^7.1.1: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.2.0: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" - debug "4.3.3" + debug "4.3.4" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" glob "7.2.0" - growl "1.10.5" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" - minimatch "4.2.1" + minimatch "5.0.1" ms "2.1.3" - nanoid "3.3.1" + nanoid "3.3.3" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" + workerpool "6.2.1" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +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" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +moo@^0.5.0, moo@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c" + integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q== ms@2.0.0: version "2.0.0" @@ -7831,46 +5743,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 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" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - 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" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.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" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^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" @@ -7885,58 +5757,67 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -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" - integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18= +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nan@^2.2.1: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +nearley@^2.19.0: + version "2.20.1" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474" + integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ== + dependencies: + commander "^2.19.0" + moo "^0.5.0" + railroad-diagrams "^1.0.0" + randexp "0.4.6" neo-async@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 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" - 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" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nmtree@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/nmtree/-/nmtree-1.0.6.tgz#953e057ad545e9e627f1275bd25fea4e92c1cf63" + integrity sha512-SUPCoyX5w/lOT6wD/PZEymR+J899984tYEOYjuDqQlIOeX5NSb1MEsCcT0az+dhZD0MLAj5hGBZEpKQxuDdniA== + dependencies: + commander "^2.11.0" + 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" @@ -7957,26 +5838,37 @@ node-environment-flags@1.0.6: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 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" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" +node-gyp-build@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: +node-gyp-build@4.4.0, node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== +node-interval-tree@^2.0.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-interval-tree/-/node-interval-tree-2.1.2.tgz#316e380db08d1c0de0a620d551f0327e8397dad8" + integrity sha512-bJ9zMDuNGzVQg1xv0bCPzyEDxHgbrx7/xGj6CDokvizZZmastPsOh0JJLuY8wA5q2SfX1TLNMk7XNV8WxbGxzA== + dependencies: + shallowequal "^1.1.0" + nofilter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" @@ -7989,32 +5881,17 @@ nopt@3.x: dependencies: abbrev "1" -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.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" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== +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" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: - boolbase "^1.0.0" + path-key "^2.0.0" number-is-nan@^1.0.0: version "1.0.1" @@ -8034,50 +5911,21 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.0.0, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.9.0, object-inspect@~1.12.0: +object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 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" - integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - 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" @@ -8098,7 +5946,7 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: +object.getownpropertydescriptors@^2.0.3: version "2.1.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== @@ -8107,46 +5955,11 @@ object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1 define-properties "^1.1.3" es-abstract "^1.19.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - obliterator@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.2.tgz#25f50dc92e1181371b9d8209d11890f1a3c2fc21" integrity sha512-g0TrA7SbUggROhDPK8cEu/qpItwH2LSKcNl4tlfBNT54XY+nOsqrs0Q68h1V9b3HOSpIWv15jb1lax2hAggdIg== -oboe@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" - integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= - 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" - integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - 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" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - 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" @@ -8193,38 +6006,35 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: - lcid "^1.0.0" + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" -os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8232,7 +6042,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -8260,13 +6070,6 @@ p-locate@^3.0.0: 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" - 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" @@ -8281,13 +6084,6 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - integrity sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y= - 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" @@ -8305,33 +6101,15 @@ parent-module@^1.0.0: 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" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - 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" integrity sha1-juqz5U+laSD+Fro493+iGqzC104= -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - 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" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" +parse-es6-imports@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-es6-imports/-/parse-es6-imports-1.0.1.tgz#fbfea61afcd94435c7f697fc439616c18853771b" + integrity sha512-WheMSatJ69ItiKNFTYYzYIbntAT4DC0+dM+a64bLQi6dxxqI5elYqJK9oCo5AYlDxeTo/bimmdo5kv4IxJy34A== parse-json@^4.0.0: version "4.0.0" @@ -8341,50 +6119,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -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" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -patch-package@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" - integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^2.4.2" - cross-spawn "^6.0.5" - find-yarn-workspace-root "^1.2.1" - fs-extra "^7.0.1" - is-ci "^2.0.0" - klaw-sync "^6.0.0" - minimist "^1.2.0" - rimraf "^2.6.3" - semver "^5.6.0" - slash "^2.0.0" - tmp "^0.0.33" - -patch-package@^6.2.2, patch-package@^6.4.7: +patch-package@^6.4.7: version "6.4.7" resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.4.7.tgz#2282d53c397909a0d9ef92dae3fdeb558382b148" integrity sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ== @@ -8408,13 +6143,6 @@ path-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - 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" @@ -8425,7 +6153,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -8435,7 +6163,7 @@ path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.1: +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" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -8450,20 +6178,6 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 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" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.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" @@ -8474,7 +6188,14 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: +pause-stream@^0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + +pbkdf2@^3.0.17, pbkdf2@^3.0.9: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -8485,11 +6206,6 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.3, pbkdf2@^3.0.9: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8500,55 +6216,16 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 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" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - 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" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pollock@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/pollock/-/pollock-0.2.1.tgz#01273ae3542511492d07f1c10fa53f149b37c6ad" - integrity sha512-2Xy6LImSXm0ANKv9BKSVuCa6Z4ACbK7oUrl9gtUgqLkekL7n9C0mlWsOGYYuGbCG8xT0x3Q4F31C3ZMyVQjwsg== - -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" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - postinstall-postinstall@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== -precond@0.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" - integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8559,16 +6236,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - 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" @@ -8593,7 +6260,7 @@ prettier@^1.14.3: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== -prettier@^2.1.2, prettier@^2.3.1: +prettier@^2.3.1: version "2.6.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== @@ -8603,34 +6270,16 @@ prettier@^2.5.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - 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" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@2.0.3, progress@^2.0.0: +progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -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" - integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= - dependencies: - is-fn "^1.0.0" - set-immediate-shim "^1.0.1" - promise@^8.0.0: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -8638,93 +6287,28 @@ promise@^8.0.0: dependencies: asap "~2.0.6" -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pull-cat@^1.1.9: - version "1.1.11" - resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" - integrity sha1-tkLdElXaN2pwa220+pYvX9t0wxs= - -pull-defer@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - 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" - integrity sha512-fW6pljDeUThpq5KXwKbRG3X7Ogk3vc75d5OQU/TvXXui65ykm+Bn+fiktg+MOx2jJ85cd+sheufPL+rw9QSVZg== - dependencies: - level-post "^1.0.7" - pull-cat "^1.1.9" - pull-live "^1.0.1" - pull-pushable "^2.0.0" - pull-stream "^3.4.0" - pull-window "^2.1.4" - stream-to-pull-stream "^1.7.1" - -pull-live@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" - integrity sha1-pOzuAeMwFV6RJLu89HYfIbOPUfU= - dependencies: - pull-cat "^1.1.9" - pull-stream "^3.4.0" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pull-pushable@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" - integrity sha1-Xy867UethpGfAbEqLpnW8b13ZYE= +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== -pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -pull-window@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" - integrity sha1-/DuG/uvRkgx64pdpHiP3BfiFUvA= +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== dependencies: - looper "^2.0.0" + end-of-stream "^1.1.0" + once "^1.3.1" pump@^3.0.0: version "3.0.0" @@ -8739,106 +6323,59 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer@^13.7.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-13.7.0.tgz#18e16f83e397cf02f7a0804c67c1603d381cfb0b" - integrity sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA== - dependencies: - cross-fetch "3.1.5" - debug "4.3.4" - devtools-protocol "0.0.981744" - extract-zip "2.0.1" - https-proxy-agent "5.0.1" - pkg-dir "4.2.0" - progress "2.0.3" - proxy-from-env "1.1.0" - rimraf "3.0.2" - tar-fs "2.1.1" - unbzip2-stream "1.4.3" - ws "8.5.0" - -qs@6.10.3, qs@^6.4.0, qs@^6.7.0, qs@^6.9.4: +qs@^6.4.0, qs@^6.9.4: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -queue-microtask@^1.2.2: +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" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +railroad-diagrams@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" + integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A== + ramda@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6, randombytes@^2.1.0: +randexp@0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" + integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ== + dependencies: + discontinuous-range "1.0.0" + ret "~0.1.10" + +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 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" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@2.5.1, raw-body@^2.4.1: +raw-body@^2.4.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -8848,34 +6385,7 @@ raw-body@2.5.1, raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -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" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^1.0.33: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.2.8, readable-stream@^2.2.9, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -8888,7 +6398,29 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -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: +readable-stream@^2.3.0, readable-stream@^2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.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" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -8897,10 +6429,10 @@ readable-stream@^3.0.6, readable-stream@^3.1.0, readable-stream@^3.1.1, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.15: +readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -8921,6 +6453,11 @@ readdirp@~3.6.0: 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" + integrity sha512-7KA6+N9IGat52d83dvxnApAWN+MtVb1MiVuMR/cf1O4kYsJG+g/Aav0AHcHKsb6StinayfPLne0+fMX2sOzAKg== + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -8940,40 +6477,10 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regenerate@^1.2.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - 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" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -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" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" - integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" +regenerator-runtime@0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== regexpp@^2.0.1: version "2.0.1" @@ -8985,44 +6492,6 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 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" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - 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" @@ -9053,7 +6522,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.79.0, request@^2.85.0, request@^2.88.0: +request@^2.85.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -9084,11 +6553,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -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" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= - 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" @@ -9114,11 +6578,6 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -9139,7 +6598,7 @@ resolve@^1.1.6: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.8.1, resolve@~1.22.0: +resolve@^1.10.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -9157,13 +6616,6 @@ resolve@^1.3.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.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" @@ -9172,13 +6624,6 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - 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" @@ -9189,6 +6634,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.1.4: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -9196,13 +6646,6 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -9210,6 +6653,13 @@ rimraf@^2.2.8, rimraf@^2.6.3: dependencies: glob "^7.1.3" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -9218,7 +6668,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.1, rlp@^2.2.2, rlp@^2.2.3, rlp@^2.2.4: +rlp@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + +rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -9230,6 +6687,13 @@ run-async@^2.2.0: resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" 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" + 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" @@ -9249,7 +6713,7 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.2.1, 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: +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.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -9259,21 +6723,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -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" - integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== - dependencies: - events "^3.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" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"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: +"safer-buffer@>= 2.1.2 < 3", 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" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9303,19 +6753,12 @@ scrypt-js@2.0.4: resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== -scryptsy@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" - integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM= - dependencies: - pbkdf2 "^3.0.3" - -secp256k1@^4.0.1: +secp256k1@4.0.3, secp256k1@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== @@ -9324,22 +6767,17 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -seedrandom@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" - integrity sha512-1/02Y/rUeU1CJBAGLebiC5Lbo5FnB22gQbIFFYTLkwvp1xdABZJH1sn4ZT1MzXmPpzv+Rf/Lu2NcsLJiK4rcDg== +seedrandom@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== 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" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= - -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" - integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: +semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -9349,6 +6787,13 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0, semver@^7.5.4: + version "7.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -9363,30 +6808,6 @@ semver@^7.3.7: 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" - integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== - -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "1.8.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -9394,47 +6815,11 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.2" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -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" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -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" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" @@ -9466,6 +6851,11 @@ sha1@^1.1.1: charenc ">= 0.0.1" crypt ">= 0.0.1" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + 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" @@ -9508,30 +6898,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 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" - 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" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -9560,50 +6931,24 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.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" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" +solady@0.0.182: + version "0.0.182" + resolved "https://registry.yarnpkg.com/solady/-/solady-0.0.182.tgz#bd8c47f128a3a752358ad052782773966d74c400" + integrity sha512-FW6xo1akJoYpkXMzu58/56FcNU3HYYNamEbnFO3iSibXk0nSHo0DV2Gu/zI3FPg3So5CCX6IYli1TT1IWATnvg== -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== +solc@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.5.7.tgz#d84697ac5cc63d9b2139bfb349cec64b64861cdc" + integrity sha512-DaYFzB3AAYjzPtgUl9LenPY2xjI3wG9k8U8T8YE/sXHVIoCirCY5MB6mhcFPgk/VyUtaWZPUCWiYS1E6RSiiqw== dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sol2uml@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/sol2uml/-/sol2uml-2.2.0.tgz#145b1b85cc2c5d466d596f3426aae4dd4dc946f2" - integrity sha512-JMBvn3ZMT/1egoZjheM4Mh9gQudrlVjFZ1VS0gjQ/eluITT08U6V438Jyku28OuXz42aXNbGS80JuRZo0J7pLg== - dependencies: - "@aduh95/viz.js" "^3.7.0" - "@solidity-parser/parser" "^0.14.3" - axios "^0.27.2" - commander "^9.4.0" - convert-svg-to-png "^0.6.4" - debug "^4.3.4" - ethers "^5.6.9" - js-graph-algorithms "^1.0.18" - klaw "^4.0.1" + command-exists "^1.2.8" + fs-extra "^0.30.0" + keccak "^1.0.2" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + yargs "^11.0.0" solc@0.7.3: version "0.7.3" @@ -9620,28 +6965,29 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== +solc@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== dependencies: - fs-extra "^0.30.0" + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" + semver "^5.5.0" + tmp "0.0.33" -solc@^0.6.3: - version "0.6.12" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.6.12.tgz#48ac854e0c729361b22a7483645077f58cba080e" - integrity sha512-Lm0Ql2G9Qc7yPP2Ba+WNmzw2jwsrd3u4PobHYlSOxaut3TtUbj9+5ZrT6f4DUpNPEoBaFUOEg9Op9C0mk7ge9g== +solc@^0.8.17: + version "0.8.21" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.21.tgz#c3cd505c360ea2fa0eaa5ab574ef96bffb1a2766" + integrity sha512-N55ogy2dkTRwiONbj4e6wMZqUNaLZkiRcjGyeafjLYzo/tf/IvhHY5P5wpe+H3Fubh9idu071i8eOGO31s1ylg== dependencies: command-exists "^1.2.8" - commander "3.0.2" - fs-extra "^0.30.0" + commander "^8.1.0" + follow-redirects "^1.12.1" js-sha3 "0.8.0" memorystream "^0.3.1" - require-from-string "^2.0.0" semver "^5.5.0" tmp "0.0.33" @@ -9674,60 +7020,127 @@ solhint@^3.3.7: optionalDependencies: prettier "^1.14.3" +solidity-comments-darwin-arm64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-darwin-arm64/-/solidity-comments-darwin-arm64-0.0.2.tgz#07d89176967d805d41177b38d4f7b16f17c4fa29" + integrity sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA== + +solidity-comments-darwin-x64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-darwin-x64/-/solidity-comments-darwin-x64-0.0.2.tgz#aaadbfcc08d9fdd1b564c8ce71d6ba50d67b1829" + integrity sha512-Zjs0Ruz6faBTPT6fBecUt6qh4CdloT8Bwoc0+qxRoTn9UhYscmbPQkUgQEbS0FQPysYqVzzxJB4h1Ofbf4wwtA== + 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" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@^0.7.20: - version "0.7.20" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.7.20.tgz#246e9b0dd62f698bb8ddeecdcc46cab26c48b637" - integrity sha512-edOXTugUYdqxrtEnIn4vgrGjLPxdexcL0WD8LzAvVA3d1dwgcfRO3k8xQR02ZQnOnWMBi8Cqs0F+kAQQp3JW8g== - dependencies: - "@solidity-parser/parser" "^0.14.0" - "@truffle/provider" "^0.2.24" +solidity-comments-freebsd-x64@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-freebsd-x64/-/solidity-comments-freebsd-x64-0.0.2.tgz#b2bbf4fe04daefb5e97d595ef5581d56b61ea275" + integrity sha512-8Qe4mpjuAxFSwZJVk7B8gAoLCdbtS412bQzBwk63L8dmlHogvE39iT70aAk3RHUddAppT5RMBunlPUCFYJ3ZTw== + +solidity-comments-linux-arm64-gnu@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-arm64-gnu/-/solidity-comments-linux-arm64-gnu-0.0.2.tgz#db9cd6c46606d46ce66ff781aa37d596bf06b5f1" + integrity sha512-spkb0MZZnmrP+Wtq4UxP+nyPAVRe82idOjqndolcNR0S9Xvu4ebwq+LvF4HiUgjTDmeiqYiFZQ8T9KGdLSIoIg== + +solidity-comments-linux-arm64-musl@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-arm64-musl/-/solidity-comments-linux-arm64-musl-0.0.2.tgz#e37d20bb18447a4761cb48c80909833874b60d27" + integrity sha512-guCDbHArcjE+JDXYkxx5RZzY1YF6OnAKCo+sTC5fstyW/KGKaQJNPyBNWuwYsQiaEHpvhW1ha537IvlGek8GqA== + +solidity-comments-linux-x64-gnu@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-x64-gnu/-/solidity-comments-linux-x64-gnu-0.0.2.tgz#19d09f0d52181ed2661d188ded0f9f22399eb17d" + integrity sha512-zIqLehBK/g7tvrFmQljrfZXfkEeLt2v6wbe+uFu6kH/qAHZa7ybt8Vc0wYcmjo2U0PeBm15d79ee3AkwbIjFdQ== + +solidity-comments-linux-x64-musl@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-linux-x64-musl/-/solidity-comments-linux-x64-musl-0.0.2.tgz#ec1297208481c70bcdceae11ab1ef50c5a955553" + integrity sha512-R9FeDloVlFGTaVkOlELDVC7+1Tjx5WBPI5L8r0AGOPHK3+jOcRh6sKYpI+VskSPDc3vOO46INkpDgUXrKydlIw== + +solidity-comments-win32-arm64-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-arm64-msvc/-/solidity-comments-win32-arm64-msvc-0.0.2.tgz#48dc8a623f9e34a7c1ff62e406d67862d660ff04" + integrity sha512-QnWJoCQcJj+rnutULOihN9bixOtYWDdF5Rfz9fpHejL1BtNjdLW1om55XNVHGAHPqBxV4aeQQ6OirKnp9zKsug== + +solidity-comments-win32-ia32-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-ia32-msvc/-/solidity-comments-win32-ia32-msvc-0.0.2.tgz#5110e57d247d59131c82310ee1c88a8a9cfc7da5" + integrity sha512-vUg4nADtm/NcOtlIymG23NWJUSuMsvX15nU7ynhGBsdKtt8xhdP3C/zA6vjDk8Jg+FXGQL6IHVQ++g/7rSQi0w== + +solidity-comments-win32-x64-msvc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments-win32-x64-msvc/-/solidity-comments-win32-x64-msvc-0.0.2.tgz#271ad8fbbaf17f6026362964ba3e1880e3dc3685" + integrity sha512-36j+KUF4V/y0t3qatHm/LF5sCUCBx2UndxE1kq5bOzh/s+nQgatuyB+Pd5BfuPQHdWu2KaExYe20FlAa6NL7+Q== + +solidity-comments@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/solidity-comments/-/solidity-comments-0.0.2.tgz#e1158d243ad55d5803882f2a67c0298466df573b" + integrity sha512-G+aK6qtyUfkn1guS8uzqUeua1dURwPlcOjoTYW/TwmXAcE7z/1+oGCfZUdMSe4ZMKklNbVZNiG5ibnF8gkkFfw== + optionalDependencies: + solidity-comments-darwin-arm64 "0.0.2" + solidity-comments-darwin-x64 "0.0.2" + solidity-comments-freebsd-x64 "0.0.2" + solidity-comments-linux-arm64-gnu "0.0.2" + solidity-comments-linux-arm64-musl "0.0.2" + solidity-comments-linux-x64-gnu "0.0.2" + solidity-comments-linux-x64-musl "0.0.2" + solidity-comments-win32-arm64-msvc "0.0.2" + solidity-comments-win32-ia32-msvc "0.0.2" + solidity-comments-win32-x64-msvc "0.0.2" + +solidity-coverage@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" + integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.16.0" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" + difflib "^0.2.4" fs-extra "^8.1.0" ghost-testrpc "^0.0.2" global-modules "^2.0.0" globby "^10.0.1" jsonschema "^1.2.4" lodash "^4.17.15" + mocha "7.1.2" node-emoji "^1.10.0" pify "^4.0.1" recursive-readdir "^2.2.2" sc-istanbul "^0.4.5" semver "^7.3.4" shelljs "^0.8.3" - web3-utils "^1.3.0" + web3-utils "^1.3.6" -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" +solidity-to-abi@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/solidity-to-abi/-/solidity-to-abi-1.0.4.tgz#b5d1c095e7cb8ee402d5f7a49d2c2ff0e0d63a15" + integrity sha512-2WZpksSLXBAGHBJvv/+M9zI/W4OGxHY3Hmgb75ZqO9hd1rcJMJx/u0zD8DKRWNuzKBw1f5J91VmntewGIrgRjg== -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" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== +solpp@^0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/solpp/-/solpp-0.11.5.tgz#e5f38b5acc952e1cc2e3871d490fdbed910938dd" + integrity sha512-LjzCGMrTDXtera2C4mbQGZSpBznP+o3/82L2CneAAMNbm+t4xPsvfrgJkIaY+IZ5YLrB8IXn7cYthwHMKvAWnQ== dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" + antlr4 "~4.8.0" + axios "^0.21.1" + bn-str-256 "^1.9.1" + commander "^2.19.0" + ethereumjs-util "^6.0.0" + lodash "^4.17.11" + mz "^2.7.0" + resolve "^1.10.0" + semver "^5.6.0" -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" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== source-map-support@^0.5.13: version "0.5.21" @@ -9737,16 +7150,6 @@ source-map-support@^0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -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" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -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" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - 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" @@ -9759,38 +7162,17 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^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" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== +split-ca@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" + integrity sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ== -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" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: - extend-shallow "^3.0.0" + through "2" sprintf-js@~1.0.2: version "1.0.3" @@ -9819,41 +7201,28 @@ stacktrace-parser@^0.1.10: 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" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= -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" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== +stream-combiner@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.2.2.tgz#aec8cbac177b56b6f4fa479ced8c1912cee52858" + integrity sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ== dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" + duplexer "~0.1.1" + through "~2.3.4" -strict-uri-encode@^1.0.0: +streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string-format@^2.0.0: version "2.0.0" @@ -9869,7 +7238,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.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" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -9891,18 +7260,9 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trim@~1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz#a587bcc8bfad8cb9829a577f5de30dd170c1682c" - integrity sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" string.prototype.trimend@^1.0.4: version "1.0.4" @@ -9967,12 +7327,10 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: 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" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-hex-prefix@1.0.0: version "1.0.0" @@ -10005,11 +7363,6 @@ supports-color@8.1.1: 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" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" @@ -10036,23 +7389,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swarm-js@^0.1.40: - version "0.1.40" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" - integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^7.1.0" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - sync-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" @@ -10069,6 +7405,21 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" +synp@^1.9.10: + version "1.9.10" + resolved "https://registry.yarnpkg.com/synp/-/synp-1.9.10.tgz#53163321a600418c9b06af0db499939ffce12907" + integrity sha512-G9Z/TXTaBG1xNslUf3dHFidz/8tvvRaR560WWyOwyI7XrGGEGBTEIIg4hdRh1qFtz8mPYynAUYwWXUg/Zh0Pzw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + bash-glob "^2.0.0" + colors "1.4.0" + commander "^7.2.0" + eol "^0.9.1" + lodash "4.17.21" + nmtree "^1.0.6" + semver "^7.3.5" + sort-object-keys "^1.1.3" + table-layout@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" @@ -10100,73 +7451,28 @@ table@^6.8.0: string-width "^4.2.3" strip-ansi "^6.0.1" -tape@^4.6.3: - version "4.15.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.15.0.tgz#1b8a9563b4bc7e51302216c137732fb2ce6d1a99" - integrity sha512-SfRmG2I8QGGgJE/MCiLH8c11L5XxyUXxwK9xLRD0uiK5fehRkkSZGmR6Y1pxOt8vJ19m3sY+POTQpiaVv45/LQ== - dependencies: - call-bind "~1.0.2" - deep-equal "~1.1.1" - defined "~1.0.0" - dotignore "~0.1.2" - for-each "~0.3.3" - glob "~7.2.0" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.1.4" - minimist "~1.2.5" - object-inspect "~1.12.0" - resolve "~1.22.0" - resumer "~0.0.0" - string.prototype.trim "~1.2.5" - through "~2.3.8" - -tar-fs@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== +tar-fs@~1.16.3: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== +tar-stream@^1.1.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -test-value@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/test-value/-/test-value-2.1.0.tgz#11da6ff670f3471a73b625ca4f3fdcf7bb748291" - integrity sha1-Edpv9nDzRxpztiXKTz/c97t0gpE= - dependencies: - array-back "^1.0.3" - typical "^2.6.0" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" text-table@^0.2.0: version "0.2.0" @@ -10190,23 +7496,24 @@ then-request@^6.0.0: promise "^8.0.0" qs "^6.4.0" -through2@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" + thenify ">= 3.1.0 < 4" -through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timed-out@^4.0.0, timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@0.0.33, tmp@^0.0.33: version "0.0.33" @@ -10215,44 +7522,10 @@ tmp@0.0.33, tmp@^0.0.33: 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" - integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== - dependencies: - rimraf "^2.6.3" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -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" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -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" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - 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" - 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" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== to-regex-range@^5.0.1: version "5.0.1" @@ -10261,16 +7534,6 @@ to-regex-range@^5.0.1: 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" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -10289,16 +7552,6 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== - ts-command-line-args@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz#fd6913e542099012c0ffb2496126a8f38305c7d6" @@ -10309,36 +7562,11 @@ ts-command-line-args@^2.2.0: command-line-usage "^6.1.0" string-format "^2.0.0" -ts-essentials@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a" - 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" - 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" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== -ts-generator@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ts-generator/-/ts-generator-0.1.1.tgz#af46f2fb88a6db1f9785977e9590e7bcd79220ab" - integrity sha512-N+ahhZxTLYu1HNTQetwWcx3so8hcYbkKBHTr4b4/YgObFTIKkOSSsaa+nal12w8mfrJAyzJfETXawbNjSfP2gQ== - dependencies: - "@types/mkdirp" "^0.5.2" - "@types/prettier" "^2.1.1" - "@types/resolve" "^0.0.8" - chalk "^2.4.1" - glob "^7.1.2" - mkdirp "^0.5.1" - prettier "^2.1.2" - resolve "^1.8.1" - ts-essentials "^1.0.0" - ts-node@^10.4.0: version "10.7.0" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" @@ -10408,7 +7636,7 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl-util@^0.15.0, tweetnacl-util@^0.15.1: +tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== @@ -10418,7 +7646,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0, tweetnacl@^1.0.3: +tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -10457,37 +7685,6 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - -typechain@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-3.0.0.tgz#d5a47700831f238e43f7429b987b4bb54849b92e" - integrity sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg== - dependencies: - command-line-args "^4.0.7" - debug "^4.1.1" - fs-extra "^7.0.0" - js-sha3 "^0.8.0" - lodash "^4.17.15" - ts-essentials "^6.0.3" - ts-generator "^0.1.1" - typechain@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.0.0.tgz#a5dbe754717a7e16247df52b5285903de600e8ff" @@ -10504,12 +7701,21 @@ typechain@^8.0.0: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" -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" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: - is-typedarray "^1.0.0" + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" typedarray@^0.0.6: version "0.0.6" @@ -10521,28 +7727,6 @@ typescript@^4.5.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== -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" - integrity sha1-l+uRgFx/VdL5QXSPpQ0xXZke8ZU= - -typewise@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" - integrity sha1-EGeTZUCvl5N8xdz5kiSG6fooRlE= - 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" - integrity sha1-yIgvobsQksBgBal/NO9chQjjZk4= - -typical@^2.6.0, typical@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/typical/-/typical-2.6.1.tgz#5c080e5d661cbbe38259d2e70a3c7253e873881d" - integrity sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0= - typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" @@ -10558,11 +7742,6 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859" integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ== -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" @@ -10573,39 +7752,18 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" -unbzip2-stream@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== +undici@^5.14.0: + version "5.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" + integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== dependencies: - buffer "^5.2.1" - through "^2.3.8" - -underscore@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" - integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== - -undici@^4.14.1: - version "4.16.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-4.16.0.tgz#469bb87b3b918818d3d7843d91a1d08da357d5ff" - integrity sha512-tkZSECUYi+/T1i4u+4+lwZmQgLXd4BLGlrc7KZPcLIW7Jpq99+Xpc30ONv7nS6F5UNOxp/HBZSSL9MafUrvJbw== + busboy "^1.6.0" undici@^5.4.0: version "5.10.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -10616,24 +7774,11 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unorm@^1.3.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" - integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== - -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -10641,35 +7786,6 @@ uri-js@^4.2.2: 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" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - -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" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -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" - integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -10678,19 +7794,14 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -utf-8-validate@^5.0.2: - version "5.0.9" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== dependencies: node-gyp-build "^4.3.0" -utf8@3.0.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" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== @@ -10700,44 +7811,11 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" - -util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - safe-buffer "^5.1.2" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - uuid@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -10753,24 +7831,6 @@ v8-compile-cache-lib@^3.0.0: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - 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" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -10780,560 +7840,25 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -web3-bzz@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.11.tgz#41bc19a77444bd5365744596d778b811880f707f" - integrity sha512-XGpWUEElGypBjeFyUhTkiPXFbDVD6Nr/S5jznE3t8cWUA0FxRf1n3n/NuIZeb0H9RkN2Ctd/jNma/k8XGa3YKg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - underscore "1.9.1" - -web3-bzz@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.5.3.tgz#e36456905ce051138f9c3ce3623cbc73da088c2b" - integrity sha512-SlIkAqG0eS6cBS9Q2eBOTI1XFzqh83RqGJWnyrNZMDxUwsTVHL+zNnaPShVPvrWQA1Ub5b0bx1Kc5+qJVxsTJg== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - -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" - integrity sha512-PEPoAoZd5ME7UfbnCZBdzIerpe74GEvlwT4AjOmHeCVZoIFk7EqvOZDejJHt+feJA6kMVTdd0xzRNN295UhC1A== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.11" - web3-utils "1.2.11" - -web3-core-helpers@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.5.3.tgz#099030235c477aadf39a94199ef40092151d563c" - integrity sha512-Ip1IjB3S8vN7Kf1PPjK41U5gskmMk6IJQlxIVuS8/1U7n/o0jC8krqtpRwiMfAgYyw3TXwBFtxSRTvJtnLyXZw== - dependencies: - web3-eth-iban "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-ff0q76Cde94HAxLDZ6DbdmKniYCQVtvuaYh+rtOUMB6kssa5FX0q3vPmixi7NPooFnbKmmZCM6NvXg4IreTPIw== - dependencies: - "@ethersproject/transactions" "^5.0.0-beta.135" - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-utils "1.2.11" - -web3-core-method@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.5.3.tgz#6cff97ed19fe4ea2e9183d6f703823a079f5132c" - integrity sha512-8wJrwQ2qD9ibWieF9oHXwrJsUGrv3XAtEkNeyvyNMpktNTIjxJ2jaFGQUuLiyUrMubD18XXgLk4JS6PJU4Loeg== - dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethersproject/transactions" "^5.0.0-beta.135" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-il4McoDa/Ox9Agh4kyfQ8Ak/9ABYpnF8poBLL33R/EnxLsJOGQG2nZhkJa3I067hocrPSjEdlPt/0bHXsln4qA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.5.3.tgz#3f11833c3dc6495577c274350b61144e0a4dba01" - integrity sha512-CFfgqvk3Vk6PIAxtLLuX+pOMozxkKCY+/GdGr7weMh033mDXEPvwyVjoSRO1PqIKj668/hMGQsVoIgbyxkJ9Mg== - 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" - integrity sha512-oFhBtLfOiIbmfl6T6gYjjj9igOvtyxJ+fjS+byRxiwFJyJ5BQOz4/9/17gWR1Cq74paTlI7vDGxYfuvfE/mKvA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.11" - web3-providers-http "1.2.11" - web3-providers-ipc "1.2.11" - web3-providers-ws "1.2.11" - -web3-core-requestmanager@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.5.3.tgz#b339525815fd40e3a2a81813c864ddc413f7b6f7" - integrity sha512-9k/Bze2rs8ONix5IZR+hYdMNQv+ark2Ek2kVcrFgWO+LdLgZui/rn8FikPunjE+ub7x7pJaKCgVRbYFXjo3ZWg== - dependencies: - util "^0.12.0" - web3-core-helpers "1.5.3" - web3-providers-http "1.5.3" - web3-providers-ipc "1.5.3" - web3-providers-ws "1.5.3" - -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" - integrity sha512-qEF/OVqkCvQ7MPs1JylIZCZkin0aKK9lDxpAtQ1F8niEDGFqn7DT8E/vzbIa0GsOjL2fZjDhWJsaW+BSoAW1gg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-core-subscriptions@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.5.3.tgz#d7d69c4caad65074212028656e9dc56ca5c2159d" - integrity sha512-L2m9vG1iRN6thvmv/HQwO2YLhOQlmZU8dpLG6GSo9FBN14Uch868Swk0dYVr3rFSYjZ/GETevSXU+O+vhCummA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - -web3-core@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.11.tgz#1043cacc1becb80638453cc5b2a14be9050288a7" - integrity sha512-CN7MEYOY5ryo5iVleIWRE3a3cZqVaLlIbIzDPsvQRUfzYnvzZQRZBm9Mq+ttDi2STOOzc1MKylspz/o3yq/LjQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-requestmanager "1.2.11" - web3-utils "1.2.11" - -web3-core@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.5.3.tgz#59f8728b27c8305b349051326aa262b9b7e907bf" - integrity sha512-ACTbu8COCu+0eUNmd9pG7Q9EVsNkAg2w3Y7SqhDr+zjTgbSHZV01jXKlapm9z+G3AN/BziV3zGwudClJ4u4xXQ== - dependencies: - "@types/bn.js" "^4.11.5" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-requestmanager "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-PkRYc0+MjuLSgg03QVWqWlQivJqRwKItKtEpRUaxUAeLE7i/uU39gmzm2keHGcQXo3POXAbOnMqkDvOep89Crg== - dependencies: - "@ethersproject/abi" "5.0.0-beta.153" - underscore "1.9.1" - web3-utils "1.2.11" - -web3-eth-abi@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.5.3.tgz#5aea9394d797f99ca0d9bd40c3417eb07241c96c" - integrity sha512-i/qhuFsoNrnV130CSRYX/z4SlCfSQ4mHntti5yTmmQpt70xZKYZ57BsU0R29ueSQ9/P+aQrL2t2rqkQkAloUxg== - dependencies: - "@ethersproject/abi" "5.0.7" - web3-utils "1.5.3" - -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" - integrity sha512-6FwPqEpCfKIh3nSSGeo3uBm2iFSnFJDfwL3oS9pyegRBXNsGRVpgiW63yhNzL0796StsvjHWwQnQHsZNxWAkGw== - dependencies: - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-common "^1.3.2" - ethereumjs-tx "^2.1.1" - scrypt-js "^3.0.1" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-eth-accounts@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.5.3.tgz#076c816ff4d68c9dffebdc7fd2bfaddcfc163d77" - integrity sha512-pdGhXgeBaEJENMvRT6W9cmji3Zz/46ugFSvmnLLw79qi5EH7XJhKISNVb41eWCrs4am5GhI67GLx5d2s2a72iw== - dependencies: - "@ethereumjs/common" "^2.3.0" - "@ethereumjs/tx" "^3.2.1" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-MzYuI/Rq2o6gn7vCGcnQgco63isPNK5lMAan2E51AJLknjSLnOxwNY3gM8BcKoy4Z+v5Dv00a03Xuk78JowFow== - dependencies: - "@types/bn.js" "^4.11.5" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-promievent "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-utils "1.2.11" - -web3-eth-contract@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.5.3.tgz#12b03a4a16ce583a945f874bea2ff2fb4c5b81ad" - integrity sha512-Gdlt1L6cdHe83k7SdV6xhqCytVtOZkjD0kY/15x441AuuJ4JLubCHuqu69k2Dr3tWifHYVys/vG8QE/W16syGg== - dependencies: - "@types/bn.js" "^4.11.5" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-promievent "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-dbW7dXP6HqT1EAPvnniZVnmw6TmQEKF6/1KgAxbo8iBBYrVTMDGFQUUnZ+C4VETGrwwaqtX4L9d/FrQhZ6SUiA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-promievent "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-contract "1.2.11" - web3-utils "1.2.11" - -web3-eth-ens@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.5.3.tgz#ef6eee1ddf32b1ff9536fc7c599a74f2656bafe1" - integrity sha512-QmGFFtTGElg0E+3xfCIFhiUF+1imFi9eg/cdsRMUZU4F1+MZCC/ee+IAelYLfNTGsEslCqfAusliKOT9DdGGnw== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-promievent "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-contract "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-ozuVlZ5jwFC2hJY4+fH9pIcuH1xP0HEFhtWsR69u9uDIANHLPQQtWYmdj7xQ3p2YT4bQLq/axKhZi7EZVetmxQ== - dependencies: - bn.js "^4.11.9" - web3-utils "1.2.11" - -web3-eth-iban@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.5.3.tgz#91b1475893a877b10eac1de5cce6eb379fb81b5d" - integrity sha512-vMzmGqolYZvRHwP9P4Nf6G8uYM5aTLlQu2a34vz78p0KlDC+eV1th3+90Qeaupa28EG7OO0IT1F0BejiIauOPw== - dependencies: - bn.js "^4.11.9" - web3-utils "1.5.3" - -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" - integrity sha512-42IzUtKq9iHZ8K9VN0vAI50iSU9tOA1V7XU2BhF/tb7We2iKBVdkley2fg26TxlOcKNEHm7o6HRtiiFsVK4Ifw== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth-personal@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.5.3.tgz#4ebe09e9a77dd49d23d93b36b36cfbf4a6dae713" - integrity sha512-JzibJafR7ak/Icas8uvos3BmUNrZw1vShuNR5Cxjo+vteOC8XMqz1Vr7RH65B4bmlfb3bm9xLxetUHO894+Sew== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - -web3-eth@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.11.tgz#4c81fcb6285b8caf544058fba3ae802968fdc793" - integrity sha512-REvxW1wJ58AgHPcXPJOL49d1K/dPmuw4LjPLBPStOVkQjzDTVmJEIsiLwn2YeuNDd4pfakBwT8L3bz1G1/wVsQ== - dependencies: - underscore "1.9.1" - web3-core "1.2.11" - web3-core-helpers "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-eth-abi "1.2.11" - web3-eth-accounts "1.2.11" - web3-eth-contract "1.2.11" - web3-eth-ens "1.2.11" - web3-eth-iban "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-utils "1.2.11" - -web3-eth@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.5.3.tgz#d7d1ac7198f816ab8a2088c01e0bf1eda45862fe" - integrity sha512-saFurA1L23Bd7MEf7cBli6/jRdMhD4X/NaMiO2mdMMCXlPujoudlIJf+VWpRWJpsbDFdu7XJ2WHkmBYT5R3p1Q== - dependencies: - web3-core "1.5.3" - web3-core-helpers "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-eth-abi "1.5.3" - web3-eth-accounts "1.5.3" - web3-eth-contract "1.5.3" - web3-eth-ens "1.5.3" - web3-eth-iban "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-utils "1.5.3" - -web3-net@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.11.tgz#eda68ef25e5cdb64c96c39085cdb74669aabbe1b" - integrity sha512-sjrSDj0pTfZouR5BSTItCuZ5K/oZPVdVciPQ6981PPPIwJJkCMeVjD7I4zO3qDPCnBjBSbWvVnLdwqUBPtHxyg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-utils "1.2.11" - -web3-net@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.5.3.tgz#545fee49b8e213b0c55cbe74ffd0295766057463" - integrity sha512-0W/xHIPvgVXPSdLu0iZYnpcrgNnhzHMC888uMlGP5+qMCt8VuflUZHy7tYXae9Mzsg1kxaJAS5lHVNyeNw4CoQ== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-utils "1.5.3" - -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" - integrity sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw== - dependencies: - async "^2.5.0" - backoff "^2.5.0" - clone "^2.0.0" - cross-fetch "^2.1.0" - eth-block-tracker "^3.0.0" - eth-json-rpc-infura "^3.1.0" - eth-sig-util "^1.4.2" - ethereumjs-block "^1.2.2" - ethereumjs-tx "^1.2.0" - ethereumjs-util "^5.1.5" - ethereumjs-vm "^2.3.4" - json-rpc-error "^2.0.0" - json-stable-stringify "^1.0.1" - promise-to-callback "^1.0.0" - readable-stream "^2.2.9" - request "^2.85.0" - semaphore "^1.0.3" - ws "^5.1.1" - xhr "^2.2.0" - xtend "^4.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" - integrity sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA== - dependencies: - web3-core-helpers "1.2.11" - xhr2-cookies "1.1.0" - -web3-providers-http@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.5.3.tgz#74f170fc3d79eb7941d9fbc34e2a067d61ced0b2" - integrity sha512-5DpUyWGHtDAr2RYmBu34Fu+4gJuBAuNx2POeiJIooUtJ+Mu6pIx4XkONWH6V+Ez87tZAVAsFOkJRTYuzMr3rPw== - dependencies: - web3-core-helpers "1.5.3" - xhr2-cookies "1.1.0" - -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" - integrity sha512-yhc7Y/k8hBV/KlELxynWjJDzmgDEDjIjBzXK+e0rHBsYEhdCNdIH5Psa456c+l0qTEU2YzycF8VAjYpWfPnBpQ== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - -web3-providers-ipc@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.5.3.tgz#4bd7f5e445c2f3c2595fce0929c72bb879320a3f" - integrity sha512-JmeAptugVpmXI39LGxUSAymx0NOFdgpuI1hGQfIhbEAcd4sv7fhfd5D+ZU4oLHbRI8IFr4qfGU0uhR8BXhDzlg== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.5.3" - -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" - integrity sha512-ZxnjIY1Er8Ty+cE4migzr43zA/+72AF1myzsLaU5eVgdsfV7Jqx7Dix1hbevNZDKFlSoEyq/3j/jYalh3So1Zg== - dependencies: - eventemitter3 "4.0.4" - underscore "1.9.1" - web3-core-helpers "1.2.11" - websocket "^1.0.31" - -web3-providers-ws@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.5.3.tgz#eec6cfb32bb928a4106de506f13a49070a21eabf" - integrity sha512-6DhTw4Q7nm5CFYEUHOJM0gAb3xFx+9gWpVveg3YxJ/ybR1BUvEWo3bLgIJJtX56cYX0WyY6DS35a7f0LOI1kVg== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.5.3" - websocket "^1.0.32" - -web3-shh@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.11.tgz#f5d086f9621c9a47e98d438010385b5f059fd88f" - integrity sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg== - dependencies: - web3-core "1.2.11" - web3-core-method "1.2.11" - web3-core-subscriptions "1.2.11" - web3-net "1.2.11" - -web3-shh@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.5.3.tgz#3c04aa4cda9ba0b746d7225262401160f8e38b13" - integrity sha512-COfEXfsqoV/BkcsNLRxQqnWc1Teb8/9GxdGag5GtPC5gQC/vsN+7hYVJUwNxY9LtJPKYTij2DHHnx6UkITng+Q== - dependencies: - web3-core "1.5.3" - web3-core-method "1.5.3" - web3-core-subscriptions "1.5.3" - web3-net "1.5.3" - -web3-utils@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.11.tgz#af1942aead3fb166ae851a985bed8ef2c2d95a82" - integrity sha512-3Tq09izhD+ThqHEaWYX4VOT7dNPdZiO+c/1QMA0s5X2lDFKK/xHJb7cyTRRVzN2LvlHbR7baS1tmQhSua51TcQ== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - underscore "1.9.1" - utf8 "3.0.0" - -web3-utils@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.5.3.tgz#e914c9320cd663b2a09a5cb920ede574043eb437" - integrity sha512-56nRgA+Ad9SEyCv39g36rTcr5fpsd4L9LgV3FK0aB66nAMazLAA6Qz4lH5XrUKPDyBIPGJIR+kJsyRtwcu2q1Q== - dependencies: - bn.js "^4.11.9" - eth-lib "0.2.8" - ethereum-bloom-filters "^1.0.6" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@^1.0.0-beta.31: - version "1.7.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.1.tgz#77d8bacaf426c66027d8aa4864d77f0ed211aacd" - integrity sha512-fef0EsqMGJUgiHPdX+KN9okVWshbIumyJPmR+btnD1HgvoXijKEkuKBv0OmUqjbeqmLKP2/N9EiXKJel5+E1Dw== - dependencies: - bn.js "^4.11.9" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@^1.3.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.6.1.tgz#befcb23922b00603ab56d8c5b4158468dc494aca" - integrity sha512-RidGKv5kOkcerI6jQqDFDoTllQQqV+rPhTzZHhmbqtFObbYpU93uc+yG1LHivRTQhA6llIx67iudc/vzisgO+w== +web3-utils@^1.3.6: + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" + integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== dependencies: - bn.js "^4.11.9" + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" utf8 "3.0.0" -web3@1.2.11: - version "1.2.11" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.11.tgz#50f458b2e8b11aa37302071c170ed61cff332975" - integrity sha512-mjQ8HeU41G6hgOYm1pmeH0mRAeNKJGnJEUzDMoerkpw7QUQT4exVREgF1MYPvL/z6vAshOXei25LE/t/Bxl8yQ== - dependencies: - web3-bzz "1.2.11" - web3-core "1.2.11" - web3-eth "1.2.11" - web3-eth-personal "1.2.11" - web3-net "1.2.11" - web3-shh "1.2.11" - web3-utils "1.2.11" - -web3@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.5.3.tgz#11882679453c645bf33620fbc255a243343075aa" - integrity sha512-eyBg/1K44flfv0hPjXfKvNwcUfIVDI4NX48qHQe6wd7C8nPSdbWqo9vLy6ksZIt9NLa90HjI8HsGYgnMSUxn6w== - dependencies: - web3-bzz "1.5.3" - web3-core "1.5.3" - web3-eth "1.5.3" - web3-eth-personal "1.5.3" - web3-net "1.5.3" - web3-shh "1.5.3" - web3-utils "1.5.3" - webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= -websocket@1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" - integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -websocket@^1.0.31, websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-fetch@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -11353,28 +7878,11 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which-typed-array@^1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.7.tgz#2761799b9a22d4b8660b3c1b40abaa7739691793" - integrity sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-abstract "^1.18.5" - foreach "^2.0.5" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.7" - which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -11382,7 +7890,7 @@ which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: dependencies: isexe "^2.0.0" -which@2.0.2, which@^2.0.1: +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== @@ -11396,11 +7904,6 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= - 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" @@ -11419,10 +7922,10 @@ wordwrapjs@^4.0.0: reduce-flatten "^2.0.0" typical "^5.2.0" -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^2.0.0: version "2.1.0" @@ -11467,86 +7970,26 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" - integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== - -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^5.1.1: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" - integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== - dependencies: - async-limiter "~1.0.0" - ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== -xhr-request-promise@^0.1.2: +xhr2@0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - 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" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= - 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" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.3.tgz#cbfc4759a69b4a888e78cf4f20b051038757bd11" + integrity sha512-6RmGK22QwC7yXB1CRwyLWuS2opPcKOlAu0ViAnyZjDlzrEmCKL4kLHkfvB8oMRWeztMsNoDGAjsMZY15w/4tTw== xmlhttprequest@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 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" - integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= - 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" @@ -11562,12 +8005,12 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 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" - integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: +yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -11590,19 +8033,23 @@ yargs-parser@20.2.4: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ= - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 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" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw== + dependencies: + camelcase "^4.1.0" + yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" @@ -11651,33 +8098,55 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha1-wMQpJMpKqmsObaFznfshZDn53cA= +yargs@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" + integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== dependencies: - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" + find-up "^2.1.0" get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^3.1.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^2.4.1" + yargs-parser "^9.0.2" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== +yargs@^17.0.0: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yarn-audit-fix@^10.0.7: + version "10.0.7" + resolved "https://registry.yarnpkg.com/yarn-audit-fix/-/yarn-audit-fix-10.0.7.tgz#a775e30b5790eb1fdec1dea536e68fa1baa7fc35" + integrity sha512-JC6Uu/GAY/cG5k4GZDZk2MgmygiN+FY/mSM1fKY2w6myBg/qVdI/jDeOCsbsuHXf0TsMpd2LcF8yGwqvQ+X4Kw== dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" + "@types/fs-extra" "^11.0.1" + "@types/lodash-es" "^4.17.8" + "@types/semver" "^7.5.0" + "@types/yarnpkg__lockfile" "^1.1.6" + "@yarnpkg/lockfile" "^1.1.0" + chalk "^5.3.0" + commander "^11.0.0" + fast-glob "^3.3.1" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash-es "^4.17.21" + semver "^7.5.4" + synp "^1.9.10" yn@3.1.1: version "3.1.1" @@ -11688,3 +8157,27 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yulp@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/yulp/-/yulp-0.2.3.tgz#f8055cb7784b44a955d76c607f712b5911c701f8" + integrity sha512-2XX6g9hTB5OAMhPYw0Qq9inEmssVFSnq6dZxfkDQyipiZO70NgrrCTcQGt2Dw+jhUCwUkjPKTA6DF7RG7RRpKQ== + dependencies: + bn.js "^5.0.0" + ethers "^4.0.39" + moo "^0.5.1" + nearley "^2.19.0" + parse-es6-imports "^1.0.1" + rfdc "^1.1.4" + optionalDependencies: + "@hyperapp/router" "^0.7.1" + axios "^0.18.1" + ethjs-extras "0.0.7" + hyperapp "1.2.9" + regenerator-runtime "0.13.2" + solc "0.5.7" + +zksync-web3@^0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/zksync-web3/-/zksync-web3-0.14.3.tgz#64ac2a16d597464c3fc4ae07447a8007631c57c9" + integrity sha512-hT72th4AnqyLW1d5Jlv8N2B/qhEnl2NePK2A3org7tAa24niem/UAaHMkEvmWI3SF9waYUPtqAtjpf+yvQ9zvQ== diff --git a/yul/Reader4844.yul b/yul/Reader4844.yul new file mode 100644 index 00000000..ef183d79 --- /dev/null +++ b/yul/Reader4844.yul @@ -0,0 +1,39 @@ +object "Reader4844" { + code { + datacopy(0, dataoffset("runtime"), datasize("runtime")) + return(0, datasize("runtime")) + } + object "runtime" { + code { + // This contract does not accept callvalue + if callvalue() { revert(0, 0) } + + // Match against the keccak of the ABI function signature needed. + switch shr(0xe0, calldataload(0)) + // bytes4(keccak("getDataHashes()")) + case 0xe83a2d82 { + let i := 0 + for { } true { } + { + // DATAHASH opcode has hex value 0x49 + let hash := verbatim_1i_1o(hex"49", i) + if iszero(hash) { break } + mstore(add(mul(i, 32), 64), hash) + i := add(i, 1) + } + mstore(0, 32) + mstore(32, i) + return(0, add(mul(i, 32), 64)) + } + // bytes4(keccak("getBlobBaseFee()")) + case 0x1f6d6ef7 { + // BLOBBASEFEE opcode has hex value 0x4a + let blobBasefee := verbatim_0i_1o(hex"4a") + mstore(0, blobBasefee) + return(0, 32) + } + // Unknown selector (revert) + default { revert(0, 0) } + } + } +}