diff --git a/.eslintrc.js b/.eslintrc.js index 763cca5b..bcc62401 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,37 +1,37 @@ module.exports = { - env: { - browser: true, - es2021: true, - }, - extends: [ - 'next/core-web-vitals', - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react/recommended', - ], - overrides: [ - { - env: { - node: true, - }, - files: ['.eslintrc.{js,cjs}'], - parserOptions: { - sourceType: 'script', - }, - }, - ], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - }, - plugins: ['@typescript-eslint', 'react'], - rules: { - 'react/react-in-jsx-scope': 'off', - // Allow unused variables that start with an underscore. - '@typescript-eslint/no-unused-vars': [ - 'error', - { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, - ], - }, + env: { + browser: true, + es2021: true, + }, + extends: [ + 'next/core-web-vitals', + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react/recommended', + ], + overrides: [ + { + env: { + node: true, + }, + files: ['.eslintrc.{js,cjs}'], + parserOptions: { + sourceType: 'script', + }, + }, + ], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['@typescript-eslint', 'react'], + rules: { + 'react/react-in-jsx-scope': 'off', + // Allow unused variables that start with an underscore. + '@typescript-eslint/no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, + ], + }, }; diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..5267a4d5 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [mds1] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c73a12e..9c742cb4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,43 +10,40 @@ on: jobs: build: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - with: - version: latest - - - name: Use Node.js 18.x - uses: actions/setup-node@v4 - with: - node-version: 18.x - cache: 'pnpm' + - uses: oven-sh/setup-bun@v1 - name: Install dependencies - run: pnpm install + run: bun install - # This runs `next lint` before building. - name: Build - run: pnpm build + run: bun run build - fmt: + lint: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - with: - version: latest + - uses: oven-sh/setup-bun@v1 + + - name: Install dependencies + run: bun install - - name: Use Node.js 18.x - uses: actions/setup-node@v4 - with: - node-version: 18.x - cache: 'pnpm' + - name: Check linting and formatting + run: bun check + + chain-list: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 - name: Install dependencies - run: pnpm install + run: bun install + + - name: Generate list of chains for the UI + run: bun prepare-chain-data - - name: Check formatting - run: pnpm fmt:check + # When this fails, run `bun prepare-chain-data` locally and commit the changes + - name: Ensure no diff + run: git diff --exit-code script/data diff --git a/.github/workflows/fetch-data.yml b/.github/workflows/fetch-data.yml new file mode 100644 index 00000000..aea98c27 --- /dev/null +++ b/.github/workflows/fetch-data.yml @@ -0,0 +1,55 @@ +name: Fetch Chain Data + +on: + workflow_dispatch: + schedule: + - cron: '0 * * * *' + +jobs: + fetch-data: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: oven-sh/setup-bun@v1 + + - name: Install dependencies + run: bun install + + - name: Fetch data for all chains + run: bun fetch-data + + - name: Check for changes + id: diff + run: | + if git diff --exit-code --quiet script/data; then + echo "No changes detected" + else + echo "::set-output name=changed::true" + exit 1 + fi + + - name: Check for existing open issue + if: failure() && steps.diff.outputs.changed == 'true' + id: existing_issue + run: | + issue_title="Chain Data Updated" + issue_search=$(gh issue list --state open --label "data mismatch" --limit 1 --json title --jq '.[].title') + if [[ "$issue_search" == "$issue_title" ]]; then + echo "::set-output name=exists::true" + else + echo "::set-output name=exists::false" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Open issue if changes detected and no existing open issue + if: failure() && steps.diff.outputs.changed == 'true' && steps.existing_issue.outputs.exists == 'false' + run: | + title="Chain Data Updated" + body="The chain data has been updated. Please review the changes. + + Triggered by GitHub Actions run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + + gh issue create --title "$title" --body "$body" --label "data mismatch" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.prettierignore b/.prettierignore index 0db9ddd2..dd69d607 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,5 @@ .next pnpm-lock.yaml public/prism-light.css -public/prism-dark.css \ No newline at end of file +public/prism-dark.css +script/ \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2f3d1f15..0676f3a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,38 +1,45 @@ # Contributing -This repo uses [Next.js](https://github.com/vercel/next.js/), [Tailwind CSS](https://github.com/tailwindlabs/tailwindcss), [TypeScript](https://github.com/microsoft/TypeScript), [pnpm](https://github.com/pnpm/pnpm), and [viem](https://github.com/wagmi-dev/viem). To get started: +## Issues + +See the open [issues](https://github.com/mds1/evm-diff/issues) for current needs, and feel free to create new issues for bugs, feature requests, or other ideas. + +## Development + +If you are interested in working on an issue, please comment on the issue so it can be assigned to you. +Before opening a PR, run `bun check` to ensure linting and formatting are correct. + +This repo uses [Next.js](https://github.com/vercel/next.js/), [Tailwind CSS](https://github.com/tailwindlabs/tailwindcss), [TypeScript](https://github.com/microsoft/TypeScript), [bun](https://bun.sh/), and [viem](https://github.com/wagmi-dev/viem). + +To get started building the app: ```sh # Install dependencies. -pnpm install +bun install # Start the development server. -pnpm dev +bun dev # Format files. -pnpm fmt -``` - -See the open [issues](https://github.com/mds1/evm-diff/issues) for current needs, and feel free to create new issues for bugs, feature requests, or other ideas. +bun fmt -## Bounties +# Lint. +bun lint -Most issues are eligible for bounties. Some issues will have something like "(bounty: X ETH 🔴)" at the end of the issue title, where `X ETH` is the number of ETH paid out for this bounty. Others will say nothing, but are still eligible—I just haven't gotten around to assigning a payment amount. - -To apply for and claim a bounty: +# Add a new chain to the UI, format, and lint. +bun check +``` -1. If the issue has no bounty listed, message me on [Twitter](https://twitter.com/msolomon44), [Telegram](https://t.me/msolomon4), or [Discord](https://discordapp.com/users/417428774653657089) to work out an amount. -2. Leave a brief comment explaining your work plan (may be very brief is issue is well-scoped), and wait to begin work until you are assigned to the issue. If you have any questions about the issue scope, you can ask in the issue or message me. (There is no guarantee that leaving a comment means you will be assigned, if multiple people are interested in the same issue). -3. I'm not aware of any sufficient github issue bounty platforms, so there is no intermediary managing the bounties. This means you have to trust that I'll pay it out, which I will if the work meets the issue's requirements and is sufficiently high quality to close that issue. -4. Feel free to open a draft PR before completion if you have any questions. -5. Include your **OP Mainnet** payout address (all payouts will be on [OP Mainnet](https://docs.optimism.io/chain/networks#op-mainnet)) in the PR description, and once the PR is reviewed and merged I will transfer the ETH. +To fetch chain data use the below commands. +It's recommend to have an `INFURA_API_KEY` set in your environment to improve performance. -## Architecture +```bash +# Fetch all data for a single chain. +bun fetch-data [chainId] -The specs for each chain live in `src/chains/[chainName]/*.ts`. -Each chain's folder is structured similar to the [ethereum/execution-specs](https://github.com/ethereum/execution-specs) repo. -For example, the `src/ethereum/shanghai` folder in that repo contains the specs for the latest hard fork (Shanghai) on Ethereum mainnet, and information about precompiles lives in the `vm/precompiled_contracts` subfolder. -That folder contains one file for each precompile. -Since EVM Diff doesn't have to actually implement the precompiles, we just use a single file for all precompile data, which lives in this repo at `src/chains/mainnet/vm/precompiles.ts`. +# Fetch all data for all chains. +bun fetch-data -As more aspects of the execution spec are added, they should be added in such a way to continue this pattern of mirroring the structure of the execution-specs repo. +# Add a new chain to the UI, format, and lint. +bun check +``` diff --git a/README.md b/README.md index 7b28213b..8571cd2f 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,6 @@ Diff EVM-compatible chains in a friendly format. -> [!NOTE] -> This site is under active development. Check out the [issues](https://github.com/mds1/evm-diff/issues) if you'd like to contribute. - ## Overview There are lots of EVM-compatible chains, and they can differ in various, subtle ways. diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 00000000..365b3ba4 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,33 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", + "files": { + "ignore": ["archive/**/*", ".next/**/*"] + }, + "organizeImports": { + "enabled": true + }, + "formatter": { + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "suspicious": { + "noExplicitAny": "off", // Checked by eslint. + "noArrayIndexKey": "off" // Sometimes required based on array data. + }, + "a11y": { + "all": false // This causes a lot of changes, will enable it later. + }, + "complexity": { + "useSimpleNumberKeys": "off" + } + } + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 00000000..be908fb8 Binary files /dev/null and b/bun.lockb differ diff --git a/next.config.js b/next.config.js index eefa2f22..db1fea8e 100644 --- a/next.config.js +++ b/next.config.js @@ -1,10 +1,10 @@ module.exports = { - images: { - remotePatterns: [ - { - protocol: 'https', - hostname: 'icons.llamao.fi', - }, - ], - }, + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'icons.llamao.fi', + }, + ], + }, }; diff --git a/package.json b/package.json index 4e901fa4..f36bd3cc 100644 --- a/package.json +++ b/package.json @@ -1,46 +1,49 @@ { - "name": "evm-diff", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint --fix", - "fmt": "prettier --write .", - "fmt:check": "prettier --check ." - }, - "dependencies": { - "@headlessui/react": "^1.7.16", - "@heroicons/react": "^2.0.17", - "@vercel/analytics": "^1.0.1", - "@vercel/og": "^0.5.10", - "@wagmi/chains": "^0.3.1", - "next": "^13.4.12", - "next-themes": "^0.2.1", - "react": "18.2.0", - "react-dom": "18.2.0", - "react-markdown": "^8.0.7", - "viem": "^1.5.0" - }, - "devDependencies": { - "@tailwindcss/forms": "^0.5.3", - "@trivago/prettier-plugin-sort-imports": "^4.1.1", - "@types/node": "18.16.3", - "@types/react": "18.2.5", - "@types/react-dom": "18.2.3", - "@typescript-eslint/eslint-plugin": "^6.1.0", - "@typescript-eslint/parser": "^6.1.0", - "abitype": "^0.9.6", - "autoprefixer": "10.4.14", - "clipboardy": "^3.0.0", - "eslint": "8.39.0", - "eslint-config-next": "13.4.12", - "eslint-plugin-react": "^7.32.2", - "postcss": "8.4.23", - "prettier": "^2.8.8", - "prettier-plugin-tailwindcss": "^0.2.8", - "tailwindcss": "3.3.2", - "typescript": "5.0.4" - } + "name": "evm-diff", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "bun prepare-chain-data && NEXT_PUBLIC_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) next dev", + "build": "NEXT_PUBLIC_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) next build", + "start": "bun prepare-chain-data && NEXT_PUBLIC_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) next start", + "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", + "fmt": "bunx @biomejs/biome format --write .", + "check": "bun prepare-chain-data && bun lint && bun fmt", + "fetch-data": "bash script/main.sh", + "prepare-chain-data": "bash script/prepare-chain-data.sh" + }, + "dependencies": { + "@headlessui/react": "^1.7.16", + "@heroicons/react": "^2.0.17", + "@vercel/analytics": "^1.0.1", + "@vercel/og": "^0.5.10", + "@wagmi/chains": "^0.3.1", + "next": "^13.4.12", + "next-themes": "^0.2.1", + "react": "18.2.0", + "react-diff-viewer-continued": "^3.4.0", + "react-dom": "18.2.0", + "react-markdown": "^8.0.7", + "sharp": "^0.33.4", + "viem": "^1.5.0" + }, + "devDependencies": { + "@biomejs/biome": "^1.7.2", + "@tailwindcss/forms": "^0.5.3", + "@types/bun": "^1.1.0", + "@types/node": "18.16.3", + "@types/react": "18.2.5", + "@types/react-dom": "18.2.3", + "@typescript-eslint/eslint-plugin": "^6.1.0", + "@typescript-eslint/parser": "^6.1.0", + "abitype": "^0.9.6", + "autoprefixer": "10.4.14", + "clipboardy": "^3.0.0", + "eslint": "8.39.0", + "eslint-config-next": "13.4.12", + "eslint-plugin-react": "^7.32.2", + "postcss": "8.4.23", + "tailwindcss": "3.3.2", + "typescript": "5.0.4" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index ca819ec6..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,4003 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@headlessui/react': - specifier: ^1.7.16 - version: 1.7.16(react-dom@18.2.0)(react@18.2.0) - '@heroicons/react': - specifier: ^2.0.17 - version: 2.0.17(react@18.2.0) - '@vercel/analytics': - specifier: ^1.0.1 - version: 1.0.1 - '@vercel/og': - specifier: ^0.5.10 - version: 0.5.10 - '@wagmi/chains': - specifier: ^0.3.1 - version: 0.3.1(typescript@5.0.4) - next: - specifier: ^13.4.12 - version: 13.4.12(react-dom@18.2.0)(react@18.2.0) - next-themes: - specifier: ^0.2.1 - version: 0.2.1(next@13.4.12)(react-dom@18.2.0)(react@18.2.0) - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-markdown: - specifier: ^8.0.7 - version: 8.0.7(@types/react@18.2.5)(react@18.2.0) - viem: - specifier: ^1.5.0 - version: 1.5.0(typescript@5.0.4) - -devDependencies: - '@tailwindcss/forms': - specifier: ^0.5.3 - version: 0.5.3(tailwindcss@3.3.2) - '@trivago/prettier-plugin-sort-imports': - specifier: ^4.1.1 - version: 4.1.1(prettier@2.8.8) - '@types/node': - specifier: 18.16.3 - version: 18.16.3 - '@types/react': - specifier: 18.2.5 - version: 18.2.5 - '@types/react-dom': - specifier: 18.2.3 - version: 18.2.3 - '@typescript-eslint/eslint-plugin': - specifier: ^6.1.0 - version: 6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.39.0)(typescript@5.0.4) - '@typescript-eslint/parser': - specifier: ^6.1.0 - version: 6.1.0(eslint@8.39.0)(typescript@5.0.4) - abitype: - specifier: ^0.9.6 - version: 0.9.6(typescript@5.0.4) - autoprefixer: - specifier: 10.4.14 - version: 10.4.14(postcss@8.4.23) - clipboardy: - specifier: ^3.0.0 - version: 3.0.0 - eslint: - specifier: 8.39.0 - version: 8.39.0 - eslint-config-next: - specifier: 13.4.12 - version: 13.4.12(eslint@8.39.0)(typescript@5.0.4) - eslint-plugin-react: - specifier: ^7.32.2 - version: 7.32.2(eslint@8.39.0) - postcss: - specifier: 8.4.23 - version: 8.4.23 - prettier: - specifier: ^2.8.8 - version: 2.8.8 - prettier-plugin-tailwindcss: - specifier: ^0.2.8 - version: 0.2.8(@trivago/prettier-plugin-sort-imports@4.1.1)(prettier@2.8.8) - tailwindcss: - specifier: 3.3.2 - version: 3.3.2 - typescript: - specifier: 5.0.4 - version: 5.0.4 - -packages: - - /@adraffy/ens-normalize@1.9.0: - resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} - dev: false - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: true - - /@babel/code-frame@7.21.4: - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/generator@7.17.7: - resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - dev: true - - /@babel/helper-environment-visitor@7.22.1: - resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.21.9 - '@babel/types': 7.22.0 - dev: true - - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.0 - dev: true - - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.0 - dev: true - - /@babel/helper-string-parser@7.21.5: - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.22.0: - resolution: {integrity: sha512-DA65VCJRetcFmJnt9/hEmRvXNCwk0V86dxG6p6N13hzDazaLRjGdTGPGgjxZOtLuFgWzOSRX4grybmRXwQ9bSg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.17.0 - dev: true - - /@babel/runtime@7.22.0: - resolution: {integrity: sha512-TT6NB0oszYQ4oxLNUdG+FNHIc3MohXVCKA2BeyQ4WeM2VCSC6wBZ6P0Yfkdzxv+87D8Xk0LJyHeCKlWMvpZt0g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.11 - dev: true - - /@babel/template@7.21.9: - resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.22.0 - '@babel/types': 7.22.0 - dev: true - - /@babel/traverse@7.17.3: - resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/generator': 7.17.7 - '@babel/helper-environment-visitor': 7.22.1 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.22.0 - '@babel/types': 7.17.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.17.0: - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@babel/types@7.22.0: - resolution: {integrity: sha512-NtXlm3f6cNWIv003cETdlz9sss0VMNtplyatFohxWPz90AbwuhCbHbQopkGis6bG1vOunDLN0FF/4Uv5i8LFZQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.39.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.39.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@eslint-community/regexpp@4.5.1: - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.0.3: - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.5.2 - globals: 13.20.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.39.0: - resolution: {integrity: sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@headlessui/react@1.7.16(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-2MphIAZdSUacZBT6EXk8AJkj+EuvaaJbtCyHTJrPsz8inhzCl7qeNPI1uk1AUvCgWylVtdN8cVVmnhUDPxPy3g==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - dependencies: - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@heroicons/react@2.0.17(react@18.2.0): - resolution: {integrity: sha512-90GMZktkA53YbNzHp6asVEDevUQCMtxWH+2UK2S8OpnLEu7qckTJPhNxNQG52xIR1WFTwFqtH6bt7a60ZNcLLA==} - peerDependencies: - react: '>= 16' - dependencies: - react: 18.2.0 - dev: false - - /@humanwhocodes/config-array@0.11.8: - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@next/env@13.4.12: - resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==} - dev: false - - /@next/eslint-plugin-next@13.4.12: - resolution: {integrity: sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==} - dependencies: - glob: 7.1.7 - dev: true - - /@next/swc-darwin-arm64@13.4.12: - resolution: {integrity: sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-darwin-x64@13.4.12: - resolution: {integrity: sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-gnu@13.4.12: - resolution: {integrity: sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-arm64-musl@13.4.12: - resolution: {integrity: sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-gnu@13.4.12: - resolution: {integrity: sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-linux-x64-musl@13.4.12: - resolution: {integrity: sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-arm64-msvc@13.4.12: - resolution: {integrity: sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-ia32-msvc@13.4.12: - resolution: {integrity: sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@next/swc-win32-x64-msvc@13.4.12: - resolution: {integrity: sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@noble/curves@1.0.0: - resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} - dependencies: - '@noble/hashes': 1.3.0 - dev: false - - /@noble/hashes@1.3.0: - resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@pkgr/utils@2.4.1: - resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.2.12 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.5.2 - dev: true - - /@resvg/resvg-wasm@2.4.1: - resolution: {integrity: sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg==} - engines: {node: '>= 10'} - dev: false - - /@rushstack/eslint-patch@1.3.0: - resolution: {integrity: sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==} - dev: true - - /@scure/base@1.1.1: - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} - dev: false - - /@scure/bip32@1.3.0: - resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} - dependencies: - '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 - '@scure/base': 1.1.1 - dev: false - - /@scure/bip39@1.2.0: - resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} - dependencies: - '@noble/hashes': 1.3.0 - '@scure/base': 1.1.1 - dev: false - - /@shuding/opentype.js@1.4.0-beta.0: - resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} - engines: {node: '>= 8.0.0'} - hasBin: true - dependencies: - fflate: 0.7.4 - string.prototype.codepointat: 0.2.1 - dev: false - - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} - dependencies: - tslib: 2.5.2 - dev: false - - /@tailwindcss/forms@0.5.3(tailwindcss@3.3.2): - resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' - dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.2 - dev: true - - /@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8): - resolution: {integrity: sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw==} - peerDependencies: - '@vue/compiler-sfc': 3.x - prettier: 2.x - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - dependencies: - '@babel/generator': 7.17.7 - '@babel/parser': 7.22.0 - '@babel/traverse': 7.17.3 - '@babel/types': 7.17.0 - javascript-natural-sort: 0.7.1 - lodash: 4.17.21 - prettier: 2.8.8 - transitivePeerDependencies: - - supports-color - dev: true - - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - dependencies: - '@types/ms': 0.7.31 - dev: false - - /@types/hast@2.3.5: - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /@types/json-schema@7.0.12: - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /@types/ms@0.7.31: - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false - - /@types/node@18.16.3: - resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} - dev: true - - /@types/prop-types@15.7.5: - resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - - /@types/react-dom@18.2.3: - resolution: {integrity: sha512-hxXEXWxFJXbY0LMj/T69mznqOZJXNtQMqVxIiirVAZnnpeYiD4zt+lPsgcr/cfWg2VLsxZ1y26vigG03prYB+Q==} - dependencies: - '@types/react': 18.2.5 - dev: true - - /@types/react@18.2.5: - resolution: {integrity: sha512-RuoMedzJ5AOh23Dvws13LU9jpZHIc/k90AgmK7CecAYeWmSr3553L4u5rk4sWAPBuQosfT7HmTfG4Rg5o4nGEA==} - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - - /@types/scheduler@0.16.3: - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - - /@types/semver@7.5.0: - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true - - /@types/unist@2.0.7: - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - dev: false - - /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.1.0)(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/type-utils': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - '@typescript-eslint/utils': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - '@typescript-eslint/visitor-keys': 6.1.0 - debug: 4.3.4 - eslint: 8.39.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.0.4) - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.59.7 - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.4) - debug: 4.3.4 - eslint: 8.39.0 - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.0.4) - '@typescript-eslint/visitor-keys': 6.1.0 - debug: 4.3.4 - eslint: 8.39.0 - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.59.7: - resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/visitor-keys': 5.59.7 - dev: true - - /@typescript-eslint/scope-manager@6.1.0: - resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 - dev: true - - /@typescript-eslint/type-utils@6.1.0(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.0.4) - '@typescript-eslint/utils': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - debug: 4.3.4 - eslint: 8.39.0 - ts-api-utils: 1.0.1(typescript@5.0.4) - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.59.7: - resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types@6.1.0: - resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.4): - resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/visitor-keys': 5.59.7 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.0.4) - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree@6.1.0(typescript@5.0.4): - resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.1(typescript@5.0.4) - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.1.0(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.39.0) - '@types/json-schema': 7.0.12 - '@types/semver': 7.5.0 - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.0.4) - eslint: 8.39.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.59.7: - resolution: {integrity: sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.59.7 - eslint-visitor-keys: 3.4.1 - dev: true - - /@typescript-eslint/visitor-keys@6.1.0: - resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.1.0 - eslint-visitor-keys: 3.4.1 - dev: true - - /@vercel/analytics@1.0.1: - resolution: {integrity: sha512-Ux0c9qUfkcPqng3vrR0GTrlQdqNJ2JREn/2ydrVuKwM3RtMfF2mWX31Ijqo1opSjNAq6rK76PwtANw6kl6TAow==} - dev: false - - /@vercel/og@0.5.10: - resolution: {integrity: sha512-Iwo02EZm/MgEMI9MQjuvfdfsTt/IrhH6xGi0EWBnro72LcPKoEDEn/S/fEh8ut3LNMOmrRAjceXEhTfFqQW7sw==} - engines: {node: '>=16'} - dependencies: - '@resvg/resvg-wasm': 2.4.1 - satori: 0.10.2 - yoga-wasm-web: 0.3.3 - dev: false - - /@wagmi/chains@0.3.1(typescript@5.0.4): - resolution: {integrity: sha512-NN5qziBLFeXnx0+3ywdiKKXUSW4H73Wc1jRrygl9GKXVPawU0GBMudwXUfV7VOu6E9vmG7Arj0pVsEwq63b2Ew==} - peerDependencies: - typescript: '>=4.9.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.0.4 - dev: false - - /@wagmi/chains@1.6.0(typescript@5.0.4): - resolution: {integrity: sha512-5FRlVxse5P4ZaHG3GTvxwVANSmYJas1eQrTBHhjxVtqXoorm0aLmCHbhmN8Xo1yu09PaWKlleEvfE98yH4AgIw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.0.4 - dev: false - - /abitype@0.9.3(typescript@5.0.4): - resolution: {integrity: sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.0.4 - dev: false - - /abitype@0.9.6(typescript@5.0.4): - resolution: {integrity: sha512-bnx3yBJ9BhF5SWlIy+fMRprm2w5VhOrDj5bh0K9Aj40AfgQoICuIolm3GmSIhE+lE8qTqRv9PmTg3C9b25vmag==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.0.4 - dev: true - - /acorn-jsx@5.3.2(acorn@8.8.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.8.2 - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - dependencies: - deep-equal: 2.2.1 - dev: true - - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - dev: true - - /array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.1 - is-string: 1.0.7 - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 - dev: true - - /ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: true - - /autoprefixer@10.4.14(postcss@8.4.23): - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.5 - caniuse-lite: 1.0.30001489 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.23 - postcss-value-parser: 4.2.0 - dev: true - - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: true - - /axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} - engines: {node: '>=4'} - dev: true - - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - dependencies: - deep-equal: 2.2.1 - dev: true - - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - dev: false - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.51 - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browserslist@4.21.5: - resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001489 - electron-to-chromium: 1.4.409 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.5) - dev: true - - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false - - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: true - - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false - - /caniuse-lite@1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false - - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-background-parser@0.1.0: - resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - dev: false - - /css-box-shadow@1.0.0-3: - resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - dev: false - - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false - - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - dev: false - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true - - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: false - - /deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.2 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.1 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.9 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.1.1 - titleize: 3.0.0 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: true - - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - dev: true - - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true - - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /electron-to-chromium@1.4.409: - resolution: {integrity: sha512-+2mRCBG9dR66sprh2dLuO6vr+O1xqHXvhmMglfut3OmfeUVRUho2nZYxxD9pG6G4PLDkZeqhlA/Gk6LpjVSHag==} - dev: true - - /emoji-regex@10.2.1: - resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - dev: false - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.1 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.10 - is-weakref: 1.0.2 - object-inspect: 1.12.3 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 - dev: true - - /es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - dev: true - - /es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - dev: true - - /es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-next@13.4.12(eslint@8.39.0)(typescript@5.0.4): - resolution: {integrity: sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@next/eslint-plugin-next': 13.4.12 - '@rushstack/eslint-patch': 1.3.0 - '@typescript-eslint/parser': 5.59.7(eslint@8.39.0)(typescript@5.0.4) - eslint: 8.39.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint@8.39.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.39.0) - eslint-plugin-react: 7.32.2(eslint@8.39.0) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.39.0) - typescript: 5.0.4 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} - dependencies: - debug: 3.2.7 - is-core-module: 2.12.1 - resolve: 1.22.2 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0): - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.4 - enhanced-resolve: 5.14.1 - eslint: 8.39.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.39.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0)(eslint@8.39.0) - get-tsconfig: 4.5.0 - globby: 13.1.4 - is-core-module: 2.12.1 - is-glob: 4.0.3 - synckit: 0.8.5 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.39.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.59.7(eslint@8.39.0)(typescript@5.0.4) - debug: 3.2.7 - eslint: 8.39.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.7)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0) - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint@8.39.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - debug: 3.2.7 - eslint: 8.39.0 - eslint-import-resolver-node: 0.3.7 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.1.0)(eslint@8.39.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - array-includes: 3.1.6 - array.prototype.flat: 1.3.1 - array.prototype.flatmap: 1.3.1 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.39.0 - eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0)(eslint-import-resolver-node@0.3.7)(eslint@8.39.0) - has: 1.0.3 - is-core-module: 2.12.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.2 - semver: 6.3.0 - tsconfig-paths: 3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.39.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': 7.22.0 - aria-query: 5.1.3 - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - ast-types-flow: 0.0.7 - axe-core: 4.7.2 - axobject-query: 3.1.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.39.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - semver: 6.3.0 - dev: true - - /eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.39.0): - resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.39.0 - dev: true - - /eslint-plugin-react@7.32.2(eslint@8.39.0): - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - array-includes: 3.1.6 - array.prototype.flatmap: 1.3.1 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - eslint: 8.39.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 - minimatch: 3.1.2 - object.entries: 1.1.6 - object.fromentries: 2.0.6 - object.hasown: 1.1.2 - object.values: 1.1.6 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.0 - string.prototype.matchall: 4.0.8 - dev: true - - /eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.39.0: - resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.39.0) - '@eslint-community/regexpp': 4.5.1 - '@eslint/eslintrc': 2.0.3 - '@eslint/js': 8.39.0 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.0 - eslint-visitor-keys: 3.4.1 - espree: 9.5.2 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.20.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.4.0 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.4.1 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: true - - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - dev: false - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.7 - dev: true - - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - dev: true - - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true - - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: false - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - dependencies: - define-properties: 1.2.0 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.2.1 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false - - /hex-rgb@4.3.0: - resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} - engines: {node: '>=6'} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false - - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - - /is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.10 - dev: true - - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true - - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true - - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: true - - /is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true - - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - dev: true - - /is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - dev: true - - /is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true - - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - dev: true - - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - dev: true - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /isomorphic-ws@5.0.0(ws@8.12.0): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - dependencies: - ws: 8.12.0 - dev: false - - /javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - dev: true - - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - dev: true - - /js-sdsl@4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: true - - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} - dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 - dev: true - - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false - - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true - - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} - dependencies: - language-subtag-registry: 0.3.22 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true - - /linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-definitions: 5.1.2 - micromark-util-sanitize-uri: 1.2.0 - trim-lines: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - dev: false - - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - dependencies: - '@types/mdast': 3.0.12 - dev: false - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false - - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false - - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: false - - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - dev: false - - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: false - - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - dependencies: - micromark-util-symbol: 1.1.0 - dev: false - - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - dependencies: - micromark-util-types: 1.1.0 - dev: false - - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - dev: false - - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - dev: false - - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - dev: false - - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: false - - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - dependencies: - '@types/debug': 4.1.8 - debug: 4.3.4 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - - /mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} - hasBin: true - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /next-themes@0.2.1(next@13.4.12)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - dependencies: - next: 13.4.12(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /next@13.4.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==} - engines: {node: '>=16.8.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - fibers: '>= 3.1.0' - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - fibers: - optional: true - sass: - optional: true - dependencies: - '@next/env': 13.4.12 - '@swc/helpers': 0.5.1 - busboy: 1.6.0 - caniuse-lite: 1.0.30001489 - postcss: 8.4.14 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(react@18.2.0) - watchpack: 2.4.0 - zod: 3.21.4 - optionalDependencies: - '@next/swc-darwin-arm64': 13.4.12 - '@next/swc-darwin-x64': 13.4.12 - '@next/swc-linux-arm64-gnu': 13.4.12 - '@next/swc-linux-arm64-musl': 13.4.12 - '@next/swc-linux-x64-gnu': 13.4.12 - '@next/swc-linux-x64-musl': 13.4.12 - '@next/swc-win32-arm64-msvc': 13.4.12 - '@next/swc-win32-ia32-msvc': 13.4.12 - '@next/swc-win32-x64-msvc': 13.4.12 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: true - - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true - - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - dev: true - - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true - - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - dev: true - - /object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-css-color@0.2.1: - resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} - dependencies: - color-name: 1.1.4 - hex-rgb: 4.3.0 - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - - /postcss-import@15.1.0(postcss@8.4.23): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.23 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.2 - dev: true - - /postcss-js@4.0.1(postcss@8.4.23): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.23 - dev: true - - /postcss-load-config@4.0.1(postcss@8.4.23): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 2.1.0 - postcss: 8.4.23 - yaml: 2.3.1 - dev: true - - /postcss-nested@6.0.1(postcss@8.4.23): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.23 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: false - - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-plugin-tailwindcss@0.2.8(@trivago/prettier-plugin-sort-imports@4.1.1)(prettier@2.8.8): - resolution: {integrity: sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==} - engines: {node: '>=12.17.0'} - peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@shufo/prettier-plugin-blade': '*' - '@trivago/prettier-plugin-sort-imports': '*' - prettier: '>=2.2.0' - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-style-order: '*' - prettier-plugin-svelte: '*' - prettier-plugin-twig-melody: '*' - peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': - optional: true - '@prettier/plugin-pug': - optional: true - '@shopify/prettier-plugin-liquid': - optional: true - '@shufo/prettier-plugin-blade': - optional: true - '@trivago/prettier-plugin-sort-imports': - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-css-order: - optional: true - prettier-plugin-import-sort: - optional: true - prettier-plugin-jsdoc: - optional: true - prettier-plugin-organize-attributes: - optional: true - prettier-plugin-organize-imports: - optional: true - prettier-plugin-style-order: - optional: true - prettier-plugin-svelte: - optional: true - prettier-plugin-twig-melody: - optional: true - dependencies: - '@trivago/prettier-plugin-sort-imports': 4.1.1(prettier@2.8.8) - prettier: 2.8.8 - dev: true - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true - - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - /property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - dev: false - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false - - /react-markdown@8.0.7(@types/react@18.2.5)(react@18.2.0): - resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - dependencies: - '@types/hast': 2.3.5 - '@types/prop-types': 15.7.5 - '@types/react': 18.2.5 - '@types/unist': 2.0.7 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.2.0 - react: 18.2.0 - react-is: 18.2.0 - remark-parse: 10.0.2 - remark-rehype: 10.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.2 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - dev: false - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true - - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - dev: true - - /remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - dependencies: - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - dependencies: - mri: 1.2.0 - dev: false - - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - dev: true - - /satori@0.10.2: - resolution: {integrity: sha512-38povLat5QMuKiKBudM/oIk+a0Z5tEfHh8oD/bsh58L0jlOXxfuhAVpDtlG3M0g5FGLajIV0LaKQftXtaYoSUQ==} - engines: {node: '>=16'} - dependencies: - '@shuding/opentype.js': 1.4.0-beta.0 - css-background-parser: 0.1.0 - css-box-shadow: 1.0.0-3 - css-to-react-native: 3.2.0 - emoji-regex: 10.2.1 - escape-html: 1.0.3 - linebreak: 1.1.0 - parse-css-color: 0.2.1 - postcss-value-parser: 4.2.0 - yoga-wasm-web: 0.3.3 - dev: false - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - dev: true - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true - - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - dependencies: - internal-slot: 1.0.5 - dev: true - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false - - /string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - dev: false - - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.1 - has-symbols: 1.0.3 - internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.0 - side-channel: 1.0.4 - dev: true - - /string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /style-to-object@0.4.2: - resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} - dependencies: - inline-style-parser: 0.1.1 - dev: false - - /styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - client-only: 0.0.1 - react: 18.2.0 - dev: false - - /sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.5 - ts-interface-checker: 0.1.13 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.4.1 - tslib: 2.5.2 - dev: true - - /tailwindcss@3.3.2: - resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.2.12 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.18.2 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.23 - postcss-import: 15.1.0(postcss@8.4.23) - postcss-js: 4.0.1(postcss@8.4.23) - postcss-load-config: 4.0.1(postcss@8.4.23) - postcss-nested: 6.0.1(postcss@8.4.23) - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - resolve: 1.22.2 - sucrase: 3.32.0 - transitivePeerDependencies: - - ts-node - dev: true - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: false - - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false - - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false - - /ts-api-utils@1.0.1(typescript@5.0.4): - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.0.4 - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} - - /tsutils@3.21.0(typescript@5.0.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.0.4 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - dev: true - - /unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - dependencies: - pako: 0.2.9 - tiny-inflate: 1.0.3 - dev: false - - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - dependencies: - '@types/unist': 2.0.7 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 5.3.7 - dev: false - - /unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - dev: false - - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - dependencies: - '@types/unist': 2.0.7 - dev: false - - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - dev: false - - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - dev: false - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true - - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - dev: false - - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - dependencies: - '@types/unist': 2.0.7 - unist-util-stringify-position: 3.0.3 - dev: false - - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - dependencies: - '@types/unist': 2.0.7 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - dev: false - - /viem@1.5.0(typescript@5.0.4): - resolution: {integrity: sha512-+SVCVaXJRR+fE9q6Sf6q9droB6TunPGY1JfwB3uTdxwWrkgr3qq/NbXaRdtEk+TyaOEjzZQr7t6vUzjOL0zL0Q==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@adraffy/ens-normalize': 1.9.0 - '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 - '@scure/bip32': 1.3.0 - '@scure/bip39': 1.2.0 - '@wagmi/chains': 1.6.0(typescript@5.0.4) - abitype: 0.9.3(typescript@5.0.4) - isomorphic-ws: 5.0.0(ws@8.12.0) - typescript: 5.0.4 - ws: 8.12.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - dev: false - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: false - - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - dev: true - - /which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - dev: true - - /which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.10 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws@8.12.0: - resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - dev: false - - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: false diff --git a/postcss.config.js b/postcss.config.js index 12a703d9..e873f1a4 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, }; diff --git a/script/.env.example b/script/.env.example new file mode 100644 index 00000000..78816600 --- /dev/null +++ b/script/.env.example @@ -0,0 +1 @@ +INFURA_API_KEY= \ No newline at end of file diff --git a/script/README.md b/script/README.md new file mode 100644 index 00000000..c41d606b --- /dev/null +++ b/script/README.md @@ -0,0 +1,5 @@ +# script + +This directory contains the scripts to fetch chain data and generate the output files. + +See the [CONTRIBUTING.md](../CONTRIBUTING.md) for more information on how to run these scripts. diff --git a/script/archive/fetch-abi.ts b/script/archive/fetch-abi.ts new file mode 100644 index 00000000..e9a96562 --- /dev/null +++ b/script/archive/fetch-abi.ts @@ -0,0 +1,97 @@ +// Given an Etherscan URL, fetch the ABI and convert it to viem's human readable format. +// Example usage: +// bun script/fetch-abi.ts https://arbiscan.io/address/0x0000000000000000000000000000000000000064 +import { formatAbi } from 'abitype'; +// import clipboardy from 'clipboardy'; +import type { Address } from 'viem'; + +type ChainConfig = { + name: string; + urlPart: string; + apiPrefix: string; + apiKey: string; +}; + +const chains: Record = { + arbitrum: { + name: 'Arbitrum', + urlPart: 'arbiscan.io', + apiPrefix: 'api.', + apiKey: process.env.ARBISCAN_API_KEY!, + }, + optimism: { + name: 'Optimism', + urlPart: 'optimistic.etherscan.io', + apiPrefix: 'api-', + apiKey: process.env.OPTIMISM_API_KEY!, + }, +}; + +async function getAbi(apiUrl: string) { + // Fetch the ABI from the API. + const response = await fetch(apiUrl); + const data = await response.json(); + if (data.status !== '1') throw new Error('API request failed: ' + data.message); + + // Return formatted ABI. + const abi = JSON.parse(data.result); + return formatAbi(abi); +} + +function getChain(url: string): ChainConfig { + for (const chainName in chains) { + if (url.includes(chains[chainName].urlPart)) { + const chain = chains[chainName]; + if (!chain.apiKey) throw new Error(`API key not found for chain ${chainName}`); + return chain; + } + } + throw new Error(`Chain not recognized from URL: ${url}`); +} + +function getEtherscanUrl(chain: ChainConfig, address: Address, kind: 'abi' | 'source') { + const query = kind === 'abi' ? 'getabi' : 'getsourcecode'; + const { apiPrefix, apiKey, urlPart } = chain; + return `https://${apiPrefix}${urlPart}/api?module=contract&action=${query}&address=${address}&apikey=${apiKey}`; +} + +async function main() { + // Use the first argument as the URL and get the contract address from it. + const url = process.argv[2]; + if (!url) throw new Error('URL is required'); + + // Get the address and chain from the URL. + const address = url.split('/').pop() as Address; + if (!address) throw new Error('Could not parse address from URL'); + const chain = getChain(url); + + // Get the ABI. + const abiRequestUrl = getEtherscanUrl(chain, address, 'abi'); + const formattedAbi1 = await getAbi(abiRequestUrl); + + // Now we check if it's a proxy contract. + // Note that for some optimism predeploys that are proxies, this does not return the + // implementation address, so it's not guaranteed to work. + const sourceRequestUrl = getEtherscanUrl(chain, address, 'source'); + const sourceResponse = await fetch(sourceRequestUrl); + const data = await sourceResponse.json(); + if (data.status !== '1') throw new Error('API request failed: ' + data.message); + const implementationAddress = data.result[0].Implementation as '' | Address; + + // If it is a proxy contract, fetch the implementation ABI. + let formattedAbi2; + if (implementationAddress) { + const implAbiRequestUrl = getEtherscanUrl(chain, implementationAddress, 'abi'); + formattedAbi2 = await getAbi(implAbiRequestUrl); + } + + // If we have a second ABI, separate the two with a divider so they can be easily distinguished. + const fullAbi = formattedAbi2 ? formattedAbi1.concat('--------', formattedAbi2) : formattedAbi1; + + // Copy the formatted ABI to the clipboard. + // clipboardy.writeSync(JSON.stringify(fullAbi)); + const kind = formattedAbi2 ? ' proxy and implementation ' : ' '; + console.log(`✅ Copied${kind}ABI to clipboard for ${chain.name} contract ${address}`); +} + +main().catch(console.error); diff --git a/script/optimism-difficulty.sh b/script/archive/optimism-difficulty.sh similarity index 100% rename from script/optimism-difficulty.sh rename to script/archive/optimism-difficulty.sh diff --git a/script/archive/precompile-check.ts b/script/archive/precompile-check.ts new file mode 100644 index 00000000..283eaa45 --- /dev/null +++ b/script/archive/precompile-check.ts @@ -0,0 +1,86 @@ +// Docs sometimes conflate precompiles and predeploys, but we want to differentiate them. We define +// a precompile as an address that has no code (or symbolic code like `0xfe`) and a predeploy has +// executable bytecode. For each chain this script defines a list of addresses and checks whether +// they are precompiles or predeploys, and prints the result. +// Example usage: +// bun script/precompile-check.ts optimism +import { http, type Address, createPublicClient, getAddress } from 'viem'; +import { type Chain, arbitrum, optimism } from 'viem/chains'; + +type ChainConfig = { + addresses: Address[]; + chain: Chain; + rpcUrl: string; +}; + +const addressMap: Record = { + arbitrum: { + chain: arbitrum, + rpcUrl: process.env.ARBITRUM_RPC_URL!, + addresses: [ + '0x5288c571Fd7aD117beA99bF60FE0846C4E84F933', + '0x09e9222E96E7B4AE2a407B98d48e330053351EEe', + '0x096760F208390250649E3e8763348E783AEF5562', + '0x6c411aD3E74De3E7Bd422b94A27770f5B86C623B', + '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', + '0xd570aCE65C43af47101fC6250FD6fC63D1c22a86', + '0x0000000000000000000000000000000000000064', + '0x000000000000000000000000000000000000006E', + '0x000000000000000000000000000000000000006C', + '0x0000000000000000000000000000000000000066', + '0x000000000000000000000000000000000000006F', + '0x00000000000000000000000000000000000000C8', + '0x0000000000000000000000000000000000000067', + '0x0000000000000000000000000000000000000065', + '0x0000000000000000000000000000000000000070', + '0x000000000000000000000000000000000000006b', + '0x000000000000000000000000000000000000006D', + '0x0000000000000000000000000000000000000068', + ], + }, + optimism: { + chain: optimism, + rpcUrl: process.env.OPTIMISM_RPC_URL!, + addresses: [ + '0x4200000000000000000000000000000000000000', + '0x4200000000000000000000000000000000000002', + '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', + '0x4200000000000000000000000000000000000006', + '0x4200000000000000000000000000000000000007', + '0x4200000000000000000000000000000000000010', + '0x4200000000000000000000000000000000000011', + '0x4200000000000000000000000000000000000012', + '0x4200000000000000000000000000000000000013', + '0x420000000000000000000000000000000000000F', + '0x4200000000000000000000000000000000000042', + '0x4200000000000000000000000000000000000015', + '0x4200000000000000000000000000000000000016', + '0x4200000000000000000000000000000000000014', + '0x4200000000000000000000000000000000000017', + '0x4200000000000000000000000000000000000018', + '0x4200000000000000000000000000000000000019', + '0x420000000000000000000000000000000000001a', + ], + }, +}; + +async function main() { + const chainName = process.argv[2]; + const chainData = addressMap[chainName]; + const { chain, rpcUrl, addresses } = chainData; + if (!addresses) throw new Error(`Unknown chain: ${chainName}`); + if (!rpcUrl) throw new Error(`Undefined RPC URL for chain: ${chainName}`); + + const transport = http(rpcUrl, { batch: true }); + const client = createPublicClient({ chain, transport }); + + const promises = addresses.map((address) => client.getBytecode({ address })); + const codes = await Promise.all(promises); + const kinds = codes.map((code) => + code === '0x' || code === '0xfe' ? 'precompile' : 'predeploy', + ); + + addresses.forEach((address, i) => console.log(`${getAddress(address)} ${kinds[i]}`)); +} + +main().catch(console.error); diff --git a/script/checks/deployed-contracts.ts b/script/checks/deployed-contracts.ts new file mode 100644 index 00000000..91e4f478 --- /dev/null +++ b/script/checks/deployed-contracts.ts @@ -0,0 +1,33 @@ +import { type Address, type Hex, type PublicClient, keccak256 } from 'viem'; + +const NO_CODE_HASH = keccak256('0x'); + +export async function checkDeployedContracts( + client: PublicClient, +): Promise<{ name: string; address: Address; codeHash: Hex; hasCode: boolean }[]> { + const result = deployedContracts.map(async ({ name, address }) => { + const code = await client.getBytecode({ address }); + const codeHash = (code && keccak256(code)) || NO_CODE_HASH; + return { name, address, codeHash, hasCode: codeHash !== NO_CODE_HASH }; + }); + return await Promise.all(result); +} + +export const deployedContracts: { name: string; address: Address }[] = [ + // Deterministic Deployer contracts. + { name: 'CreateX', address: '0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed' }, + { + name: "Arachnid's Deterministic Deployment Proxy", + address: '0x4e59b44847b379578588920cA78FbF26c0B4956C', + }, + { name: 'Create2Deployer', address: '0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2' }, + // ERC-4337. + { name: 'ERC-4337 Entry Point v0.6', address: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' }, + { + name: 'ERC-4337 Simple Account Factory v0.6', + address: '0x9406Cc6185a346906296840746125a0E44976454', + }, + // Other + { name: 'Multicall3', address: '0xcA11bde05977b3631167028862bE2a173976CA11' }, + { name: 'Permit2', address: '0x000000000022D473030F116dDEE9F6B43aC78BA3' }, +]; diff --git a/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts new file mode 100644 index 00000000..b4f0b6d8 --- /dev/null +++ b/script/checks/evm-stack-addresses.ts @@ -0,0 +1,89 @@ +import { type Address, type Hex, type PublicClient, keccak256 } from 'viem'; + +export type EVMStack = 'OP' | 'Orbit'; + +type StackAccount = { + name: string; + address: Address; + kind: 'Predeploy' | 'Precompile'; +}; + +export type EVMStackResult = StackAccount & { + codeHash: Hex; + exists: boolean; +}; + +const NO_CODE_HASH = keccak256('0x'); +const INVALID_CODE_HASH = keccak256('0xfe'); + +export async function checkEvmStackAddresses( + client: PublicClient, +): Promise> { + const result: Record = { + OP: [], + Orbit: [], + }; + + for (const stack of Object.keys(evmStackAddresses)) { + const stackPredploys = evmStackAddresses[stack as EVMStack]; + const res = stackPredploys.map(async ({ name, address, kind }) => { + const code = await client.getBytecode({ address }); + const codeHash = (code && keccak256(code)) || NO_CODE_HASH; + const exists = evmStackAddressExists(stack as EVMStack, codeHash); + return { name, address, kind, codeHash, exists }; + }); + result[stack as EVMStack] = await Promise.all(res); + } + + return result; +} + +// Check existence of an account for a given EVM Stack as follows: +// - OP Stack: These are predeploys, so standard EVM bytecode should exist at the address. +// Therefore we check for existence of code as normal. +// - Orbit Stack: These are precompiles, but unlike standard EVM precompiles, they have code +// of 0xfe, instead of empty code. Therefore we don't need to define test calldata and +// expected return values, and instead just confirm the code is 0xfe. +function evmStackAddressExists(stack: EVMStack, codeHash: Hex): boolean { + if (stack === 'OP' && codeHash !== NO_CODE_HASH && codeHash !== INVALID_CODE_HASH) return true; + if (stack === 'Orbit' && codeHash === INVALID_CODE_HASH) return true; + return false; +} + +// Maps an EVM Stack to the expected predeploys for that stack. +// biome-ignore format: Easier to skim and update with one line per address. +export const evmStackAddresses: Record = { + OP: [ + { address: '0x4200000000000000000000000000000000000000', name: 'LegacyMessagePasser', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000002', name: 'DeployerWhitelist', kind: 'Predeploy' }, + { address: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', name: 'LegacyERC20ETH', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000006', name: 'WETH9', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000007', name: 'L2CrossDomainMessenger', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000010', name: 'L2StandardBridge', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000011', name: 'SequencerFeeVault', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000012', name: 'OptimismMintableERC20Factory', kind: 'Predeploy', }, + { address: '0x4200000000000000000000000000000000000013', name: 'L1BlockNumber', kind: 'Predeploy' }, + { address: '0x420000000000000000000000000000000000000F', name: 'GasPriceOracle', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000042', name: 'GovernanceToken', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000015', name: 'L1Block', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000016', name: 'L2ToL1MessagePasser', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000014', name: 'L2ERC721Bridge', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000017', name: 'OptimismMintableERC721Factory', kind: 'Predeploy', }, + { address: '0x4200000000000000000000000000000000000018', name: 'ProxyAdmin', kind: 'Predeploy' }, + { address: '0x4200000000000000000000000000000000000019', name: 'BaseFeeVault', kind: 'Predeploy' }, + { address: '0x420000000000000000000000000000000000001a', name: 'L1FeeVault', kind: 'Predeploy' }, + ], + Orbit: [ + { address: '0x0000000000000000000000000000000000000066', name: 'ArbAddressTable', kind: 'Predeploy'}, + { address: '0x000000000000000000000000000000000000006D', name: 'ArbAggregator', kind: 'Predeploy'}, + { address: '0x0000000000000000000000000000000000000068', name: 'ArbFunctionTable', kind: 'Predeploy'}, + { address: '0x000000000000000000000000000000000000006C', name: 'ArbGasInfo', kind: 'Predeploy'}, + { address: '0x0000000000000000000000000000000000000065', name: 'ArbInfo', kind: 'Predeploy'}, + { address: '0x0000000000000000000000000000000000000070', name: 'ArbOwner', kind: 'Predeploy'}, + { address: '0x000000000000000000000000000000000000006b', name: 'ArbOwnerPublic', kind: 'Predeploy'}, + { address: '0x000000000000000000000000000000000000006E', name: 'ArbRetryableTx', kind: 'Predeploy'}, + { address: '0x000000000000000000000000000000000000006F', name: 'ArbStatistics', kind: 'Predeploy'}, + { address: '0x0000000000000000000000000000000000000064', name: 'ArbSys', kind: 'Predeploy'}, + { address: '0x00000000000000000000000000000000000000C8', name: 'NodeInterface', kind: 'Predeploy'}, + ], +}; diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts new file mode 100644 index 00000000..d636d037 --- /dev/null +++ b/script/checks/opcodes.ts @@ -0,0 +1,195 @@ +import { type Hex, type PublicClient, toHex } from 'viem'; + +type Opcode = number; +type CallError = { details: string }; + +export async function checkOpcodes( + client: PublicClient, +): Promise<{ number: Hex; name: string; supported: boolean | string }[]> { + const opcodes = Array.from(Array(0xff + 1).keys()); + const supported = await Promise.all(opcodes.map(async (opcode) => checkOpcode(opcode, client))); + + const result: { number: Hex; name: string; supported: boolean | string }[] = []; + opcodes.forEach((opcode, index) => { + // For brevity, omit opcodes that are not known and not supported. All known opcodes are + // included. Supported but unknown opcodes are included with the name 'unknown'. + const shouldOmit = !knownOpcodes[opcode] && !supported[index]; + if (!shouldOmit) { + result.push({ + number: toHex(opcode, { size: 1 }), + name: knownOpcodes[opcode] || 'unknown', + supported: supported[index], + }); + } + }); + return result; +} + +async function checkOpcode(opcode: Opcode, client: PublicClient): Promise { + try { + await client.call({ data: toHex(opcode, { size: 1 }) }); + return true; // Call succeeded so opcode is supported. + } catch (e: unknown) { + const err = e as CallError; + // TODO These might be specific to the node implementation, can this be more robust? + if (opcode === 0xfe && err.details === 'invalid opcode: INVALID') return true; // Designated invalid opcode. + if (err.details.includes('stack underflow')) return true; // Implies opcode is supported. + if (err.details.includes('not defined')) return false; + if (err.details.includes('not supported')) return false; + if (err.details.includes('invalid opcode')) return false; + + throw new Error(`Unexpected error: ${err}`); + } +} + +export const knownOpcodes: Record = { + 0x00: 'STOP', + 0x01: 'ADD', + 0x02: 'MUL', + 0x03: 'SUB', + 0x04: 'DIV', + 0x05: 'SDIV', + 0x06: 'MOD', + 0x07: 'SMOD', + 0x08: 'ADDMOD', + 0x09: 'MULMOD', + 0x0a: 'EXP', + 0x0b: 'SIGNEXTEND', + 0x10: 'LT', + 0x11: 'GT', + 0x12: 'SLT', + 0x13: 'SGT', + 0x14: 'EQ', + 0x15: 'ISZERO', + 0x16: 'AND', + 0x17: 'OR', + 0x18: 'XOR', + 0x19: 'NOT', + 0x1a: 'BYTE', + 0x1b: 'SHL', + 0x1c: 'SHR', + 0x1d: 'SAR', + 0x20: 'KECCAK256', + 0x30: 'ADDRESS', + 0x31: 'BALANCE', + 0x32: 'ORIGIN', + 0x33: 'CALLER', + 0x34: 'CALLVALUE', + 0x35: 'CALLDATALOAD', + 0x36: 'CALLDATASIZE', + 0x37: 'CALLDATACOPY', + 0x38: 'CODESIZE', + 0x39: 'CODECOPY', + 0x3a: 'GASPRICE', + 0x3b: 'EXTCODESIZE', + 0x3c: 'EXTCODECOPY', + 0x3d: 'RETURNDATASIZE', + 0x3e: 'RETURNDATACOPY', + 0x3f: 'EXTCODEHASH', + 0x40: 'BLOCKHASH', + 0x41: 'COINBASE', + 0x42: 'TIMESTAMP', + 0x43: 'NUMBER', + 0x44: 'PREVRANDAO', + 0x45: 'GASLIMIT', + 0x46: 'CHAINID', + 0x47: 'SELFBALANCE', + 0x48: 'BASEFEE', + 0x49: 'BLOBHASH', + 0x4a: 'BLOBBASEFEE', + 0x50: 'POP', + 0x51: 'MLOAD', + 0x52: 'MSTORE', + 0x53: 'MSTORE8', + 0x54: 'SLOAD', + 0x55: 'SSTORE', + 0x56: 'JUMP', + 0x57: 'JUMPI', + 0x58: 'PC', + 0x59: 'MSIZE', + 0x5a: 'GAS', + 0x5b: 'JUMPDEST', + 0x5c: 'TLOAD', + 0x5d: 'TSTORE', + 0x5e: 'MCOPY', + 0x5f: 'PUSH0', + 0x60: 'PUSH1', + 0x61: 'PUSH2', + 0x62: 'PUSH3', + 0x63: 'PUSH4', + 0x64: 'PUSH5', + 0x65: 'PUSH6', + 0x66: 'PUSH7', + 0x67: 'PUSH8', + 0x68: 'PUSH9', + 0x69: 'PUSH10', + 0x6a: 'PUSH11', + 0x6b: 'PUSH12', + 0x6c: 'PUSH13', + 0x6d: 'PUSH14', + 0x6e: 'PUSH15', + 0x6f: 'PUSH16', + 0x70: 'PUSH17', + 0x71: 'PUSH18', + 0x72: 'PUSH19', + 0x73: 'PUSH20', + 0x74: 'PUSH21', + 0x75: 'PUSH22', + 0x76: 'PUSH23', + 0x77: 'PUSH24', + 0x78: 'PUSH25', + 0x79: 'PUSH26', + 0x7a: 'PUSH27', + 0x7b: 'PUSH28', + 0x7c: 'PUSH29', + 0x7d: 'PUSH30', + 0x7e: 'PUSH31', + 0x7f: 'PUSH32', + 0x80: 'DUP1', + 0x81: 'DUP2', + 0x82: 'DUP3', + 0x83: 'DUP4', + 0x84: 'DUP5', + 0x85: 'DUP6', + 0x86: 'DUP7', + 0x87: 'DUP8', + 0x88: 'DUP9', + 0x89: 'DUP10', + 0x8a: 'DUP11', + 0x8b: 'DUP12', + 0x8c: 'DUP13', + 0x8d: 'DUP14', + 0x8e: 'DUP15', + 0x8f: 'DUP16', + 0x90: 'SWAP1', + 0x91: 'SWAP2', + 0x92: 'SWAP3', + 0x93: 'SWAP4', + 0x94: 'SWAP5', + 0x95: 'SWAP6', + 0x96: 'SWAP7', + 0x97: 'SWAP8', + 0x98: 'SWAP9', + 0x99: 'SWAP10', + 0x9a: 'SWAP11', + 0x9b: 'SWAP12', + 0x9c: 'SWAP13', + 0x9d: 'SWAP14', + 0x9e: 'SWAP15', + 0x9f: 'SWAP16', + 0xa0: 'LOG0', + 0xa1: 'LOG1', + 0xa2: 'LOG2', + 0xa3: 'LOG3', + 0xa4: 'LOG4', + 0xf0: 'CREATE', + 0xf1: 'CALL', + 0xf2: 'CALLCODE', + 0xf3: 'RETURN', + 0xf4: 'DELEGATECALL', + 0xf5: 'CREATE2', + 0xfa: 'STATICCALL', + 0xfd: 'REVERT', + 0xfe: 'INVALID', + 0xff: 'SELFDESTRUCT', +}; diff --git a/script/checks/precompiles.ts b/script/checks/precompiles.ts new file mode 100644 index 00000000..83508339 --- /dev/null +++ b/script/checks/precompiles.ts @@ -0,0 +1,114 @@ +import type { Address, Hex, PublicClient } from 'viem'; + +export async function checkPrecompiles( + client: PublicClient, +): Promise<{ name: string; address: Address; implemented: boolean }[]> { + const result = precompiles.map(async ({ name, address, testCalldata, expectedResponse }) => { + try { + const res = await client.call({ to: address, data: testCalldata }); + const implemented = res.data === expectedResponse; + return { name, address, implemented }; + } catch (e) { + // If the call fails, the precompile is not implemented. + return { name, address, implemented: false }; + } + }); + return await Promise.all(result); +} + +// By default a call to an EOA succeeds and returns no data, therefore we cannot simply use a +// successful call as a signal that the precompile is implemented. Instead we must provide a test +// vector. The test calldata and corresponding expected response are provided for each precompile, +// and are from the examples used on the playground links from https://www.evm.codes/precompiled +// unless otherwise noted. +export const precompiles: { + name: string; + address: Address; + testCalldata: Hex; + expectedResponse: Hex; +}[] = [ + { + address: '0x0000000000000000000000000000000000000001', + name: 'ecRecover', + testCalldata: + '0x456e9aea5e197a1f1af7a3e85a3212fa4049a3ba34c2289b4c860fc0b0c64ef3000000000000000000000000000000000000000000000000000000000000001c9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac80388256084f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada0000000000000000000000000000000000000000000000000000000000000000', + expectedResponse: '0x0000000000000000000000007156526fbd7a3c72969b54f64e42c10fbb768c8a', + }, + { + address: '0x0000000000000000000000000000000000000002', + name: 'SHA2-256', + testCalldata: '0xff', + expectedResponse: '0xa8100ae6aa1940d0b663bb31cd466142ebbdbd5187131b92d93818987832eb89', + }, + { + address: '0x0000000000000000000000000000000000000003', + name: 'RIPEMD-160', + testCalldata: '0xff', + expectedResponse: '0x0000000000000000000000002c0c45d3ecab80fe060e5f1d7057cd2f8de5e557', + }, + { + address: '0x0000000000000000000000000000000000000004', + name: 'identity', + testCalldata: '0xff', + expectedResponse: '0xff', + }, + { + address: '0x0000000000000000000000000000000000000005', + name: 'modexp', + testCalldata: + '0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000108090A0000000000000000000000000000000000000000000000000000000000', + expectedResponse: '0x08', + }, + { + address: '0x0000000000000000000000000000000000000006', + name: 'ecAdd', + testCalldata: + '0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002', + expectedResponse: + '0x030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4', + }, + { + address: '0x0000000000000000000000000000000000000007', + name: 'ecMul', + testCalldata: + '0x000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002', + expectedResponse: + '0x030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4', + }, + { + address: '0x0000000000000000000000000000000000000008', + name: 'ecPairing', + testCalldata: + '0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f61fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d92bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f902fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd451971ff0471b09fa93caaf13cbf443c1aede09cc4328f5a62aad45f40ec133eb4091058a3141822985733cbdddfed0fd8d6c104e9e9eff40bf5abfef9ab163bc72a23af9a5ce2ba2796c1f4e453a370eb0af8c212d9dc9acd8fc02c2e907baea223a8eb0b0996252cb548a4487da97b02422ebc0e834613f954de6c7e0afdc1fc', + expectedResponse: '0x0000000000000000000000000000000000000000000000000000000000000001', + }, + { + address: '0x0000000000000000000000000000000000000009', + name: 'blake2f', + testCalldata: + '0x0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001', + expectedResponse: + '0xba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923', + }, + { + // This test vector is from https://github.com/ethereum/execution-spec-tests/blob/1983444bbe1a471886ef7c0e82253ffe2a4053e1/tests/cancun/eip4844_blobs/point_evaluation_vectors/go_kzg_4844_verify_kzg_proof.json#L3-L9. + // With the version hash versioned hash aspect of the calldata computed per the spec as + // `0x01 || sha256(commitment)[1:]` where || represents concatenation. + address: '0x000000000000000000000000000000000000000a', + name: 'point evaluation', + testCalldata: + '0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + expectedResponse: + '0x000000000000000000000000000000000000000000000000000000000000100073eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001', + }, + { + // RIP-7212: Precompile for secp256r1 Curve Support + // This test vector is from https://github.com/maticnetwork/bor/blob/bade7f57df5c09ae060c15fc66aed488c526149e/core/vm/testdata/precompiles/p256Verify.json#L3 + // The secp256r1 precompile returns bytes32(1) if the signature is valid, and 0x otherwise. + address: '0x0000000000000000000000000000000000000100', + name: 'secp256r1', + testCalldata: + '0x4cee90eb86eaa050036147a12d49004b6b9c72bd725d39d4785011fe190f0b4da73bd4903f0ce3b639bbbf6e8e80d16931ff4bcf5993d58468e8fb19086e8cac36dbcd03009df8c59286b162af3bd7fcc0450c9aa81be5d10d312af6c66b1d604aebd3099c618202fcfe16ae7770b0c49ab5eadf74b754204a3bb6060e44eff37618b065f9832de4ca6ca971a7a1adc826d0f7c00181a5fb2ddf79ae00b4e10e', + expectedResponse: '0x0000000000000000000000000000000000000000000000000000000000000001', + }, +]; diff --git a/script/data/chain/1.json b/script/data/chain/1.json new file mode 100644 index 00000000..f53416a2 --- /dev/null +++ b/script/data/chain/1.json @@ -0,0 +1,511 @@ +{ + "metadata": { + "name": "Ethereum Mainnet", + "shortName": "eth", + "chainId": 1, + "networkId": 1, + "infoURL": "https://ethereum.org", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "ens": { "registry": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e" }, + "explorers": [ + { "name": "etherscan", "url": "https://etherscan.io", "standard": "EIP3091" }, + { + "name": "blockscout", + "url": "https://eth.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://ethereum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], + "icon": "ethereum", + "rpc": [ + "https://mainnet.infura.io/v3/${INFURA_API_KEY}", + "wss://mainnet.infura.io/ws/v3/${INFURA_API_KEY}", + "https://api.mycryptoapi.com/eth", + "https://cloudflare-eth.com", + "https://ethereum-rpc.publicnode.com", + "wss://ethereum-rpc.publicnode.com", + "https://mainnet.gateway.tenderly.co", + "wss://mainnet.gateway.tenderly.co", + "https://rpc.blocknative.com/boost", + "https://rpc.flashbots.net", + "https://rpc.flashbots.net/fast", + "https://rpc.mevblocker.io", + "https://rpc.mevblocker.io/fast", + "https://rpc.mevblocker.io/noreverts", + "https://rpc.mevblocker.io/fullprivacy", + "https://eth.drpc.org", + "wss://eth.drpc.org" + ], + "slip44": 60 + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x2a300e3fee0eee59e0a1b184d1531c4bea54b843b28426f227d12145e8918663", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xc67d1657868aa5146eaf24fb879fb1fdec3d2d493b3683a61c9c2f4fb2851131", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/10.json b/script/data/chain/10.json new file mode 100644 index 00000000..a362ff67 --- /dev/null +++ b/script/data/chain/10.json @@ -0,0 +1,497 @@ +{ + "metadata": { + "name": "OP Mainnet", + "shortName": "oeth", + "chainId": 10, + "networkId": 10, + "infoURL": "https://optimism.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "etherscan", "url": "https://optimistic.etherscan.io", "standard": "EIP3091" }, + { + "name": "blockscout", + "url": "https://optimism.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://optimism.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "rpc": [ + "https://mainnet.optimism.io", + "https://optimism-rpc.publicnode.com", + "wss://optimism-rpc.publicnode.com", + "https://optimism.gateway.tenderly.co", + "wss://optimism.gateway.tenderly.co", + "https://optimism.drpc.org", + "wss://optimism.drpc.org" + ] + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x375714c2c948abd47bf468552c0a842d0e8002ca721efd85061a1297d6824617", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0x0947f7bbeb5659a3b6e9a2045605fee6c606c66cb27eacfcf9ec3c2a4d426c51", + "exists": true + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x779bbf2a738ef09d961c945116197e2ac764c1b39304b2b4418cd4e42668b173", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x8551d935f4e67ad3c98609f0d9f0f234740c4c4599f82674633b55204393e07f", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/137.json b/script/data/chain/137.json new file mode 100644 index 00000000..4226dae2 --- /dev/null +++ b/script/data/chain/137.json @@ -0,0 +1,498 @@ +{ + "metadata": { + "name": "Polygon Mainnet", + "shortName": "matic", + "chainId": 137, + "networkId": 137, + "infoURL": "https://polygon.technology/", + "nativeCurrency": { "name": "MATIC", "symbol": "MATIC", "decimals": 18 }, + "chain": "Polygon", + "explorers": [ + { "name": "polygonscan", "url": "https://polygonscan.com", "standard": "EIP3091" }, + { + "name": "dexguru", + "url": "https://polygon.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "icon": "polygon", + "rpc": [ + "https://polygon-rpc.com/", + "https://rpc-mainnet.matic.network", + "https://matic-mainnet.chainstacklabs.com", + "https://rpc-mainnet.maticvigil.com", + "https://rpc-mainnet.matic.quiknode.pro", + "https://matic-mainnet-full-rpc.bwarelabs.com", + "https://polygon-bor-rpc.publicnode.com", + "wss://polygon-bor-rpc.publicnode.com", + "https://polygon.gateway.tenderly.co", + "wss://polygon.gateway.tenderly.co", + "https://polygon.drpc.org", + "wss://polygon.drpc.org" + ], + "slip44": 966 + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xdb0dd198c1767513d04589d8b3da05423ddc97e543440f84afe0e216693af9bb", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": true + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/34443.json b/script/data/chain/34443.json new file mode 100644 index 00000000..092c0861 --- /dev/null +++ b/script/data/chain/34443.json @@ -0,0 +1,478 @@ +{ + "metadata": { + "name": "Mode", + "shortName": "mode", + "chainId": 34443, + "networkId": 34443, + "infoURL": "https://docs.mode.network/", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "modescout", "url": "https://explorer.mode.network", "standard": "none" } + ], + "faucets": [], + "icon": "mode", + "rpc": ["https://mainnet.mode.network", "https://mode.drpc.org", "wss://mode.drpc.org"] + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0x8ec8aa5d07a37e47597b3a254f5cbf39fa2080526ae34db3a564fffed82b99ad", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xa60f5be4cb47b577bface325f828fb1075b9b0bc5e88a5f7586543ec3986381c", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x8a3a1f6a9f9dce633117adee5b458245835a8645a8c8726a26382a4622508b1c", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json new file mode 100644 index 00000000..30ce9599 --- /dev/null +++ b/script/data/chain/42161.json @@ -0,0 +1,495 @@ +{ + "metadata": { + "name": "Arbitrum One", + "shortName": "arb1", + "chainId": 42161, + "networkId": 42161, + "infoURL": "https://arbitrum.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "Arbiscan", "url": "https://arbiscan.io", "standard": "EIP3091" }, + { "name": "Arbitrum Explorer", "url": "https://explorer.arbitrum.io", "standard": "EIP3091" }, + { + "name": "dexguru", + "url": "https://arbitrum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://bridge.arbitrum.io" }] + }, + "rpc": [ + "https://arbitrum-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", + "https://arb1.arbitrum.io/rpc", + "https://arbitrum-one.publicnode.com", + "wss://arbitrum-one.publicnode.com" + ] + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x9e51dcb64cf56fc09a82cb41edbc17c6a2250f18dbd1b91e884c0aca02acd57c", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xb85ab24294b1fe78ada85b084ae35f30c8d9696d43dae917df31c8c65e3b45b9", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + } + ] + } +} diff --git a/script/data/chain/43114.json b/script/data/chain/43114.json new file mode 100644 index 00000000..4f3bbc64 --- /dev/null +++ b/script/data/chain/43114.json @@ -0,0 +1,482 @@ +{ + "metadata": { + "name": "Avalanche C-Chain", + "shortName": "avax", + "chainId": 43114, + "networkId": 43114, + "infoURL": "https://www.avax.network/", + "nativeCurrency": { "name": "Avalanche", "symbol": "AVAX", "decimals": 18 }, + "chain": "AVAX", + "explorers": [{ "name": "snowtrace", "url": "https://snowtrace.io", "standard": "EIP3091" }], + "faucets": [], + "features": [{ "name": "EIP1559" }], + "icon": "avax", + "rpc": [ + "https://api.avax.network/ext/bc/C/rpc", + "https://avalanche-c-chain-rpc.publicnode.com", + "wss://avalanche-c-chain-rpc.publicnode.com" + ], + "slip44": 9005 + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x081beff14e75c5a5c1e60740445f58d54ba0fef228148a11d3e4287dc3551cbb", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/534352.json b/script/data/chain/534352.json new file mode 100644 index 00000000..ae0b942b --- /dev/null +++ b/script/data/chain/534352.json @@ -0,0 +1,485 @@ +{ + "metadata": { + "name": "Scroll", + "shortName": "scr", + "chainId": 534352, + "networkId": 534352, + "infoURL": "https://scroll.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [{ "name": "Scrollscan", "url": "https://scrollscan.com", "standard": "EIP3091" }], + "faucets": [], + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://scroll.io/bridge" }] + }, + "rpc": [ + "https://rpc.scroll.io", + "https://rpc.ankr.com/scroll", + "https://scroll-mainnet.chainstacklabs.com" + ], + "status": "active" + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": false }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": false } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb24b52fb04a5cf32eb702c01f9dee003e7191e57252ef7690a222c55b4d35d17", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x3f850215845af8f051808200d4f02a01d5eeb9fcf4eaed568e25e3278c23de3a", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": false + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": false + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/59144.json b/script/data/chain/59144.json new file mode 100644 index 00000000..e6a43489 --- /dev/null +++ b/script/data/chain/59144.json @@ -0,0 +1,502 @@ +{ + "metadata": { + "name": "Linea", + "shortName": "linea", + "chainId": 59144, + "networkId": 59144, + "infoURL": "https://linea.build", + "nativeCurrency": { "name": "Linea Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { + "name": "Etherscan", + "url": "https://lineascan.build", + "standard": "EIP3091", + "icon": "linea" + }, + { + "name": "Blockscout", + "url": "https://explorer.linea.build", + "standard": "EIP3091", + "icon": "linea" + }, + { "name": "L2scan", "url": "https://linea.l2scan.co", "standard": "EIP3091", "icon": "linea" } + ], + "faucets": [], + "icon": "linea", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://bridge.linea.build" }] + }, + "rpc": [ + "https://rpc.linea.build", + "wss://rpc.linea.build", + "https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}", + "wss://linea-mainnet.infura.io/ws/v3/${INFURA_API_KEY}" + ], + "status": "active", + "title": "Linea Mainnet" + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": false }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb24b52fb04a5cf32eb702c01f9dee003e7191e57252ef7690a222c55b4d35d17", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0x8ec8aa5d07a37e47597b3a254f5cbf39fa2080526ae34db3a564fffed82b99ad", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x939f3d8fd3d2ffc9dd506aae79fb3827c60a629d41f9a7f6b85e26275e0ec649", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/chain/8453.json b/script/data/chain/8453.json new file mode 100644 index 00000000..c1ccc574 --- /dev/null +++ b/script/data/chain/8453.json @@ -0,0 +1,498 @@ +{ + "metadata": { + "name": "Base", + "shortName": "base", + "chainId": 8453, + "networkId": 8453, + "infoURL": "https://base.org", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "basescan", "url": "https://basescan.org", "standard": "none" }, + { + "name": "basescout", + "url": "https://base.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://base.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "icon": "base", + "rpc": [ + "https://mainnet.base.org/", + "https://developer-access-mainnet.base.org/", + "https://base.gateway.tenderly.co", + "wss://base.gateway.tenderly.co", + "https://base-rpc.publicnode.com", + "wss://base-rpc.publicnode.com" + ], + "status": "active" + }, + "opcodes": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "deployedContracts": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xa67739abc3ede9dbdc0491636c67d6a14ac07fab9030c3f509b1eb7b11dff8ed", + "hasCode": true + } + ], + "precompiles": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "evmStackAddresses": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x8a3a1f6a9f9dce633117adee5b458245835a8645a8c8726a26382a4622508b1c", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/feature/deployedContracts.json b/script/data/feature/deployedContracts.json new file mode 100644 index 00000000..747a1f50 --- /dev/null +++ b/script/data/feature/deployedContracts.json @@ -0,0 +1,398 @@ +{ + "1": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x2a300e3fee0eee59e0a1b184d1531c4bea54b843b28426f227d12145e8918663", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xc67d1657868aa5146eaf24fb879fb1fdec3d2d493b3683a61c9c2f4fb2851131", + "hasCode": true + } + ], + "10": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x375714c2c948abd47bf468552c0a842d0e8002ca721efd85061a1297d6824617", + "hasCode": true + } + ], + "137": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xdb0dd198c1767513d04589d8b3da05423ddc97e543440f84afe0e216693af9bb", + "hasCode": true + } + ], + "8453": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xa67739abc3ede9dbdc0491636c67d6a14ac07fab9030c3f509b1eb7b11dff8ed", + "hasCode": true + } + ], + "34443": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0x8ec8aa5d07a37e47597b3a254f5cbf39fa2080526ae34db3a564fffed82b99ad", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xa60f5be4cb47b577bface325f828fb1075b9b0bc5e88a5f7586543ec3986381c", + "hasCode": true + } + ], + "42161": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x9e51dcb64cf56fc09a82cb41edbc17c6a2250f18dbd1b91e884c0aca02acd57c", + "hasCode": true + } + ], + "43114": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0x99620e2b8c35367629c21fa0691e69597c468ca24dc83a024fdb46ad6cba533d", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x081beff14e75c5a5c1e60740445f58d54ba0fef228148a11d3e4287dc3551cbb", + "hasCode": true + } + ], + "59144": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb24b52fb04a5cf32eb702c01f9dee003e7191e57252ef7690a222c55b4d35d17", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0x8ec8aa5d07a37e47597b3a254f5cbf39fa2080526ae34db3a564fffed82b99ad", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x939f3d8fd3d2ffc9dd506aae79fb3827c60a629d41f9a7f6b85e26275e0ec649", + "hasCode": true + } + ], + "534352": [ + { + "name": "CreateX", + "address": "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed", + "codeHash": "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f", + "hasCode": true + }, + { + "name": "Arachnid's Deterministic Deployment Proxy", + "address": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "codeHash": "0x2fa86add0aed31f33a762c9d88e807c475bd51d0f52bd0955754b2608f7e4989", + "hasCode": true + }, + { + "name": "Create2Deployer", + "address": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "codeHash": "0xb24b52fb04a5cf32eb702c01f9dee003e7191e57252ef7690a222c55b4d35d17", + "hasCode": true + }, + { + "name": "ERC-4337 Entry Point v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 Simple Account Factory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x3f850215845af8f051808200d4f02a01d5eeb9fcf4eaed568e25e3278c23de3a", + "hasCode": true + } + ] +} diff --git a/script/data/feature/evmStackAddresses.json b/script/data/feature/evmStackAddresses.json new file mode 100644 index 00000000..20da8b7a --- /dev/null +++ b/script/data/feature/evmStackAddresses.json @@ -0,0 +1,1883 @@ +{ + "1": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "10": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0x0947f7bbeb5659a3b6e9a2045605fee6c606c66cb27eacfcf9ec3c2a4d426c51", + "exists": true + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x779bbf2a738ef09d961c945116197e2ac764c1b39304b2b4418cd4e42668b173", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x8551d935f4e67ad3c98609f0d9f0f234740c4c4599f82674633b55204393e07f", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "137": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "8453": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x8a3a1f6a9f9dce633117adee5b458245835a8645a8c8726a26382a4622508b1c", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "34443": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0x8a3a1f6a9f9dce633117adee5b458245835a8645a8c8726a26382a4622508b1c", + "exists": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "exists": true + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "42161": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xb85ab24294b1fe78ada85b084ae35f30c8d9696d43dae917df31c8c65e3b45b9", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", + "exists": true + } + ] + }, + "43114": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "59144": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "534352": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "kind": "Predeploy", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + } +} diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json new file mode 100644 index 00000000..c42b287b --- /dev/null +++ b/script/data/feature/metadata.json @@ -0,0 +1,281 @@ +{ + "1": { + "name": "Ethereum Mainnet", + "shortName": "eth", + "chainId": 1, + "networkId": 1, + "infoURL": "https://ethereum.org", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "ens": { "registry": "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e" }, + "explorers": [ + { "name": "etherscan", "url": "https://etherscan.io", "standard": "EIP3091" }, + { + "name": "blockscout", + "url": "https://eth.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://ethereum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], + "icon": "ethereum", + "rpc": [ + "https://mainnet.infura.io/v3/${INFURA_API_KEY}", + "wss://mainnet.infura.io/ws/v3/${INFURA_API_KEY}", + "https://api.mycryptoapi.com/eth", + "https://cloudflare-eth.com", + "https://ethereum-rpc.publicnode.com", + "wss://ethereum-rpc.publicnode.com", + "https://mainnet.gateway.tenderly.co", + "wss://mainnet.gateway.tenderly.co", + "https://rpc.blocknative.com/boost", + "https://rpc.flashbots.net", + "https://rpc.flashbots.net/fast", + "https://rpc.mevblocker.io", + "https://rpc.mevblocker.io/fast", + "https://rpc.mevblocker.io/noreverts", + "https://rpc.mevblocker.io/fullprivacy", + "https://eth.drpc.org", + "wss://eth.drpc.org" + ], + "slip44": 60 + }, + "10": { + "name": "OP Mainnet", + "shortName": "oeth", + "chainId": 10, + "networkId": 10, + "infoURL": "https://optimism.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "etherscan", "url": "https://optimistic.etherscan.io", "standard": "EIP3091" }, + { + "name": "blockscout", + "url": "https://optimism.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://optimism.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "rpc": [ + "https://mainnet.optimism.io", + "https://optimism-rpc.publicnode.com", + "wss://optimism-rpc.publicnode.com", + "https://optimism.gateway.tenderly.co", + "wss://optimism.gateway.tenderly.co", + "https://optimism.drpc.org", + "wss://optimism.drpc.org" + ] + }, + "137": { + "name": "Polygon Mainnet", + "shortName": "matic", + "chainId": 137, + "networkId": 137, + "infoURL": "https://polygon.technology/", + "nativeCurrency": { "name": "MATIC", "symbol": "MATIC", "decimals": 18 }, + "chain": "Polygon", + "explorers": [ + { "name": "polygonscan", "url": "https://polygonscan.com", "standard": "EIP3091" }, + { + "name": "dexguru", + "url": "https://polygon.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "icon": "polygon", + "rpc": [ + "https://polygon-rpc.com/", + "https://rpc-mainnet.matic.network", + "https://matic-mainnet.chainstacklabs.com", + "https://rpc-mainnet.maticvigil.com", + "https://rpc-mainnet.matic.quiknode.pro", + "https://matic-mainnet-full-rpc.bwarelabs.com", + "https://polygon-bor-rpc.publicnode.com", + "wss://polygon-bor-rpc.publicnode.com", + "https://polygon.gateway.tenderly.co", + "wss://polygon.gateway.tenderly.co", + "https://polygon.drpc.org", + "wss://polygon.drpc.org" + ], + "slip44": 966 + }, + "8453": { + "name": "Base", + "shortName": "base", + "chainId": 8453, + "networkId": 8453, + "infoURL": "https://base.org", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "basescan", "url": "https://basescan.org", "standard": "none" }, + { + "name": "basescout", + "url": "https://base.blockscout.com", + "icon": "blockscout", + "standard": "EIP3091" + }, + { + "name": "dexguru", + "url": "https://base.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "icon": "base", + "rpc": [ + "https://mainnet.base.org/", + "https://developer-access-mainnet.base.org/", + "https://base.gateway.tenderly.co", + "wss://base.gateway.tenderly.co", + "https://base-rpc.publicnode.com", + "wss://base-rpc.publicnode.com" + ], + "status": "active" + }, + "34443": { + "name": "Mode", + "shortName": "mode", + "chainId": 34443, + "networkId": 34443, + "infoURL": "https://docs.mode.network/", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "modescout", "url": "https://explorer.mode.network", "standard": "none" } + ], + "faucets": [], + "icon": "mode", + "rpc": ["https://mainnet.mode.network", "https://mode.drpc.org", "wss://mode.drpc.org"] + }, + "42161": { + "name": "Arbitrum One", + "shortName": "arb1", + "chainId": 42161, + "networkId": 42161, + "infoURL": "https://arbitrum.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { "name": "Arbiscan", "url": "https://arbiscan.io", "standard": "EIP3091" }, + { "name": "Arbitrum Explorer", "url": "https://explorer.arbitrum.io", "standard": "EIP3091" }, + { + "name": "dexguru", + "url": "https://arbitrum.dex.guru", + "icon": "dexguru", + "standard": "EIP3091" + } + ], + "faucets": [], + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://bridge.arbitrum.io" }] + }, + "rpc": [ + "https://arbitrum-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}", + "https://arb1.arbitrum.io/rpc", + "https://arbitrum-one.publicnode.com", + "wss://arbitrum-one.publicnode.com" + ] + }, + "43114": { + "name": "Avalanche C-Chain", + "shortName": "avax", + "chainId": 43114, + "networkId": 43114, + "infoURL": "https://www.avax.network/", + "nativeCurrency": { "name": "Avalanche", "symbol": "AVAX", "decimals": 18 }, + "chain": "AVAX", + "explorers": [{ "name": "snowtrace", "url": "https://snowtrace.io", "standard": "EIP3091" }], + "faucets": [], + "features": [{ "name": "EIP1559" }], + "icon": "avax", + "rpc": [ + "https://api.avax.network/ext/bc/C/rpc", + "https://avalanche-c-chain-rpc.publicnode.com", + "wss://avalanche-c-chain-rpc.publicnode.com" + ], + "slip44": 9005 + }, + "59144": { + "name": "Linea", + "shortName": "linea", + "chainId": 59144, + "networkId": 59144, + "infoURL": "https://linea.build", + "nativeCurrency": { "name": "Linea Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [ + { + "name": "Etherscan", + "url": "https://lineascan.build", + "standard": "EIP3091", + "icon": "linea" + }, + { + "name": "Blockscout", + "url": "https://explorer.linea.build", + "standard": "EIP3091", + "icon": "linea" + }, + { "name": "L2scan", "url": "https://linea.l2scan.co", "standard": "EIP3091", "icon": "linea" } + ], + "faucets": [], + "icon": "linea", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://bridge.linea.build" }] + }, + "rpc": [ + "https://rpc.linea.build", + "wss://rpc.linea.build", + "https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}", + "wss://linea-mainnet.infura.io/ws/v3/${INFURA_API_KEY}" + ], + "status": "active", + "title": "Linea Mainnet" + }, + "534352": { + "name": "Scroll", + "shortName": "scr", + "chainId": 534352, + "networkId": 534352, + "infoURL": "https://scroll.io", + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "chain": "ETH", + "explorers": [{ "name": "Scrollscan", "url": "https://scrollscan.com", "standard": "EIP3091" }], + "faucets": [], + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://scroll.io/bridge" }] + }, + "rpc": [ + "https://rpc.scroll.io", + "https://rpc.ankr.com/scroll", + "https://scroll-mainnet.chainstacklabs.com" + ], + "status": "active" + } +} diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json new file mode 100644 index 00000000..033fd589 --- /dev/null +++ b/script/data/feature/opcodes.json @@ -0,0 +1,1361 @@ +{ + "1": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "10": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "137": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "8453": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "34443": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": true }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "42161": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": true }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": true }, + { "number": "0x5d", "name": "TSTORE", "supported": true }, + { "number": "0x5e", "name": "MCOPY", "supported": true }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "43114": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "59144": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": true }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": false }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } + ], + "534352": [ + { "number": "0x00", "name": "STOP", "supported": true }, + { "number": "0x01", "name": "ADD", "supported": true }, + { "number": "0x02", "name": "MUL", "supported": true }, + { "number": "0x03", "name": "SUB", "supported": true }, + { "number": "0x04", "name": "DIV", "supported": true }, + { "number": "0x05", "name": "SDIV", "supported": true }, + { "number": "0x06", "name": "MOD", "supported": true }, + { "number": "0x07", "name": "SMOD", "supported": true }, + { "number": "0x08", "name": "ADDMOD", "supported": true }, + { "number": "0x09", "name": "MULMOD", "supported": true }, + { "number": "0x0a", "name": "EXP", "supported": true }, + { "number": "0x0b", "name": "SIGNEXTEND", "supported": true }, + { "number": "0x10", "name": "LT", "supported": true }, + { "number": "0x11", "name": "GT", "supported": true }, + { "number": "0x12", "name": "SLT", "supported": true }, + { "number": "0x13", "name": "SGT", "supported": true }, + { "number": "0x14", "name": "EQ", "supported": true }, + { "number": "0x15", "name": "ISZERO", "supported": true }, + { "number": "0x16", "name": "AND", "supported": true }, + { "number": "0x17", "name": "OR", "supported": true }, + { "number": "0x18", "name": "XOR", "supported": true }, + { "number": "0x19", "name": "NOT", "supported": true }, + { "number": "0x1a", "name": "BYTE", "supported": true }, + { "number": "0x1b", "name": "SHL", "supported": true }, + { "number": "0x1c", "name": "SHR", "supported": true }, + { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x20", "name": "KECCAK256", "supported": true }, + { "number": "0x30", "name": "ADDRESS", "supported": true }, + { "number": "0x31", "name": "BALANCE", "supported": true }, + { "number": "0x32", "name": "ORIGIN", "supported": true }, + { "number": "0x33", "name": "CALLER", "supported": true }, + { "number": "0x34", "name": "CALLVALUE", "supported": true }, + { "number": "0x35", "name": "CALLDATALOAD", "supported": true }, + { "number": "0x36", "name": "CALLDATASIZE", "supported": true }, + { "number": "0x37", "name": "CALLDATACOPY", "supported": true }, + { "number": "0x38", "name": "CODESIZE", "supported": true }, + { "number": "0x39", "name": "CODECOPY", "supported": true }, + { "number": "0x3a", "name": "GASPRICE", "supported": true }, + { "number": "0x3b", "name": "EXTCODESIZE", "supported": true }, + { "number": "0x3c", "name": "EXTCODECOPY", "supported": true }, + { "number": "0x3d", "name": "RETURNDATASIZE", "supported": true }, + { "number": "0x3e", "name": "RETURNDATACOPY", "supported": true }, + { "number": "0x3f", "name": "EXTCODEHASH", "supported": true }, + { "number": "0x40", "name": "BLOCKHASH", "supported": true }, + { "number": "0x41", "name": "COINBASE", "supported": true }, + { "number": "0x42", "name": "TIMESTAMP", "supported": true }, + { "number": "0x43", "name": "NUMBER", "supported": true }, + { "number": "0x44", "name": "PREVRANDAO", "supported": true }, + { "number": "0x45", "name": "GASLIMIT", "supported": true }, + { "number": "0x46", "name": "CHAINID", "supported": true }, + { "number": "0x47", "name": "SELFBALANCE", "supported": true }, + { "number": "0x48", "name": "BASEFEE", "supported": false }, + { "number": "0x49", "name": "BLOBHASH", "supported": false }, + { "number": "0x4a", "name": "BLOBBASEFEE", "supported": false }, + { "number": "0x50", "name": "POP", "supported": true }, + { "number": "0x51", "name": "MLOAD", "supported": true }, + { "number": "0x52", "name": "MSTORE", "supported": true }, + { "number": "0x53", "name": "MSTORE8", "supported": true }, + { "number": "0x54", "name": "SLOAD", "supported": true }, + { "number": "0x55", "name": "SSTORE", "supported": true }, + { "number": "0x56", "name": "JUMP", "supported": true }, + { "number": "0x57", "name": "JUMPI", "supported": true }, + { "number": "0x58", "name": "PC", "supported": true }, + { "number": "0x59", "name": "MSIZE", "supported": true }, + { "number": "0x5a", "name": "GAS", "supported": true }, + { "number": "0x5b", "name": "JUMPDEST", "supported": true }, + { "number": "0x5c", "name": "TLOAD", "supported": false }, + { "number": "0x5d", "name": "TSTORE", "supported": false }, + { "number": "0x5e", "name": "MCOPY", "supported": false }, + { "number": "0x5f", "name": "PUSH0", "supported": true }, + { "number": "0x60", "name": "PUSH1", "supported": true }, + { "number": "0x61", "name": "PUSH2", "supported": true }, + { "number": "0x62", "name": "PUSH3", "supported": true }, + { "number": "0x63", "name": "PUSH4", "supported": true }, + { "number": "0x64", "name": "PUSH5", "supported": true }, + { "number": "0x65", "name": "PUSH6", "supported": true }, + { "number": "0x66", "name": "PUSH7", "supported": true }, + { "number": "0x67", "name": "PUSH8", "supported": true }, + { "number": "0x68", "name": "PUSH9", "supported": true }, + { "number": "0x69", "name": "PUSH10", "supported": true }, + { "number": "0x6a", "name": "PUSH11", "supported": true }, + { "number": "0x6b", "name": "PUSH12", "supported": true }, + { "number": "0x6c", "name": "PUSH13", "supported": true }, + { "number": "0x6d", "name": "PUSH14", "supported": true }, + { "number": "0x6e", "name": "PUSH15", "supported": true }, + { "number": "0x6f", "name": "PUSH16", "supported": true }, + { "number": "0x70", "name": "PUSH17", "supported": true }, + { "number": "0x71", "name": "PUSH18", "supported": true }, + { "number": "0x72", "name": "PUSH19", "supported": true }, + { "number": "0x73", "name": "PUSH20", "supported": true }, + { "number": "0x74", "name": "PUSH21", "supported": true }, + { "number": "0x75", "name": "PUSH22", "supported": true }, + { "number": "0x76", "name": "PUSH23", "supported": true }, + { "number": "0x77", "name": "PUSH24", "supported": true }, + { "number": "0x78", "name": "PUSH25", "supported": true }, + { "number": "0x79", "name": "PUSH26", "supported": true }, + { "number": "0x7a", "name": "PUSH27", "supported": true }, + { "number": "0x7b", "name": "PUSH28", "supported": true }, + { "number": "0x7c", "name": "PUSH29", "supported": true }, + { "number": "0x7d", "name": "PUSH30", "supported": true }, + { "number": "0x7e", "name": "PUSH31", "supported": true }, + { "number": "0x7f", "name": "PUSH32", "supported": true }, + { "number": "0x80", "name": "DUP1", "supported": true }, + { "number": "0x81", "name": "DUP2", "supported": true }, + { "number": "0x82", "name": "DUP3", "supported": true }, + { "number": "0x83", "name": "DUP4", "supported": true }, + { "number": "0x84", "name": "DUP5", "supported": true }, + { "number": "0x85", "name": "DUP6", "supported": true }, + { "number": "0x86", "name": "DUP7", "supported": true }, + { "number": "0x87", "name": "DUP8", "supported": true }, + { "number": "0x88", "name": "DUP9", "supported": true }, + { "number": "0x89", "name": "DUP10", "supported": true }, + { "number": "0x8a", "name": "DUP11", "supported": true }, + { "number": "0x8b", "name": "DUP12", "supported": true }, + { "number": "0x8c", "name": "DUP13", "supported": true }, + { "number": "0x8d", "name": "DUP14", "supported": true }, + { "number": "0x8e", "name": "DUP15", "supported": true }, + { "number": "0x8f", "name": "DUP16", "supported": true }, + { "number": "0x90", "name": "SWAP1", "supported": true }, + { "number": "0x91", "name": "SWAP2", "supported": true }, + { "number": "0x92", "name": "SWAP3", "supported": true }, + { "number": "0x93", "name": "SWAP4", "supported": true }, + { "number": "0x94", "name": "SWAP5", "supported": true }, + { "number": "0x95", "name": "SWAP6", "supported": true }, + { "number": "0x96", "name": "SWAP7", "supported": true }, + { "number": "0x97", "name": "SWAP8", "supported": true }, + { "number": "0x98", "name": "SWAP9", "supported": true }, + { "number": "0x99", "name": "SWAP10", "supported": true }, + { "number": "0x9a", "name": "SWAP11", "supported": true }, + { "number": "0x9b", "name": "SWAP12", "supported": true }, + { "number": "0x9c", "name": "SWAP13", "supported": true }, + { "number": "0x9d", "name": "SWAP14", "supported": true }, + { "number": "0x9e", "name": "SWAP15", "supported": true }, + { "number": "0x9f", "name": "SWAP16", "supported": true }, + { "number": "0xa0", "name": "LOG0", "supported": true }, + { "number": "0xa1", "name": "LOG1", "supported": true }, + { "number": "0xa2", "name": "LOG2", "supported": true }, + { "number": "0xa3", "name": "LOG3", "supported": true }, + { "number": "0xa4", "name": "LOG4", "supported": true }, + { "number": "0xf0", "name": "CREATE", "supported": true }, + { "number": "0xf1", "name": "CALL", "supported": true }, + { "number": "0xf2", "name": "CALLCODE", "supported": true }, + { "number": "0xf3", "name": "RETURN", "supported": true }, + { "number": "0xf4", "name": "DELEGATECALL", "supported": true }, + { "number": "0xf5", "name": "CREATE2", "supported": true }, + { "number": "0xfa", "name": "STATICCALL", "supported": true }, + { "number": "0xfd", "name": "REVERT", "supported": true }, + { "number": "0xfe", "name": "INVALID", "supported": true }, + { "number": "0xff", "name": "SELFDESTRUCT", "supported": false } + ] +} diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json new file mode 100644 index 00000000..3751afda --- /dev/null +++ b/script/data/feature/precompiles.json @@ -0,0 +1,515 @@ +{ + "1": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "10": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "137": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": true + } + ], + "8453": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "34443": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "42161": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "43114": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "59144": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": true + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": true + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ], + "534352": [ + { + "name": "ecRecover", + "address": "0x0000000000000000000000000000000000000001", + "implemented": true + }, + { + "name": "SHA2-256", + "address": "0x0000000000000000000000000000000000000002", + "implemented": true + }, + { + "name": "RIPEMD-160", + "address": "0x0000000000000000000000000000000000000003", + "implemented": false + }, + { + "name": "identity", + "address": "0x0000000000000000000000000000000000000004", + "implemented": true + }, + { + "name": "modexp", + "address": "0x0000000000000000000000000000000000000005", + "implemented": true + }, + { + "name": "ecAdd", + "address": "0x0000000000000000000000000000000000000006", + "implemented": true + }, + { + "name": "ecMul", + "address": "0x0000000000000000000000000000000000000007", + "implemented": true + }, + { + "name": "ecPairing", + "address": "0x0000000000000000000000000000000000000008", + "implemented": true + }, + { + "name": "blake2f", + "address": "0x0000000000000000000000000000000000000009", + "implemented": false + }, + { + "name": "point evaluation", + "address": "0x000000000000000000000000000000000000000a", + "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false + } + ] +} diff --git a/script/fetch-abi.ts b/script/fetch-abi.ts deleted file mode 100644 index 87e3c396..00000000 --- a/script/fetch-abi.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Given an Etherscan URL, fetch the ABI and convert it to viem's human readable format. -// Example usage: -// bun script/fetch-abi.ts https://arbiscan.io/address/0x0000000000000000000000000000000000000064 -import { formatAbi } from 'abitype'; -import clipboardy from 'clipboardy'; -import { Address } from 'viem'; - -type ChainConfig = { - name: string; - urlPart: string; - apiPrefix: string; - apiKey: string; -}; - -const chains: Record = { - arbitrum: { - name: 'Arbitrum', - urlPart: 'arbiscan.io', - apiPrefix: 'api.', - apiKey: process.env.ARBISCAN_API_KEY!, - }, - optimism: { - name: 'Optimism', - urlPart: 'optimistic.etherscan.io', - apiPrefix: 'api-', - apiKey: process.env.OPTIMISM_API_KEY!, - }, -}; - -async function getAbi(apiUrl: string) { - // Fetch the ABI from the API. - const response = await fetch(apiUrl); - const data = await response.json(); - if (data.status !== '1') throw new Error('API request failed: ' + data.message); - - // Return formatted ABI. - const abi = JSON.parse(data.result); - return formatAbi(abi); -} - -function getChain(url: string): ChainConfig { - for (const chainName in chains) { - if (url.includes(chains[chainName].urlPart)) { - const chain = chains[chainName]; - if (!chain.apiKey) throw new Error(`API key not found for chain ${chainName}`); - return chain; - } - } - throw new Error(`Chain not recognized from URL: ${url}`); -} - -function getEtherscanUrl(chain: ChainConfig, address: Address, kind: 'abi' | 'source') { - const query = kind === 'abi' ? 'getabi' : 'getsourcecode'; - const { apiPrefix, apiKey, urlPart } = chain; - return `https://${apiPrefix}${urlPart}/api?module=contract&action=${query}&address=${address}&apikey=${apiKey}`; -} - -async function main() { - // Use the first argument as the URL and get the contract address from it. - const url = process.argv[2]; - if (!url) throw new Error('URL is required'); - - // Get the address and chain from the URL. - const address = url.split('/').pop() as Address; - if (!address) throw new Error('Could not parse address from URL'); - const chain = getChain(url); - - // Get the ABI. - const abiRequestUrl = getEtherscanUrl(chain, address, 'abi'); - const formattedAbi1 = await getAbi(abiRequestUrl); - - // Now we check if it's a proxy contract. - // Note that for some optimism predeploys that are proxies, this does not return the - // implementation address, so it's not guaranteed to work. - const sourceRequestUrl = getEtherscanUrl(chain, address, 'source'); - const sourceResponse = await fetch(sourceRequestUrl); - const data = await sourceResponse.json(); - if (data.status !== '1') throw new Error('API request failed: ' + data.message); - const implementationAddress = data.result[0].Implementation as '' | Address; - - // If it is a proxy contract, fetch the implementation ABI. - let formattedAbi2; - if (implementationAddress) { - const implAbiRequestUrl = getEtherscanUrl(chain, implementationAddress, 'abi'); - formattedAbi2 = await getAbi(implAbiRequestUrl); - } - - // If we have a second ABI, separate the two with a divider so they can be easily distinguished. - const fullAbi = formattedAbi2 ? formattedAbi1.concat('--------', formattedAbi2) : formattedAbi1; - - // Copy the formatted ABI to the clipboard. - clipboardy.writeSync(JSON.stringify(fullAbi)); - const kind = formattedAbi2 ? ' proxy and implementation ' : ' '; - console.log(`✅ Copied${kind}ABI to clipboard for ${chain.name} contract ${address}`); -} - -main().catch(console.error); diff --git a/script/index.ts b/script/index.ts new file mode 100644 index 00000000..4a65eb91 --- /dev/null +++ b/script/index.ts @@ -0,0 +1,153 @@ +import { http, fallback, createPublicClient } from 'viem'; +import { checkDeployedContracts } from './checks/deployed-contracts'; +import { + checkEvmStackAddresses, + type EVMStack, + type EVMStackResult, +} from './checks/evm-stack-addresses'; +import { checkOpcodes } from './checks/opcodes'; +import { checkPrecompiles } from './checks/precompiles'; +import type { Metadata } from './types'; +import { join } from 'node:path'; + +export type Chain = { + metadata: Metadata; + opcodes: { + number: `0x${string}`; + name: string; + supported: string | boolean; + }[]; + deployedContracts: { + name: string; + address: `0x${string}`; + codeHash: `0x${string}`; + hasCode: boolean; + }[]; + precompiles: { + name: string; + address: `0x${string}`; + implemented: boolean; + }[]; + evmStackAddresses: Record; +}; + +async function main() { + // Initialize chain data. + const { chainId } = init(); + const metadata = await getMetadata(chainId); + const rpcUrls = selectRpcUrls(metadata.rpc); + const client = initClient(rpcUrls); + + // Fetch data. + const [opcodes, deployedContracts, precompiles, evmStackAddresses] = await Promise.all([ + checkOpcodes(client), + checkDeployedContracts(client), + checkPrecompiles(client), + checkEvmStackAddresses(client), + ]); + + // Format and save the output. + const chain: Chain = { + metadata: sortObjectKeys(metadata, [ + 'name', + 'shortName', + 'chainId', + 'networkId', + 'infoURL', + 'nativeCurrency', + ]), + opcodes, + deployedContracts, + precompiles, + evmStackAddresses, + }; + await save(chainId, chain); +} + +function init() { + const arg = process.argv[2]; + if (!arg) throw new Error('Must provide chainId as an argument'); + const chainId = Number(arg); + if (Number.isNaN(chainId)) throw new Error('chainId must be a number'); + if (chainId <= 0 || chainId > Number.MAX_SAFE_INTEGER) throw new Error('chainId not supported'); + return { chainId }; +} + +function initClient(rpcUrls: string[]) { + // Websocket seems to hang and script doesn't exit, so we only use HTTP. + const https = rpcUrls.filter((url) => url.startsWith('https')).map((url) => http(url)); + const transport = fallback([...https]); + return createPublicClient({ transport }); +} + +async function getMetadata(chainId: number): Promise { + const response = await fetch('https://chainid.network/chains.json'); + const data = await response.json(); + const metadata = data.find((chain: Metadata) => chain.chainId === chainId); + if (!metadata) throw new Error(`Chain with ID ${chainId} not found.`); + return metadata; +} + +async function save(chainId: number, chainObj: object) { + const outfile = join(import.meta.dir, 'data', 'chain', `${chainId}.json`); + await Bun.write(outfile, JSON.stringify(chainObj)); + console.log(`✅ Chain data for chainId ${chainId} written to script/data/${chainId}.json`); +} + +function sortObjectKeys(obj: T, orderedKeys: (keyof T)[]): T { + const objKeys = Object.keys(obj) as (keyof T)[]; + const remainingKeys = objKeys.filter((key) => !orderedKeys.includes(key)); + const sortedRemainingKeys = remainingKeys.sort((keyA, keyB) => + String(keyA).localeCompare(String(keyB)), + ); + const sortedKeys = [...orderedKeys, ...sortedRemainingKeys]; + const sortedEntries = sortedKeys.map((key) => [key, obj[key]]); + return Object.fromEntries(sortedEntries) as T; +} + +function selectRpcUrls(rpcUrls: string[]): string[] { + const hasPlaceholder = (str: string): boolean => str.includes('${'); + + const replacePlaceholder = (str: string): string => { + const placeholderRegex = /\$\{(\w+)\}/; + const match = str.match(placeholderRegex); + if (match) { + const apiKey = process.env[match[1]]; + if (apiKey) return str.replace(placeholderRegex, apiKey); + } + return str; + }; + + // These domains have various issues that make them unsuitable for our purposes. + const domainsToSkip = [ + 'drpc.org', // Required "to" is empty. + 'blocknative.com', // Transaction creation failed. + 'flashbots.net', // 403 (also on eth_call with no to). + 'mevblocker.io', // 429's easily. + 'matic-mainnet-full-rpc.bwarelabs.com', // "This endpoint is deprecated". + ]; + const filteredRpcUrls = rpcUrls.filter( + (url) => !domainsToSkip.some((domain) => url.includes(domain)), + ); + + // Check for URLs with placeholders and replace with API key if available. In this case, we + // return this URL as the selected RPC URL. Preferring URLs with API keys this way helps + // avoid rate limits and other issues. + const replacedUrls: string[] = []; + const normalUrls: string[] = []; + for (const url of filteredRpcUrls) { + if (hasPlaceholder(url)) { + const replacedUrl = replacePlaceholder(url); + if (replacedUrl !== url) replacedUrls.push(replacedUrl); + } else { + normalUrls.push(url); + } + } + + return [...replacedUrls, ...normalUrls]; // Prefer URLs with API keys. +} + +main().catch((error) => { + console.error('An error occurred:', error); + process.exit(1); +}); diff --git a/script/json-abi-to-viem-human-readable.ts b/script/json-abi-to-viem-human-readable.ts deleted file mode 100644 index db196f1b..00000000 --- a/script/json-abi-to-viem-human-readable.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Given a JSON ABI on the clipboard, replace the clipboard contents with a viem human-readable ABI. -// Example usage: -// bun script/json-abi-to-viem-human-readable.ts -import { formatAbi } from 'abitype'; -import clipboardy from 'clipboardy'; - -const abi = clipboardy.readSync(); -const formattedAbi = formatAbi(JSON.parse(abi)); -clipboardy.writeSync(JSON.stringify(formattedAbi)); -console.log('✅ Copied formatted ABI to clipboard'); diff --git a/script/main.sh b/script/main.sh new file mode 100644 index 00000000..6df7ac9a --- /dev/null +++ b/script/main.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -euo pipefail + +# Function to handle final preparation steps +final_preparation() { + local exitStatus=$? + + echo "" + bun script/postprocess.ts # Slice data by feature. + bun check # Runs prepare-chain-data, lints, and formats. + echo "" + if [ $exitStatus -eq 0 ]; then + echo "✅ Chain data fetched and processed successfully!" + else + echo "❌ An error occurred during chain data fetching or processing. See above for details." + fi +} + +# Set up a trap to run final preparation steps on script exit +trap final_preparation EXIT + + +if [ $# -eq 0 ]; then + # No input provided, find all *.json files in the data/chain folder + chainFiles=(script/data/chain/*.json) + numChains=${#chainFiles[@]} + echo "Found $numChains chains" + + index=1 + for file in "${chainFiles[@]}"; do + input="${file%.json}" # Extract the file name without the extension + input="${input##*/}" # Extract the file name without the path + echo "" + echo "Running for chain ID $input (chain $index of $numChains)" + bun script/index.ts "$input" + index=$((index + 1)) + done +else + # Input provided, run the script with the provided input + echo "Running for chain ID $1" + bun script/index.ts "$1" +fi diff --git a/script/postprocess.ts b/script/postprocess.ts new file mode 100644 index 00000000..9f3ebb8a --- /dev/null +++ b/script/postprocess.ts @@ -0,0 +1,38 @@ +import { readdir, unlink } from 'node:fs/promises'; +import { join } from 'node:path'; + +const DATA_PATH = join(import.meta.dir, 'data', 'chain'); +const FEATURE_PATH = join(import.meta.dir, 'data', 'feature'); + +async function main() { + // Delete all feature/*.json files + const featureFiles = await readdir(FEATURE_PATH); + const featureJsonFiles = featureFiles.filter((file) => file.endsWith('.json')); + for (const file of featureJsonFiles) { + await unlink(join(FEATURE_PATH, file)); + } + + const eth = await Bun.file(join(DATA_PATH, '1.json')).json(); // Source of truth for available keys. + const keys = Object.keys(eth); + + const allFiles = await readdir(DATA_PATH); + const jsonFiles = allFiles.filter((file) => file.endsWith('.json')); + + for (const key of keys) { + const dataOut: Record = {}; + + for (const file of jsonFiles) { + const dataIn = await Bun.file(join(DATA_PATH, file)).json(); + const chainId = dataIn.metadata.chainId; + dataOut[chainId] = dataIn[key]; + } + + const outfile = join(FEATURE_PATH, `${key}.json`); + await Bun.write(outfile, JSON.stringify(dataOut)); + } +} + +main().catch((error) => { + console.error('An error occurred:', error); + process.exit(1); +}); diff --git a/script/precompile-check.ts b/script/precompile-check.ts deleted file mode 100644 index e1c84178..00000000 --- a/script/precompile-check.ts +++ /dev/null @@ -1,86 +0,0 @@ -// Docs sometimes conflate precompiles and predeploys, but we want to differentiate them. We define -// a precompile as an address that has no code (or symbolic code like `0xfe`) and a predeploy has -// executable bytecode. For each chain this script defines a list of addresses and checks whether -// they are precompiles or predeploys, and prints the result. -// Example usage: -// bun script/precompile-check.ts optimism -import { Address, createPublicClient, getAddress, http } from 'viem'; -import { Chain, arbitrum, optimism } from 'viem/chains'; - -type ChainConfig = { - addresses: Address[]; - chain: Chain; - rpcUrl: string; -}; - -const addressMap: Record = { - arbitrum: { - chain: arbitrum, - rpcUrl: process.env.ARBITRUM_RPC_URL!, - addresses: [ - '0x5288c571Fd7aD117beA99bF60FE0846C4E84F933', - '0x09e9222E96E7B4AE2a407B98d48e330053351EEe', - '0x096760F208390250649E3e8763348E783AEF5562', - '0x6c411aD3E74De3E7Bd422b94A27770f5B86C623B', - '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', - '0xd570aCE65C43af47101fC6250FD6fC63D1c22a86', - '0x0000000000000000000000000000000000000064', - '0x000000000000000000000000000000000000006E', - '0x000000000000000000000000000000000000006C', - '0x0000000000000000000000000000000000000066', - '0x000000000000000000000000000000000000006F', - '0x00000000000000000000000000000000000000C8', - '0x0000000000000000000000000000000000000067', - '0x0000000000000000000000000000000000000065', - '0x0000000000000000000000000000000000000070', - '0x000000000000000000000000000000000000006b', - '0x000000000000000000000000000000000000006D', - '0x0000000000000000000000000000000000000068', - ], - }, - optimism: { - chain: optimism, - rpcUrl: process.env.OPTIMISM_RPC_URL!, - addresses: [ - '0x4200000000000000000000000000000000000000', - '0x4200000000000000000000000000000000000002', - '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - '0x4200000000000000000000000000000000000006', - '0x4200000000000000000000000000000000000007', - '0x4200000000000000000000000000000000000010', - '0x4200000000000000000000000000000000000011', - '0x4200000000000000000000000000000000000012', - '0x4200000000000000000000000000000000000013', - '0x420000000000000000000000000000000000000F', - '0x4200000000000000000000000000000000000042', - '0x4200000000000000000000000000000000000015', - '0x4200000000000000000000000000000000000016', - '0x4200000000000000000000000000000000000014', - '0x4200000000000000000000000000000000000017', - '0x4200000000000000000000000000000000000018', - '0x4200000000000000000000000000000000000019', - '0x420000000000000000000000000000000000001a', - ], - }, -}; - -async function main() { - const chainName = process.argv[2]; - const chainData = addressMap[chainName]; - const { chain, rpcUrl, addresses } = chainData; - if (!addresses) throw new Error(`Unknown chain: ${chainName}`); - if (!rpcUrl) throw new Error(`Undefined RPC URL for chain: ${chainName}`); - - const transport = http(rpcUrl, { batch: true }); - const client = createPublicClient({ chain, transport }); - - const promises = addresses.map((address) => client.getBytecode({ address })); - const codes = await Promise.all(promises); - const kinds = codes.map((code) => - code === '0x' || code === '0xfe' ? 'precompile' : 'predeploy' - ); - - addresses.forEach((address, i) => console.log(`${getAddress(address)} ${kinds[i]}`)); -} - -main().catch(console.error); diff --git a/script/prepare-chain-data.sh b/script/prepare-chain-data.sh new file mode 100644 index 00000000..bb68ad60 --- /dev/null +++ b/script/prepare-chain-data.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -euo pipefail + +# First we get list of all chains. +CHAIN_DIR="./script/data/chain" +OUTPUT_FILE="./src/lib/chains.json" +CHAINS=() + +for file in "$CHAIN_DIR"/*.json; do + if [ -e "$file" ]; then + CHAIN_ID=$(basename "$file" .json) + CHAIN_NAME=$(jq -r '.metadata.name' "$file") + CHAINS+=("{ \"chainId\": $CHAIN_ID, \"name\": \"$CHAIN_NAME\" }") + fi +done + +cat > "$OUTPUT_FILE" < "$OUTPUT_FILE" < = { - ...mainnetDeployedContracts, - L2GatewayRouter: { - name: 'L2GatewayRouter', - description: - 'Handles withdrawals from Ethereum into Arbitrum. Tokens are routed to their appropriate L2 gateway (Router itself also conforms to the Gateway interface).', - kind: DeployedContractKind.Utility, - address: '0x5288c571Fd7aD117beA99bF60FE0846C4E84F933', - proxyAbi: [ - 'constructor(address _logic, address admin_, bytes _data) payable', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address admin_)', - 'function changeAdmin(address newAdmin)', - 'function implementation() returns (address implementation_)', - 'function upgradeTo(address newImplementation)', - 'function upgradeToAndCall(address newImplementation, bytes data) payable', - 'receive() external payable', - ], - logicAbi: [ - 'event DefaultGatewayUpdated(address newDefaultGateway)', - 'event GatewaySet(address indexed l1Token, address indexed gateway)', - 'event TransferRouted(address indexed token, address indexed _userFrom, address indexed _userTo, address gateway)', - 'event TxToL1(address indexed _from, address indexed _to, uint256 indexed _id, bytes _data)', - 'function calculateL2TokenAddress(address l1ERC20) view returns (address)', - 'function counterpartGateway() view returns (address)', - 'function defaultGateway() view returns (address)', - 'function finalizeInboundTransfer(address, address, address, uint256, bytes) payable', - 'function getGateway(address _token) view returns (address gateway)', - 'function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns (bytes)', - 'function initialize(address _counterpartGateway, address _defaultGateway)', - 'function l1TokenToGateway(address) view returns (address)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, bytes _data) payable returns (bytes)', - 'function outboundTransfer(address _token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns (bytes)', - 'function postUpgradeInit()', - 'function router() view returns (address)', - 'function setDefaultGateway(address newL2DefaultGateway)', - 'function setGateway(address[] _l1Token, address[] _gateway)', - ], - logicAddress: '0xe80eb0238029333e368e0bDDB7acDf1b9cb28278', - references: [ARBITRUM_SMART_CONTRACT_ADDRESSES], - }, - L2ERC20Gateway: { - name: 'L2ERC20Gateway', - description: - "Initiates Arbitrum to Ethereum ERC20 transfers, which are forwarded to the token's L2 Gateway to communicate with its corresponding L1 Gateway.", - kind: DeployedContractKind.Utility, - address: '0x09e9222E96E7B4AE2a407B98d48e330053351EEe', - proxyAbi: [ - 'constructor(address _logic, address admin_, bytes _data) payable', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address admin_)', - 'function changeAdmin(address newAdmin)', - 'function implementation() returns (address implementation_)', - 'function upgradeTo(address newImplementation)', - 'function upgradeToAndCall(address newImplementation, bytes data) payable', - 'receive() external payable', - ], - logicAbi: [ - 'event DepositFinalized(address indexed l1Token, address indexed _from, address indexed _to, uint256 _amount)', - 'event TxToL1(address indexed _from, address indexed _to, uint256 indexed _id, bytes _data)', - 'event WithdrawalInitiated(address l1Token, address indexed _from, address indexed _to, uint256 indexed _l2ToL1Id, uint256 _exitNum, uint256 _amount)', - 'function beaconProxyFactory() view returns (address)', - 'function calculateL2TokenAddress(address l1ERC20) view returns (address)', - 'function cloneableProxyHash() view returns (bytes32)', - 'function counterpartGateway() view returns (address)', - 'function exitNum() view returns (uint256)', - 'function finalizeInboundTransfer(address _token, address _from, address _to, uint256 _amount, bytes _data) payable', - 'function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns (bytes outboundCalldata)', - 'function getUserSalt(address l1ERC20) pure returns (bytes32)', - 'function initialize(address _l1Counterpart, address _router, address _beaconProxyFactory)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, bytes _data) payable returns (bytes)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, uint256, uint256, bytes _data) payable returns (bytes res)', - 'function postUpgradeInit()', - 'function router() view returns (address)', - ], - logicAddress: '0x1DCf7D03574fbC7C205F41f2e116eE094a652e93', - references: [ARBITRUM_SMART_CONTRACT_ADDRESSES], - }, - L2CustomGateway: { - name: 'L2CustomGateway', - description: - 'Allows to transfer of custom tokens from Arbitrum to Ethereum, which are forwarded to the L2 Gateway to communicate with its corresponding L1 Gateway.', - kind: DeployedContractKind.Utility, - address: '0x096760F208390250649E3e8763348E783AEF5562', - proxyAbi: [ - 'constructor(address _logic, address admin_, bytes _data) payable', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address admin_)', - 'function changeAdmin(address newAdmin)', - 'function implementation() returns (address implementation_)', - 'function upgradeTo(address newImplementation)', - 'function upgradeToAndCall(address newImplementation, bytes data) payable', - 'receive() external payable', - ], - logicAbi: [ - 'event DepositFinalized(address indexed l1Token, address indexed _from, address indexed _to, uint256 _amount)', - 'event TokenSet(address indexed l1Address, address indexed l2Address)', - 'event TxToL1(address indexed _from, address indexed _to, uint256 indexed _id, bytes _data)', - 'event WithdrawalInitiated(address l1Token, address indexed _from, address indexed _to, uint256 indexed _l2ToL1Id, uint256 _exitNum, uint256 _amount)', - 'function calculateL2TokenAddress(address l1ERC20) view returns (address)', - 'function counterpartGateway() view returns (address)', - 'function exitNum() view returns (uint256)', - 'function finalizeInboundTransfer(address _token, address _from, address _to, uint256 _amount, bytes _data) payable', - 'function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns (bytes outboundCalldata)', - 'function initialize(address _l1Counterpart, address _router)', - 'function l1ToL2Token(address) view returns (address)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, bytes _data) payable returns (bytes)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, uint256, uint256, bytes _data) payable returns (bytes res)', - 'function postUpgradeInit()', - 'function registerTokenFromL1(address[] l1Address, address[] l2Address)', - 'function router() view returns (address)', - ], - logicAddress: '0x190274fEa8f30e3f48CE43aDCBd9a74110118284', - references: [ARBITRUM_SMART_CONTRACT_ADDRESSES], - }, - L2WethGateway: { - name: 'L2WethGateway', - description: - "Handles Arbitrum to Ethereum transfers of WETH by unwrapping the Ether and re-wrapping it on Ethereum, ensuring that all WETH tokens are always fully collateralized on the layer it's transferred to.", - kind: DeployedContractKind.Utility, - address: '0x6c411aD3E74De3E7Bd422b94A27770f5B86C623B', - proxyAbi: [ - 'constructor(address _logic, address admin_, bytes _data) payable', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address admin_)', - 'function changeAdmin(address newAdmin)', - 'function implementation() returns (address implementation_)', - 'function upgradeTo(address newImplementation)', - 'function upgradeToAndCall(address newImplementation, bytes data) payable', - 'receive() external payable', - ], - logicAbi: [ - 'event DepositFinalized(address indexed l1Token, address indexed _from, address indexed _to, uint256 _amount)', - 'event TxToL1(address indexed _from, address indexed _to, uint256 indexed _id, bytes _data)', - 'event WithdrawalInitiated(address l1Token, address indexed _from, address indexed _to, uint256 indexed _l2ToL1Id, uint256 _exitNum, uint256 _amount)', - 'function calculateL2TokenAddress(address l1ERC20) view returns (address)', - 'function counterpartGateway() view returns (address)', - 'function exitNum() view returns (uint256)', - 'function finalizeInboundTransfer(address _token, address _from, address _to, uint256 _amount, bytes _data) payable', - 'function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns (bytes outboundCalldata)', - 'function initialize(address _l1Counterpart, address _router, address _l1Weth, address _l2Weth)', - 'function l1Weth() view returns (address)', - 'function l2Weth() view returns (address)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, bytes _data) payable returns (bytes)', - 'function outboundTransfer(address _l1Token, address _to, uint256 _amount, uint256, uint256, bytes _data) payable returns (bytes res)', - 'function postUpgradeInit()', - 'function router() view returns (address)', - 'receive() external payable', - ], - logicAddress: '0x806421D09cDb253aa9d128a658e60c0B95eFFA01', - references: [ARBITRUM_SMART_CONTRACT_ADDRESSES], - }, - L2Multicall: { - name: 'L2Multicall', - description: - 'The L2Multicall contract enables batched read operations on Arbitrum, where block numbers are calculated via the ArbSys precompile.', - kind: DeployedContractKind.Utility, - address: '0x842eC2c7D803033Edf55E478F461FC547Bc54EB2', - references: [ARBITRUM_SMART_CONTRACT_ADDRESSES], - logicAbi: [ - 'struct Call { address target; bytes callData; }', - 'struct Result { bool success; bytes returnData; }', - 'function aggregate(Call[] calldata calls) public returns (uint256 blockNumber, bytes[] memory returnData)', - 'function blockAndAggregate(Call[] calldata calls) public returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)', - 'function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)', - 'function getBlockNumber() view returns (uint256 blockNumber)', - 'function getCurrentBlockCoinbase() view returns (address coinbase)', - 'function getCurrentBlockDifficulty() view returns (uint256 difficulty)', - 'function getCurrentBlockGasLimit() view returns (uint256 gaslimit)', - 'function getCurrentBlockTimestamp() view returns (uint256 timestamp)', - 'function getEthBalance(address addr) view returns (uint256 balance)', - 'function getLastBlockHash() view returns (bytes32 blockHash)', - 'function getL1BlockNumber() public view returns (uint256 l1BlockNumber)', - 'function tryAggregate(bool requireSuccess, Call[] calldata calls) public returns (Result[] memory returnData)', - 'function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)', - ], - }, -}; - -arbitrumDeployedContracts['Wrapped Native Token'] = { - ...arbitrumDeployedContracts['Wrapped Native Token'], - address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', - references: [ - ...arbitrumDeployedContracts['Wrapped Native Token'].references, - '[Arbitrum Docs: Smart contract addresses](https://docs.arbitrum.io/for-devs/useful-addresses#core-contracts-1)', - ], - proxyAbi: [ - 'constructor(address _logic, address admin_, bytes _data) payable', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address admin_)', - 'function changeAdmin(address newAdmin)', - 'function implementation() returns (address implementation_)', - 'function upgradeTo(address newImplementation)', - 'function upgradeToAndCall(address newImplementation, bytes data) payable', - 'receive() external payable', - ], - logicAbi: [ - 'event Approval(address indexed owner, address indexed spender, uint256 value)', - 'event Transfer(address indexed from, address indexed to, uint256 value, bytes data)', - 'event Transfer(address indexed from, address indexed to, uint256 value)', - 'function DOMAIN_SEPARATOR() view returns (bytes32)', - 'function allowance(address owner, address spender) view returns (uint256)', - 'function approve(address spender, uint256 amount) returns (bool)', - 'function balanceOf(address account) view returns (uint256)', - 'function bridgeBurn(address account, uint256 amount)', - 'function bridgeMint(address account, uint256 amount)', - 'function decimals() view returns (uint8)', - 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)', - 'function deposit() payable', - 'function depositTo(address account) payable', - 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)', - 'function initialize(string _name, string _symbol, uint8 _decimals, address _l2Gateway, address _l1Address)', - 'function l1Address() view returns (address)', - 'function l2Gateway() view returns (address)', - 'function name() view returns (string)', - 'function nonces(address owner) view returns (uint256)', - 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)', - 'function symbol() view returns (string)', - 'function totalSupply() view returns (uint256)', - 'function transfer(address recipient, uint256 amount) returns (bool)', - 'function transferAndCall(address _to, uint256 _value, bytes _data) returns (bool success)', - 'function transferFrom(address sender, address recipient, uint256 amount) returns (bool)', - 'function withdraw(uint256 amount)', - 'function withdrawTo(address account, uint256 amount)', - 'receive() external payable', - ], - logicAddress: '0x8b194bEae1d3e0788A1a35173978001ACDFba668', -}; - -export const deployedContracts = arbitrumDeployedContracts; diff --git a/src/chains/arbitrum/index.ts b/src/chains/arbitrum/index.ts deleted file mode 100644 index 94348b08..00000000 --- a/src/chains/arbitrum/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { arbitrum as arbitrumMetadata } from '@wagmi/chains'; -import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; -import { accountTypes } from './accountTypes'; -import { deployedContracts } from './deployedContracts'; -import { consensusNodes, executionNodes } from './nodes'; -import { signatureTypes } from './signatureTypes'; -import { opcodes } from './vm/opcodes'; -import { precompiles } from './vm/precompiles'; -import { predeploys } from './vm/predeploys'; - -export const arbitrum: Chain = { - metadata: arbitrumMetadata, - precompiles, - predeploys, - signatureTypes: sortedArrayByField(signatureTypes, 'prefixByte'), - accountTypes: sortedArrayByField(accountTypes, 'name'), - opcodes: sortedArrayByField(opcodes, 'number'), - mempools: [], - deployedContracts: sortedArrayByFields(deployedContracts, ['kind', 'name']), - eips: [], - executionNodes, - consensusNodes, -}; diff --git a/src/chains/arbitrum/nodes.ts b/src/chains/arbitrum/nodes.ts deleted file mode 100644 index 149a7012..00000000 --- a/src/chains/arbitrum/nodes.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Language, Node, NodeType } from '@/types'; - -const nitro: Node = { - name: 'nitro', - description: - 'Nitro is the latest iteration of the Arbitrum technology. It is a fully integrated, complete layer 2 optimistic rollup system, including fraud proofs, the sequencer, the token bridges, advanced calldata compression, and more.', - type: NodeType.Execution, - language: Language.Go, - repository: 'https://github.com/OffchainLabs/nitro', - documentation: 'https://docs.arbitrum.io/', -}; - -export const executionNodes: Node[] = [nitro]; -export const consensusNodes: Node[] = []; // Arbitrum does not have any consensus nodes. diff --git a/src/chains/arbitrum/signatureTypes.ts b/src/chains/arbitrum/signatureTypes.ts deleted file mode 100644 index 1a9b8fb2..00000000 --- a/src/chains/arbitrum/signatureTypes.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import { SignatureType } from '@/types'; - -const txTypeDocs = - '[Arbitrum Transaction Types](https://developer.arbitrum.io/arbos/geth#transaction-types)'; - -const arbitrumDepositTx: SignatureType = { - prefixByte: 0x64, - description: - "Represents a user deposit from L1 to L2. This increases the user's balance by the amount deposited on L1.", - signedData: ['`keccak256(0x64 || rlp([chainId, l1RequestId, from, to, value]))`'], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L48', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L371-L377', - ], -}; - -const arbitrumUnsignedTx: SignatureType = { - prefixByte: 0x65, - description: - "A message from a user on L1 to a contract on L2 that uses the bridge for authentication instead of requiring the user's signature.", - signedData: [ - '`keccak256(0x65 || rlp([chainId, from, nonce, maxFeePerGas, gasLimit, to, value, data]))`', - ], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L49', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L48-L58', - ], -}; - -const arbitrumContractTx: SignatureType = { - prefixByte: 0x66, - description: - "Similar to an `ArbitrumUnsignedTx` but intended for smart contracts. Uses the bridge's unique, sequential nonce rather than requiring the caller specify their own.", - signedData: [ - '`keccak256(0x66 || rlp([chainId, requestId, from, maxFeePerGas, gasLimit, to, value, data]))`', - ], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L50', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L116-L126', - ], -}; - -const arbitrumSubmitRetryableTx: SignatureType = { - prefixByte: 0x69, - description: 'A retryable submission and may schedule an ArbitrumRetryTx if provided enough gas.', - signedData: [ - '`keccak256(0x69 || rlp([chainId, requestId, from, l1BaseFee, depositValue, maxFeePerGas, gasLimit, retryTo, retryValue, beneficiary, maxSubmissionFee, feeRefundAddress, retryData]))`', - ], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L52', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L258-L273', - ], -}; - -const arbitrumRetryTx: SignatureType = { - prefixByte: 0x68, - description: - 'Transactions scheduled by calls to the redeem precompile method and via retryable auto-redemption.', - signedData: [ - '`keccak256(0x68 || rlp([chainId, nonce, from, maxFeePerGas, gasLimit, to, value, data, ticketId, refundTo, maxRefund, submissionFeeRefund]))`', - ], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L51', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L180-L194', - ], -}; - -const arbitrumInternalTx: SignatureType = { - prefixByte: 0x6a, - description: 'ArbOS-created transaction to update state between user-generated transactions.', - signedData: ['`keccak256(0x6a || rlp([chainId, data]))`'], - signs: 'transaction', - references: [ - txTypeDocs, - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/transaction.go#L53', - 'https://github.com/OffchainLabs/go-ethereum/blob/dcd0ff9ad8b4c84a9456c6b37f9047233adf7181/core/types/arb_types.go#L424-L427', - ], -}; - -const arbitrumLegacyTx: SignatureType = { - prefixByte: 0x78, - description: 'A legacy transaction', - signedData: mainnetSignatureTypes[0x00].signedData, - signs: 'transaction', - references: [ - 'https://github.com/OffchainLabs/go-ethereum/blob/a2132df21812259f604855f8ae399745fa9b6de6/core/types/transaction.go#L54', - ...mainnetSignatureTypes[0x00].references, - ], -}; - -export const signatureTypes = { - ...mainnetSignatureTypes, - ...{ [arbitrumDepositTx.prefixByte]: arbitrumDepositTx }, - ...{ [arbitrumUnsignedTx.prefixByte]: arbitrumUnsignedTx }, - ...{ [arbitrumContractTx.prefixByte]: arbitrumContractTx }, - ...{ [arbitrumSubmitRetryableTx.prefixByte]: arbitrumSubmitRetryableTx }, - ...{ [arbitrumRetryTx.prefixByte]: arbitrumRetryTx }, - ...{ [arbitrumInternalTx.prefixByte]: arbitrumInternalTx }, - ...{ [arbitrumLegacyTx.prefixByte]: arbitrumLegacyTx }, -}; diff --git a/src/chains/arbitrum/vm/opcodes/block/blockhash.ts b/src/chains/arbitrum/vm/opcodes/block/blockhash.ts deleted file mode 100644 index 79ee0ae7..00000000 --- a/src/chains/arbitrum/vm/opcodes/block/blockhash.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { blockhash as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/blockhash'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const blockhash: Omit = { - ...opcode, - description: - 'Returns a cryptographically insecure, pseudo-random hash for `x` within the range `block.number - 256 <= x < block.number`. If `x` is outside of this range, `blockhash(x)` will return 0. This includes `blockhash(block.number)`, which always returns 0 just like on Ethereum. The hashes returned do not come from L1.', - outputs: [ - { - name: 'hash', - description: - 'The pseudo-random hash for the input block number, or 0 if the block number is not in the valid range', - }, - ], - examples: [ - { - input: '17813636', - output: '0xfe4f20b10608dbb75f84782733dd434832c50192993f7389386dfa40f6feda4b', - }, - ], - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://developer.arbitrum.io/solidity-support)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/block/coinbase.ts b/src/chains/arbitrum/vm/opcodes/block/coinbase.ts deleted file mode 100644 index eec479db..00000000 --- a/src/chains/arbitrum/vm/opcodes/block/coinbase.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { coinbase as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/coinbase'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const coinbase: Omit = { - ...opcode, - description: - "Returns the designated internal address `0xA4b000000000000000000073657175656e636572` if the message was posted by a sequencer. If it's a delayed message, it returns the address of the delayed message's poster.", - outputs: [ - { - name: 'address', - description: - "The L1 Batch Poster's address if the message was posted by a sequencer, or the address of the delayed message's poster if it's a delayed message.", - }, - ], - examples: [ - { - output: '0xA4b000000000000000000073657175656e636572', - }, - ], - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://docs.arbitrum.io/for-devs/concepts/differences-between-arbitrum-ethereum/solidity-support)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/block/number.ts b/src/chains/arbitrum/vm/opcodes/block/number.ts deleted file mode 100644 index 58bdb608..00000000 --- a/src/chains/arbitrum/vm/opcodes/block/number.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { number as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/number'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const number: Omit = { - ...opcode, - description: - 'Returns an estimate of the L1 block number at which the Sequencer received the transaction.', - outputs: [ - { - name: 'blockNumber', - description: - 'Estimate of the L1 block number at which the Sequencer received the transaction.', - }, - ], - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://developer.arbitrum.io/solidity-support)', - '[Arbitrum Block Numbers and Time](https://developer.arbitrum.io/time)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/block/prevrandao.ts b/src/chains/arbitrum/vm/opcodes/block/prevrandao.ts deleted file mode 100644 index a22f0f19..00000000 --- a/src/chains/arbitrum/vm/opcodes/block/prevrandao.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { prevrandao as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/prevrandao'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, notes: _notes, ...opcode } = baseOpcode; -export const prevrandao: Omit = { - ...opcode, - outputs: [{ name: 'constant', description: 'The constant `1`.' }], - examples: [{ output: '1' }], - description: 'Returns the constant `1`.', - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://developer.arbitrum.io/solidity-support)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/environment/caller.ts b/src/chains/arbitrum/vm/opcodes/environment/caller.ts deleted file mode 100644 index 754acecb..00000000 --- a/src/chains/arbitrum/vm/opcodes/environment/caller.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { caller as baseOpcode } from '@/chains/optimism/vm/opcodes/environment/caller'; -import { Opcode } from '@/types'; - -const { references: _references, ...opcode } = baseOpcode; -export const caller: Omit = { - ...opcode, - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://developer.arbitrum.io/solidity-support)', - '[L1 to L2 Messaging, Address Aliasing](https://developer.arbitrum.io/arbos/l1-to-l2-messaging#address-aliasing)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/environment/origin.ts b/src/chains/arbitrum/vm/opcodes/environment/origin.ts deleted file mode 100644 index 064b1984..00000000 --- a/src/chains/arbitrum/vm/opcodes/environment/origin.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { origin as baseOpcode } from '@/chains/optimism/vm/opcodes/environment/origin'; -import { Opcode } from '@/types'; - -const { references: _references, ...opcode } = baseOpcode; -export const origin: Omit = { - ...opcode, - references: [ - '[Arbitrum Differences from Solidity on Ethereum](https://developer.arbitrum.io/solidity-support)', - '[L1 to L2 Messaging, Address Aliasing](https://developer.arbitrum.io/arbos/l1-to-l2-messaging#address-aliasing)', - ], -}; diff --git a/src/chains/arbitrum/vm/opcodes/index.ts b/src/chains/arbitrum/vm/opcodes/index.ts deleted file mode 100644 index b268e06f..00000000 --- a/src/chains/arbitrum/vm/opcodes/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { opcodes as mainnetOpcodes } from '@/chains/mainnet/vm/opcodes'; -import { Opcode } from '@/types'; -import { blockhash } from './block/blockhash'; -import { coinbase } from './block/coinbase'; -import { number } from './block/number'; -import { prevrandao } from './block/prevrandao'; -import { caller } from './environment/caller'; -import { origin } from './environment/origin'; -import { push0 } from './stack/push0'; - -export const opcodes: Record> = { - ...mainnetOpcodes, - - // block - ...{ [blockhash.number]: blockhash }, - ...{ [coinbase.number]: coinbase }, - ...{ [prevrandao.number]: prevrandao }, - ...{ [number.number]: number }, - - // environment - ...{ [caller.number]: caller }, - ...{ [origin.number]: origin }, - - // stack - ...{ [push0.number]: push0 }, -}; diff --git a/src/chains/arbitrum/vm/opcodes/stack/push0.ts b/src/chains/arbitrum/vm/opcodes/stack/push0.ts deleted file mode 100644 index e94fb216..00000000 --- a/src/chains/arbitrum/vm/opcodes/stack/push0.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { push0 as baseOpcode } from '@/chains/mainnet/vm/opcodes/stack/push'; -import { Opcode } from '@/types'; - -export const push0: Opcode = { - ...baseOpcode, - supportedHardforks: ['ArbOS 11'], -}; diff --git a/src/chains/arbitrum/vm/precompiles.ts b/src/chains/arbitrum/vm/precompiles.ts deleted file mode 100644 index dee0f61f..00000000 --- a/src/chains/arbitrum/vm/precompiles.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import { Precompile } from '@/types'; - -const ARBITRUM_SMART_CONTRACT_ADDRESSES = - '[Arbitrum Smart Contract Addresses](https://docs.arbitrum.io/for-devs/useful-addresses#precompiles)'; - -export const precompiles: Precompile[] = [ - ...mainnetPrecompiles, - { - address: '0x0000000000000000000000000000000000000064', - name: '`ArbSys`', - description: - 'Exposes a variety of system-level functionality for interacting with Ethereum and understanding the call stack.', - logicAbi: [ - 'event L2ToL1Transaction(address caller, address indexed destination, uint256 indexed uniqueId, uint256 indexed batchNumber, uint256 indexInBatch, uint256 arbBlockNum, uint256 ethBlockNum, uint256 timestamp, uint256 callvalue, bytes data)', - 'event L2ToL1Tx(address caller, address indexed destination, uint256 indexed hash, uint256 indexed position, uint256 arbBlockNum, uint256 ethBlockNum, uint256 timestamp, uint256 callvalue, bytes data)', - 'event SendMerkleUpdate(uint256 indexed reserved, bytes32 indexed hash, uint256 indexed position)', - 'function arbBlockHash(uint256 arbBlockNum) view returns (bytes32)', - 'function arbBlockNumber() view returns (uint256)', - 'function arbChainID() view returns (uint256)', - 'function arbOSVersion() view returns (uint256)', - 'function getStorageGasAvailable() view returns (uint256)', - 'function isTopLevelCall() view returns (bool)', - 'function mapL1SenderContractAddressToL2Alias(address sender, address unused) pure returns (address)', - 'function myCallersAddressWithoutAliasing() view returns (address)', - 'function sendMerkleTreeState() view returns (uint256 size, bytes32 root, bytes32[] partials)', - 'function sendTxToL1(address destination, bytes data) payable returns (uint256)', - 'function wasMyCallersAddressAliased() view returns (bool)', - 'function withdrawEth(address destination) payable returns (uint256)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbSys reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbsys)', - ], - }, - { - address: '0x000000000000000000000000000000000000006E', - name: '`ArbRetryableTx`', - description: 'Manages retryable transactions related to data retrieval and interactions.', - logicAbi: [ - 'error NoTicketWithID()', - 'error NotCallable()', - 'event Canceled(bytes32 indexed ticketId)', - 'event LifetimeExtended(bytes32 indexed ticketId, uint256 newTimeout)', - 'event RedeemScheduled(bytes32 indexed ticketId, bytes32 indexed retryTxHash, uint64 indexed sequenceNum, uint64 donatedGas, address gasDonor, uint256 maxRefund, uint256 submissionFeeRefund)', - 'event Redeemed(bytes32 indexed userTxHash)', - 'event TicketCreated(bytes32 indexed ticketId)', - 'function cancel(bytes32 ticketId)', - 'function getBeneficiary(bytes32 ticketId) view returns (address)', - 'function getCurrentRedeemer() view returns (address)', - 'function getLifetime() view returns (uint256)', - 'function getTimeout(bytes32 ticketId) view returns (uint256)', - 'function keepalive(bytes32 ticketId) returns (uint256)', - 'function redeem(bytes32 ticketId) returns (bytes32)', - 'function submitRetryable(bytes32 requestId, uint256 l1BaseFee, uint256 deposit, uint256 callvalue, uint256 gasFeeCap, uint64 gasLimit, uint256 maxSubmissionFee, address feeRefundAddress, address beneficiary, address retryTo, bytes retryData)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbRetryableTx reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbretryabletx)', - ], - }, - { - address: '0x000000000000000000000000000000000000006C', - name: '`ArbGasInfo`', - description: 'Provides insight into the costs of using Arbitrum.', - logicAbi: [ - 'function getAmortizedCostCapBips() view returns (uint64)', - 'function getCurrentTxL1GasFees() view returns (uint256)', - 'function getGasAccountingParams() view returns (uint256, uint256, uint256)', - 'function getGasBacklog() view returns (uint64)', - 'function getGasBacklogTolerance() view returns (uint64)', - 'function getLastL1PricingSurplus() view returns (int256)', - 'function getLastL1PricingUpdateTime() view returns (uint64)', - 'function getL1BaseFeeEstimate() view returns (uint256)', - 'function getL1BaseFeeEstimateInertia() view returns (uint64)', - 'function getL1FeesAvailable() view returns (uint256)', - 'function getL1GasPriceEstimate() view returns (uint256)', - 'function getL1PricingEquilibrationUnits() view returns (uint256)', - 'function getL1PricingFundsDueForRewards() view returns (uint256)', - 'function getL1PricingSurplus() view returns (int256)', - 'function getL1PricingUnitsSinceUpdate() view returns (uint64)', - 'function getL1RewardRate() view returns (uint64)', - 'function getL1RewardRecipient() view returns (address)', - 'function getMinimumGasPrice() view returns (uint256)', - 'function getPerBatchGasCharge() view returns (int64)', - 'function getPricesInArbGas() view returns (uint256, uint256, uint256)', - 'function getPricesInArbGasWithAggregator(address aggregator) view returns (uint256, uint256, uint256)', - 'function getPricesInWei() view returns (uint256, uint256, uint256, uint256, uint256, uint256)', - 'function getPricesInWeiWithAggregator(address aggregator) view returns (uint256, uint256, uint256, uint256, uint256, uint256)', - 'function getPricingInertia() view returns (uint64)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbGasInfo reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbgasinfo)', - ], - }, - { - address: '0x0000000000000000000000000000000000000066', - name: '`ArbAddressTable`', - description: - 'Allows registering and retrieving commonly used addresses via indices, saving calldata.', - logicAbi: [ - 'function addressExists(address addr) view returns (bool)', - 'function compress(address addr) returns (bytes)', - 'function decompress(bytes buf, uint256 offset) view returns (address, uint256)', - 'function lookup(address addr) view returns (uint256)', - 'function lookupIndex(uint256 index) view returns (address)', - 'function register(address addr) returns (uint256)', - 'function size() view returns (uint256)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbAddressTable reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbaddresstable)', - ], - }, - { - address: '0x000000000000000000000000000000000000006F', - name: '`ArbStatistics`', - description: - 'Provides statistics about Arbitrum, such as the number of blocks, accounts, transactions, and contracts.', - logicAbi: [ - 'function getStats() view returns (uint256, uint256, uint256, uint256, uint256, uint256)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbStatistics reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbstatistics)', - ], - }, - { - address: '0x0000000000000000000000000000000000000070', - name: '`ArbOwner`', - description: - 'Provides owners with tools for managing the rollup. All calls to this precompile are authorized by the OwnerPrecompile wrapper, which ensures only a chain owner can access these methods.', - logicAbi: [ - 'event OwnerActs(bytes4 indexed method, address indexed owner, bytes data)', - 'function addChainOwner(address newOwner)', - 'function getAllChainOwners() view returns (address[])', - 'function getInfraFeeAccount() view returns (address)', - 'function getNetworkFeeAccount() view returns (address)', - 'function isChainOwner(address addr) view returns (bool)', - 'function releaseL1PricerSurplusFunds(uint256 maxWeiToRelease) returns (uint256)', - 'function removeChainOwner(address ownerToRemove)', - 'function scheduleArbOSUpgrade(uint64 newVersion, uint64 timestamp)', - 'function setAmortizedCostCapBips(uint64 cap)', - 'function setBrotliCompressionLevel(uint64 level)', - 'function setChainConfig(string calldata chainConfig)', - 'function setInfraFeeAccount(address newInfraFeeAccount)', - 'function setL1BaseFeeEstimateInertia(uint64 inertia)', - 'function setL1PricePerUnit(uint256 pricePerUnit)', - 'function setL1PricingEquilibrationUnits(uint256 equilibrationUnits)', - 'function setL1PricingInertia(uint64 inertia)', - 'function setL1PricingRewardRate(uint64 weiPerUnit)', - 'function setL1PricingRewardRecipient(address recipient)', - 'function setL2BaseFee(uint256 priceInWei)', - 'function setL2GasBacklogTolerance(uint64 sec)', - 'function setL2GasPricingInertia(uint64 sec)', - 'function setMaxTxGasLimit(uint64 limit)', - 'function setMinimumL2BaseFee(uint256 priceInWei)', - 'function setNetworkFeeAccount(address newNetworkFeeAccount)', - 'function setPerBatchGasCharge(int64 cost)', - 'function setSpeedLimit(uint64 limit)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbOwner reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbowner)', - ], - }, - { - address: '0x000000000000000000000000000000000000006b', - name: '`ArbOwnerPublic`', - description: - 'Provides non-owners with info about the current chain owners. The calls to this precompile do not require the sender be a chain owner. For those that are, see `ArbOwner`.', - logicAbi: [ - 'event ChainOwnerRectified(address rectifiedOwner)', - 'function getAllChainOwners() view returns (address[])', - 'function getBrotliCompressionLevel() view returns (uint64)', - 'function getInfraFeeAccount() view returns (address)', - 'function getNetworkFeeAccount() view returns (address)', - 'function getScheduledUpgrade() view returns (uint64 arbosVersion, uint64 scheduledForTimestamp)', - 'function isChainOwner(address addr) view returns (bool)', - 'function rectifyChainOwner(address ownerToRectify)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbOwnerPublic reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbownerpublic)', - ], - }, - { - address: '0x000000000000000000000000000000000000006D', - name: '`ArbAggregator`', - description: - "Provides aggregators and their users methods for configuring how they participate in Ethereum aggregation. The default aggregator is Arbitrum's Sequencer.", - logicAbi: [ - 'function addBatchPoster(address newBatchPoster)', - 'function getBatchPosters() view returns (address[])', - 'function getDefaultAggregator() view returns (address)', - 'function getFeeCollector(address batchPoster) view returns (address)', - 'function getPreferredAggregator(address addr) view returns (address, bool)', - 'function getTxBaseFee(address aggregator) view returns (uint256)', - 'function setFeeCollector(address batchPoster, address newFeeCollector)', - 'function setTxBaseFee(address aggregator, uint256 feeInL1Gas)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbAggregator reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbaggregator)', - ], - }, - { - address: '0x0000000000000000000000000000000000000068', - name: '`ArbFunctionTable`', - description: - 'Allows aggregators to manage function tables for one form of transaction compression.', - logicAbi: [ - 'function get(address addr, uint256 index) view returns (uint256, bool, uint256)', - 'function size(address addr) view returns (uint256)', - 'function upload(bytes buf)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbFunctionTable reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbfunctiontable)', - ], - }, - { - address: '0x0000000000000000000000000000000000000065', - name: '`ArbInfo`', - description: 'Provides the ability to lookup basic info about accounts and contracts.', - logicAbi: [ - 'function getBalance(address account) view returns (uint256)', - 'function getCode(address account) view returns (bytes memory)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[ArbInfo reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/precompiles#arbinfo)', - ], - }, - { - address: '0x00000000000000000000000000000000000000C8', - name: '`NodeInterface`', - description: - 'Only accessible via RPCs (not deployed on-chain), includes helper functions to construct proofs for executing L2->L1 messages, estimate gas consumption and more.', - logicAbi: [ - 'function blockL1Num(uint64 l2BlockNum) view returns (uint64 l1BlockNum)', - 'function constructOutboxProof(uint64 size, uint64 leaf) view returns (bytes32 send, bytes32 root, bytes32[] proof)', - 'function estimateRetryableTicket(address sender, uint256 deposit, address to, uint256 l2CallValue, address excessFeeRefundAddress, address callValueRefundAddress, bytes data)', - 'function findBatchContainingBlock(uint64 blockNum) view returns (uint64 batch)', - 'function gasEstimateComponents(address to, bool contractCreation, bytes data) payable returns (uint64 gasEstimate, uint64 gasEstimateForL1, uint256 baseFee, uint256 l1BaseFeeEstimate)', - 'function gasEstimateL1Component(address to, bool contractCreation, bytes data) payable returns (uint64 gasEstimateForL1, uint256 baseFee, uint256 l1BaseFeeEstimate)', - 'function getL1Confirmations(bytes32 blockHash) view returns (uint64 confirmations)', - 'function legacyLookupMessageBatchProof(uint256 batchNum, uint64 index) view returns (bytes32[] proof, uint256 path, address l2Sender, address l1Dest, uint256 l2Block, uint256 l1Block, uint256 timestamp, uint256 amount, bytes calldataForL1)', - 'function l2BlockRangeForL1(uint64 blockNum) view returns (uint64 firstBlock, uint64 lastBlock)', - 'function nitroGenesisBlock() pure returns (uint256 number)', - ], - deprecated: false, - references: [ - ARBITRUM_SMART_CONTRACT_ADDRESSES, - '[NodeInterface reference](https://docs.arbitrum.io/for-devs/dev-tools-and-resources/nodeinterface)', - ], - }, -]; diff --git a/src/chains/arbitrum/vm/predeploys.ts b/src/chains/arbitrum/vm/predeploys.ts deleted file mode 100644 index e003601e..00000000 --- a/src/chains/arbitrum/vm/predeploys.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Predeploy } from '@/types'; - -export const predeploys: Predeploy[] = []; diff --git a/src/chains/index.ts b/src/chains/index.ts deleted file mode 100644 index 8113619b..00000000 --- a/src/chains/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { arbitrum } from '@/chains/arbitrum'; -import { mainnet } from '@/chains/mainnet'; -import { optimism } from '@/chains/optimism'; - -export const chains = { arbitrum, mainnet, optimism }; - -export const getChainById = (chainId: string | number | bigint | undefined) => { - if (!chainId) return undefined; - chainId = BigInt(chainId); - return Object.values(chains).find((chain) => BigInt(chain.metadata.id) === chainId); -}; diff --git a/src/chains/mainnet/accountTypes.ts b/src/chains/mainnet/accountTypes.ts deleted file mode 100644 index bd9a2ad8..00000000 --- a/src/chains/mainnet/accountTypes.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AccountType } from '@/types'; - -const ethereumAccounts = '[Ethereum Accounts](https://ethereum.org/en/developers/docs/accounts/)'; - -export const eoa: AccountType = { - name: 'EOA', - description: 'An externally-owned account (EOA) is controlled by a private key.', - references: [ethereumAccounts], - properties: { - canBatchTxs: false, - canInitiateTxs: true, - hasCode: false, - hasKeyPair: true, - hasStorage: false, - }, -}; - -export const contract: AccountType = { - name: 'Contract Account', - description: 'A smart contract deployed to the network, controlled by code.', - references: [ethereumAccounts], - properties: { - canBatchTxs: true, - canInitiateTxs: false, - hasCode: true, - hasKeyPair: false, - hasStorage: true, - }, -}; - -export const accountTypes = { - [eoa.name]: eoa, - [contract.name]: contract, -}; diff --git a/src/chains/mainnet/deployedContracts.ts b/src/chains/mainnet/deployedContracts.ts deleted file mode 100644 index 22032c96..00000000 --- a/src/chains/mainnet/deployedContracts.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { DeployedContract, DeployedContractKind } from '@/types'; - -const contracts: DeployedContract[] = [ - { - name: 'Wrapped Native Token', - description: - 'It allows users to deposit Ether into the contract and receive ERC-20 WETH tokens in return.', - kind: DeployedContractKind.WrappedNativeAsset, - tokenName: 'Wrapped Ether', - tokenSymbol: 'WETH', - address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', - references: [ - '[Alchemy Smart Contract Repository](https://www.alchemy.com/smart-contracts/weth9)', - ], - logicAbi: [ - 'function name() view returns (string)', - 'function approve(address guy, uint256 wad) returns (bool)', - 'function totalSupply() view returns (uint256)', - 'function transferFrom(address src, address dst, uint256 wad) returns (bool)', - 'function withdraw(uint256 wad)', - 'function decimals() view returns (uint8)', - 'function balanceOf(address) view returns (uint256)', - 'function symbol() view returns (string)', - 'function transfer(address dst, uint256 wad) returns (bool)', - 'function deposit() payable', - 'function allowance(address, address) view returns (uint256)', - 'fallback()', - 'event Approval(address indexed src, address indexed guy, uint256 wad)', - 'event Transfer(address indexed src, address indexed dst, uint256 wad)', - 'event Deposit(address indexed dst, uint256 wad)', - 'event Withdrawal(address indexed src, uint256 wad)', - ], - }, - { - name: 'Multicall3', - description: 'The Multicall3 contract enables batched read or write operations.', - kind: DeployedContractKind.Utility, - address: '0xcA11bde05977b3631167028862bE2a173976CA11', - deploymentInstructions: - 'https://github.com/mds1/multicall/blob/main/README.md#new-deployments.', - references: ['[Multicall3 website](https://www.multicall3.com/)'], - logicAbi: [ - 'struct Call { address target; bytes callData; }', - 'struct Call3 { address target; bool allowFailure; bytes callData; }', - 'struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }', - 'struct Result { bool success; bytes returnData; }', - 'function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)', - 'function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)', - 'function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)', - 'function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)', - 'function getBasefee() view returns (uint256 basefee)', - 'function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)', - 'function getBlockNumber() view returns (uint256 blockNumber)', - 'function getChainId() view returns (uint256 chainid)', - 'function getCurrentBlockCoinbase() view returns (address coinbase)', - 'function getCurrentBlockDifficulty() view returns (uint256 difficulty)', - 'function getCurrentBlockGasLimit() view returns (uint256 gaslimit)', - 'function getCurrentBlockTimestamp() view returns (uint256 timestamp)', - 'function getEthBalance(address addr) view returns (uint256 balance)', - 'function getLastBlockHash() view returns (bytes32 blockHash)', - 'function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)', - 'function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)', - ], - }, - { - name: "Nick Johnson's Create2 Deployer", - description: - 'A contract that allows you to deploy contracts to a deterministic address with CREATE2.', - kind: DeployedContractKind.Utility, - address: '0x4e59b44847b379578588920cA78FbF26c0B4956C', - deploymentInstructions: - 'https://github.com/Arachnid/deterministic-deployment-proxy/blob/master/README.md#deployment-transaction', - references: [ - 'https://github.com/Arachnid/deterministic-deployment-proxy/blob/master/README.md', - ], - logicAbi: [ - // Since the contract is written in Yul, it has no Solidity ABI. - JSON.stringify({ - payable: true, - stateMutability: 'payable', - type: 'fallback', - inputs: [ - { - internalType: 'bytes32', - name: 'salt', - type: 'bytes32', - }, - { - internalType: 'bytes32', - name: 'creationCode', - type: 'bytes', - }, - ], - }), - ], - }, - { - name: "0age's Create2 Deployer", - description: - 'A contract that allows you to deploy contracts to a deterministic address with CREATE2, and provides a safe deployment method that ensures the first 20 bytes of the salt are equal to the address of the caller.', - kind: DeployedContractKind.Utility, - address: '0x0000000000FFe8B47B3e2130213B802212439497', - deploymentInstructions: - 'https://github.com/ProjectOpenSea/seaport/blob/main/docs/Deployment.md#setting-up-factory-on-a-new-chain.', - references: [ - '[Etherscan: Keyless CREATE2 Factory](https://etherscan.io/address/0x0000000000FFe8B47B3e2130213B802212439497#code)', - ], - logicAbi: [ - 'function hasBeenDeployed(address deploymentAddress) view returns (bool)', - 'function safeCreate2(bytes32 salt, bytes initializationCode) payable returns (address deploymentAddress)', - 'function findCreate2Address(bytes32 salt, bytes initCode) view returns (address deploymentAddress)', - 'function findCreate2AddressViaHash(bytes32 salt, bytes32 initCodeHash) view returns (address deploymentAddress)', - ], - }, - { - name: "pcaversaccio's Create2 Deployer", - description: - 'A contract that allows you to deploy contracts to a deterministic address with CREATE2, and is part of a Hardhat plugin to simplify deterministic deployments.', - kind: DeployedContractKind.Utility, - address: '0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2', - deploymentInstructions: - 'See https://github.com/pcaversaccio/xdeployer/blob/main/README.md#local-deployment to deploy locally, or open an issue in that repo to request a new deployment.', - references: ['https://github.com/pcaversaccio/xdeployer/blob/main/README.md#local-deployment'], - logicAbi: [ - 'event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)', - 'event Paused(address account)', - 'event Unpaused(address account)', - 'function computeAddress(bytes32 salt, bytes32 codeHash) view returns (address)', - 'function computeAddressWithDeployer(bytes32 salt, bytes32 codeHash, address deployer) pure returns (address)', - 'function deploy(uint256 value, bytes32 salt, bytes code)', - 'function deployERC1820Implementer(uint256 value, bytes32 salt)', - 'function killCreate2Deployer(address payoutAddress)', - 'function owner() view returns (address)', - 'function pause()', - 'function paused() view returns (bool)', - 'function renounceOwnership()', - 'function transferOwnership(address newOwner)', - 'function unpause()', - 'receive() external payable', - ], - }, -]; - -// Reshape into a map where the key is the name. -export const deployedContracts: Record = contracts.reduce( - (acc, contract) => { - acc[contract.name] = contract; - return acc; - }, - {} as Record -); diff --git a/src/chains/mainnet/eips.ts b/src/chains/mainnet/eips.ts deleted file mode 100644 index 3ee0ce66..00000000 --- a/src/chains/mainnet/eips.ts +++ /dev/null @@ -1,554 +0,0 @@ -import { EIP, EIPCategory, EIPState } from '@/types/eip'; -import { MainnetHardfork, getMainnetHardforksFrom } from './hardforks'; - -const hardforksFromHomestead: string[] = getMainnetHardforksFrom(MainnetHardfork.Homestead); -const homesteadEIPs: EIP[] = [ - { - number: 2, - title: 'Homestead hard-fork changes', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromHomestead, - references: ['https://eips.ethereum.org/EIPS/eip-2'], - }, - { - number: 7, - title: 'Delegatecall', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromHomestead, - references: ['https://eips.ethereum.org/EIPS/eip-7'], - }, -]; - -const hardforksFromTangerineWhistle: string[] = getMainnetHardforksFrom( - MainnetHardfork.TangerineWhistle -); -const tangerineWhistleEIPs: EIP[] = [ - { - number: 150, - title: 'Gas cost changes for IO-heavy operations', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromTangerineWhistle, - references: ['https://eips.ethereum.org/EIPS/eip-150'], - }, -]; - -const hardforksFromSpuriousDragon: string[] = getMainnetHardforksFrom( - MainnetHardfork.SpuriousDragon -); -const spuriousDragonEIPS: EIP[] = [ - { - number: 155, - title: 'Simple replay attack protection', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromSpuriousDragon, - references: ['https://eips.ethereum.org/EIPS/eip-155'], - }, - { - number: 160, - title: 'EXP cost increase', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromSpuriousDragon, - references: ['https://eips.ethereum.org/EIPS/eip-160'], - }, - { - number: 161, - title: 'State trie clearing (invariant-preserving alternative)', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromSpuriousDragon, - references: ['https://eips.ethereum.org/EIPS/eip-161'], - }, - { - number: 170, - title: 'Contract code size limit', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromSpuriousDragon, - parameters: [ - { - name: 'MAX_CODE_SIZE', - value: 24576, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-170'], - }, -]; - -const hardforksFromByzantium: string[] = getMainnetHardforksFrom(MainnetHardfork.Byzantium); -const byzantiumEIPs: EIP[] = [ - { - number: 100, - title: 'Change difficulty adjustment to target mean block time including uncles', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-100'], - }, - { - number: 140, - title: 'REVERT instruction', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-140'], - }, - { - number: 196, - title: - 'Precompiled contracts for addition and scalar multiplication on the elliptic curve alt_bn128', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-196'], - }, - { - number: 197, - title: 'Precompiled contracts for optimal ate pairing check on the elliptic curve alt_bn128', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-197'], - }, - { - number: 198, - title: 'Big integer modular exponentiation', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - parameters: [ - { - name: 'GQUADDIVISOR', - value: 20, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-198'], - }, - { - number: 211, - title: 'New opcodes: RETURNDATASIZE and RETURNDATACOPY', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-211'], - }, - { - number: 214, - title: 'New opcode STATICCALL', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-214'], - }, - { - number: 649, - title: 'Metropolis Difficulty Bomb Delay and Block Reward Reduction', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-649'], - }, - { - number: 658, - title: 'Embedding transaction status code in receipts', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromByzantium, - references: ['https://eips.ethereum.org/EIPS/eip-658'], - }, -]; - -// Both the Constantinople and Petersburg hard forks went live at the same time. The Petersburg hard -// fork incorporates identical EIPs as the Constantinople hard fork, excluding the final EIP, EIP-1283. -// As EIP-1283 was never implemented in a production environment, we have opted not to display it. -const hardforksFromConstantinople: string[] = getMainnetHardforksFrom( - MainnetHardfork.Constantinople -); -const constantinopleEIPs: EIP[] = [ - { - number: 145, - title: 'Bitwise shifting instructions in EVM', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromConstantinople, - references: ['https://eips.ethereum.org/EIPS/eip-145'], - }, - { - number: 1014, - title: 'Skinny CREATE2', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromConstantinople, - references: ['https://eips.ethereum.org/EIPS/eip-1014'], - }, - { - number: 1052, - title: 'EXTCODEHASH opcode', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromConstantinople, - references: ['https://eips.ethereum.org/EIPS/eip-1052'], - }, - { - number: 1234, - title: 'Constantinople Difficulty Bomb Delay and Block Reward Adjustment', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromConstantinople, - references: ['https://eips.ethereum.org/EIPS/eip-1234'], - }, -]; - -const hardforksFromIstanbul: string[] = getMainnetHardforksFrom(MainnetHardfork.Istanbul); -const istanbulEIPs: EIP[] = [ - { - number: 152, - title: 'BAdd BLAKE2 compression function `F` precompile', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-152'], - }, - { - number: 1108, - title: 'Reduce alt_bn128 precompile gas costs', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-1108'], - }, - { - number: 1344, - title: 'ChainID opcode', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-1344'], - }, - { - number: 1884, - title: 'Repricing for trie-size-dependent opcodes', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-1884'], - }, - { - number: 2028, - title: 'Transaction data gas cost reduction', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-2028'], - }, - { - number: 2200, - title: 'Structured Definitions for Net Gas Metering', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromIstanbul, - references: ['https://eips.ethereum.org/EIPS/eip-2200'], - }, -]; - -const hardforksFromMuirGlacier: string[] = getMainnetHardforksFrom(MainnetHardfork.MuirGlacier); -const muirGlacierEIPs: EIP[] = [ - { - number: 2384, - title: 'Muir Glacier Difficulty Bomb Delay', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromMuirGlacier, - references: ['https://eips.ethereum.org/EIPS/eip-2384'], - }, -]; - -const hardforksFromBerlin: string[] = getMainnetHardforksFrom(MainnetHardfork.Berlin); -const berlinEIPs: EIP[] = [ - { - number: 2565, - title: 'ModExp Gas Cost', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromBerlin, - references: ['https://eips.ethereum.org/EIPS/eip-2565'], - }, - { - number: 2929, - title: 'Gas cost increases for state access opcodes', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromBerlin, - parameters: [ - { - name: 'COLD_SLOAD_COST', - value: 2100, - }, - { - name: 'COLD_ACCOUNT_ACCESS_COST', - value: 2600, - }, - { - name: 'WARM_STORAGE_READ_COST', - value: 100, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-2929'], - }, - { - number: 2718, - title: 'Typed Transaction Envelope', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromBerlin, - references: ['https://eips.ethereum.org/EIPS/eip-2718'], - }, - { - number: 2930, - title: 'Optional access lists', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromBerlin, - parameters: [ - { - name: 'ACCESS_LIST_STORAGE_KEY_COST', - value: 1900, - }, - { - name: 'ACCESS_LIST_ADDRESS_COST', - value: 2400, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-2930'], - }, -]; - -const hardforksFromLondon: string[] = getMainnetHardforksFrom(MainnetHardfork.London); - -export const eip1559: EIP = { - number: 1559, - title: 'Fee market change for ETH 1.0 chain', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromLondon, - parameters: [ - { - name: 'INITIAL_BASE_FEE', - value: 1000000000, - }, - { - name: 'BASE_FEE_MAX_CHANGE_DENOMINATOR', - value: 8, - }, - { - name: 'ELASTICITY_MULTIPLIER', - value: 2, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-1559'], -}; - -const londonEIPs: EIP[] = [ - eip1559, - { - number: 3198, - title: 'BASEFEE opcode', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromLondon, - references: ['https://eips.ethereum.org/EIPS/eip-3198'], - }, - { - number: 3529, - title: 'Reduction in refunds', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromLondon, - parameters: [ - { - name: 'MAX_REFUND_QUOTIENT', - value: 5, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-3529'], - }, - { - number: 3541, - title: 'Reject new contract code starting with the 0xEF byte', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromLondon, - references: ['https://eips.ethereum.org/EIPS/eip-3541'], - }, - { - number: 3554, - title: 'Difficulty Bomb Delay to December 2021', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromLondon, - references: ['https://eips.ethereum.org/EIPS/eip-3554'], - }, -]; - -const hardforksFromArrowGlacier: string[] = getMainnetHardforksFrom(MainnetHardfork.ArrowGlacier); -const arrowGlacierEIPs: EIP[] = [ - { - number: 4345, - title: 'Difficulty Bomb Delay to June 2022', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromArrowGlacier, - references: ['https://eips.ethereum.org/EIPS/eip-4345'], - }, -]; - -const hardforksFromGrayGlacier: string[] = getMainnetHardforksFrom(MainnetHardfork.GrayGlacier); -const grayGlacierEIPs: EIP[] = [ - { - number: 5133, - title: 'Delaying Difficulty Bomb to mid-September 2022', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromGrayGlacier, - references: ['https://eips.ethereum.org/EIPS/eip-5133'], - }, -]; - -const hardforksFromParis: string[] = getMainnetHardforksFrom(MainnetHardfork.Paris); - -export const eip4399: EIP = { - number: 4399, - title: 'Supplant DIFFICULTY opcode with PREVRANDAO', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromParis, - references: ['https://eips.ethereum.org/EIPS/eip-4399'], -}; - -export const parisEIPs: EIP[] = [ - { - number: 3675, - title: 'Upgrade consensus to Proof-of-Stake', - category: EIPCategory.Consensus, - - status: EIPState.Final, - activeHardforks: hardforksFromParis, - parameters: [ - { - name: 'MAX_EXTRA_DATA_BYTES', - value: 32, - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-3675'], - }, - eip4399, -]; - -const hardforksFromShanghai: string[] = getMainnetHardforksFrom(MainnetHardfork.Shanghai); - -export const eip4895: EIP = { - number: 4895, - title: 'Beacon chain push withdrawals as operations', - category: EIPCategory.Execution, - status: EIPState.Final, - activeHardforks: hardforksFromShanghai, - references: ['https://eips.ethereum.org/EIPS/eip-4895'], -}; - -const shanghaiEIPs: EIP[] = [ - { - number: 3651, - title: 'Warm COINBASE', - category: EIPCategory.Execution, - status: EIPState.Final, - activeHardforks: hardforksFromShanghai, - references: ['https://eips.ethereum.org/EIPS/eip-3651'], - }, - { - number: 3855, - title: 'PUSH0 instruction', - category: EIPCategory.Execution, - status: EIPState.Final, - activeHardforks: hardforksFromShanghai, - references: ['https://eips.ethereum.org/EIPS/eip-3855'], - }, - { - number: 3860, - title: 'Limit and meter initcode', - category: EIPCategory.Execution, - - status: EIPState.Final, - activeHardforks: hardforksFromShanghai, - parameters: [ - { - name: 'INITCODE_WORD_COST', - value: 2, - }, - { - name: 'MAX_INITCODE_SIZE', - value: '49152 = 2 * MAX_CODE_SIZE where MAX_CODE_SIZE=24576', - }, - ], - references: ['https://eips.ethereum.org/EIPS/eip-3860'], - }, - eip4895, -]; - -export const eips: EIP[] = [ - ...homesteadEIPs, - ...tangerineWhistleEIPs, - ...spuriousDragonEIPS, - ...byzantiumEIPs, - ...constantinopleEIPs, - ...istanbulEIPs, - ...muirGlacierEIPs, - ...berlinEIPs, - ...londonEIPs, - ...arrowGlacierEIPs, - ...grayGlacierEIPs, - ...parisEIPs, - ...shanghaiEIPs, -]; diff --git a/src/chains/mainnet/hardforks.ts b/src/chains/mainnet/hardforks.ts deleted file mode 100644 index 8133a8c3..00000000 --- a/src/chains/mainnet/hardforks.ts +++ /dev/null @@ -1,44 +0,0 @@ -export enum MainnetHardfork { - Frontier, - Homestead, - DaoFork, - TangerineWhistle, - SpuriousDragon, - Byzantium, - Constantinople, - // The Petersburg hard fork doesn't exist in ethereum/execution-specs so we do not reference it. - Istanbul, - MuirGlacier, - Berlin, - London, - ArrowGlacier, - GrayGlacier, - Paris, - Shanghai, -} - -export const CURRENT_MAINNET_HARDFORK = MainnetHardfork.Shanghai; - -// Retrieve all the hard forks from the starting hard fork to the current mainnet hard fork. -export const getMainnetHardforksFrom = (startingHardfork: MainnetHardfork): string[] => - getMainnetHardforksFromTo(startingHardfork, CURRENT_MAINNET_HARDFORK); - -// Retrieve an array of hardforks from a starting hardfork to an ending hardfork (inclusive). -export const getMainnetHardforksFromTo = ( - start: MainnetHardfork, - end: MainnetHardfork -): string[] => { - if (start > end) { - throw new Error( - `Error: the starting hard fork ${MainnetHardfork[start]} (index: ${start}) occured after the ending hard fork ${MainnetHardfork[end]} (index: ${end}). Arguments are wrong or must have been reversed.` - ); - } - - // Create an array made of all the enum key indexes following by all the stringified keys. - // For example, if you had an enum with two keys A and B, you would get ['0', '1', 'A', 'B']. - // Then, we only keep the slice with the values (e.g. ['A', 'B']). - const array = Object.keys(MainnetHardfork); - const length = array.length / 2; - const keys = array.slice(length); - return keys.slice(start, end + 1); -}; diff --git a/src/chains/mainnet/index.ts b/src/chains/mainnet/index.ts deleted file mode 100644 index b89fa4cd..00000000 --- a/src/chains/mainnet/index.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { mainnet as mainnetMetadata } from '@wagmi/chains'; -import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; -import { accountTypes } from './accountTypes'; -import { deployedContracts } from './deployedContracts'; -import { eips } from './eips'; -import { mempools } from './mempools'; -import { consensusNodes } from './nodes/consensus'; -import { executionNodes } from './nodes/execution'; -import { signatureTypes } from './signatureTypes'; -import { opcodes } from './vm/opcodes'; -import { precompiles } from './vm/precompiles'; -import { predeploys } from './vm/predeploys'; - -export const mainnet: Chain = { - metadata: mainnetMetadata, - precompiles, - predeploys, - signatureTypes: sortedArrayByField(signatureTypes, 'prefixByte'), - accountTypes: sortedArrayByField(accountTypes, 'name'), - opcodes: sortedArrayByField(opcodes, 'number'), - mempools: sortedArrayByField(mempools, 'name'), - deployedContracts: sortedArrayByFields(deployedContracts, ['kind', 'name']), - eips, - executionNodes, - consensusNodes, -}; diff --git a/src/chains/mainnet/mempools.ts b/src/chains/mainnet/mempools.ts deleted file mode 100644 index 580e08f9..00000000 --- a/src/chains/mainnet/mempools.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Mempool } from '@/types'; - -const flashbotsProtect: Mempool = { - name: 'Flashbots Protect', - description: - 'The Flashbots Protect RPC provides frontrunning protection for Ethereum transactions, along with other benefits.', - rpcUrl: 'https://rpc.flashbots.net', - references: [ - '[Flashbots Protect documentation](https://docs.flashbots.net/flashbots-protect/overview)', - ], - notes: [ - 'Transactions that perform simple actions—such as token approvals or transfers—will be sent to the public mempool as these do not need frontrunning protection.', - 'Transactions may be emitted to the public mempool if you switch RPC endpoints from Flashbots Protect RPC to another RPC while your transactions are pending.', - ], - properties: { - isPrivate: true, - tracksIpAddress: false, - refundsMev: true, - includesFailedTxs: false, - canSpecifyBuilders: true, - isFree: true, - configurable: true, - txLifespan: 360, - rateLimit: '80 requests/second', - burstRateLimit: '100 requests/second', - }, -}; - -const secureRpc: Mempool = { - name: 'SecureRpc', - description: - 'A bare-metal, fully conformant JSON-RPC/gRPC infrastructure plane that aims to meet various requirements around performance, privacy, and more.', - rpcUrl: 'https://api.securerpc.com/v1', - references: ['[SecureRpc Documentation](https://securerpc.com/)'], - properties: { - isPrivate: true, - isFree: true, - configurable: false, - }, -}; - -const mevBlocker: Mempool = { - name: 'MEV Blocker', - description: - 'MEV Blocker offers protection from frontrunning and sandwich attacks for a broad spectrum of Ethereum transactions.', - rpcUrl: 'https://rpc.mevblocker.io', - references: ['[MEV Blocker website](https://mevblocker.io/)'], - notes: [ - 'Historical submitted bundles, including those that did not land on-chain, will not only be shared with builders but also archived and presented to the public for transparency.', - 'For complete privacy, you can use an RPC URL of `https://rpc.mevblocker.io/norefunds`, which comes at the cost of no longer getting refunds for MEV your transaction generates.', - 'You can prevent reverting transactions from being included by using an RPC URL of `https://rpc.mevblocker.io/noreverts`, but this comes at the cost of slower inclusion time.', - ], - properties: { - isPrivate: true, - tracksIpAddress: false, - refundsMev: true, - includesFailedTxs: true, - canSpecifyBuilders: false, - isFree: true, - configurable: false, - }, -}; - -const bloxroute: Mempool = { - name: 'bloXroute ETH Protect', - description: - 'ETH Protect provides reliable and free front-running protection for Metamask transactions on the Ethereum Mainnet network.', - rpcUrl: 'https://eth-protect.rpc.blxrbdn.com', - references: [ - '[ETH Protect RPC documentation](https://docs.flashbots.net/flashbots-protect/overview)', - ], - notes: [], - properties: { - isPrivate: true, - isFree: true, - }, -}; - -const eden: Mempool = { - name: 'Eden RPC', - description: - 'Eden RPC makes it easy for everyday users and developers to use Eden for frontrunning protection.', - rpcUrl: 'https://api.edennetwork.io/v1/rpc', - references: ['[Eden documentation](https://docs.edennetwork.io/eden-rpc/overview)'], - notes: [ - 'Eden RPC is currently in public beta.', - 'For faster inclusion you can use an RPC URL of `https://api.edennetwork.io/v1/rocket`. This cannot guarantee transactions are frontrun, but the third-parties receiving the transaction have no known history of frontrunning their users.', - ], - properties: { - isPrivate: true, - isFree: true, - }, -}; - -export const mempools = { - [flashbotsProtect.name]: flashbotsProtect, - [secureRpc.name]: secureRpc, - [mevBlocker.name]: mevBlocker, - [bloxroute.name]: bloxroute, - [eden.name]: eden, -}; diff --git a/src/chains/mainnet/nodes/consensus.ts b/src/chains/mainnet/nodes/consensus.ts deleted file mode 100644 index 1e55f9ca..00000000 --- a/src/chains/mainnet/nodes/consensus.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Language, Node, NodeType } from '@/types'; - -const lighthouse: Node = { - name: 'lighthouse', - description: 'Ethereum consensus client in Rust.', - type: NodeType.Consensus, - language: Language.Rust, - repository: 'https://github.com/sigp/lighthouse', - documentation: 'https://lighthouse-book.sigmaprime.io/', -}; - -const lodestar: Node = { - name: 'lodestar', - description: 'TypeScript Implementation of Ethereum Consensus.', - type: NodeType.Consensus, - language: Language.TypeScript, - repository: 'https://github.com/ChainSafe/lodestar', - documentation: 'https://lodestar.chainsafe.io/', -}; - -const nimbus: Node = { - name: 'nimbus', - description: 'Nim implementation of the Ethereum Beacon Chain.', - type: NodeType.Consensus, - language: Language.Nim, - repository: 'https://github.com/status-im/nimbus-eth2', - documentation: 'https://nimbus.guide/', -}; - -const prysm: Node = { - name: 'prysm', - description: 'Go implementation of Ethereum proof of stake.', - type: NodeType.Consensus, - language: Language.Go, - repository: 'https://github.com/prysmaticlabs/prysm', - documentation: 'https://prysmaticlabs.com/', -}; - -const teku: Node = { - name: 'teku', - description: 'Java Implementation of the Ethereum 2.0 Beacon Chain.', - type: NodeType.Consensus, - language: Language.Java, - repository: 'https://github.com/Consensys/teku', - documentation: 'https://docs.teku.consensys.io/', -}; - -export const consensusNodes: Node[] = [lighthouse, lodestar, nimbus, prysm, teku]; diff --git a/src/chains/mainnet/nodes/execution.ts b/src/chains/mainnet/nodes/execution.ts deleted file mode 100644 index 99afb617..00000000 --- a/src/chains/mainnet/nodes/execution.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Language, Node, NodeType, SyncStrategy } from '@/types'; - -const besu: Node = { - name: 'besu', - description: 'An enterprise-grade Java-based, Apache 2.0 licensed Ethereum client.', - type: NodeType.Execution, - language: Language.Java, - syncStrategy: [SyncStrategy.Snap, SyncStrategy.Fast, SyncStrategy.Full], - repository: 'https://github.com/hyperledger/besu', - documentation: 'https://besu.hyperledger.org/', -}; - -const coregeth: Node = { - name: 'core-geth', - description: 'A highly configurable Go implementation of the Ethereum protocol.', - type: NodeType.Execution, - language: Language.Go, - syncStrategy: [SyncStrategy.Snap, SyncStrategy.Full], - forkOf: 'geth', - repository: 'https://github.com/etclabscore/core-geth', - documentation: 'https://etclabscore.github.io/core-geth/', -}; - -const erigon: Node = { - name: 'erigon', - description: 'Ethereum implementation on the efficiency frontier.', - type: NodeType.Execution, - language: Language.Go, - syncStrategy: [SyncStrategy.Full], - forkOf: 'geth', - repository: 'https://github.com/ledgerwatch/erigon', - documentation: 'https://erigon.gitbook.io/erigon/', -}; - -const geth: Node = { - name: 'geth', - description: 'Official Go implementation of the Ethereum protocol.', - type: NodeType.Execution, - language: Language.Go, - syncStrategy: [SyncStrategy.Snap, SyncStrategy.Full], - repository: 'https://github.com/ethereum/go-ethereum', - documentation: 'https://geth.ethereum.org/', -}; - -export const nethermind: Node = { - name: 'nethermind', - description: 'A robust execution client for Ethereum node operators.', - type: NodeType.Execution, - language: Language.CSharp, - syncStrategy: [SyncStrategy.Snap, SyncStrategy.Fast, SyncStrategy.Full], - repository: 'https://github.com/NethermindEth/nethermind', - documentation: 'https://docs.nethermind.io/', -}; - -export const reth: Node = { - name: 'reth', - description: - 'Modular, contributor-friendly and blazing-fast implementation of the Ethereum protocol, in Rust.', - type: NodeType.Execution, - language: Language.Rust, - syncStrategy: [SyncStrategy.Full], - repository: 'https://github.com/paradigmxyz/reth', - documentation: 'https://paradigmxyz.github.io/reth/', -}; - -export const executionNodes: Node[] = [besu, coregeth, erigon, geth, nethermind, reth]; diff --git a/src/chains/mainnet/signatureTypes.ts b/src/chains/mainnet/signatureTypes.ts deleted file mode 100644 index 89283593..00000000 --- a/src/chains/mainnet/signatureTypes.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { SignatureType } from '@/types'; - -const eip2718 = 'https://eips.ethereum.org/EIPS/eip-2718'; -const sigTypes = - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/lists/signature-types/README.md'; - -// Some signature prefix bytes are invalid because they collide with the initial byte of valid RLP -// encoded transactions. The range of invalid prefix bytes is 0xc0-0xff, which is a length of 64. -const invalidSigTypes: SignatureType[] = [...Array(64).keys()].map((i) => ({ - prefixByte: i + 0xc0, - description: 'Invalid; collides with the initial byte of valid RLP encoded transactions', - signedData: undefined, - signs: undefined, - references: [sigTypes], -})); - -export const validSigTypes: SignatureType[] = [ - { - prefixByte: 0x0, - description: 'Legacy (untyped) transaction', - signedData: [ - '`keccak256(rlp([nonce, gasPrice, gasLimit, to, value, data]))`', - '`keccak256(rlp([nonce, gasPrice, gasLimit, to, value, data, chainId, 0, 0]))`', - ], - signs: 'transaction', - references: ['https://eips.ethereum.org/EIPS/eip-155', eip2718, sigTypes], - notes: [ - "When signing over chain ID, the signature's v-value is computed as `{0,1} + chainId * 2 + 35`, where 0 and 1 are signature's y-parity.", - ], - }, - { - prefixByte: 0x1, - description: 'EIP-2930 Access list transaction', - signedData: [ - '`keccak256(0x01 || rlp([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList]))`', - ], - signs: 'transaction', - references: ['https://eips.ethereum.org/EIPS/eip-2930', eip2718, sigTypes], - }, - { - prefixByte: 0x2, - description: 'EIP-1559 transaction', - signedData: [ - '`keccak256(0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList]))`', - ], - signs: 'transaction', - references: ['https://eips.ethereum.org/EIPS/eip-1559', eip2718, sigTypes], - }, - { - prefixByte: 0x3, - description: 'Unused, but tentatively reserved for EIP-3074', - signedData: ['`keccak256(0x03 || chainId || paddedInvokerAddress || commit)`'], - signs: 'transaction', - references: ['https://eips.ethereum.org/EIPS/eip-3074', eip2718, sigTypes], - }, - { - prefixByte: 0x19, - description: - 'Used for signatures of data payloads to prevent collisions between data signatures and transaction signatures', - signedData: ['`keccak256(0x19 || 1-byte-version || versionSpecificData || dataToSign)`'], - signs: 'data', - references: ['https://eips.ethereum.org/EIPS/eip-191', sigTypes], - }, - ...invalidSigTypes, -]; - -const allSigTypes = [...validSigTypes, ...invalidSigTypes]; - -// Reshape into a map where the key is the prefix byte. -export const signatureTypes: Record = allSigTypes.reduce((acc, sigType) => { - acc[sigType.prefixByte] = sigType; - return acc; -}, {} as Record); diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/add.ts b/src/chains/mainnet/vm/opcodes/arithmetic/add.ts deleted file mode 100644 index 49315cfa..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/add.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const add: Opcode = { - number: 0x01, - name: 'add', - description: 'Addition operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The first integer value to add', - }, - { - name: 'b', - description: 'The second integer value to add', - }, - ], - outputs: [ - { - name: 'a + b', - description: 'The integer result of the addition modulo 2**256', - }, - ], - examples: [ - { - input: ['10', '20'], - output: '30', - }, - { - input: ['0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', '1'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z0z0twwy2v32%200xsssszt%27~uuuuzv1%201y%2F%2F%20Example%20w%5CnvwPUSHuFFtwADDs~~%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x01), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 30), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts b/src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts deleted file mode 100644 index c99fa5a3..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const addmod: Opcode = { - number: 0x08, - name: 'addmod', - description: 'Modulo addition operation', - minGas: 8, - inputs: [ - { - name: 'a', - description: 'The first integer value to add', - }, - { - name: 'b', - description: 'The second integer value to add', - }, - { - name: 'N', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: '(a + b) % N', - description: - 'The integer result of the addition followed by a modulo. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '10', '8'], - output: '4', - }, - { - input: ['0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', '2', '2'], - output: '1', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z8z10z10vwwy2z2z2u32%200xssssv%27~ttttzu1%20y%2F%2F%20Example%20w%5CnvwADDMODuwPUSHtFFs~~%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['All intermediate calculations of this operation are not subject to the 2**256 modulo'], - references: [ - evmCodesOpcodesLink(0x08), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 234), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/div.ts b/src/chains/mainnet/vm/opcodes/arithmetic/div.ts deleted file mode 100644 index c8d03d29..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/div.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const div: Opcode = { - number: 0x04, - name: 'div', - description: 'Multiplication operation', - minGas: 5, - inputs: [ - { - name: 'a', - description: 'The integer numerator', - }, - { - name: 'b', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: 'a // b', - description: - 'The integer result of the integer division. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '10'], - output: '1', - }, - { - input: ['1', '2'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~10~10wyyz2~2~1w%27~yPUSH1%20z%2F%2F%20Example%20y%5CnwyDIV%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x04), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 111), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/exp.ts b/src/chains/mainnet/vm/opcodes/arithmetic/exp.ts deleted file mode 100644 index f9186478..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/exp.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const exp: Opcode = { - number: 0x0a, - name: 'exp', - description: 'Exponential operation', - minGas: 10, - gasComputation: { - staticGasCost: { - expression: '10', - }, - dynamicGasCost: { - expression: '50 * exponent_byte_size', - variables: [ - { - name: 'exponent_byte_size', - description: 'The exponent representation in bytes', - }, - ], - }, - }, - inputs: [ - { - name: 'a', - description: 'The integer base', - }, - { - name: 'exponent', - description: 'The integer exponent', - }, - ], - outputs: [ - { - name: 'a ** exponent', - description: 'The integer result of the exponential operation modulo 2**256', - }, - ], - examples: [ - { - input: ['10', '2'], - output: '100', - }, - { - input: ['2', '2'], - output: '4', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~2~10wyyz2~2~2w%27~yPUSH1%20z%2F%2F%20Example%20y%5CnwyEXP%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['All intermediate calculations of this operation are not subject to the 2**256 modulo'], - references: [ - evmCodesOpcodesLink(0x0a), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 296), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/index.ts b/src/chains/mainnet/vm/opcodes/arithmetic/index.ts deleted file mode 100644 index e0f5923e..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Opcode } from '@/types'; -import { add } from './add'; -import { addmod } from './addmod'; -import { div } from './div'; -import { exp } from './exp'; -import { mod } from './mod'; -import { mul } from './mul'; -import { mulmod } from './mulmod'; -import { sdiv } from './sdiv'; -import { signextend } from './signextend'; -import { smod } from './smod'; -import { sub } from './sub'; - -export const opcodes: Record = { - [add.number]: add, - [addmod.number]: addmod, - [div.number]: div, - [exp.number]: exp, - [mod.number]: mod, - [mul.number]: mul, - [mulmod.number]: mulmod, - [sdiv.number]: sdiv, - [signextend.number]: signextend, - [smod.number]: smod, - [sub.number]: sub, -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/mod.ts b/src/chains/mainnet/vm/opcodes/arithmetic/mod.ts deleted file mode 100644 index 31b28fe7..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mod.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mod: Opcode = { - number: 0x06, - name: 'mod', - description: 'Modulo remainder operation', - minGas: 5, - inputs: [ - { - name: 'a', - description: 'The integer numerator', - }, - { - name: 'b', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: 'a % b', - description: - 'The integer result of the integer modulo. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '3'], - output: '1', - }, - { - input: ['17', '5'], - output: '2', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~3~10wyyz2~5~17w%27~yPUSH1%20z%2F%2F%20Example%20y%5CnwyMOD%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x06), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 174), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/mul.ts b/src/chains/mainnet/vm/opcodes/arithmetic/mul.ts deleted file mode 100644 index d770c8ca..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mul.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mul: Opcode = { - number: 0x02, - name: 'mul', - description: 'Multiplication operation', - minGas: 5, - inputs: [ - { - name: 'a', - description: 'The first integer value to multiply', - }, - { - name: 'b', - description: 'The second integer value to multiply', - }, - ], - outputs: [ - { - name: 'a * b', - description: 'The integer result of the multiplication modulo 2**256', - }, - ], - examples: [ - { - input: ['10', '10'], - output: '100', - }, - { - input: ['0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', '2'], - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z10z10twwy2v32%200xssssz2t%27~uuuuzv1%20y%2F%2F%20Example%20w%5CnvwPUSHuFFtwMULs~~%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x02), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 84), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts b/src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts deleted file mode 100644 index c9cd44ff..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mulmod: Opcode = { - number: 0x09, - name: 'mulmod', - description: 'Modulo multiplication operation', - minGas: 8, - inputs: [ - { - name: 'a', - description: 'The first integer value to multiply', - }, - { - name: 'b', - description: 'The second integer value to multiply', - }, - { - name: 'N', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: '(a + b) % N', - description: - 'The integer result of the multiplication followed by a modulo. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '10', '8'], - output: '4', - }, - { - input: [ - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - '12', - ], - output: '9', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1v8v10v10twwy2v12usust%27~rrrrzwPUSHy%2F%2F%20Example%20w%5Cnvz1%20uz32%200xstwMULMODs~~~~rFF%01rstuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['All intermediate calculations of this operation are not subject to the 2**256 modulo'], - references: [ - evmCodesOpcodesLink(0x08), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 265), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts b/src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts deleted file mode 100644 index 582e8a4e..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sdiv: Opcode = { - number: 0x05, - name: 'sdiv', - description: 'Signed integer division operation (truncated)', - minGas: 5, - inputs: [ - { - name: 'a', - description: 'The integer numerator', - }, - { - name: 'b', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: 'a // b', - description: - 'The integer result of the signed integer division. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '10'], - output: '1', - }, - { - input: [ - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE', - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - ], - output: '2', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1vvszzy2wrFwrEs%27~uuuz%5Cny%2F%2F%20Example%20wt32%200xr~vt1%2010uFFFtzPUSHszSDIVr~~~%01rstuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'All values are treated as two’s complement signed 256-bit integers. Note the overflow semantic when −2**255 is negated.', - ], - references: [ - evmCodesOpcodesLink(0x05), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 141), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts b/src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts deleted file mode 100644 index e42540cc..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const signextend: Opcode = { - number: 0x0b, - name: 'signextend', - description: "Extend length of two's complement signed integer", - minGas: 5, - inputs: [ - { - name: 'b', - description: 'The size in byte minus 1 of the integer to sign extend', - }, - { - name: 'x', - description: 'The integer value to sign extend', - }, - ], - outputs: [ - { - name: 'y', - description: 'The integer result of the sign extend', - }, - ], - examples: [ - { - input: ['0', '0xFF'], - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - { - input: ['0', '0x7F'], - output: '0x7F', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~xFywwz2~x7y%27~wPUSH1%200z%2F%2F%20Example%20yF~wSIGNEXTENDw%5Cn%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x0b), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 329), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/smod.ts b/src/chains/mainnet/vm/opcodes/arithmetic/smod.ts deleted file mode 100644 index ff4e942b..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/smod.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const smod: Opcode = { - number: 0x07, - name: 'smod', - description: 'Signed modulo remainder operation', - minGas: 5, - inputs: [ - { - name: 'a', - description: 'The integer numerator', - }, - { - name: 'b', - description: 'The integer denominator', - }, - ], - outputs: [ - { - name: 'a % b', - description: - 'The integer result of the signed integer modulo. If the denominator is 0, the result will be 0.', - }, - ], - examples: [ - { - input: ['10', '3'], - output: '1', - }, - { - input: [ - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8', - '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD', - ], - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1s3s10tzzy2wrDwr8t%27~uuuz%5Cny%2F%2F%20Example%20wv32%200xr~vzPUSHuFFFtzSMODsv1%20r~~~%01rstuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'All values are treated as two’s complement signed 256-bit integers. Note the overflow semantic when −2**255 is negated.', - ], - references: [ - evmCodesOpcodesLink(0x07), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 174), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/arithmetic/sub.ts b/src/chains/mainnet/vm/opcodes/arithmetic/sub.ts deleted file mode 100644 index bce98930..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/sub.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sub: Opcode = { - number: 0x03, - name: 'sub', - description: 'Subtraction operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The first integer value', - }, - { - name: 'b', - description: 'The second integer value to subtract to the first', - }, - ], - outputs: [ - { - name: 'a - b', - description: 'The integer result of the subtraction modulo 2**256', - }, - ], - examples: [ - { - input: ['10', '10'], - output: '0', - }, - { - input: ['0', '1'], - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~10~1wyyz2~1~w%27~yPUSH1%20z%2F%2F%20Example%20y%5Cnw0ySUB%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x03), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 57), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/and.ts b/src/chains/mainnet/vm/opcodes/bitwise/and.ts deleted file mode 100644 index bbd768a9..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/and.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const and: Opcode = { - number: 0x16, - name: 'and', - description: 'Bitwise AND operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The first binary value', - }, - { - name: 'b', - description: 'The second binary value', - }, - ], - outputs: [ - { - name: 'a & b', - description: 'The bitwise AND result', - }, - ], - examples: [ - { - input: ['0xF', '0xF'], - output: '0xF', - }, - { - input: ['0xFF', '0'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~xF~xwyyz2~~xFw%27~yPUSH1%200z%2F%2F%20Example%20y%5CnwFyAND%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x16), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 22), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/byte.ts b/src/chains/mainnet/vm/opcodes/bitwise/byte.ts deleted file mode 100644 index 7b313921..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/byte.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const byte: Opcode = { - number: 0x1a, - name: 'byte', - description: 'Retrieve single byte from word', - minGas: 3, - inputs: [ - { - name: 'i', - description: 'The byte offset starting from the most significant byte', - }, - { - name: 'x', - description: 'The 32-byte value', - }, - ], - outputs: [ - { - name: 'y', - description: - 'The indicated byte at the least significant position. If the byte offset is out of range, the result is 0.', - }, - ], - examples: [ - { - input: ['31', '0xFF'], - output: '0xFF', - }, - { - input: ['30', '0xFF00'], - output: '0xFF00', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~0xFF~31vyyz2w2%200xFF00~30v%27~w1%20z%2F%2F%20Example%20y%5CnwyPUSHvyBYTE%01vwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x1a), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 121), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/index.ts b/src/chains/mainnet/vm/opcodes/bitwise/index.ts deleted file mode 100644 index 6d00fbc1..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Opcode } from '@/types'; -import { and } from './and'; -import { byte } from './byte'; -import { not } from './not'; -import { or } from './or'; -import { sar } from './sar'; -import { shl } from './shl'; -import { shr } from './shr'; -import { xor } from './xor'; - -export const opcodes: Record = { - [and.number]: and, - [byte.number]: byte, - [not.number]: not, - [or.number]: or, - [sar.number]: sar, - [shl.number]: shl, - [shr.number]: shr, - [xor.number]: xor, -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/not.ts b/src/chains/mainnet/vm/opcodes/bitwise/not.ts deleted file mode 100644 index 9a04685c..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/not.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const not: Opcode = { - number: 0x19, - name: 'not', - description: 'Bitwise NOT operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The binary value', - }, - ], - outputs: [ - { - name: '~a', - description: 'The bitwise NOT result', - }, - ], - examples: [ - { - input: '0', - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27PUSH1%200%5CnNOT%27_'), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x19), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 97), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/or.ts b/src/chains/mainnet/vm/opcodes/bitwise/or.ts deleted file mode 100644 index 124f425d..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/or.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const or: Opcode = { - number: 0x17, - name: 'or', - description: 'Bitwise OR operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The first binary value', - }, - { - name: 'b', - description: 'The second binary value', - }, - ], - outputs: [ - { - name: 'a | b', - description: 'The bitwise OR result', - }, - ], - examples: [ - { - input: ['0xF0', '0xFF'], - output: '0xF', - }, - { - input: ['0xFF', '0xFF'], - output: '0xFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~~0yORyyz2~F~FyOR%27~yPUSH1%200xFz%2F%2F%20Example%20y%5Cn%01yz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x17), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 47), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/sar.ts b/src/chains/mainnet/vm/opcodes/bitwise/sar.ts deleted file mode 100644 index 8f9b7ead..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/sar.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sar: Opcode = { - number: 0x1d, - name: 'sar', - description: 'Arithmetic (signed) right shift operation', - minGas: 3, - inputs: [ - { - name: 'shift', - description: 'The number of bits to shift to the right', - }, - { - name: 'value', - description: 'The 32 bytes to shift', - }, - ], - outputs: [ - { - name: 'value >> shift', - description: 'The shifted value', - }, - ], - examples: [ - { - input: ['1', '2'], - output: '1', - }, - { - input: ['4', '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0'], - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z2z1twwy2v32%200xuuu0z4t%27~FFFFFFFzv1%20y%2F%2F%20Example%20w%5CnvwPUSHu~~~twSAR%01tuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Shift the bits towards the least significant one. The bits moved before the first one are discarded, the new bits are set to 0 if the previous most significant bit was 0, otherwise the new bits are set to 1.', - ], - references: [ - evmCodesOpcodesLink(0x1d), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 213), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/shl.ts b/src/chains/mainnet/vm/opcodes/bitwise/shl.ts deleted file mode 100644 index 5baebd7d..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/shl.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const shl: Opcode = { - number: 0x1b, - name: 'shl', - description: 'Left shift operation', - minGas: 3, - inputs: [ - { - name: 'shift', - description: 'The number of bits to shift to the left', - }, - { - name: 'value', - description: 'The 32 bytes to shift', - }, - ], - outputs: [ - { - name: 'value << shift', - description: 'The shifted value. If shift is bigger than 255, returns 0.', - }, - ], - examples: [ - { - input: ['1', '1'], - output: '2', - }, - { - input: ['4', '0xFF00000000000000000000000000000000000000000000000000000000000000'], - output: '0xF000000000000000000000000000000000000000000000000000000000000000', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z1z1swwy2v32%200xFFuuuuutz4s%27~tttzv1%20y%2F%2F%20Example%20w%5CnvwPUSHu~~t00swSHL%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Shift the bits towards the least significant one. The bits moved before the first one are discarded, the new bits are set to 0.', - ], - references: [ - evmCodesOpcodesLink(0x1b), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 157), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/shr.ts b/src/chains/mainnet/vm/opcodes/bitwise/shr.ts deleted file mode 100644 index 9d80baf0..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/shr.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const shr: Opcode = { - number: 0x1c, - name: 'shr', - description: 'Right shift operation', - minGas: 3, - inputs: [ - { - name: 'shift', - description: 'The number of bits to shift to the right', - }, - { - name: 'value', - description: 'The 32 bytes to shift', - }, - ], - outputs: [ - { - name: 'value >> shift', - description: 'The shifted value. If shift is bigger than 255, returns 0.', - }, - ], - examples: [ - { - input: ['1', '2'], - output: '1', - }, - { - input: ['4', '0xFF'], - output: '0xF', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~2~1wyyz2~0xFF~4w%27~yPUSH1%20z%2F%2F%20Example%20y%5CnwySHR%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Shift the bits towards the least significant one. The bits moved before the first one are discarded, the new bits are set to 0.', - ], - references: [ - evmCodesOpcodesLink(0x1c), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 185), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/bitwise/xor.ts b/src/chains/mainnet/vm/opcodes/bitwise/xor.ts deleted file mode 100644 index eadc56b0..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/xor.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const xor: Opcode = { - number: 0x18, - name: 'xor', - description: 'Bitwise XOR operation', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The first binary value', - }, - { - name: 'b', - description: 'The second binary value', - }, - ], - outputs: [ - { - name: 'a ^ b', - description: 'The bitwise XOR result', - }, - ], - examples: [ - { - input: ['0xF0', '0xFF'], - output: '0xF', - }, - { - input: ['0xFF', '0xFF'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~~0wyyz2~F~Fw%27~yPUSH1%200xFz%2F%2F%20Example%20y%5CnwyXOR%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x18), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Bitwise, 72), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/blockhash.ts b/src/chains/mainnet/vm/opcodes/block/blockhash.ts deleted file mode 100644 index c62212d2..00000000 --- a/src/chains/mainnet/vm/opcodes/block/blockhash.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const blockhash: Opcode = { - number: 0x40, - name: 'blockhash', - description: 'Get the hash of one of the 256 most recent complete blocks.', - minGas: 20, - inputs: [ - { - name: 'blockNumber', - description: - 'The block number to get the hash from. Valid range is the last 256 blocks (not including the current one). Current block number can be queried with NUMBER.', - }, - ], - outputs: [ - { - name: 'hash', - description: - 'The hash of the chosen block, or 0 if the block number is not in the valid range', - }, - ], - examples: [ - { - input: '17813636', - output: '0x3204feac1c276343f84e44df04f8fcddbb80eee246ee0533026511e4c4bbf4b6', - }, - ], - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x40), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 22), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/chainid.ts b/src/chains/mainnet/vm/opcodes/block/chainid.ts deleted file mode 100644 index 864c735e..00000000 --- a/src/chains/mainnet/vm/opcodes/block/chainid.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const chainid: Opcode = { - number: 0x46, - name: 'chainid', - description: 'Get the chain ID', - minGas: 2, - outputs: [ - { - name: 'chainId', - description: 'The chain id of the network', - }, - ], - examples: [ - { - output: '1', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27CHAINID%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x46), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 222), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Istanbul), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/coinbase.ts b/src/chains/mainnet/vm/opcodes/block/coinbase.ts deleted file mode 100644 index 6cc1d0e3..00000000 --- a/src/chains/mainnet/vm/opcodes/block/coinbase.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const coinbase: Opcode = { - number: 0x41, - name: 'coinbase', - description: "Get the block's beneficiary address", - minGas: 2, - outputs: [ - { - name: 'address', - description: "The miner's 20-byte address", - }, - ], - examples: [ - { - output: '0x5B38Da6a701c568545dCfcB03FcB875f56beddC4', - }, - ], - errorCases: ['Not enough gas.', 'Stack overflow.'], - references: [ - evmCodesOpcodesLink(0x41), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 60), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/gaslimit.ts b/src/chains/mainnet/vm/opcodes/block/gaslimit.ts deleted file mode 100644 index 3dce5a64..00000000 --- a/src/chains/mainnet/vm/opcodes/block/gaslimit.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const gaslimit: Opcode = { - number: 0x45, - name: 'gaslimit', - description: "Get the block's gas limit", - minGas: 2, - outputs: [ - { - name: 'gasLimit', - description: 'The current block gas limit', - }, - ], - examples: [ - { - output: '0xffffffffffff', - }, - ], - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x45), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 190), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/index.ts b/src/chains/mainnet/vm/opcodes/block/index.ts deleted file mode 100644 index 915c164a..00000000 --- a/src/chains/mainnet/vm/opcodes/block/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Opcode } from '@/types'; -import { blockhash } from './blockhash'; -import { coinbase } from './coinbase'; -import { gaslimit } from './gaslimit'; -import { number } from './number'; -import { prevrandao } from './prevrandao'; -import { timestamp } from './timestamp'; - -export const opcodes: Record = { - [blockhash.number]: blockhash, - [coinbase.number]: coinbase, - [prevrandao.number]: prevrandao, - [gaslimit.number]: gaslimit, - [number.number]: number, - [timestamp.number]: timestamp, -}; diff --git a/src/chains/mainnet/vm/opcodes/block/number.ts b/src/chains/mainnet/vm/opcodes/block/number.ts deleted file mode 100644 index 9d0600ad..00000000 --- a/src/chains/mainnet/vm/opcodes/block/number.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const number: Opcode = { - number: 0x43, - name: 'number', - description: "Get the block's number", - minGas: 2, - outputs: [ - { - name: 'blockNumber', - description: 'The current block number', - }, - ], - examples: [ - { - output: '1636704767', - }, - ], - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x43), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 126), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/prevrandao.ts b/src/chains/mainnet/vm/opcodes/block/prevrandao.ts deleted file mode 100644 index becb6f08..00000000 --- a/src/chains/mainnet/vm/opcodes/block/prevrandao.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const prevrandao: Opcode = { - number: 0x44, - name: 'prevrandao', - description: - "Get the random output of the beacon chain's randomness oracle for the previous block.", - minGas: 2, - outputs: [ - { - name: 'random', - description: "The random output of the beacon chain's oracle", - }, - ], - examples: [ - { - output: '0xce124dee50136f3f93f19667fb4198c6b94eecbacfa300469e5280012757be94', - }, - ], - notes: [ - "Prior to the Paris hardfork, this opcode was named `difficulty` and returned the block's current difficulty. From Paris onwards, the `difficulty` opcode became `prevrandao`.", - ], - // TODO: add the evm.codes playground link once available - errorCases: ['Not enough gas.', 'Stack overflow.'], - references: [ - evmCodesOpcodesLink(0x44), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 158), - 'https://eips.ethereum.org/EIPS/eip-4399', - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/block/timestamp.ts b/src/chains/mainnet/vm/opcodes/block/timestamp.ts deleted file mode 100644 index da78109c..00000000 --- a/src/chains/mainnet/vm/opcodes/block/timestamp.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const timestamp: Opcode = { - number: 0x42, - name: 'timestamp', - description: "Get the block's timestamp", - minGas: 2, - outputs: [ - { - name: 'timestamp', - description: 'unix timestamp of the current block', - }, - ], - examples: [ - { - output: '1636704767', - }, - ], - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x42), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Block, 93), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/eq.ts b/src/chains/mainnet/vm/opcodes/comparison/eq.ts deleted file mode 100644 index bb12760d..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/eq.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const eq: Opcode = { - number: 0x14, - name: 'eq', - description: 'Equality comparison', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The left side integer', - }, - { - name: 'b', - description: 'The right side integer', - }, - ], - outputs: [ - { - name: 'a == b', - description: - 'The result of the equality comparison: 1 if the left side is equal to the right side and 0 otherwise', - }, - ], - examples: [ - { - input: ['10', '10'], - output: '1', - }, - { - input: ['10', '5'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~10wyyz2~5w%27~yPUSH1%20z%2F%2F%20Example%20y%5Cnw~10yEQ%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x14), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 128), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/gt.ts b/src/chains/mainnet/vm/opcodes/comparison/gt.ts deleted file mode 100644 index 3ea09b96..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/gt.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const gt: Opcode = { - number: 0x11, - name: 'gt', - description: 'Greater-than comparison', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The left side integer', - }, - { - name: 'b', - description: 'The right side integer', - }, - ], - outputs: [ - { - name: 'a > b', - description: - 'The result of the greater-than comparison: 1 if the left side is bigger and 0 otherwise', - }, - ], - examples: [ - { - input: ['10', '9'], - output: '1', - }, - { - input: ['10', '10'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~9wyyz2~10w%27~yPUSH1%20z%2F%2F%20Example%20y%5Cnw~10yGT%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x11), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 75), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/index.ts b/src/chains/mainnet/vm/opcodes/comparison/index.ts deleted file mode 100644 index 58fbcd51..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Opcode } from '@/types'; -import { eq } from './eq'; -import { gt } from './gt'; -import { iszero } from './iszero'; -import { lt } from './lt'; -import { sgt } from './sgt'; -import { slt } from './slt'; - -export const opcodes: Record = { - [eq.number]: eq, - [gt.number]: gt, - [iszero.number]: iszero, - [lt.number]: lt, - [sgt.number]: sgt, - [slt.number]: slt, -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/iszero.ts b/src/chains/mainnet/vm/opcodes/comparison/iszero.ts deleted file mode 100644 index 2116ff56..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/iszero.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const iszero: Opcode = { - number: 0x15, - name: 'iszero', - description: 'Simple NOT (or non-zero )operator', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'An integer value', - }, - ], - outputs: [ - { - name: 'a == 0', - description: - 'The result of the zero equality comparison: 1 if the a is equal to O and 0 otherwise', - }, - ], - examples: [ - { - input: '10', - output: '0', - }, - { - input: '0', - output: '1', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27~1y1wzz~2yw%27~%2F%2F%20Example%20z%5CnyzPUSH1%20w0zISZERO%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x15), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 155), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/lt.ts b/src/chains/mainnet/vm/opcodes/comparison/lt.ts deleted file mode 100644 index 24996b7f..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/lt.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const lt: Opcode = { - number: 0x10, - name: 'lt', - description: 'Less-than comparison', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The left side integer', - }, - { - name: 'b', - description: 'The right side integer', - }, - ], - outputs: [ - { - name: 'a < b', - description: - 'The result of the less-than comparison: 1 if the left side is smaller and 0 otherwise', - }, - ], - examples: [ - { - input: ['9', '10'], - output: '1', - }, - { - input: ['10', '10'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1w~9yLTyyz2wwyLT%27~yPUSH1%20z%2F%2F%20Example%20y%5Cnw~10%01wyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x10), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 22), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/sgt.ts b/src/chains/mainnet/vm/opcodes/comparison/sgt.ts deleted file mode 100644 index 0c5c94e9..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/sgt.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sgt: Opcode = { - number: 0x13, - name: 'sgt', - description: 'Signed greater-than comparison', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The left side signed integer', - }, - { - name: 'b', - description: 'The right side signed integer', - }, - ], - outputs: [ - { - name: 'a > b', - description: - 'The result of the signed greater-than comparison: 1 if the left side is bigger and 0 otherwise', - }, - ], - examples: [ - { - input: ['10', '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'], - output: '1', - }, - { - input: ['10', '10'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1v32%200xssssz9twwy2z10z10t%27~uuuuzv1%20y%2F%2F%20Example%20w%5CnvwPUSHuFFtwSGTs~~%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x13), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 102), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/comparison/slt.ts b/src/chains/mainnet/vm/opcodes/comparison/slt.ts deleted file mode 100644 index 29482994..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/slt.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const slt: Opcode = { - number: 0x12, - name: 'slt', - description: 'Signed less-than comparison', - minGas: 3, - inputs: [ - { - name: 'a', - description: 'The left side signed integer', - }, - { - name: 'b', - description: 'The right side signed integer', - }, - ], - outputs: [ - { - name: 'a < b', - description: - 'The result of the signed less-than comparison: 1 if the left side is smaller and 0 otherwise', - }, - ], - examples: [ - { - input: ['0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', '0'], - output: '1', - }, - { - input: ['10', '10'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27y1z9v32%200xsssstwwy2z10z10t%27~uuuuzv1%20y%2F%2F%20Example%20w%5CnvwPUSHuFFtwSLTs~~%01stuvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['All values are treated as two’s complement signed 256-bit integers.'], - references: [ - evmCodesOpcodesLink(0x12), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Comparison, 49), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/gas.ts b/src/chains/mainnet/vm/opcodes/controlFlow/gas.ts deleted file mode 100644 index d82e9fbf..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/gas.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const gas: Omit = { - number: 0x5a, - name: 'gas', - description: - 'Get the amount of available gas, including the corresponding reduction for the cost of this instruction', - minGas: 2, - outputs: [ - { - name: 'gas', - description: 'The remaining gas (after this instruction).', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27GASyPUSH3%2021000zCosqof~transactionyGASLIMITzGaskhaqwjgivenko~context__zResulqis~amounqof%20gjused%20upko%20andbncluding~GASbnstruction%27~khe%20z%20%2F%2F%20y%5Cnqt%20k%20tjas%20b%20i_ySUB%01_bjkqyz~_' - ), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x5a), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 125), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/index.ts b/src/chains/mainnet/vm/opcodes/controlFlow/index.ts deleted file mode 100644 index 8cb7198f..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Opcode } from '@/types'; -import { gas } from './gas'; -import { jump } from './jump'; -import { jumpdest } from './jumpdest'; -import { jumpi } from './jumpi'; -import { pc } from './pc'; -import { stop } from './stop'; - -export const opcodes: Record> = { - [gas.number]: gas, - [jump.number]: jump, - [jumpdest.number]: jumpdest, - [jumpi.number]: jumpi, - [pc.number]: pc, - [stop.number]: stop, -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/jump.ts b/src/chains/mainnet/vm/opcodes/controlFlow/jump.ts deleted file mode 100644 index d45aa301..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jump.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const jump: Omit = { - number: 0x56, - name: 'jump', - description: 'Alter the program counter', - minGas: 8, - inputs: [ - { - name: 'counter', - description: - 'The byte offset in the deployed code where execution will continue from. Must be a JUMPDEST instruction.', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27wWZjump%20overqinvalid%20and%20jusXgoYoqpushk4x0_%20%20%20x2%20%7Bprevious%20instruction%20occupies%202%20bytes%7DzINVALIDx3_DEST~4k1x5%27~%20wOffseXz%5Cnx%20~w%2F%2F%20qYhZkzPUSH1%20_zJUMPZe%20Y%20tXt%20%01XYZ_kqwxz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'Counter offset is not a JUMPDEST. The error is generated even if the JUMP would not have been done.', - ], - notes: [ - 'The program counter (PC) is a byte offset in the deployed code. It indicates which instruction will be executed next. When an ADD is executed, for example, the PC is incremented by 1, since the instruction is 1 byte. The PUSH instructions are bigger than one byte, and so will increment the counter accordingly. The JUMP instruction alters the program counter, thus breaking the linear path of the execution to another point in the deployed code. It is used to implement functionalities like functions.', - ], - references: [ - evmCodesOpcodesLink(0x56), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 45), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts b/src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts deleted file mode 100644 index 7930afc1..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const jumpdest: Omit = { - number: 0x5b, - name: 'jumpdest', - description: 'Mark a valid destination for jumps', - minGas: 1, - notes: [ - 'Mark a valid destination for JUMP or JUMPI. This operation has no effect on machine state during execution.', - ], - references: [ - evmCodesOpcodesLink(0x5b), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 149), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts b/src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts deleted file mode 100644 index 583257d7..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const jumpi: Omit = { - number: 0x57, - name: 'jumpi', - description: 'Conditionally alter the program counter', - minGas: 10, - inputs: [ - { - name: 'counter', - description: - 'The byte offset in the deployed code where execution will continue from. Must be a JUMPDEST instruction.', - }, - { - name: 'b', - description: - 'The program counter will be altered with the new value only if this value is different from 0. Otherwise, the program counter is simply incremented and the next instruction will be executed.', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27qFirstk%20noYjump%2C%20secondkw0%20XRY0w10z2~h4~W_z5w12z7~h9~Z0gINVALIDK11gZ2w_z13%27~%20%7Bprevious%20instruction%20occupiR%202%20bytR%7DgzXseYwgWq%2F%2F%20k%20example%20doRhQI%20%20Kg%5Cn_1%20ZQDESTz1Yt%20X%20qOffWPUSH_ResQJUMPK%20z%01KQRWXYZ_ghkqwz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'Counter offset is not a JUMPDEST. The error is generated even if the JUMP would not have been done.', - ], - notes: [ - 'The program counter (PC) is a byte offset in the deployed code. It indicates which instruction will be executed next. When an ADD is executed, for example, the PC is incremented by 1, since the instruction is 1 byte. The PUSH instructions are bigger than one byte, and so will increment the counter accordingly. The JUMPI instruction may alter the program counter, thus breaking the linear path of the execution to another point in the deployed code. It is used to implement functionalities like loops and conditions.', - ], - references: [ - evmCodesOpcodesLink(0x57), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 70), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/pc.ts b/src/chains/mainnet/vm/opcodes/controlFlow/pc.ts deleted file mode 100644 index aa3bd940..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/pc.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const pc: Omit = { - number: 0x58, - name: 'pc', - description: - 'Get the value of the program counter prior to the increment corresponding to this instruction', - minGas: 2, - outputs: [ - { - name: 'counter', - description: 'The PC of this instruction in the current program', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27~0x~1xJUMPDESTzesq2x~3xPUSH1%201%20l4x~6%20%7Bpreviouminstructionmtakem2%20bytes%7D%27~PCwwwlz%20%2F%2F%20Offx%5Cnw%20%20qt%20ms%20lzseq%01lmqwxz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'The program counter (PC) is a byte offset in the deployed code. It indicates which instruction will be executed next. When an ADD is executed, for example, the PC is incremented by 1, since the instruction is 1 byte. The PUSH instructions are bigger than one byte, and so will increment the counter accordingly.', - ], - references: [ - evmCodesOpcodesLink(0x58), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 101), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/controlFlow/stop.ts b/src/chains/mainnet/vm/opcodes/controlFlow/stop.ts deleted file mode 100644 index 4e2617b7..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/stop.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const stop: Omit = { - number: 0x00, - name: 'stop', - description: 'Halts execution', - minGas: 0, - notes: [ - 'Exits the current context successfully. When a call is executed on an address with no code and the EVM tries to read the code data, the default value is returned, 0, which corresponds to this instruction and halts the execution.', - ], - references: [ - evmCodesOpcodesLink(0x00), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.ControlFlow, 23), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/address.ts b/src/chains/mainnet/vm/opcodes/environment/address.ts deleted file mode 100644 index 93f55e72..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/address.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const address: Opcode = { - number: 0x30, - name: 'address', - description: 'Get address of currently executing account', - minGas: 2, - outputs: [ - { - name: 'address', - description: 'The 20-byte address of the current account', - }, - ], - examples: [ - { - output: '0x9bbfed6889322e016e0a02ee459d306fc19545d8', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27ADDRESS%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x30), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 40), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/balance.ts b/src/chains/mainnet/vm/opcodes/environment/balance.ts deleted file mode 100644 index 81e2c3ac..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/balance.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const balance: Opcode = { - number: 0x31, - name: 'balance', - description: 'Get balance of given account', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: '100 if the accessed address is warm, 2600 otherwise', - }, - }, - inputs: [ - { - name: 'address', - description: 'The 20-byte address of the account to check', - }, - ], - outputs: [ - { - name: 'balance', - description: - "The balance of the given account in wei. Returns 0 if the account doesn't exist.", - }, - ], - examples: [ - { - input: '0x9bbfed6889322e016e0a02ee459d306fc19545d8', - output: '125985', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27%2F%2F%20Read%20current%20contract%20balance%5CnADDRESS%5CnBALANCE%27_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x31), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 63), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/basefee.ts b/src/chains/mainnet/vm/opcodes/environment/basefee.ts deleted file mode 100644 index 269d6d8b..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/basefee.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const basefee: Opcode = { - number: 0x48, - name: 'basefee', - description: 'Get the base fee', - minGas: 2, - outputs: [ - { - name: 'baseFee', - description: 'The base fee in wei.', - }, - ], - examples: [ - { - output: '10', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27BASEFEE%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x48), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 517), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.London), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts b/src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts deleted file mode 100644 index 8e7e714f..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const calldatacopy: Opcode = { - number: 0x37, - name: 'calldatacopy', - description: 'Copy input data in current environment to memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - expression: '3 * minimum_word_size + memory_expansion_cost', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to copy', - expression: '(size + 31) / 32', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'destOffset', - description: 'The byte offset in the memory where the result will be copied', - }, - { - name: 'offset', - description: 'The byte offset in the calldata to copy', - }, - { - name: 'size', - description: 'The byte size to copy', - }, - ], - examples: [ - { - input: ['0', '0', '32'], - calldata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '0', - after: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - { - input: ['0', '31', '8'], - calldata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - after: '0xFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1~32~0ywwz2~8~31y%27~wPUSH1%20z%2F%2F%20Example%20y~0wCALLDATACOPYw%5Cn%01wyz~_&callData=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x37), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 212), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/calldataload.ts b/src/chains/mainnet/vm/opcodes/environment/calldataload.ts deleted file mode 100644 index 14c4bcc9..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/calldataload.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const calldataload: Opcode = { - number: 0x35, - name: 'calldataload', - description: 'Get input data of current environment', - minGas: 3, - inputs: [ - { - name: 'i', - description: 'The byte offset in the calldata', - }, - ], - outputs: [ - { - name: 'data[i]', - description: - 'The 32-byte value starting from the given offset of the calldata. All bytes after the end of the calldata are set to 0.', - }, - ], - examples: [ - { - input: '0', - output: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - calldata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - { - input: '31', - output: '0xFF00000000000000000000000000000000000000000000000000000000000000', - calldata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27~1w0yzz~2w31y%27~%2F%2F%20Example%20z%5CnyzCALLDATALOADwzPUSH1%20%01wyz~_&callData=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' - ), - errorCases: ['Not enough gas', 'Not enough values on stack'], - references: [ - evmCodesOpcodesLink(0x35), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 163), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/calldatasize.ts b/src/chains/mainnet/vm/opcodes/environment/calldatasize.ts deleted file mode 100644 index 2f7918d0..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/calldatasize.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const calldatasize: Opcode = { - number: 0x36, - name: 'calldatasize', - description: 'Get size of input data in current environment', - minGas: 2, - outputs: [ - { - name: 'size ', - description: 'The byte size of the calldata', - }, - ], - examples: [ - { - output: '1', - calldata: '0xFF', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27CALLDATASIZE%27_&callData=0xFF'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x36), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 189), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/caller.ts b/src/chains/mainnet/vm/opcodes/environment/caller.ts deleted file mode 100644 index e04bdbfe..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/caller.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const caller: Opcode = { - number: 0x33, - name: 'caller', - description: 'Get caller address', - minGas: 2, - outputs: [ - { - name: 'address', - description: - "The 20-byte address of the caller's account. This is the account that did the last call (except delegate call).", - }, - ], - examples: [ - { - output: '0xbe862ad9abfe6f22bcb087716c7d89a26051f74c', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27CALLER%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x33), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 117), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/callvalue.ts b/src/chains/mainnet/vm/opcodes/environment/callvalue.ts deleted file mode 100644 index d46c172e..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/callvalue.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const callvalue: Opcode = { - number: 0x34, - name: 'callvalue', - description: 'Get deposited value by the instruction/transaction responsible for this execution', - minGas: 2, - outputs: [ - { - name: 'value', - description: 'The value of the current call in wei', - }, - ], - examples: [ - { - output: '123456789', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27CALLVALUE%27_&callValue=123456789'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x34), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 140), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/codecopy.ts b/src/chains/mainnet/vm/opcodes/environment/codecopy.ts deleted file mode 100644 index 9c50a0e9..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/codecopy.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const codecopy: Opcode = { - number: 0x39, - name: 'codecopy', - description: 'Copy code running in current environment to memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - expression: '3 * minimum_word_size + memory_expansion_cost', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to copy', - expression: '(size + 31) / 32', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'destOffset', - description: 'The byte offset in the memory where the result will be copied', - }, - { - name: 'offset', - description: 'The byte offset in the code to copy', - }, - { - name: 'size', - description: 'The byte size to copy', - }, - ], - examples: [ - { - input: ['0', '0', '32'], - code: '0x7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', - memory: { - before: '', - after: '0x7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', - }, - }, - { - input: ['0', '31', '8'], - code: '0x7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', - memory: { - before: '0x7DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', - after: '0x7F00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27qPutwbeginning%20ofwcodXtowexpected%20valueZ30VxWWWWWZ32VyyqRemovewvalues%20fromwstackTTj1~32~0_j2~8~31_%27~Z1%20zFFFFFFy%5Cnw%20thXq%2F%2F%20jyyqExamplX_~0yCODECOPYZyPUSHXe%20WzzV%200TyPOP%01TVWXZ_jqwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['For out of bound bytes, 0s will be copied'], - references: [ - evmCodesOpcodesLink(0x39), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 270), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/codesize.ts b/src/chains/mainnet/vm/opcodes/environment/codesize.ts deleted file mode 100644 index ac5b9a8a..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/codesize.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const codesize: Opcode = { - number: 0x38, - name: 'codesize', - description: 'Get size of code running in current environment', - minGas: 2, - outputs: [ - { - name: 'size', - description: 'The byte size of the code', - }, - ], - examples: [ - { - output: '32', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27%2F%2F%20Add%20som~instructions%20to%20increas~th~cod~sizeyPUSH29%200yPOPyyCODESIZE%27~e%20y%5Cn%01y~_' - ), - errorCases: ['Not enough gas', 'Stack overflow'], - notes: [ - 'Each instruction occupies one byte. In the case of a PUSH instruction, the bytes that need to be pushed are encoded after that, it thus increases the codesize accordingly.', - ], - references: [ - evmCodesOpcodesLink(0x38), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 247), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts b/src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts deleted file mode 100644 index 81a379f1..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const extcodecopy: Opcode = { - number: 0x3c, - name: 'extcodecopy', - description: "Copy an account's code to memory", - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: '3 * minimum_word_size + memory_expansion_cost + address_access_cost', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to copy', - expression: '(size + 31) / 32', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'address_access_cost', - description: 'The cost of accessing the address', - expression: '100 if the accessed address is warm, 2600 otherwise', - }, - ], - }, - }, - inputs: [ - { - name: 'address', - description: 'The 20-byte address of the contract to query', - }, - { - name: 'destOffset', - description: 'The byte offset in the memory where the result will be copied', - }, - { - name: 'offset', - description: 'The byte offset in the code to copy', - }, - { - name: 'size', - description: 'The byte size to copy', - }, - ], - examples: [ - { - input: ['0x43a61f3f4c73ea0d444c5c1c1a8544067a86219b', '0', '0', '32'], - code: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '', - after: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - { - input: ['0x43a61f3f4c73ea0d444c5c1c1a8544067a86219b', '0', '31', '8'], - code: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - after: '0xFF00000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27jCNQthat%20cNZwith%20.9%20aGcodeK7qqqqqqqqqIWK96_5260206_F3JJJJJ0!W(C-gZwithgQcodBabove~41IIzCREATE%20jPutsgnew%20ZaddresGongstack(Cleargmemory%20forge*esIIWI!WL1!IVL2~8~31V%27~)1%20z%5Cnq999Fj%2F%2F%20g%20thB_000Zcontract%20WzMSTOREVIzDUP4zEXTCODECOPYQconstructor%20N-Ga%20L(E*BK).0xJ___I~0Gs%20Be%209FF.32%20-reate*xampl)zPUSH(zzj!~32%01!()*-.9BGIJKLNQVWZ_gjqz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: ['For out of bound bytes, 0s will be copied'], - references: [ - evmCodesOpcodesLink(0x3c), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 350), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/extcodehash.ts b/src/chains/mainnet/vm/opcodes/environment/extcodehash.ts deleted file mode 100644 index 941a3087..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/extcodehash.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const extcodehash: Opcode = { - number: 0x3f, - name: 'extcodehash', - description: "Get hash of an account's code", - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: '100 if the accessed address is warm, 2600 otherwise', - }, - }, - inputs: [ - { - name: 'address', - description: 'The 20-byte address of the account', - }, - ], - outputs: [ - { - name: 'hash', - description: - "The hash of the chosen account's code, the empty hash (0xc5d24601...) if the account has no code, or 0 if the account does not exist or has been destroyed.", - }, - ], - examples: [ - { - input: '0x43a61f3f4c73ea0d444c5c1c1a8544067a86219b', - output: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27yClmthaWcl_%204%20FFZjYdeg3%200x63FFFFFFFF60005260046000F3q0~MSTORE~~yCfz_zmYdeZboveq13q0q0~CREATE%20yPutsznewVaddresjonzstack~~yGetzhash~EXTCODEHASH%27~%5Cnz%20the%20y%2F%2F%20qgVYntracWmYnstructor%20lfja%20js%20g~PUSH1freate_pwithZ%20aYcoWt%20V%20p%01VWYZ_fgjlmpqyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x3f), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 444), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/extcodesize.ts b/src/chains/mainnet/vm/opcodes/environment/extcodesize.ts deleted file mode 100644 index 18e7f821..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/extcodesize.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const extcodesize: Opcode = { - number: 0x3b, - name: 'extcodesize', - description: "Get size of an account's code", - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: '100 if the accessed address is warm, 2600 otherwise', - }, - }, - inputs: [ - { - name: 'address', - description: 'The 20-byte address of the contract to query', - }, - ], - outputs: [ - { - name: 'size', - description: 'The byte size of the code', - }, - ], - examples: [ - { - input: '0x43a61f3f4c73ea0d444c5c1c1a8544067a86219b', - output: '32', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27gCQYtha*cQ8%20GJ%20a_-deW7...p0KWJ6l5260206lF3NNNNN0p32KjjgCBm8mY-dVabovep41p0p0jCREATE%20gPutsmnew)addresLjjgThVaddres_iL%2C%20wVcan%20querymsizejEXTCODESIZE%27~JJJFp91%20m%20thVl000j%5Cng%2F%2F)-ntrac*_s%20Y-nstructor%20W9G0xVe%20QB_a%20NlllL_onmstackKjMSTOREJFFG32%20Breate9jPUSH8fwith.~~~-co*t%20)%20f%01)*-.89BGJKLNQVWY_fgjlmp~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x3b), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 324), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/gasprice.ts b/src/chains/mainnet/vm/opcodes/environment/gasprice.ts deleted file mode 100644 index e9171071..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/gasprice.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const gasprice: Opcode = { - number: 0x3a, - name: 'gasprice', - description: 'Get price of gas in current environment', - minGas: 2, - outputs: [ - { - name: 'price', - description: 'The gas price in wei per gas', - }, - ], - examples: [ - { - output: '10', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27GASPRICE%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x3a), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 301), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/index.ts b/src/chains/mainnet/vm/opcodes/environment/index.ts deleted file mode 100644 index 8de1879e..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Opcode } from '@/types'; -import { address } from './address'; -import { balance } from './balance'; -import { basefee } from './basefee'; -import { calldatacopy } from './calldatacopy'; -import { calldataload } from './calldataload'; -import { calldatasize } from './calldatasize'; -import { caller } from './caller'; -import { callvalue } from './callvalue'; -import { codecopy } from './codecopy'; -import { codesize } from './codesize'; -import { extcodecopy } from './extcodecopy'; -import { extcodehash } from './extcodehash'; -import { extcodesize } from './extcodesize'; -import { gasprice } from './gasprice'; -import { origin } from './origin'; -import { returndatacopy } from './returndatacopy'; -import { returndatasize } from './returndatasize'; -import { selfbalance } from './selfbalance'; - -export const opcodes: Record = { - [address.number]: address, - [balance.number]: balance, - [basefee.number]: basefee, - [calldatacopy.number]: calldatacopy, - [calldataload.number]: calldataload, - [calldatasize.number]: calldatasize, - [caller.number]: caller, - [callvalue.number]: callvalue, - [codecopy.number]: codecopy, - [codesize.number]: codesize, - [extcodecopy.number]: extcodecopy, - [extcodehash.number]: extcodehash, - [extcodesize.number]: extcodesize, - [gasprice.number]: gasprice, - [origin.number]: origin, - [returndatacopy.number]: returndatacopy, - [returndatasize.number]: returndatasize, - [selfbalance.number]: selfbalance, -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/origin.ts b/src/chains/mainnet/vm/opcodes/environment/origin.ts deleted file mode 100644 index a021abdf..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/origin.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const origin: Opcode = { - number: 0x32, - name: 'origin', - description: 'Get execution origination address', - minGas: 2, - outputs: [ - { - name: 'address', - description: - 'The 20-byte address of the sender of the transaction. It can only be an account without code.', - }, - ], - examples: [ - { - output: '0xbe862ad9abfe6f22bcb087716c7d89a26051f74c', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27ORIGIN%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(0x32), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 93), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts b/src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts deleted file mode 100644 index b7d50e6f..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const returndatacopy: Opcode = { - number: 0x3e, - name: 'returndatacopy', - description: 'Copy output data from the previous call to memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - expression: '3 * minimum_word_size + memory_expansion_cost', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to copy', - expression: '(size + 31) / 32', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'destOffset', - description: 'The byte offset in the memory where the result will be copied', - }, - { - name: 'offset', - description: 'The byte offset in the return data from the last executed sub context to copy', - }, - { - name: 'size', - description: 'The byte size to copy', - }, - ], - examples: [ - { - input: ['0', '0', '32'], - returndata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '', - after: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - { - input: ['32', '31', '1'], - returndata: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - memory: { - before: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - after: '0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27jCKVthat%20cK(wich%20return-32%20*Z7F7ggggggggggFJ_Z*6Q527*F6Q526020.!_Zq06020526029.00~64_Breatef(withfVcod)above~77JJzCREATE%20jPutsfnew%20(addres-onfstackBallfdeployed%20XJJJJzDUP584%200xg*zSTATICCALLBlearfstackzPOPzPOPBlearfmemoryJJ_J!_J~64_zG1!JJWG2~1~31!W%27~81%20z%5CnqQQQj%2F%2F%20g***f%20th)_zMSTOREZ832%200xXcontractWzRETURNDATACOPYzVconstructor%20Q000Kreate-a%20J~0GzjExampl)BzzjC8zPUSH.6QF3qqqq-s%20*FF)e%20(X%20!~32%01!()*-.8BGJKQVWXZ_fgjqz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The addition offset + size overflows', - 'The result of `offset` plus `size` is larger than RETURNDATASIZE.', - ], - notes: ['A sub context can be created with CALL, CALLCODE, DELEGATECALL or STATICCALL'], - references: [ - evmCodesOpcodesLink(0x3e), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 406), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Byzantium), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/returndatasize.ts b/src/chains/mainnet/vm/opcodes/environment/returndatasize.ts deleted file mode 100644 index d7808190..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/returndatasize.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const returndatasize: Opcode = { - number: 0x3d, - name: 'returndatasize', - description: 'Get size of output data from the previous call from the current environment', - minGas: 2, - outputs: [ - { - name: 'size ', - description: 'The byte size of the return data from the last executed sub context', - }, - ], - examples: [ - { - output: '32', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27gCJWthat%20cJX-ichB.(*Y7F7jjjjjjjjjjF)KY*6Q527*F6Q5260208~32KYq06020526029800~64KmmgC!_X-ith_WcodVabove~77))mCREATE%20gPuts_new%20X%20addres.on_stackmmgCall_deployed%20X))))mDUP5G4%200xj*mSTATICCALLmmgNow-Vshould%20havVourB%20data%20sizVof%2032mRETURNDATASIZEm%27~G1%20qQQQm%5Cnj***g%2F%2F%20_%20thVYG(0xXcontractWconstructor%20Ve%20Q000KmMSTOREJ!.a%20GmPUSHB%20return86QF3qqqq.s%20-%20w*FF)~0(32%20!reate%01!()*-.8BGJKQVWXY_gjmq~_' - ), - errorCases: ['Not enough gas', 'Stack overflow'], - notes: ['A sub context can be created with CALL, CALLCODE, DELEGATECALL or STATICCALL'], - references: [ - evmCodesOpcodesLink(0x3d), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 384), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Byzantium), -}; diff --git a/src/chains/mainnet/vm/opcodes/environment/selfbalance.ts b/src/chains/mainnet/vm/opcodes/environment/selfbalance.ts deleted file mode 100644 index c2e592ca..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/selfbalance.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const selfbalance: Opcode = { - number: 0x47, - name: 'selfbalance', - description: 'Get balance of currently executing account', - minGas: 5, - outputs: [ - { - name: 'balance', - description: 'The balance of the current account in wei.', - }, - ], - examples: [ - { - output: '9', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27SELFBALANCE%27_'), - errorCases: ['Not enough gas', 'Stack overflow'], - notes: [ - 'Semantically equivalent of calling BALANCE with ADDRESS as parameter, but with a reduced gas cost.', - ], - references: [ - evmCodesOpcodesLink(0x47), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Environment, 491), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Istanbul), -}; diff --git a/src/chains/mainnet/vm/opcodes/index.ts b/src/chains/mainnet/vm/opcodes/index.ts deleted file mode 100644 index fd02f55f..00000000 --- a/src/chains/mainnet/vm/opcodes/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Opcode } from '@/types'; -import { opcodes as arithmeticOpcodes } from './arithmetic'; -import { opcodes as bitwiseOpcodes } from './bitwise'; -import { opcodes as blockOpcodes } from './block'; -import { opcodes as comparisonOpcodes } from './comparison'; -import { opcodes as controlFlowOpcodes } from './controlFlow'; -import { opcodes as environmentOpcodes } from './environment'; -import { opcodes as keccakOpcodes } from './keccak'; -import { opcodes as logOpcodes } from './log'; -import { opcodes as memoryOpcodes } from './memory'; -import { opcodes as stackOpcodes } from './stack'; -import { opcodes as storageOpcodes } from './storage'; -import { opcodes as systemOpcodes } from './system'; - -export const opcodes: Record> = { - ...arithmeticOpcodes, - ...bitwiseOpcodes, - ...blockOpcodes, - ...comparisonOpcodes, - ...controlFlowOpcodes, - ...environmentOpcodes, - ...keccakOpcodes, - ...logOpcodes, - ...memoryOpcodes, - ...stackOpcodes, - ...storageOpcodes, - ...systemOpcodes, -}; diff --git a/src/chains/mainnet/vm/opcodes/keccak/index.ts b/src/chains/mainnet/vm/opcodes/keccak/index.ts deleted file mode 100644 index 8e700efd..00000000 --- a/src/chains/mainnet/vm/opcodes/keccak/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Opcode } from '@/types'; -import { keccak } from './keccak'; - -export const opcodes: Record = { - [keccak.number]: keccak, -}; diff --git a/src/chains/mainnet/vm/opcodes/keccak/keccak.ts b/src/chains/mainnet/vm/opcodes/keccak/keccak.ts deleted file mode 100644 index 5f570f08..00000000 --- a/src/chains/mainnet/vm/opcodes/keccak/keccak.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const keccak: Opcode = { - number: 0x20, - name: 'keccak', - description: 'Compute Keccak-256 hash', - minGas: 30, - gasComputation: { - staticGasCost: { - expression: '30', - }, - dynamicGasCost: { - expression: '6 * minimum_word_size + memory_expansion_cost', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to hash', - expression: '(size + 31) / 32', - }, - { - name: 'Memory expansion', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The byte offset in the memory', - }, - { - name: 'size', - description: 'The byte size to read in the memory', - }, - ], - outputs: [ - { - name: 'hash', - description: 'The Keccak-256 hash of the given data in memory', - }, - ], - examples: [ - { - input: ['0', '4'], - output: '0x29045A592007D0C246EF02C2223570DA9522D0CF0F73282C79A1BC8F0BB2C238', - memory: { - before: '0xFFFFFFFF', - after: '0xFFFFFFFF', - }, - }, - { - input: ['0xFF', '0'], - output: '0', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27sPutkrequired%20valugin%20memoryj32%200xFFFFFFFFffffz0wMSTOREwwsCallkopcodez4z0wSHA3%27~0000000zj1%20w%5Cns%2F%2F%20k%20thgjwPUSHge%20f~~%01fgjkswz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x20), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Keccak, 30), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/log/index.ts b/src/chains/mainnet/vm/opcodes/log/index.ts deleted file mode 100644 index 10275f16..00000000 --- a/src/chains/mainnet/vm/opcodes/log/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Opcode } from '@/types'; -import { opcodes as logOpcodes } from './log'; - -export const opcodes: Record> = { - ...logOpcodes, -}; diff --git a/src/chains/mainnet/vm/opcodes/log/log.ts b/src/chains/mainnet/vm/opcodes/log/log.ts deleted file mode 100644 index c5e24162..00000000 --- a/src/chains/mainnet/vm/opcodes/log/log.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const log = (n: number): Omit => { - if (n < 0 || n > 4) { - throw new Error('Log number must be between 1 and 32'); - } - const number = 0xa0 + n; - const description = `Append log record with ${ - n == 0 ? 'no topic' : n == 1 ? '1 topic' : `${n} topics` - }`; - return { - number, - name: `log${n}`, - description, - minGas: 375 * (1 + n), - gasComputation: { - staticGasCost: { - expression: '375 * (1 + topic_count)', - variables: [ - { - name: 'topic_count', - description: 'The number of topics in the log record', - expression: `${n}`, - }, - ], - }, - dynamicGasCost: { - expression: '8 * size + memory_expansion_cost', - variables: [ - { - name: 'size', - description: 'byte size to copy', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The byte offset in the memory in bytes', - }, - { - name: 'size', - description: 'The byte size to copy', - }, - ], - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL (since Byzantium fork)', - ], - notes: ['This instruction has no effect on the EVM state'], - references: [ - evmCodesOpcodesLink(number), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Log, 84 + n), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), - }; -}; - -const createLogOpcodes = (start: number, end: number): Record> => { - const opcodes: Record> = {}; - for (let i = start; i <= end; i++) { - const log_i = log(i); - opcodes[log_i.number] = log_i; - } - return opcodes; -}; - -export const opcodes = createLogOpcodes(0, 4); diff --git a/src/chains/mainnet/vm/opcodes/memory/index.ts b/src/chains/mainnet/vm/opcodes/memory/index.ts deleted file mode 100644 index 46255115..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Opcode } from '@/types'; -import { mload } from './mload'; -import { msize } from './msize'; -import { mstore } from './mstore'; -import { mstore8 } from './mstore8'; - -export const opcodes: Record> = { - [mload.number]: mload, - [msize.number]: msize, - [mstore.number]: mstore, - [mstore8.number]: mstore8, -}; diff --git a/src/chains/mainnet/vm/opcodes/memory/mload.ts b/src/chains/mainnet/vm/opcodes/memory/mload.ts deleted file mode 100644 index 7f495ef8..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/mload.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mload: Opcode = { - number: 0x51, - name: 'mload', - description: 'Load word from memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - name: 'Memory expansion', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The offset in the memory in bytes', - }, - ], - outputs: [ - { - name: 'value', - description: - 'The 32 bytes in memory starting at that offset. If it goes beyond its current size (see MSIZE), writes 0s.', - }, - ], - examples: [ - { - input: '0', - output: '0xFF', - memory: { - before: '0x00000000000000000000000000000000000000000000000000000000000000FF', - after: '0x00000000000000000000000000000000000000000000000000000000000000FF', - }, - }, - { - input: '1', - output: '0xFF00', - memory: { - before: '0x00000000000000000000000000000000000000000000000000000000000000FF', - after: '0x00000000000000000000000000000000000000000000000000000000000000FF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27qPut%20thkstatkin%20memoryg32%200xfffffdFFv0zMSTOREw1v0jw2v1jz%27~dddz%5CnwzzqExamplkvg1%20q%2F%2F%20ke%20jzMLOADgzPUSHf~~d00%01dfgjkqvwz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x51), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Memory, 90), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/memory/msize.ts b/src/chains/mainnet/vm/opcodes/memory/msize.ts deleted file mode 100644 index 159d0b2d..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/msize.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const msize: Omit = { - number: 0x59, - name: 'msize', - description: 'Get the size of active memory in bytes', - minGas: 2, - outputs: [ - { - name: 'size', - description: 'The current memory size in bytes (higher offset accessed until now + 1)', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27jInitiallygkufirst~1mkx39upart%20of%20third~3ms%27~mqPOPqjNow%20size%20is%20v%20%2F%2F%20uqMLOADvRead%20q%5Cnm%20wordkqPUSH1gjMSIZEvg%200%01gjkmquv~_' - ), - errorCases: ['Not enough gas', 'Stack overflow'], - notes: [ - 'The memory is always fully accessible. What this instruction tracks is the highest offset that was accessed in the current execution. A first write or read to a bigger offset will trigger a memory expansion, which will cost gas. The size is always a multiple of a word (32 bytes).', - ], - references: [ - evmCodesOpcodesLink(0x59), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Arithmetic, 120), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/memory/mstore.ts b/src/chains/mainnet/vm/opcodes/memory/mstore.ts deleted file mode 100644 index 0199a353..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/mstore.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mstore: Opcode = { - number: 0x52, - name: 'mstore', - description: 'Save word to memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - name: 'Memory expansion', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The offset in the memory in bytes', - }, - { - name: 'value', - description: 'The 32-bytes value to write in the memory', - }, - ], - examples: [ - { - input: ['0', '0xFF'], - memory: { - before: '', - after: '0x00000000000000000000000000000000000000000000000000000000000000FF', - }, - }, - { - input: ['1', '0xFF'], - memory: { - before: '', - after: '0x0000000000000000000000000000000000000000000000000000000000000000FF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1v0wyz2v1w%27~yPUSH1%20z%2F%2F%20Example%20y%5CnwyMSTOREyv~0xFF~%01vwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x52), - '[evm.codes, Memory Expansion](https://www.evm.codes/about#memoryexpansion)', - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Memory, 27), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/memory/mstore8.ts b/src/chains/mainnet/vm/opcodes/memory/mstore8.ts deleted file mode 100644 index d5144993..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/mstore8.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const mstore8: Opcode = { - number: 0x53, - name: 'mstore8', - description: 'Save byte to memory', - minGas: 3, - gasComputation: { - staticGasCost: { - expression: '3', - }, - dynamicGasCost: { - name: 'Memory expansion', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The offset in the memory in bytes', - }, - { - name: 'value', - description: - 'The 1-byte value to write in the memory (the least significant byte of the 32-byte stack value).', - }, - ], - examples: [ - { - input: ['0', '0xFFFF'], - memory: { - before: '', - after: '0xFF', - }, - }, - { - input: ['1', '0xFF'], - memory: { - before: '0xFF', - after: '0xFFFF', - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1v2%200xFFFFy0w~z2y0xFFy1w%27~%5Cnz%2F%2F%20Example%20yv1%20w~MSTORE8~v~PUSH%01vwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x53), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Memory, 58), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/stack/dup.ts b/src/chains/mainnet/vm/opcodes/stack/dup.ts deleted file mode 100644 index 72327d84..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/dup.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode, Variable } from '@/types'; - -const generateIgnoredValues = (n: number): Variable[] => { - const alphabet = 'abcdefghijklmno'; - if (n > alphabet.length) { - throw new Error('Error while generating the ignored values for the dup opcode'); - } - const array: Variable[] = []; - for (let i = 0; i < n; i++) { - const v: Variable = { - name: alphabet[i], - description: 'An ignored value', - }; - array.push(v); - } - return array; -}; - -const dup = (n: number): Opcode => { - if (n < 1 || n > 16) { - throw new Error('Dup number must be between 1 and 16'); - } - const number = 0x7f + n; - const description = `Duplicate ${ - n == 1 ? '1st' : n == 2 ? '2nd' : n == 3 ? '3rd' : `${n}th` - } stack item`; - const ignoredValues: Variable[] = n > 1 ? generateIgnoredValues(n - 1) : []; - const zeros: string[] = n > 1 ? Array(n - 1).fill('0') : []; - return { - number, - name: `dup${n}`, - description, - minGas: 3, - inputs: [ - ...ignoredValues, - { - name: 'value', - description: 'The value to duplicate', - }, - ], - outputs: [ - { - name: 'value', - description: 'The duplicated value', - }, - ...ignoredValues, - { - name: 'value', - description: 'The original value', - }, - ], - examples: [ - { - input: [...zeros, '1'], - output: ['1', ...zeros, '1'], - }, - ], - // TODO: playgroundLink: evmCodesPlaygroundLink(`%27xSet%20state${'FF'.repeat(n)}%5Cn~%27~PUSH${n}%200%01~_`), - playgroundLink: evmCodesPlaygroundLink( - '%27zSet%20styPUSH1%201~~zDuplicyDUP1%27~%5Cnz%2F%2F%20yate~%01yz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack', 'Stack overflow'], - references: [ - evmCodesOpcodesLink(number), - ethSpecsOpcodeSrc(CURRENT_MAINNET_HARDFORK, OpcodeGroup.Stack, 179 + n), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), - }; -}; - -const createDupOpcodes = (start: number, end: number): Record => { - const opcodes: Record = {}; - for (let i = start; i <= end; i++) { - const dup_i = dup(i); - opcodes[dup_i.number] = dup_i; - } - return opcodes; -}; - -export const opcodes = createDupOpcodes(1, 16); diff --git a/src/chains/mainnet/vm/opcodes/stack/index.ts b/src/chains/mainnet/vm/opcodes/stack/index.ts deleted file mode 100644 index 4973aec5..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Opcode } from '@/types'; -import { opcodes as dupOpcodes } from './dup'; -import { pop } from './pop'; -import { push0, opcodes as pushOpcodes } from './push'; -import { opcodes as swapOpcodes } from './swap'; - -export const opcodes: Record = { - ...dupOpcodes, - [pop.number]: pop, - [push0.number]: push0, - ...pushOpcodes, - ...swapOpcodes, -}; diff --git a/src/chains/mainnet/vm/opcodes/stack/pop.ts b/src/chains/mainnet/vm/opcodes/stack/pop.ts deleted file mode 100644 index 384c445f..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/pop.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const pop: Opcode = { - number: 0x50, - name: 'pop', - description: 'Remove item from stack', - minGas: 2, - inputs: [ - { - name: 'y', - description: 'A stack item', - }, - ], - examples: [ - { - input: '125985', - }, - ], - playgroundLink: evmCodesPlaygroundLink('%27PUSH3%20125985%5CnPOP%27_'), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x50), - ethSpecsOpcodeSrc(CURRENT_MAINNET_HARDFORK, OpcodeGroup.Stack, 26), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/stack/push.ts b/src/chains/mainnet/vm/opcodes/stack/push.ts deleted file mode 100644 index c59830fe..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/push.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -const push = (n: number): Opcode => { - if (n < 1 || n > 32) { - throw new Error('Push number must be between 1 and 32'); - } - const number = 0x5f + n; - return { - number, - name: `push${n}`, - description: `Place ${n} byte item on stack`, - minGas: 3, - outputs: [ - { - name: 'value', - description: 'The pushed value, aligned to the right (put in the lowest significant bytes)', - }, - ], - examples: [ - { - output: [`0x${'00'.repeat(n)}"`, `0x${'FF'.repeat(n)}"`], - }, - ], - playgroundLink: evmCodesPlaygroundLink(`%27~x${'FF'.repeat(n)}%5Cn~%27~PUSH${n}%200%01~_`), - errorCases: ['Not enough gas', 'Stack overflow'], - notes: [ - 'The new value is put on top of the stack, incrementing all the other value indices. The values for a specific opcode thus have to be pushed in reverse order of the stack. For example, with MSTORE, the first value pushed would have to be value, and then offset.', - ], - references: [ - evmCodesOpcodesLink(number), - ethSpecsOpcodeSrc(CURRENT_MAINNET_HARDFORK, OpcodeGroup.Stack, 146 + n), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), - }; -}; - -const createPushOpcodes = (start: number, end: number): Record => { - const opcodes: Record = {}; - for (let i = start; i <= end; i++) { - const push_i = push(i); - opcodes[push_i.number] = push_i; - } - return opcodes; -}; - -export const opcodes = createPushOpcodes(1, 32); - -export const push0: Opcode = { - number: 0x5f, - name: 'push0', - description: 'Place value 0 on stack', - minGas: 2, - outputs: [ - { - name: 'value', - description: 'The pushed value, equal to 0', - }, - ], - examples: [ - { - output: ['0x00'], - }, - ], - errorCases: ['Not enough gas', 'Stack overflow'], - notes: [ - 'The new value is put on top of the stack, incrementing all the other value indices. The values for a specific opcode thus have to be pushed in reverse order of the stack. For example, with MSTORE, the first value pushed would have to be value, and then offset.', - ], - references: [ - evmCodesOpcodesLink(0x5f), - ethSpecsOpcodeSrc(CURRENT_MAINNET_HARDFORK, OpcodeGroup.Stack, 146), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Shanghai), -}; diff --git a/src/chains/mainnet/vm/opcodes/stack/swap.ts b/src/chains/mainnet/vm/opcodes/stack/swap.ts deleted file mode 100644 index 007143bf..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/swap.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode, Variable } from '@/types'; - -const generateIgnoredValues = (n: number): Variable[] => { - const alphabet = 'abcdefghijklmno'; - if (n > alphabet.length) { - throw new Error('Error while generating the ignored values for the dup opcode'); - } - const array: Variable[] = []; - for (let i = 0; i < n; i++) { - const v: Variable = { - name: alphabet[i], - description: 'An ignored value', - }; - array.push(v); - } - return array; -}; - -const swap = (n: number): Opcode => { - if (n < 1 || n > 16) { - throw new Error('Swap number must be between 1 and 16'); - } - const number = 0x8f + n; - const description = `Exchange 1st and ${ - n == 1 ? '2nd' : n == 2 ? '3rd' : `${n + 1}th` - } stack items`; - const ignoredValues: Variable[] = n > 1 ? generateIgnoredValues(n - 1) : []; - const zeros: string[] = n > 1 ? Array(n - 1).fill('0') : []; - return { - number, - name: `swap${n}`, - description, - minGas: 3, - inputs: [ - { - name: 'value_1', - description: 'The value to swap', - }, - ...ignoredValues, - { - name: 'value_2', - description: 'The other value to swap', - }, - ], - outputs: [ - { - name: 'value_2', - description: 'The swapped value', - }, - ...ignoredValues, - { - name: 'value_1', - description: 'The other swapped value', - }, - ], - examples: [ - { - input: ['1', ...zeros, '2'], - output: ['2', ...zeros, '1'], - }, - ], - // TODO: playgroundLink: evmCodesPlaygroundLink(`%27xSet%20state${'FF'.repeat(n)}%5Cn~%27~PUSH${n}%200%01~_`), - playgroundLink: evmCodesPlaygroundLink( - '%27xet%20state~2zzzzzv1yyxwapySWAP14%27~yPUSH1%20v0y%5Cnx%2F%2F%20Svz~0~%01vxyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(number), - ethSpecsOpcodeSrc(CURRENT_MAINNET_HARDFORK, OpcodeGroup.Stack, 196 + n), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), - }; -}; - -const createSwapOpcodes = (start: number, end: number): Record => { - const opcodes: Record = {}; - for (let i = start; i <= end; i++) { - const swap_i = swap(i); - opcodes[swap_i.number] = swap_i; - } - return opcodes; -}; - -export const opcodes = createSwapOpcodes(1, 16); diff --git a/src/chains/mainnet/vm/opcodes/storage/index.ts b/src/chains/mainnet/vm/opcodes/storage/index.ts deleted file mode 100644 index 6493ff6a..00000000 --- a/src/chains/mainnet/vm/opcodes/storage/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Opcode } from '@/types'; -import { sload } from './sload'; -import { sstore } from './sstore'; - -export const opcodes: Record = { - [sload.number]: sload, - [sstore.number]: sstore, -}; diff --git a/src/chains/mainnet/vm/opcodes/storage/sload.ts b/src/chains/mainnet/vm/opcodes/storage/sload.ts deleted file mode 100644 index 83d09f10..00000000 --- a/src/chains/mainnet/vm/opcodes/storage/sload.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sload: Opcode = { - number: 0x54, - name: 'sload', - description: 'Load word from storage', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: '100 if the accessed address is warm, 2100 otherwise', - }, - }, - inputs: [ - { - name: 'key', - description: 'The 32-byte key in storage', - }, - ], - outputs: [ - { - name: 'value', - description: - 'The 32-byte value corresponding to that key. 0 if that key was never written before', - }, - ], - examples: [ - { - input: '0', - output: '46', - storage: { - before: { - '0': '46', - }, - after: { - '0': '46', - }, - }, - }, - { - input: '1', - output: '0', - storage: { - before: { - '0': '46', - }, - after: { - '0': '46', - }, - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27wSet%20up%20thrstatez46z0~SSTOREy1z0vy2z1v~%27~%5Cnz~PUSH1%20y~~wExamplrw%2F%2F%20v~SLOADre%20%01rvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0x54), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Storage, 32), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/storage/sstore.ts b/src/chains/mainnet/vm/opcodes/storage/sstore.ts deleted file mode 100644 index 6e54ab12..00000000 --- a/src/chains/mainnet/vm/opcodes/storage/sstore.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const sstore: Opcode = { - number: 0x55, - name: 'sstore', - description: 'Save word to storage', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - // TODO: find a way to better define this expression. - expression: ` -if value == current_value - if key is warm - base_dynamic_gas = 100 - else - base_dynamic_gas = 100 -else if current_value == original_value - if original_value == 0 - base_dynamic_gas = 20000 - else - base_dynamic_gas = 2900 -else - base_dynamic_gas = 100 - -if slot is cold - base_dynamic_gas += 2100 - `, - variables: [ - { - name: 'value', - description: 'The value from the stack input', - }, - { - name: 'current_value', - description: 'The current value of the storage slot', - }, - { - name: 'original_value', - description: 'The value of the storage slot before the current transaction', - }, - ], - }, - // TODO: find a way to better define this expression. - refunds: ` -if value != current_value - if current_value == original_value - if original_value != 0 and value == 0 - gas_refunds += 4800 - else - if original_value != 0 - if current_value == 0 - gas_refunds -= 4800 - else if value == 0 - gas_refunds += 4800 - if value == original_value - if original_value == 0 - if key is warm - gas_refunds += 20000 - 100 - else - gas_refunds += 19900 - else - if key is warm - gas_refunds += 5000 - 2100 - 100 - else - gas_refunds += 4900 - `, - }, - inputs: [ - { - name: 'key', - description: 'The 32-byte key in storage', - }, - { - name: 'value', - description: 'The 32-byte value to store', - }, - ], - examples: [ - { - input: ['0', '0xFFFF'], - storage: { - before: {}, - after: { - '0': '0xFFFF', - }, - }, - }, - { - input: ['8965', '0xFF'], - storage: { - before: { - '0': '0xFFFF', - }, - after: { - '0': '0xFFFF', - '8965': '0xFF', - }, - }, - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z1uFFv1%200w~z2uy8965w%27~%5Cnz%2F%2F%20Example%20yv2%20w~SSTORE~v~PUSHuy0xFF%01uvwyz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL (since Byzantium fork)', - ], - references: [ - evmCodesOpcodesLink(0x55), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.Storage, 62), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/call.ts b/src/chains/mainnet/vm/opcodes/system/call.ts deleted file mode 100644 index 7ec786f7..00000000 --- a/src/chains/mainnet/vm/opcodes/system/call.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const call: Omit = { - number: 0xf1, - name: 'call', - description: 'Message-call into an account', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: - 'memory_expansion_cost + code_execution_cost + address_access_cost + positive_value_cost + value_to_empty_account_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'code_execution_cost', - description: 'The cost of the called code execution (limited by the gas parameter)', - }, - { - name: 'address_access_cost', - description: '100 if the accessed address is warm, 2600 otherwise', - }, - { - name: 'positive_value_cost', - description: - '9000 if `value` is not 0. In this case there is also a call stipend that is given to make sure that a basic fallback function can be called. 2300 is thus removed from the cost, and also added to the gas input.', - }, - { - name: 'value_to_empty_account_cost', - description: - '25000 f `value` is not 0 and the address given points to an empty account. An account is empty if its balance is 0, its nonce is 0 and it has no code.', - }, - ], - }, - }, - inputs: [ - { - name: 'gas', - description: - 'The amount of gas to send to the sub context to execute. The gas that is not used by the sub context is returned to this one.', - }, - { - name: 'address', - description: 'The account which context to execute', - }, - { - name: 'value', - description: 'The value in wei to send to the account', - }, - { - name: 'argsOffset', - description: 'The byte offset in the memory in bytes, the calldata of the sub context', - }, - { - name: 'argsSize', - description: 'The byte size to copy (size of the calldata)', - }, - { - name: 'retOffset', - description: - 'The byte offset in the memory in bytes, where to store the return data of the sub context', - }, - { - name: 'retSize', - description: 'The byte size to copy (size of the return data)', - }, - ], - outputs: [ - { - name: 'success', - description: 'Returns 0 if the sub context reverted, 1 otherwise', - }, - ], - // TODO: Add an example when one will be provided on https://www.evm.codes/#f1?fork=shanghai - playgroundLink: evmCodesPlaygroundLink( - '%27breate%20aYontracWthatYreateVaQexceptioQif%20firsWword%20ofj%20isq_17qx67Z035Z757FE5BZ052Z86018F3gzMSTORE~17~15gzCREATEy%20parameterskqgggX6vynqjkVsuccessgg~32X7v%27~_1%20z%5Cnyzzball%20with%20nov_2qxFFFFzCALLq%200k%2C%20returnjYalldatag~0b%2F%2F%20C_zPUSHZ600Y%20cXggzDUPWt%20Vs%20Qn%20%01QVWXYZ_bgjkqvyz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL and the value (stack index 2) is not 0 (since Byzantium fork)', - ], - notes: [ - 'Creates a new sub context and execute the code of the given account, then resumes the current one. Note that an account with no code will return success as true.', - 'If the size of the return data is not known, it can also be retrieved after the call with the instructions RETURNDATASIZE and RETURNDATACOPY (since the Byzantium fork).', - 'From the Tangerine Whistle fork, gas is capped at all but one 64th (remaining_gas / 64) of the remaining gas of the current context. If a call tries to send more, the gas is changed to match the maximum allowed.', - ], - references: [ - evmCodesOpcodesLink(0xf1), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 329), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/callcode.ts b/src/chains/mainnet/vm/opcodes/system/callcode.ts deleted file mode 100644 index 9c2fa6cc..00000000 --- a/src/chains/mainnet/vm/opcodes/system/callcode.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const callcode: Omit = { - number: 0xf2, - name: 'callcode', - description: " Message-call into this account with alternative account's code", - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: - 'memory_expansion_cost + code_execution_cost + address_access_cost + positive_value_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'code_execution_cost', - description: 'The cost of the called code execution (limited by the gas parameter)', - }, - { - name: 'address_access_cost', - description: '100 if the accessed address is warm, 2600 otherwise', - }, - { - name: 'positive_value_cost', - description: - '9000 if `value` is not 0. In this case there is also a call stipend that is given to make sure that a basic fallback function can be called. 2300 is thus removed from the cost, and also added to the gas input.', - }, - ], - }, - }, - inputs: [ - { - name: 'gas', - description: - 'The amount of gas to send to the sub context to execute. The gas that is not used by the sub context is returned to this one.', - }, - { - name: 'address', - description: 'The account which context to execute', - }, - { - name: 'value', - description: 'The value in wei to send to the account', - }, - { - name: 'argsOffset', - description: 'The byte offset in the memory in bytes, the calldata of the sub context', - }, - { - name: 'argsSize', - description: 'The byte size to copy (size of the calldata)', - }, - { - name: 'retOffset', - description: - 'The byte offset in the memory in bytes, where to store the return data of the sub context', - }, - { - name: 'retSize', - description: 'The byte size to copy (size of the return data)', - }, - ], - outputs: [ - { - name: 'success', - description: 'Returns 0 if the sub context reverted, 1 otherwise', - }, - ], - // TODO: Add an example when one will be provided on https://www.evm.codes/#f2?fork=shanghai - playgroundLink: evmCodesPlaygroundLink( - '%27kCreatXa%20VvthavcreateNaWexceptioWif%20Zofjisb_17bx67Y054Y757FE5BY052Y86018F3JMSTORE~17~15JCREATzm0dddQ6qyykSevZiWthXcurrenvVt~1JSSTORz%27%3Am1dd~32Q7q%27~_1%20zEyykCall%20withjK0%20y%5Cnvt%20q_2bxFFFFyCALLCODEm%3Db%2C%20returnNk%2F%2F%20j%20storagXd~0b%200_yPUSHZfirsvKY600Xe%20Wn%20VcontracQdJDUPNs%20KslovJdy%01JKNQVWXYZ_bdjkmqvyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Creates a new sub context as if calling itself, but with the code of the given account. In particular the storage remains the same. Note that an account with no code will return success as true.', - 'If the size of the return data is not known, it can also be retrieved after the call with the instructions RETURNDATASIZE and RETURNDATACOPY (since the Byzantium fork).', - 'From the Tangerine Whistle fork, gas is capped at all but one 64th (remaining_gas / 64) of the remaining gas of the current context. If a call tries to send more, the gas is changed to match the maximum allowed.', - ], - references: [ - evmCodesOpcodesLink(0xf2), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 407), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/create.ts b/src/chains/mainnet/vm/opcodes/system/create.ts deleted file mode 100644 index 86ed58db..00000000 --- a/src/chains/mainnet/vm/opcodes/system/create.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const create: Opcode = { - number: 0xf0, - name: 'create', - description: 'Create a new account with associated code', - minGas: 32000, - gasComputation: { - staticGasCost: { - expression: '32000', - }, - dynamicGasCost: { - expression: 'memory_expansion_cost + deployment_code_execution_cost + code_deposit_cost', - description: 'The new contract address is added in the warm addresses', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'deployment_code_execution_cost', - description: 'The cost of whatever opcode is run to deploy the new contract', - }, - { - name: 'code_deposit_cost', - description: 'The cost for storing the code of the new contract', - }, - ], - }, - }, - inputs: [ - { - name: 'value', - description: 'The value in wei to send to the new account', - }, - { - name: 'offset', - description: - 'The byte offset in the memory in bytes, the initialisation code for the new account', - }, - { - name: 'size', - description: 'The byte size to copy (size of the initialisation code)', - }, - ], - outputs: [ - { - name: 'address', - description: 'The address of the deployed contract, 0 if the deployment failed', - }, - ], - examples: [ - { - description: 'Create an account with 0 wei and no code', - input: ['0', '0', '0'], - output: '43a61f3f4c73ea0d444c5c1c1a8544067a86219b', - }, - { - description: 'Create an account with 9 wei and no code', - input: ['0', '0', '9'], - output: '3fa89944e11022fc67d12a9d2bf35ebe1164f7ef', - }, - { - description: 'Create an account with 0 wei and 4 FF as code', - input: ['d', '0', '0'], - memory: { - before: '0000000000000000000000000000000000000063ffffffff6000526004601cf3', - after: '0000000000000000000000000000000000000063ffffffff6000526004601cf3', - }, - output: '230fc3fe9249c6f698bfefea56debde9e1de2934', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z0q0f9q9f0y4%20FFmslk3%200x63FFFFFFFF6000526004601CF3jvMSTORE~13jjp%20%27~k%20z%2F%2F%20Createmnmccountgith%20ygeimnd%20v%5Cnqynoljj~pvCREATEm%20al%20codekvPUSH1j~0g%20wfpvvz%01fgjklmpqvyz~_&callValue=9' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL (since Byzantium fork)', - ], - notes: [ - 'Creates a new contract. Enters a new sub context of the calculated destination address and executes the provided initialisation code, then resumes the current context.', - "Should deployment succeed, the new account's code is set to the return data resulting from executing the initialisation code.", - 'The destination address is calculated as the rightmost 20 bytes (160 bits) of the Keccak-256 hash of the rlp encoding of the sender address followed by its nonce. That is: `address = keccak256(rlp([sender_address,sender_nonce]))[12:]`.', - 'Deployment can fail due to: insufficient value to send, sub context reverted, insufficient gas to execute the initialisation code or call depth limit reached.', - 'Note that these failures only affect the return value and do not cause the calling context to revert (unlike the error cases below).', - ], - references: [ - evmCodesOpcodesLink(0xf0), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 125), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/create2.ts b/src/chains/mainnet/vm/opcodes/system/create2.ts deleted file mode 100644 index 762124a5..00000000 --- a/src/chains/mainnet/vm/opcodes/system/create2.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const create2: Omit = { - number: 0xf5, - name: 'create2', - description: 'Create a new account with associated code at a predictable address', - minGas: 32000, - gasComputation: { - staticGasCost: { - expression: '32000', - }, - dynamicGasCost: { - expression: - '6 * minimum_word_size + memory_expansion_cost + deployment_code_execution_cost + code_deposit_cost', - description: - 'The difference with CREATE is an additional cost to hash the initialisation code before. The new contract address is added in the warm addresses.', - variables: [ - { - name: 'minimum_word_size', - description: 'The minimum size of the word to copy', - expression: '(size + 31) / 32', - }, - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'deployment_code_execution_cost', - description: 'The cost of whatever opcode is run to deploy the new contract', - }, - { - name: 'code_deposit_cost', - description: 'The cost for storing the code of the new contract', - expression: 'code_deposit_cost = 200 * deployed_code_size', - }, - ], - }, - }, - inputs: [ - { - name: 'value', - description: 'The value in wei to send to the new account', - }, - { - name: 'offset', - description: - 'The byte offset in the memory in bytes, the initialisation code for the new account', - }, - { - name: 'size', - description: 'The byte size to copy (size of the initialisation code)', - }, - { - name: 'salt', - description: 'The 32-byte value used to create the new account at a deterministic address', - }, - ], - outputs: [ - { - name: 'address', - description: 'The address of the deployed contract, 0 if the deployment failed', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27z0NLjannoXrecVQfparameters%2C%20becausliXgeneratesfaddressLz9N~1_~9Zyyz0v4%20FFYskW3%200x63FFFFFFFF60005260046000F3~0yMSTORE~2~13q%27~W%20zjVanYccounXQ%20y%5Cnv%20weiYnd%20q_Zle%20k%20codej%2F%2F%20Cf%20thlsaml_~0~0ZyCREATE2Y%20aXt%20WyPUSH1VreatlQwithNvnokL_qyy%01LNQVWXYZ_fjklqvyz~_?callValue=9' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL', - ], - notes: [ - 'Equivalent to CREATE, except the salt allows the new contract to be deployed at a consistent, deterministic address.', - "Should deployment succeed, the account's code is set to the return data resulting from executing the initialisation code.", - 'The destination address is calculated as follows: `address = keccak256(0xff + sender_address + salt + keccak256(initialisation_code))[12:]` where `initialisation_code = memory[offset:offset+size]`.', - 'Deployment can fail due to a contract already exists at the destination address, insufficient value to transfer, sub context reverted, insufficient gas to execute the initialisation code or all depth limit reached.', - 'Note that these failures only affect the return value and do not cause the calling context to revert (unlike the error cases below).', - ], - references: [ - evmCodesOpcodesLink(0xf5), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 180), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/delegatecall.ts b/src/chains/mainnet/vm/opcodes/system/delegatecall.ts deleted file mode 100644 index 6ee1aeb5..00000000 --- a/src/chains/mainnet/vm/opcodes/system/delegatecall.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const delegatecall: Omit = { - number: 0xf4, - name: 'delegatecall', - description: - 'Message-call into this account with an alternative account’s code, but persisting the current values for sender and value', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: 'memory_expansion_cost + code_execution_cost + address_access_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'code_execution_cost', - description: 'The cost of the called code execution (limited by the gas parameter)', - }, - { - name: 'address_access_cost', - description: '100 if the accessed address is warm, 2600 otherwise', - }, - ], - }, - }, - inputs: [ - { - name: 'gas', - description: - 'The amount of gas to send to the sub context to execute. The gas that is not used by the sub context is returned to this one.', - }, - { - name: 'address', - description: 'The account which code to execute', - }, - { - name: 'value', - description: 'The value in wei to send to the account', - }, - { - name: 'argsOffset', - description: 'The byte offset in the memory in bytes, the calldata of the sub context', - }, - { - name: 'argsSize', - description: 'The byte size to copy (size of the calldata)', - }, - { - name: 'retOffset', - description: - 'The byte offset in the memory in bytes, where to store the return data of the sub context', - }, - { - name: 'retSize', - description: 'The byte size to copy (size of the return data)', - }, - ], - outputs: [ - { - name: 'success', - description: 'Returns 0 if the sub context reverted, 1 otherwise', - }, - ], - // TODO: Add an example when one will be provided on https://www.evm.codes/#f4?fork=shanghai - playgroundLink: evmCodesPlaygroundLink( - '%27kCreatXa%20VqthaqcreateNaWexceptioWif%20Zofjisd_17dx67Y054Y757FE5BY052Y86018F3QMSTORE~17~15QCREATzm0bbbJ5vyykSeqZiWthXcurrenqVt~1QSSTORz%27%3Am1bb~32J6v%27~_1%20zEyykCall%20withjK0%20y%5Cnv_2dxFFFFyDELEGATECALLqt%20m%3Dd%2C%20returnNk%2F%2F%20j%20storagXd%200b~0_yPUSHZfirsqKY600Xe%20Wn%20VcontracQbyNs%20KsloqJQDUP%01JKNQVWXYZ_bdjkmqvyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Creates a new sub context as if calling itself, but with the code of the given account. In particular the storage, the current sender and the current value remain the same. Note that an account with no code will return success as true.', - 'If the size of the return data is not known, it can also be retrieved after the call with the instructions RETURNDATASIZE and RETURNDATACOPY (since the Byzantium fork).', - 'From the Tangerine Whistle fork, gas is capped at all but one 64th (remaining_gas / 64) of the remaining gas of the current context. If a call tries to send more, the gas is changed to match the maximum allowed.', - ], - references: [ - evmCodesOpcodesLink(0xf4), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 536), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Homestead), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/index.ts b/src/chains/mainnet/vm/opcodes/system/index.ts deleted file mode 100644 index 14d2901d..00000000 --- a/src/chains/mainnet/vm/opcodes/system/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Opcode } from '@/types'; -import { call } from './call'; -import { callcode } from './callcode'; -import { create } from './create'; -import { create2 } from './create2'; -import { delegatecall } from './delegatecall'; -import { invalid } from './invalid'; -import { _return } from './return'; -import { revert } from './revert'; -import { selfdestruct } from './selfdestruct'; -import { staticcall } from './staticcall'; - -export const opcodes: Record> = { - [call.number]: call, - [callcode.number]: callcode, - [create.number]: create, - [create2.number]: create2, - [delegatecall.number]: delegatecall, - [invalid.number]: invalid, - [_return.number]: _return, - [revert.number]: revert, - [selfdestruct.number]: selfdestruct, - [staticcall.number]: staticcall, -}; diff --git a/src/chains/mainnet/vm/opcodes/system/invalid.ts b/src/chains/mainnet/vm/opcodes/system/invalid.ts deleted file mode 100644 index 272c5fa4..00000000 --- a/src/chains/mainnet/vm/opcodes/system/invalid.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const invalid: Omit = { - number: 0xfe, - name: 'invalid', - description: 'Designated invalid instruction', - notes: [ - 'Equivalent to any other opcode not present in this reference, but guaranteed to remain an invalid instruction.', - 'Equivalent to REVERT (since Byzantium fork) with 0,0 as stack parameters, except that all the gas given to the current context is consumed.', - 'All the remaining gas in this context is consumed.', - ], - references: [evmCodesOpcodesLink(0xfe)], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/return.ts b/src/chains/mainnet/vm/opcodes/system/return.ts deleted file mode 100644 index 0e874c85..00000000 --- a/src/chains/mainnet/vm/opcodes/system/return.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -// Note: the opcode is named with an underscore to avoid the `return` keyword. -export const _return: Opcode = { - number: 0xf3, - name: 'return', - description: 'Halt execution returning output data', - minGas: 0, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: 'memory_expansion_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: - 'The byte offset in the memory in bytes, to copy what will be the return data of this context', - }, - { - name: 'size', - description: 'The byte size to copy (size of the return data)', - }, - ], - examples: [ - { - input: ['0', '2'], - memory: { - before: '0xFF01', - after: '0xFF01', - }, - returndata: '0xFF01', // calling context return data - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27wSet%20the%20statev32%200xFF01uuuuuz0yMSTOREyywExamplez2z0yRETURN%27~000000zv1%20y%5Cnw%2F%2F%20vyPUSHu~~%01uvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - references: [ - evmCodesOpcodesLink(0xf3), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 233), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Frontier), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/revert.ts b/src/chains/mainnet/vm/opcodes/system/revert.ts deleted file mode 100644 index 9e1e5628..00000000 --- a/src/chains/mainnet/vm/opcodes/system/revert.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const revert: Opcode = { - number: 0xfd, - name: 'revert', - description: 'Halt execution reverting state changes but returning data and remaining gas', - minGas: 0, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: 'memory_expansion_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - ], - }, - }, - inputs: [ - { - name: 'offset', - description: 'The byte offset in the memory in bytes. The return data of the calling context', - }, - { - name: 'size', - description: 'The byte size to copy (size of the return data)', - }, - ], - examples: [ - { - input: ['0', '2'], - memory: { - before: '0xFF01', - after: '0xFF01', - }, - returndata: '0xFF01', // calling context return data - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27wSet%20the%20statev32%200xFF01uuuuuz0yMSTOREyywExamplez2z0yREVERT%27~000000zv1%20y%5Cnw%2F%2F%20vyPUSHu~~%01uvwyz~_' - ), - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Stop the current context execution, revert the state changes (see STATICCALL for a list of state changing opcodes) and return the unused gas to the caller. It also reverts the gas refund to its value before the current context. If the execution is stopped with REVERT, the value 0 is put on the stack of the calling context, which continues to execute normally. The return data of the calling context is set as the given chunk of memory of this context.', - ], - references: [ - evmCodesOpcodesLink(0xfd), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 656), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Byzantium), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/selfdestruct.ts b/src/chains/mainnet/vm/opcodes/system/selfdestruct.ts deleted file mode 100644 index 6137f2d0..00000000 --- a/src/chains/mainnet/vm/opcodes/system/selfdestruct.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, -} from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const selfdestruct: Omit = { - number: 0xff, - name: 'selfdestruct', - description: 'Halt execution and register account for later deletion', - minGas: 5000, - gasComputation: { - staticGasCost: { - expression: '5000', - }, - dynamicGasCost: { - expression: 'positive_balance + cold_address', - variables: [ - { - name: 'positive_balance', - description: - 'If a positive balance is sent to an empty account, the dynamic gas is 25000. An account is empty if its balance is 0, its nonce is 0 and it has no code.', - }, - { - name: 'cold_address', - description: 'If `address` is cold, there is an additional dynamic cost of 2600', - }, - ], - }, - }, - inputs: [ - { - name: 'address', - description: - 'The account to send the current balance to (see BALANCE or SELFBALANCE since Istanbul fork)', - }, - ], - playgroundLink: evmCodesPlaygroundLink( - '%27ureatekcvhagwrites%20inkslotq14bx64p1p055p052p5601BF3jzMSTORE~14~18jzCREATEzzuvries%20to%20modify%20state%2C%20failsjjjjzDUP5q2bxFFFFzSTATICCALL%27~q1%20z%5Cnvontracgtu%2F%2F%20CqzPUSHp600k%20a%20j~0gt%20b%200%01bgjkpquvz~_' - ), - errorCases: [ - 'Not enough gas', - 'Not enough values on the stack', - 'The current execution context is from a STATICCALL (since Byzantium fork)', - ], - notes: [ - 'The current account is registered to be destroyed, and will be at the end of the current transaction. The transfer of the current balance to the given account cannot fail. In particular, the destination account code (if any) is not executed, or, if the account does not exist, the balance is still added to the given address.', - ], - references: [ - evmCodesOpcodesLink(0xff), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 481), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Constantinople), -}; diff --git a/src/chains/mainnet/vm/opcodes/system/staticcall.ts b/src/chains/mainnet/vm/opcodes/system/staticcall.ts deleted file mode 100644 index 65020c02..00000000 --- a/src/chains/mainnet/vm/opcodes/system/staticcall.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; -import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; - -export const staticcall: Omit = { - number: 0xfa, - name: 'staticcall', - description: 'Static message-call into an account', - minGas: 100, - gasComputation: { - staticGasCost: { - expression: '0', - }, - dynamicGasCost: { - expression: 'memory_expansion_cost + code_execution_cost + address_access_cost', - variables: [ - { - name: 'memory_expansion_cost', - description: - 'During a smart contract execution, memory can be accessed with opcodes. When an offset is first accessed (either read or write), memory may trigger an expansion, which costs gas. Memory expansion may be triggered when the byte offset (modulo 32) accessed is bigger than previous offsets. If a larger offset trigger of memory expansion occurs, the cost of accessing the higher offset is computed and removed from the total gas available at the current call context. Thus, only the additional bytes of memory must be paid for.', - expression: 'memory_expansion_cost = new_memory_cost - last_memory_cost', - variables: [ - { - name: 'memory_cost', - description: 'The memory cost function for a given machine state', - expression: '(memory_size_word ** 2) / 512 + (3 * memory_size_word)', - }, - { - name: 'memory_size_word', - description: - 'Number of (32-byte) words required for memory after the operation in question', - expression: '(memory_byte_size + 31) / 32', - }, - { - name: 'memory_byte_size', - description: - 'The highest referenced memory address after the operation in question (in bytes)', - }, - ], - }, - { - name: 'code_execution_cost', - description: 'The cost of the called code execution (limited by the gas parameter)', - }, - { - name: 'address_access_cost', - description: '100 if the accessed address is warm, 2600 otherwise', - }, - ], - }, - }, - inputs: [ - { - name: 'gas', - description: - 'The amount of gas to send to the sub context to execute. The gas that is not used by the sub context is returned to this one.', - }, - { - name: 'address', - description: 'The account which context to execute', - }, - { - name: 'argsOffset', - description: 'The byte offset in the memory in bytes, the calldata of the sub context', - }, - { - name: 'argsSize', - description: 'The byte size to copy (size of the calldata)', - }, - { - name: 'retOffset', - description: - 'The byte offset in the memory in bytes, where to store the return data of the sub context', - }, - { - name: 'retSize', - description: 'The byte size to copy (size of the return data)', - }, - ], - outputs: [ - { - name: 'success', - description: 'Returns 0 if the sub context reverted, 1 otherwise', - }, - ], - // TODO: Add an example and a playground link when one will be provided on https://www.evm.codes/#f1?fork=shanghai - errorCases: ['Not enough gas', 'Not enough values on the stack'], - notes: [ - 'Creates a new sub context and execute the code of the given account, then resumes the current one. Note that an account with no code will return success as true (1).', - 'This instructions is equivalent to CALL, except that it does not allow any state modifying instructions or sending ETH in the sub context. The disallowed instructions are CREATE, CREATE2, LOG0, LOG1, LOG2, LOG3, LOG4, SSTORE, SELFDESTRUCT and CALL if the value sent is not 0.', - 'If the size of the return data is not known, it can also be retrieved after the call with the instructions RETURNDATASIZE and RETURNDATACOPY (since the Byzantium fork).', - 'From the Tangerine Whistle fork, gas is capped at all but one 64th (remaining_gas / 64) of the remaining gas of the current context. If a call tries to send more, the gas is changed to match the maximum allowed.', - ], - references: [ - evmCodesOpcodesLink(0xfa), - ethSpecsOpcodeSrc(MainnetHardfork.Shanghai, OpcodeGroup.System, 594), - ], - supportedHardforks: getMainnetHardforksFrom(MainnetHardfork.Byzantium), -}; diff --git a/src/chains/mainnet/vm/precompiles.ts b/src/chains/mainnet/vm/precompiles.ts deleted file mode 100644 index 546cd4f3..00000000 --- a/src/chains/mainnet/vm/precompiles.ts +++ /dev/null @@ -1,440 +0,0 @@ -import { Precompile } from '@/types'; - -export const precompiles: Precompile[] = [ - { - address: '0x0000000000000000000000000000000000000001', - name: 'ecRecover', - description: 'Elliptic curve digital signature algorithm (ECDSA) public key recovery function', - minGas: 3000, - input: [ - { - byteStart: 0, - byteLength: 32, - name: 'hash', - description: 'The Keccak-256 hash of the signed message', - }, - { - byteStart: 32, - byteLength: 32, - name: 'v', - description: 'Recovery identifier, expected to be either 27 or 28', - }, - { - byteStart: 64, - byteLength: 32, - name: 'r', - description: 'x-coordinate, expected to be in the range (0, secp256k1.n)', - }, - { - byteStart: 96, - byteLength: 32, - name: 's', - description: 'Expected to be in the range (0, secp256k1.n)', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'publicAddress', - description: 'The recovered 20-byte address right aligned to 32 bytes', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/ecrecover.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/gas.py#L50', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L30', - ], - notes: [ - "If an address cannot be recovered or not enough gas was given, then there is no return data, indicating a precompile contract error. Note that the return data is the address that issued the signature but it won't verify the signature.", - ], - }, - { - address: '0x0000000000000000000000000000000000000002', - name: 'SHA2-256', - description: 'SHA2-256 hash function', - minGas: 60, - input: [ - { - byteStart: 0, - byteLength: -1, // -1 to indicate variable length. - name: 'data', - description: 'Data to be hashed with SHA2-256', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'hash', - description: 'The SHA-256 hash of the input data', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/sha256.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/gas.py#L51', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L31', - ], - notes: [ - 'If not enough gas was given, then there is no return data, indicating a precompile contract error.', - ], - }, - { - address: '0x0000000000000000000000000000000000000003', - name: 'RIPEMD-160', - description: 'RIPEMD-160 hash function', - minGas: 600, - input: [ - { - byteStart: 0, - byteLength: -1, // -1 to indicate variable length. - name: 'data', - description: 'Data to be hashed with RIPEMD-160', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'hash', - description: 'The resulting 20-byte hash right aligned to 32 bytes', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/ripemd160.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/gas.py#L53', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L32', - ], - notes: [ - 'If not enough gas was given, then there is no return data, indicating a precompile contract error.', - ], - }, - { - address: '0x0000000000000000000000000000000000000004', - name: 'identity', - description: 'Returns the input', - minGas: 15, - input: [ - { - byteStart: 0, - byteLength: -1, // -1 to indicate variable length. - name: 'data', - description: 'Data to return', - }, - ], - output: [ - { - byteStart: 0, - byteLength: -1, // -1 to indicate variable length. - name: 'data', - description: 'Data from input', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/identity.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/gas.py#L55', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L33', - ], - notes: [ - 'If not enough gas was given, then there is no return data, indicating a precompile contract error.', - 'The identity function is typically used to copy a chunk of memory.', - ], - }, - { - address: '0x0000000000000000000000000000000000000005', - name: 'modexp', - description: 'Arbitrary-precision exponentiation under modulo', - minGas: 200, - input: [ - { - byteStart: 0, - byteLength: 32, - name: 'Bsize', - description: 'Byte size of B', - }, - { - byteStart: 32, - byteLength: 32, - name: 'Esize', - description: 'Byte size of E', - }, - { - byteStart: 64, - byteLength: 32, - name: 'Msize', - description: 'Byte size of M', - }, - { - byteStart: 96, - byteLength: '96 + Bsize', - name: 'B', - description: 'Base as unsigned integer', - }, - { - byteStart: '96 + Bsize', - byteLength: 'Bsize + Esize', - name: 'E', - description: 'Exponent as unsigned integer, if zero, then B ** E will be one', - }, - { - byteStart: '96 + Bsize + Esize', - byteLength: 'Bsize + Esize + Msize', - name: 'M', - description: 'Modulo as unsigned integer, if zero, then returns zero', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 'Msize', - name: 'value', - description: 'Result of the computation, with the same number of bytes as M', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/modexp.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/modexp.py#L167', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L34', - ], - notes: [ - 'If not enough gas was given, then there is no return data, indicating a precompile contract error.', - ], - }, - { - address: '0x0000000000000000000000000000000000000006', - name: 'ecAdd', - description: "Point addition (ADD) on the elliptic curve 'alt_bn128'", - minGas: 150, - input: [ - { - byteStart: 0, - byteLength: 32, - name: 'x1', - description: "x-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 32, - byteLength: 32, - name: 'y1', - description: "y-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 64, - byteLength: 32, - name: 'x2', - description: "x-coordinate of the second point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 96, - byteLength: 32, - name: 'y2', - description: "y-coordinate of the second point on the elliptic curve 'alt_bn128'", - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'x', - description: "x-coordinate of the result point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 32, - byteLength: 32, - name: 'y', - description: "y-coordinate of the result point on the elliptic curve 'alt_bn128'", - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L33', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L45', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L35', - ], - notes: [ - 'If the input is not valid, all gas provided is consumed and there is no return data, indicating a precompile contract error.', - 'If not enough gas was given, there is no return data.', - 'The gas cost is fixed at 150. However, if the input does not allow to compute a valid result, all the gas sent is consumed.', - 'The point at infinity is encoded with both field x and y at 0.', - ], - }, - { - address: '0x0000000000000000000000000000000000000007', - name: 'ecMul', - description: "Scalar multiplication (MUL) on the elliptic curve 'alt_bn128'", - minGas: 6000, - input: [ - { - byteStart: 0, - byteLength: 32, - name: 'x1', - description: "x-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 32, - byteLength: 32, - name: 'y1', - description: "y-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 64, - byteLength: 32, - name: 's', - description: 'Scalar to use for the multiplication', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'x', - description: "x-coordinate of the result point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 32, - byteLength: 32, - name: 'y', - description: "y-coordinate of the result point on the elliptic curve 'alt_bn128'", - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L72', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L84', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L36', - ], - notes: [ - 'If the input is not valid, all gas provided is consumed and there is no return data, indicating a precompile contract error.', - 'If not enough gas was given, there is no return data.', - 'The gas cost is fixed at 6000. However, if the input does not allow to compute a valid result, all the gas sent is consumed.', - 'The point at infinity is encoded with both field x and y at 0.', - ], - }, - { - address: '0x0000000000000000000000000000000000000008', - name: 'ecPairing', - description: "Bilinear function on groups on the elliptic curve 'alt_bn128'", - minGas: 45000, - input: [ - { - byteStart: 0, - byteLength: 32, - name: 'x1', - description: "x-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 32, - byteLength: 32, - name: 'y1', - description: "y-coordinate of the first point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 64, - byteLength: 32, - name: 'x2', - description: "x-coordinate of the second point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 96, - byteLength: 32, - name: 'y2', - description: "y-coordinate of the second point on the elliptic curve 'alt_bn128'", - }, - { - byteStart: 192, - byteLength: 32, - name: 'xn', - description: - "x-coordinate of the n-th point on the elliptic curve 'alt_bn128', where n must be a multiple of 3", - }, - { - byteStart: 224, - byteLength: 32, - name: 'yn', - description: - "y-coordinate of the n-th point on the elliptic curve 'alt_bn128', where n must be a multiple of 3", - }, - ], - output: [ - { - byteStart: 0, - byteLength: 32, - name: 'success', - description: '1 if the pairing was a success, 0 otherwise', - }, - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L107', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/alt_bn128.py#L119', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L37', - ], - notes: [ - 'If the input is not valid, all gas provided is consumed and there is no return data, indicating a precompile contract error.', - 'If not enough gas was given, there is no return data.', - 'The input must always be a multiple of 6 32-byte values. 0 inputs is valid and returns 1.', - 'The point at infinity is encoded with both field x and y at 0.', - ], - }, - { - address: '0x0000000000000000000000000000000000000009', - name: 'blake2f', - description: 'Compression function F used in the BLAKE2 cryptographic hashing algorithm', - minGas: 0, - input: [ - { - byteStart: 0, - byteLength: 4, - name: 'rounds', - description: 'Number of rounds (big-endian unsigned integer)', - }, - { - byteStart: 4, - byteLength: 64, - name: 'h', - description: 'State vector (8 8-byte little-endian unsigned integer)', - }, - { - byteStart: 68, - byteLength: 128, - name: 'm', - description: 'Message block vector (16 8-byte little-endian unsigned integer)', - }, - { - byteStart: 196, - byteLength: 16, - name: 't', - description: 'Offset counters (2 8-byte little-endian integer)', - }, - { - byteStart: 212, - byteLength: 1, - name: 'f', - description: 'Final block indicator flag (0 or 1)', - }, - ], - output: [ - { - byteStart: 0, - byteLength: 64, - name: 'h', - description: 'State vector (8 8-byte little-endian unsigned integer)', - }, - ], - notes: [ - 'If the input is not valid or does not allow a valid result to be computed, all gas provided is consumed and there is no return data, indicating a precompile contract error.', - 'If not enough gas was given, there is no return data.', - ], - deprecated: false, - references: [ - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/blake2f.py', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/gas.py#L59', - 'https://github.com/ethereum/execution-specs/blob/6f8614566e7117afa327ad054c3f4bfe19694d73/src/ethereum/shanghai/vm/precompiled_contracts/__init__.py#L38', - ], - }, -]; diff --git a/src/chains/mainnet/vm/predeploys.ts b/src/chains/mainnet/vm/predeploys.ts deleted file mode 100644 index e003601e..00000000 --- a/src/chains/mainnet/vm/predeploys.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Predeploy } from '@/types'; - -export const predeploys: Predeploy[] = []; diff --git a/src/chains/optimism/accountTypes.ts b/src/chains/optimism/accountTypes.ts deleted file mode 100644 index e9bd46f9..00000000 --- a/src/chains/optimism/accountTypes.ts +++ /dev/null @@ -1 +0,0 @@ -export { accountTypes } from '@/chains/mainnet/accountTypes'; diff --git a/src/chains/optimism/deployedContracts.ts b/src/chains/optimism/deployedContracts.ts deleted file mode 100644 index 5d531f59..00000000 --- a/src/chains/optimism/deployedContracts.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { deployedContracts as mainnetDeployedContracts } from '@/chains/mainnet/deployedContracts'; - -const optimismDeployedContracts = { ...mainnetDeployedContracts }; -optimismDeployedContracts['Wrapped Native Token'] = { - ...optimismDeployedContracts['Wrapped Native Token'], - address: '0x4200000000000000000000000000000000000006', - references: [ - ...optimismDeployedContracts['Wrapped Native Token'].references, - '[Optimism Docs: What is ETH? WETH?](https://help.optimism.io/hc/en-us/articles/4417948883611-What-is-ETH-WETH-How-do-they-interact-)', - ], - logicAbi: [ - 'event Approval(address indexed src, address indexed guy, uint256 wad)', - 'event Deposit(address indexed dst, uint256 wad)', - 'event Transfer(address indexed src, address indexed dst, uint256 wad)', - 'event Withdrawal(address indexed src, uint256 wad)', - 'fallback()', - 'function allowance(address, address) view returns (uint256)', - 'function approve(address guy, uint256 wad) returns (bool)', - 'function balanceOf(address) view returns (uint256)', - 'function decimals() view returns (uint8)', - 'function deposit() payable', - 'function name() view returns (string)', - 'function symbol() view returns (string)', - 'function totalSupply() view returns (uint256)', - 'function transfer(address dst, uint256 wad) returns (bool)', - 'function transferFrom(address src, address dst, uint256 wad) returns (bool)', - 'function withdraw(uint256 wad)', - ], -}; - -export const deployedContracts = optimismDeployedContracts; diff --git a/src/chains/optimism/eips.ts b/src/chains/optimism/eips.ts deleted file mode 100644 index c0ebdb53..00000000 --- a/src/chains/optimism/eips.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { EIP, EIPCategory } from '@/types/eip'; -import { - eip4399 as eip1399OnMainnet, - eip1559 as eip1559OnMainnet, - eip4895 as eip4895OnMainnet, - eips as ethereumEIPs, -} from '../mainnet/eips'; -import { OptimismHardfork, getOptimismHardforksFrom } from './hardforks'; - -const hardforksFromCanyon: string[] = getOptimismHardforksFrom(OptimismHardfork.Canyon); -const eip1559OnOptimism: EIP = { - ...eip1559OnMainnet, - activeHardforks: hardforksFromCanyon, - parameters: [ - { - name: 'INITIAL_BASE_FEE', - value: 1000000000, - }, - { - name: 'BASE_FEE_MAX_CHANGE_DENOMINATOR', - value: 250, - }, - { - name: 'ELASTICITY_MULTIPLIER', - value: 6, - }, - ], - notes: [ - 'The denominator and elasticity multiplier values of the EIP-1599 formula are modified from their mainnet values.', - ], - references: [ - ...eip1559OnMainnet.references, - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/exec-engine.md#1559-parameters', - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md#canyon', - ], -}; - -const eip4399OnOptimism: EIP = { - ...eip1399OnMainnet, - notes: [ - "PREVRANDAO returns the random output of the L1 beacon chain's randomness oracle. This value lags behind the L1 block's prevrandao value by approximately 5 L1 blocks, and is updated when the `L1BlockInfo` predeploy is updated.", - ], - references: [ - ...eip1399OnMainnet.references, - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md#building-individual-payload-attributes', - 'https://github.com/mds1/evm-diff/issues/21', - ], -}; - -const eip4895OnOptimism: EIP = { - ...eip4895OnMainnet, - notes: [ - 'Optimism has an empty withdrawals list in L2 blocks to be compatible with L1, but since there are no validators the list is always empty.', - ], - references: [ - ...eip4895OnMainnet.references, - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md#building-individual-payload-attributes', - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md#canyon', - ], -}; - -export const eips: EIP[] = ethereumEIPs - .filter((eip) => { - // Exclude consensus-related EIPs. - return eip.category !== EIPCategory.Consensus; - }) - .map((eip) => { - // EIPs modified by Optimism hard forks. - if (eip.number === 1559) return eip1559OnOptimism; - if (eip.number === 4399) return eip4399OnOptimism; - if (eip.number === 4895) return eip4895OnOptimism; - return eip; - }); diff --git a/src/chains/optimism/hardforks.ts b/src/chains/optimism/hardforks.ts deleted file mode 100644 index 7f716eb6..00000000 --- a/src/chains/optimism/hardforks.ts +++ /dev/null @@ -1,33 +0,0 @@ -// List of Optimism's past Bedrock hard forks. -// https://docs.optimism.io/builders/node-operators/network-upgrades/overview#activations -// https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/superchain-upgrades.md#post-bedrock-network-upgrades -export enum OptimismHardfork { - Regolith, - Canyon, -} - -export const CURRENT_OPTIMISM_HARDFORK = OptimismHardfork.Canyon; - -// Retrieve all the hard forks from the starting hard fork to the current mainnet hard fork. -export const getOptimismHardforksFrom = (startingHardfork: OptimismHardfork): string[] => - getOptimismHardforksFromTo(startingHardfork, CURRENT_OPTIMISM_HARDFORK); - -// Retrieve an array of hardforks from a starting hardfork to an ending hardfork (inclusive). -export const getOptimismHardforksFromTo = ( - start: OptimismHardfork, - end: OptimismHardfork -): string[] => { - if (start > end) { - throw new Error( - `Error: the starting hard fork ${OptimismHardfork[start]} (index: ${start}) occurred after the ending hard fork ${OptimismHardfork[end]} (index: ${end}). Arguments are wrong or must have been reversed.` - ); - } - - // Create an array made of all the enum key indexes following by all the stringified keys. - // For example, if you had an enum with two keys A and B, you would get ['0', '1', 'A', 'B']. - // Then, we only keep the slice with the values (e.g. ['A', 'B']). - const array = Object.keys(OptimismHardfork); - const length = array.length / 2; - const keys = array.slice(length); - return keys.slice(start, end + 1); -}; diff --git a/src/chains/optimism/index.ts b/src/chains/optimism/index.ts deleted file mode 100644 index 3bb0896a..00000000 --- a/src/chains/optimism/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { optimism as optimismMetadata } from '@wagmi/chains'; -import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; -import { accountTypes } from './accountTypes'; -import { deployedContracts } from './deployedContracts'; -import { eips } from './eips'; -import { consensusNodes, executionNodes } from './nodes'; -import { signatureTypes } from './signatureTypes'; -import { opcodes } from './vm/opcodes'; -import { precompiles } from './vm/precompiles'; -import { predeploys } from './vm/predeploys'; - -export const optimism: Chain = { - metadata: optimismMetadata, - precompiles, - predeploys, - signatureTypes: sortedArrayByField(signatureTypes, 'prefixByte'), - accountTypes: sortedArrayByField(accountTypes, 'name'), - opcodes: sortedArrayByField(opcodes, 'number'), - mempools: [], - deployedContracts: sortedArrayByFields(deployedContracts, ['kind', 'name']), - eips, - executionNodes, - consensusNodes, -}; diff --git a/src/chains/optimism/nodes.ts b/src/chains/optimism/nodes.ts deleted file mode 100644 index ed97c7ca..00000000 --- a/src/chains/optimism/nodes.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Language, Node, NodeType } from '@/types'; -import { nethermind, reth } from '../mainnet/nodes/execution'; - -// Execution nodes. -const opGeth: Node = { - name: 'op-geth', - description: - 'Official Golang execution layer implementation of the Ethereum protocol. It implements the Execution-Layer, with minimal changes for a secure Ethereum-equivalent application environment.', - type: NodeType.Execution, - language: Language.Go, - forkOf: 'geth', - repository: 'https://github.com/ethereum-optimism/op-geth', - documentation: 'https://op-geth.optimism.io/', -}; - -const opErigon: Node = { - name: 'op-erigon', - description: 'Optimism implementation on the efficiency frontier', - type: NodeType.Execution, - language: Language.Go, - forkOf: 'erigon', - repository: 'https://github.com/testinprod-io/op-erigon', - documentation: 'https://op-erigon.testinprod.io/', -}; - -export const executionNodes: Node[] = [opGeth, opErigon, reth, nethermind]; -export const consensusNodes: Node[] = []; diff --git a/src/chains/optimism/signatureTypes.ts b/src/chains/optimism/signatureTypes.ts deleted file mode 100644 index dccf4dd3..00000000 --- a/src/chains/optimism/signatureTypes.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import { SignatureType } from '@/types'; - -const depositTx: SignatureType = { - prefixByte: 0x7e, - description: 'An L2 transaction that was derived from L1 and included in a L2 block', - signedData: [ - '`keccak256(0x7E || rlp([sourceHash, from, to, mint, value, gas, isSystemTx, data]))`', - ], - signs: 'transaction', - references: [ - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/deposits.md#the-deposited-transaction-type', - 'https://github.com/ethereum-optimism/specs/blob/main/specs/glossary.md#deposited-transaction', - ], - notes: [ - `There are two kinds of deposited transactions: -- [L1 attributes deposited transaction][l1-attr-deposit], which submits the L1 block's attributes to the [L1 Attributes Predeployed Contract][l1-attr-predeploy]. -- [User-deposited transactions][user-deposited], which are transactions derived from an L1 call to the [deposit contract][deposit-contract].`, - ], -}; - -export const signatureTypes = { - ...mainnetSignatureTypes, - ...{ [depositTx.prefixByte]: depositTx }, -}; diff --git a/src/chains/optimism/vm/opcodes/block/coinbase.ts b/src/chains/optimism/vm/opcodes/block/coinbase.ts deleted file mode 100644 index f1691829..00000000 --- a/src/chains/optimism/vm/opcodes/block/coinbase.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { coinbase as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/coinbase'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const coinbase: Omit = { - ...opcode, - description: - 'Returns `0x4200000000000000000000000000000000000011`, the address of the Sequencer Fee Vault.', - outputs: [ - { - name: 'address', - description: 'The address of the Sequencer Fee Vault.', - }, - ], - examples: [ - { - output: '0x4200000000000000000000000000000000000011', - }, - ], - references: [ - '[Differences between Ethereum and OP Mainnet: Opcode Differences](https://community.optimism.io/docs/developers/build/differences/#opcode-differences)', - ], -}; diff --git a/src/chains/optimism/vm/opcodes/block/prevrandao.ts b/src/chains/optimism/vm/opcodes/block/prevrandao.ts deleted file mode 100644 index a3db3de6..00000000 --- a/src/chains/optimism/vm/opcodes/block/prevrandao.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { prevrandao as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/prevrandao'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, notes: _notes, ...opcode } = baseOpcode; -export const prevrandao: Omit = { - ...opcode, - outputs: [ - { - name: 'random', - description: - "The random output of the L1 beacon chain's oracle from approximately 5 L1 blocks ago.", - }, - ], - description: - "Returns the random output of the L1 beacon chain's randomness oracle. This value lags behind the L1 block's prevrandao value by approximately 5 L1 blocks, and is updated when the `L1BlockInfo` predeploy is updated.", - references: [ - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/derivation.md#building-individual-payload-attributes', - 'https://github.com/mds1/evm-diff/issues/21', - ], -}; diff --git a/src/chains/optimism/vm/opcodes/environment/caller.ts b/src/chains/optimism/vm/opcodes/environment/caller.ts deleted file mode 100644 index e2cf96b3..00000000 --- a/src/chains/optimism/vm/opcodes/environment/caller.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { caller as baseOpcode } from '@/chains/mainnet/vm/opcodes/environment/caller'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const caller: Omit = { - ...opcode, - description: - 'If the transaction is an L1 ⇒ L2 transaction, and this is the initial call (rather than an internal transaction from one contract to another), then `msg.sender` is set to the aliased address of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally.', - outputs: [ - { - name: 'address', - description: - "The 20-byte address of the caller's account, or the aliased address for L1 ⇒ L2 transactions. This is the account that did the last call (except delegate call).", - }, - ], - references: [ - '[Opcode Differences between Ethereum and OP Mainnet]([Differences between Ethereum and OP Mainnet: Opcode Differences](https://community.optimism.io/docs/developers/build/differences/#opcode-differences))', - '[Differences between Ethereum and OP Mainnet: Address Aliasing](https://community.optimism.io/docs/developers/build/differences/#address-aliasing)', - ], -}; diff --git a/src/chains/optimism/vm/opcodes/environment/origin.ts b/src/chains/optimism/vm/opcodes/environment/origin.ts deleted file mode 100644 index d719c3ba..00000000 --- a/src/chains/optimism/vm/opcodes/environment/origin.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { origin as baseOpcode } from '@/chains/mainnet/vm/opcodes/environment/origin'; -import { Opcode } from '@/types'; - -const { supportedHardforks: _supportedHardforks, ...opcode } = baseOpcode; -export const origin: Omit = { - ...opcode, - description: - 'If the transaction is an L1 ⇒ L2 transaction, then `tx.origin` is set to the aliased address of the address that triggered the L1 ⇒ L2 transaction. Otherwise, this opcode behaves normally.', - outputs: [ - { - name: 'address', - description: - 'The 20-byte address of the sender of the transaction, or the aliased address for L1 ⇒ L2 transactions. It can only be an account without code.', - }, - ], - references: [ - '[Differences between Ethereum and OP Mainnet: Opcode Differences](https://community.optimism.io/docs/developers/build/differences/#opcode-differences)', - '[Differences between Ethereum and OP Mainnet: Address Aliasing](https://community.optimism.io/docs/developers/build/differences/#address-aliasing)', - ], -}; diff --git a/src/chains/optimism/vm/opcodes/index.ts b/src/chains/optimism/vm/opcodes/index.ts deleted file mode 100644 index 1afc1342..00000000 --- a/src/chains/optimism/vm/opcodes/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { opcodes as mainnetOpcodes } from '@/chains/mainnet/vm/opcodes'; -import { Opcode } from '@/types'; -import { coinbase } from './block/coinbase'; -import { prevrandao } from './block/prevrandao'; -import { caller } from './environment/caller'; -import { origin } from './environment/origin'; -import { push0 } from './stack/push0'; - -export const opcodes: Record> = { - ...mainnetOpcodes, - - // Block. - ...{ [coinbase.number]: coinbase }, - ...{ [prevrandao.number]: prevrandao }, - - // Environment. - ...{ [caller.number]: caller }, - ...{ [origin.number]: origin }, - - // Stack. - ...{ [push0.number]: push0 }, -}; diff --git a/src/chains/optimism/vm/opcodes/stack/push0.ts b/src/chains/optimism/vm/opcodes/stack/push0.ts deleted file mode 100644 index b31ea669..00000000 --- a/src/chains/optimism/vm/opcodes/stack/push0.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { push0 as baseOpcode } from '@/chains/mainnet/vm/opcodes/stack/push'; -import { Opcode } from '@/types'; - -export const push0: Opcode = { - ...baseOpcode, - supportedHardforks: ['Canyon'], -}; diff --git a/src/chains/optimism/vm/precompiles.ts b/src/chains/optimism/vm/precompiles.ts deleted file mode 100644 index e998fa4f..00000000 --- a/src/chains/optimism/vm/precompiles.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import { Precompile } from '@/types'; - -export const precompiles: Precompile[] = mainnetPrecompiles; diff --git a/src/chains/optimism/vm/predeploys.ts b/src/chains/optimism/vm/predeploys.ts deleted file mode 100644 index d5711649..00000000 --- a/src/chains/optimism/vm/predeploys.ts +++ /dev/null @@ -1,604 +0,0 @@ -import { Predeploy } from '@/types'; - -const PREDEPLOYS_SPEC = - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/predeploys.md'; - -export const predeploys: Predeploy[] = [ - { - address: '0x4200000000000000000000000000000000000000', - name: '`LegacyMessagePasser`', - description: 'Stores commitments to withdrawal transactions before the Bedrock upgrade.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'function passMessageToL1(bytes _message)', - 'function sentMessages(bytes32) view returns (bool)', - 'function version() view returns (string)', - ], - logicAddress: '0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000', - deprecated: true, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000002', - name: '`DeployerWhitelist`', - description: - 'Defined a list of accounts that were allowed to deploy contracts during the initial phases of Optimism.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'event OwnerChanged(address oldOwner, address newOwner)', - 'event WhitelistDisabled(address oldOwner)', - 'event WhitelistStatusChanged(address deployer, bool whitelisted)', - 'function enableArbitraryContractDeployment()', - 'function isDeployerAllowed(address _deployer) view returns (bool)', - 'function owner() view returns (address)', - 'function setOwner(address _owner)', - 'function setWhitelistedDeployer(address _deployer, bool _isWhitelisted)', - 'function version() view returns (string)', - 'function whitelist(address) view returns (bool)', - ], - logicAddress: '0xc0d3c0d3C0d3c0D3c0d3C0D3c0d3C0d3c0D30002', - deprecated: true, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000', - name: '`LegacyERC20ETH`', - description: 'Represents all Ether in the system before Bedrock.', - logicAbi: [ - 'constructor()', - 'event Approval(address indexed owner, address indexed spender, uint256 value)', - 'event Burn(address indexed account, uint256 amount)', - 'event Mint(address indexed account, uint256 amount)', - 'event Transfer(address indexed from, address indexed to, uint256 value)', - 'function BRIDGE() view returns (address)', - 'function REMOTE_TOKEN() view returns (address)', - 'function allowance(address owner, address spender) view returns (uint256)', - 'function approve(address, uint256) returns (bool)', - 'function balanceOf(address _who) view returns (uint256)', - 'function bridge() view returns (address)', - 'function burn(address, uint256)', - 'function decimals() view returns (uint8)', - 'function decreaseAllowance(address, uint256) returns (bool)', - 'function increaseAllowance(address, uint256) returns (bool)', - 'function l1Token() view returns (address)', - 'function l2Bridge() view returns (address)', - 'function mint(address, uint256)', - 'function name() view returns (string)', - 'function remoteToken() view returns (address)', - 'function supportsInterface(bytes4 _interfaceId) pure returns (bool)', - 'function symbol() view returns (string)', - 'function totalSupply() view returns (uint256)', - 'function transfer(address, uint256) returns (bool)', - 'function transferFrom(address, address, uint256) returns (bool)', - ], - deprecated: true, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000006', - name: '`WETH9`', - description: "Wrapped Ether contract, behaves identically to mainnet's canonical WETH.", - logicAbi: [ - 'event Approval(address indexed src, address indexed guy, uint256 wad)', - 'event Deposit(address indexed dst, uint256 wad)', - 'event Transfer(address indexed src, address indexed dst, uint256 wad)', - 'event Withdrawal(address indexed src, uint256 wad)', - 'fallback()', - 'function allowance(address, address) view returns (uint256)', - 'function approve(address guy, uint256 wad) returns (bool)', - 'function balanceOf(address) view returns (uint256)', - 'function decimals() view returns (uint8)', - 'function deposit() payable', - 'function name() view returns (string)', - 'function symbol() view returns (string)', - 'function totalSupply() view returns (uint256)', - 'function transfer(address dst, uint256 wad) returns (bool)', - 'function transferFrom(address src, address dst, uint256 wad) returns (bool)', - 'function withdraw(uint256 wad)', - ], - deprecated: false, - references: [ - PREDEPLOYS_SPEC, - '[What is ETH? WETH? How do they interact?](https://help.optimism.io/hc/en-us/articles/4417948883611-What-is-ETH-WETH-How-do-they-interact-)', - ], - }, - { - address: '0x4200000000000000000000000000000000000007', - name: '`L2CrossDomainMessenger`', - description: - 'Provides a higher level API for sending cross-domain messages, compared to directly calling L2ToL1MessagePasser.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _l1CrossDomainMessenger)', - 'event FailedRelayedMessage(bytes32 indexed msgHash)', - 'event Initialized(uint8 version)', - 'event RelayedMessage(bytes32 indexed msgHash)', - 'event SentMessage(address indexed target, address sender, bytes message, uint256 messageNonce, uint256 gasLimit)', - 'event SentMessageExtension1(address indexed sender, uint256 value)', - 'function MESSAGE_VERSION() view returns (uint16)', - 'function MIN_GAS_CALLDATA_OVERHEAD() view returns (uint64)', - 'function MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR() view returns (uint64)', - 'function MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR() view returns (uint64)', - 'function OTHER_MESSENGER() view returns (address)', - 'function RELAY_CALL_OVERHEAD() view returns (uint64)', - 'function RELAY_CONSTANT_OVERHEAD() view returns (uint64)', - 'function RELAY_GAS_CHECK_BUFFER() view returns (uint64)', - 'function RELAY_RESERVED_GAS() view returns (uint64)', - 'function baseGas(bytes _message, uint32 _minGasLimit) pure returns (uint64)', - 'function failedMessages(bytes32) view returns (bool)', - 'function initialize()', - 'function l1CrossDomainMessenger() view returns (address)', - 'function messageNonce() view returns (uint256)', - 'function relayMessage(uint256 _nonce, address _sender, address _target, uint256 _value, uint256 _minGasLimit, bytes _message) payable', - 'function sendMessage(address _target, bytes _message, uint32 _minGasLimit) payable', - 'function successfulMessages(bytes32) view returns (bool)', - 'function version() view returns (string)', - 'function xDomainMessageSender() view returns (address)', - ], - logicAddress: '0xC0d3c0d3c0D3c0D3C0d3C0D3C0D3c0d3c0d30007', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000010', - name: '`L2StandardBridge`', - description: - 'Higher level API built on top of the L2CrossDomainMessenger that gives a standard interface for sending ETH or ERC20 tokens across domains.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _otherBridge)', - 'event DepositFinalized(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)', - 'event ERC20BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)', - 'event ERC20BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 amount, bytes extraData)', - 'event ETHBridgeFinalized(address indexed from, address indexed to, uint256 amount, bytes extraData)', - 'event ETHBridgeInitiated(address indexed from, address indexed to, uint256 amount, bytes extraData)', - 'event WithdrawalInitiated(address indexed l1Token, address indexed l2Token, address indexed from, address to, uint256 amount, bytes extraData)', - 'function MESSENGER() view returns (address)', - 'function OTHER_BRIDGE() view returns (address)', - 'function bridgeERC20(address _localToken, address _remoteToken, uint256 _amount, uint32 _minGasLimit, bytes _extraData)', - 'function bridgeERC20To(address _localToken, address _remoteToken, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData)', - 'function bridgeETH(uint32 _minGasLimit, bytes _extraData) payable', - 'function bridgeETHTo(address _to, uint32 _minGasLimit, bytes _extraData) payable', - 'function deposits(address, address) view returns (uint256)', - 'function finalizeBridgeERC20(address _localToken, address _remoteToken, address _from, address _to, uint256 _amount, bytes _extraData)', - 'function finalizeBridgeETH(address _from, address _to, uint256 _amount, bytes _extraData) payable', - 'function finalizeDeposit(address _l1Token, address _l2Token, address _from, address _to, uint256 _amount, bytes _extraData) payable', - 'function l1TokenBridge() view returns (address)', - 'function messenger() view returns (address)', - 'function version() view returns (string)', - 'function withdraw(address _l2Token, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable', - 'function withdrawTo(address _l2Token, address _to, uint256 _amount, uint32 _minGasLimit, bytes _extraData) payable', - 'receive() external payable', - ], - logicAddress: '0xC0d3c0d3c0D3c0d3C0D3c0D3C0d3C0D3C0D30010', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000011', - name: '`SequencerFeeVault`', - description: - 'Accumulates any transaction priority fees and is the value of block.coinbase. When enough fees accumulate in this account, they can be withdrawn to an immutable L1 address.', - logicAbi: [ - 'constructor(address _l1FeeWallet)', - 'function MIN_WITHDRAWAL_AMOUNT() view returns (uint256)', - 'function l1FeeWallet() view returns (address)', - 'function withdraw()', - 'receive() external payable', - ], - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000012', - name: '`OptimismMintableERC20Factory`', - description: - 'Responsible for creating ERC20 contracts on L2 that can be used for depositing native L1 tokens into.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _bridge)', - 'event OptimismMintableERC20Created(address indexed localToken, address indexed remoteToken, address deployer)', - 'event StandardL2TokenCreated(address indexed remoteToken, address indexed localToken)', - 'function BRIDGE() view returns (address)', - 'function createOptimismMintableERC20(address _remoteToken, string _name, string _symbol) returns (address)', - 'function createStandardL2Token(address _remoteToken, string _name, string _symbol) returns (address)', - 'function version() view returns (string)', - ], - logicAddress: '0xc0D3c0d3C0d3c0d3c0D3c0d3c0D3c0D3c0D30012', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000013', - name: '`L1BlockNumber`', - description: 'Returns the last known L1 block number.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'fallback()', - 'function getL1BlockNumber() view returns (uint256)', - 'function version() view returns (string)', - 'receive() external payable', - ], - logicAddress: '0xC0D3C0d3C0D3c0D3C0d3c0D3C0d3c0d3C0d30013', - deprecated: true, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x420000000000000000000000000000000000000F', - name: '`GasPriceOracle`', - description: 'Provides an API to return the L1 portion of the fee for a transaction.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'function DECIMALS() view returns (uint256)', - 'function baseFee() view returns (uint256)', - 'function decimals() pure returns (uint256)', - 'function gasPrice() view returns (uint256)', - 'function getL1Fee(bytes _data) view returns (uint256)', - 'function getL1GasUsed(bytes _data) view returns (uint256)', - 'function l1BaseFee() view returns (uint256)', - 'function overhead() view returns (uint256)', - 'function scalar() view returns (uint256)', - 'function version() view returns (string)', - ], - logicAddress: '0xc0d3C0d3C0d3c0D3C0D3C0d3C0d3C0D3C0D3000f', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000042', - name: '`GovernanceToken`', - description: 'The Optimism (OP) token contract.', - logicAbi: [ - 'constructor()', - 'event Approval(address indexed owner, address indexed spender, uint256 value)', - 'event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)', - 'event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance)', - 'event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)', - 'event Transfer(address indexed from, address indexed to, uint256 value)', - 'function DOMAIN_SEPARATOR() view returns (bytes32)', - 'function allowance(address owner, address spender) view returns (uint256)', - 'function approve(address spender, uint256 amount) returns (bool)', - 'function balanceOf(address account) view returns (uint256)', - 'function burn(uint256 amount)', - 'function burnFrom(address account, uint256 amount)', - 'function checkpoints(address account, uint32 pos) view returns ((uint32 fromBlock, uint224 votes))', - 'function decimals() view returns (uint8)', - 'function decreaseAllowance(address spender, uint256 subtractedValue) returns (bool)', - 'function delegate(address delegatee)', - 'function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s)', - 'function delegates(address account) view returns (address)', - 'function getPastTotalSupply(uint256 blockNumber) view returns (uint256)', - 'function getPastVotes(address account, uint256 blockNumber) view returns (uint256)', - 'function getVotes(address account) view returns (uint256)', - 'function increaseAllowance(address spender, uint256 addedValue) returns (bool)', - 'function mint(address _account, uint256 _amount)', - 'function name() view returns (string)', - 'function nonces(address owner) view returns (uint256)', - 'function numCheckpoints(address account) view returns (uint32)', - 'function owner() view returns (address)', - 'function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)', - 'function renounceOwnership()', - 'function symbol() view returns (string)', - 'function totalSupply() view returns (uint256)', - 'function transfer(address to, uint256 amount) returns (bool)', - 'function transferFrom(address from, address to, uint256 amount) returns (bool)', - 'function transferOwnership(address newOwner)', - ], - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000015', - name: '`L1Block`', - description: 'Allows for L1 state to be accessed in L2.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'function DEPOSITOR_ACCOUNT() view returns (address)', - 'function basefee() view returns (uint256)', - 'function batcherHash() view returns (bytes32)', - 'function hash() view returns (bytes32)', - 'function l1FeeOverhead() view returns (uint256)', - 'function l1FeeScalar() view returns (uint256)', - 'function number() view returns (uint64)', - 'function sequenceNumber() view returns (uint64)', - 'function setL1BlockValues(uint64 _number, uint64 _timestamp, uint256 _basefee, bytes32 _hash, uint64 _sequenceNumber, bytes32 _batcherHash, uint256 _l1FeeOverhead, uint256 _l1FeeScalar)', - 'function timestamp() view returns (uint64)', - 'function version() view returns (string)', - ], - logicAddress: '0xc0d3C0D3C0D3c0D3C0D3C0d3C0D3c0D3c0d30015', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000016', - name: '`L2ToL1MessagePasser`', - description: 'Stores commitments to withdrawal transactions.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor()', - 'event MessagePassed(uint256 indexed nonce, address indexed sender, address indexed target, uint256 value, uint256 gasLimit, bytes data, bytes32 withdrawalHash)', - 'event WithdrawerBalanceBurnt(uint256 indexed amount)', - 'function MESSAGE_VERSION() view returns (uint16)', - 'function burn()', - 'function initiateWithdrawal(address _target, uint256 _gasLimit, bytes _data) payable', - 'function messageNonce() view returns (uint256)', - 'function sentMessages(bytes32) view returns (bool)', - 'function version() view returns (string)', - 'receive() external payable', - ], - logicAddress: '0xC0D3C0d3C0d3c0d3C0d3C0D3c0D3c0d3c0D30016', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000014', - name: '`L2ERC721Bridge`', - description: - 'Works together with the L1 ERC721 bridge to enable transfers of ERC721 tokens from Ethereum to Optimism.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _messenger, address _otherBridge)', - 'event ERC721BridgeFinalized(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)', - 'event ERC721BridgeInitiated(address indexed localToken, address indexed remoteToken, address indexed from, address to, uint256 tokenId, bytes extraData)', - 'function MESSENGER() view returns (address)', - 'function OTHER_BRIDGE() view returns (address)', - 'function bridgeERC721(address _localToken, address _remoteToken, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData)', - 'function bridgeERC721To(address _localToken, address _remoteToken, address _to, uint256 _tokenId, uint32 _minGasLimit, bytes _extraData)', - 'function finalizeBridgeERC721(address _localToken, address _remoteToken, address _from, address _to, uint256 _tokenId, bytes _extraData)', - 'function messenger() view returns (address)', - 'function otherBridge() view returns (address)', - 'function version() view returns (string)', - ], - logicAddress: '0xC0D3c0d3c0d3c0d3c0D3C0d3C0D3C0D3c0d30014', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000017', - name: '`OptimismMintableERC721Factory`', - description: - 'Responsible for creating ERC721 contracts on L2 that can be used for depositing native L1 NFTs into.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _bridge, uint256 _remoteChainId)', - 'event OptimismMintableERC721Created(address indexed localToken, address indexed remoteToken, address deployer)', - 'function BRIDGE() view returns (address)', - 'function REMOTE_CHAIN_ID() view returns (uint256)', - 'function createOptimismMintableERC721(address _remoteToken, string _name, string _symbol) returns (address)', - 'function isOptimismMintableERC721(address) view returns (bool)', - 'function version() view returns (string)', - ], - logicAddress: '0xc0d3C0d3C0d3C0d3C0d3c0d3C0D3C0d3C0D30017', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000018', - name: '`ProxyAdmin`', - description: 'The owner of all of the proxy contracts set at the predeploys.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _owner)', - 'event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)', - 'function addressManager() view returns (address)', - 'function changeProxyAdmin(address _proxy, address _newAdmin)', - 'function getProxyAdmin(address _proxy) view returns (address)', - 'function getProxyImplementation(address _proxy) view returns (address)', - 'function implementationName(address) view returns (string)', - 'function isUpgrading() view returns (bool)', - 'function owner() view returns (address)', - 'function proxyType(address) view returns (uint8)', - 'function renounceOwnership()', - 'function setAddress(string _name, address _address)', - 'function setAddressManager(address _address)', - 'function setImplementationName(address _address, string _name)', - 'function setProxyType(address _address, uint8 _type)', - 'function setUpgrading(bool _upgrading)', - 'function transferOwnership(address newOwner)', - 'function upgrade(address _proxy, address _implementation)', - 'function upgradeAndCall(address _proxy, address _implementation, bytes _data) payable', - ], - logicAddress: '0xC0d3C0D3c0d3C0d3c0d3c0D3C0D3C0d3C0D30018', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x4200000000000000000000000000000000000019', - name: 'BaseFeeVault', - description: - 'Receives the base fees on L2, since the basefee is not burnt on L2 like it is on L1.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _recipient)', - 'event Withdrawal(uint256 value, address to, address from)', - 'function MIN_WITHDRAWAL_AMOUNT() view returns (uint256)', - 'function RECIPIENT() view returns (address)', - 'function totalProcessed() view returns (uint256)', - 'function version() view returns (string)', - 'function withdraw()', - 'receive() external payable', - ], - logicAddress: '0xC0d3c0D3c0d3C0D3C0D3C0d3c0D3C0D3c0d30019', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, - { - address: '0x420000000000000000000000000000000000001a', - name: 'L1FeeVault', - description: - 'Receives the L1 portion of the transaction fees. Once the contract has received a certain amount of fees, the ETH can be withdrawn to an immutable address on L1.', - proxyAbi: [ - 'constructor(address _admin)', - 'event AdminChanged(address previousAdmin, address newAdmin)', - 'event Upgraded(address indexed implementation)', - 'fallback()', - 'function admin() returns (address)', - 'function changeAdmin(address _admin)', - 'function implementation() returns (address)', - 'function upgradeTo(address _implementation)', - 'function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)', - 'receive() external payable', - ], - logicAbi: [ - 'constructor(address _recipient)', - 'event Withdrawal(uint256 value, address to, address from)', - 'function MIN_WITHDRAWAL_AMOUNT() view returns (uint256)', - 'function RECIPIENT() view returns (address)', - 'function totalProcessed() view returns (uint256)', - 'function version() view returns (string)', - 'function withdraw()', - 'receive() external payable', - ], - logicAddress: '0xc0D3c0D3C0d3c0d3c0d3C0d3c0d3C0d3C0D3001A', - deprecated: false, - references: [PREDEPLOYS_SPEC], - }, -]; diff --git a/src/components/ChainDiffSelector.tsx b/src/components/ChainDiffSelector.tsx index 2ca4cdd1..6d17869a 100644 --- a/src/components/ChainDiffSelector.tsx +++ b/src/components/ChainDiffSelector.tsx @@ -1,50 +1,54 @@ import { useState } from 'react'; import { useRouter } from 'next/router'; -import { chains } from '@/chains'; import { ChainDiffSelectorChainCombobox } from '@/components/ui/ChainDiffSelectorChainCombobox'; -import { Chain } from '@/types'; +import chains from '@/lib/chains.json'; export const ChainDiffSelector = () => { - const router = useRouter(); - const [base, setBase] = useState(chains.mainnet); - const [target, setTarget] = useState(chains.optimism); - const chainsArray: Chain[] = Object.values(chains); + const findChainById = (id: number) => { + const chain = chains.find((chain) => chain.chainId === id); + if (!chain) throw new Error(`Could not find chain with id: ${id}`); + return chain; + }; - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - router.push({ - pathname: '/diff', - query: { base: base.metadata.id, target: target.metadata.id }, - }); - }; + const router = useRouter(); + const [base, setBase] = useState(findChainById(1)); // Ethereum Mainnet. + const [target, setTarget] = useState(findChainById(10)); // OP Mainnet. - return ( - <> -
-
-
-
- - -
- -
- -
-
-
- - ); + const onSubmit = (e: React.FormEvent) => { + e.preventDefault(); + router.push({ + pathname: '/diff', + query: { base: base.chainId, target: target.chainId }, + }); + }; + + return ( + <> +
+
+
+
+ + +
+ +
+ +
+
+
+ + ); }; diff --git a/src/components/FeatureDiffSelector.tsx b/src/components/FeatureDiffSelector.tsx new file mode 100644 index 00000000..003373e1 --- /dev/null +++ b/src/components/FeatureDiffSelector.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import { useRouter } from 'next/router'; +import { BaseCombobox } from '@/components/ui/BaseCombobox'; +import features from '@/lib/features.json'; +import { featureMap } from '@/lib/constants'; + +export const FeatureDiffSelector = () => { + // --- URL Parsing --- + const router = useRouter(); + + // --- Prepare options --- + const options = features + .filter(({ feature }) => !featureMap[feature as keyof typeof featureMap].hide) + .map(({ feature }) => ({ + key: feature, + name: featureMap[feature as keyof typeof featureMap].title, + })); + + // --- Form handling --- + // Set PUSH0 as the default. + const opcodeIndex = options.findIndex((opt) => opt.name === 'Opcodes'); + const [option, setOption] = useState(options[opcodeIndex]); + + const onSubmit = (e: React.FormEvent) => { + e.preventDefault(); + router.push({ pathname: '/features', query: { feature: option.key } }); + }; + + // --- Selector Div --- + return ( +
+
+
+
+ + + +
+
+
+ ); +}; diff --git a/src/components/diff/DiffAccountTypes.tsx b/src/components/diff/DiffAccountTypes.tsx deleted file mode 100644 index 9e16db45..00000000 --- a/src/components/diff/DiffAccountTypes.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { AccountType } from '@/types'; - -type Props = { - base: AccountType[]; - target: AccountType[]; - onlyShowDiff: boolean; -}; - -const formatAccountType = (contents: AccountType | undefined) => { - if (!contents) return
Not present
; - return ( - <> -
- -
-
- {Object.entries(contents.properties).map(([key, value]) => { - // Return a two column table of the property name and description. - return ( -
-
- {key === 'canBatchTxs' && 'Can batch transactions'} - {key === 'canInitiateTxs' && 'Can initiate transactions'} - {key === 'hasCode' && 'Has code'} - {key === 'hasKeyPair' && 'Has key pair'} - {key === 'hasStorage' && 'Has storage'} -
-
{value ? 'Yes' : 'No'}
-
- ); - })} -
- - - - ); -}; - -export const DiffAccountTypes = ({ base, target, onlyShowDiff }: Props) => { - // Generate a sorted list of all account types from both base and target. - const sortedAccountTypeNames = [...base.map((a) => a.name), ...target.map((a) => a.name)].sort( - (a, b) => a.localeCompare(b) - ); - const accountTypeNames = [...new Set(sortedAccountTypeNames)]; - - const diffContent = ( - <> - {accountTypeNames.map((name) => { - const baseAccountType = base.find((a) => a.name === name); - const targetAccountType = target.find((a) => a.name === name); - - const isEqual = JSON.stringify(baseAccountType) === JSON.stringify(targetAccountType); - const showAccountType = !isEqual || !onlyShowDiff; - - return ( - showAccountType && ( -
-
- -
-
{formatAccountType(baseAccountType)}
-
{formatAccountType(targetAccountType)}
-
- ) - ); - })} - - ); - - return ; -}; diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 569d0137..7c0f2c90 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -1,148 +1,82 @@ -import { Address, getAddress } from 'viem'; -import { Abi } from '@/components/diff/utils/Abi'; -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; +import { getAddress } from 'viem'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { - DeployedContract, - DeployedContractKind, - ProxiedDeployedContract, - StandardDeployedContract, -} from '@/types'; +import { FormattedAddress } from '@/lib/utils'; +type DeployedContract = Chain['deployedContracts'][0]; type Props = { - base: DeployedContract[]; - target: DeployedContract[]; - onlyShowDiff: boolean; + base: DeployedContract[]; + target: DeployedContract[]; + onlyShowDiff: boolean; }; -const formatDeployedContract = (deployedContract: DeployedContract | undefined) => { - if (!deployedContract) return

Not present

; - - const title = - deployedContract.kind === DeployedContractKind.WrappedNativeAsset ? ( - - ) : ( - - ); - - const addr = getAddress(deployedContract.address); - const deployInstructions = deployedContract.deploymentInstructions || 'N/A'; - - return ( - <> -
{title}
-
- -
-
-
Address
-
- -
- -
Deploy Instructions
-
- -
-
-
- - -
- - ); +const FormattedDeployedContract = ({ + deployedContract, +}: { deployedContract: DeployedContract | undefined }) => { + if (!deployedContract) return

Not present

; + const addr = getAddress(deployedContract.address); + return ( + <> +
+
Address
+
+ } + textToCopy={getAddress(addr)} + /> +
+ +
Deployed?
+
{deployedContract.hasCode ? 'Yes' : 'No'}
+
+ + ); }; -const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; -}; - -type OmittedStandardDeployedContract = Omit< - StandardDeployedContract, - 'description' | 'deploymentInstructions' | 'references' ->; -type OmittedProxiedDeployedContract = Omit< - ProxiedDeployedContract, - 'description' | 'deploymentInstructions' | 'references' ->; - -export const convertToComparableContract = ( - contract: DeployedContract | undefined -): OmittedStandardDeployedContract | OmittedProxiedDeployedContract | undefined => { - if (typeof contract === 'undefined') return undefined; - - const baseReturnData: OmittedStandardDeployedContract = { - name: contract.name, - kind: contract.kind, - tokenName: contract.tokenName, - tokenSymbol: contract.tokenSymbol, - address: contract.address, - notes: contract.notes, - logicAbi: contract.logicAbi.sort(), - }; - - if ('proxyAbi' in contract) { - const proxiedReturnData: OmittedProxiedDeployedContract = { - ...baseReturnData, - proxyAbi: contract.proxyAbi.sort(), - logicAddress: contract.logicAddress, - }; - return proxiedReturnData; - } - - return baseReturnData; +export const convertToComparableContract = (contract: DeployedContract | undefined) => { + if (typeof contract === 'undefined') return undefined; + const slimmedContract = contract as any; // eslint-disable-line @typescript-eslint/no-explicit-any + slimmedContract.codeHash = undefined; + return slimmedContract; }; export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => { - const sortedNames = [...base.map((c) => c.name), ...target.map((c) => c.name)].sort((a, b) => - a.localeCompare(b) - ); - const deployedContractNames = [...new Set(sortedNames)]; - - const diffContent = ( - <> - {deployedContractNames.map((name) => { - const baseDeployedContract = base.find((c) => c.name === name); - const targetDeployedContract = target.find((c) => c.name === name); - - const isEqual = - JSON.stringify(convertToComparableContract(baseDeployedContract)) === - JSON.stringify(convertToComparableContract(targetDeployedContract)); - - const showDeployedContract = !isEqual || !onlyShowDiff; - - let formattedName: string | JSX.Element = name; - if (name.includes('Create2 Deployer')) { - const [first, _] = name.split('Create2 Deployer'); - formattedName = ( - <> -
{first}
-
Create2 Deployer
- - ); - } - - return ( - showDeployedContract && ( -
-
{formattedName}
-
{formatDeployedContract(baseDeployedContract)}
-
{formatDeployedContract(targetDeployedContract)}
-
- ) - ); - })} - - ); - - return ; + const sortedNames = [...base.map((c) => c.name), ...target.map((c) => c.name)].sort((a, b) => + a.localeCompare(b), + ); + const deployedContractNames = [...new Set(sortedNames)]; + + const diffContent = ( + <> + {deployedContractNames.map((name) => { + const baseDeployedContract = base.find((c) => c.name === name); + const targetDeployedContract = target.find((c) => c.name === name); + + const isEqual = + JSON.stringify(convertToComparableContract(baseDeployedContract)) === + JSON.stringify(convertToComparableContract(targetDeployedContract)); + + const show = !isEqual || !onlyShowDiff; + + if (!show) return false; + return ( +
+
{name}
+
+ +
+
+ +
+
+ ); + })} + + ); + + return ; }; diff --git a/src/components/diff/DiffEIPs.tsx b/src/components/diff/DiffEIPs.tsx deleted file mode 100644 index 001e455d..00000000 --- a/src/components/diff/DiffEIPs.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { EIP, EIPCategory, EIPParameter, EIPState } from '@/types/eip'; -import { formatHardfork, formatStringList } from './utils/format'; - -type Props = { - base: EIP[]; - target: EIP[]; - onlyShowDiff: boolean; -}; - -export const DiffEIPs = ({ base, target, onlyShowDiff }: Props): JSX.Element => { - if (!Array.isArray(base) || !Array.isArray(target)) return <>; - - // Keep the order defined in `eips.ts`. - const sortedEIPNumbers = [...base.map((eip) => eip.number), ...target.map((eip) => eip.number)]; - const eipNumbers = [...new Set(sortedEIPNumbers)]; - - const diffContent = ( - <> - {eipNumbers.map((number) => { - const baseEIP = base.find((eip) => eip.number === number); - const targetEIP = target.find((eip) => eip.number === number); - if (!baseEIP || !targetEIP) { - return <>; - } - - const isEqual = - JSON.stringify(convertToComparableEIP(baseEIP)) === - JSON.stringify(convertToComparableEIP(targetEIP)); - const showOpcode = !isEqual || !onlyShowDiff; - - return ( - showOpcode && ( -
-
- -
-
{formatEIP(baseEIP)}
-
{formatEIP(targetEIP)}
-
- ) - ); - })} - - ); - - return ; -}; - -const formatEIP = (eip: EIP | undefined): JSX.Element => { - if (!eip) return

Missing data for this EIP on this chain.

; - return ( - <> - - {formatHardfork(eip.activeHardforks)} -
-
Category
-
{formatEIPCategory(eip.category)}
-
Status
-
{formatEIPState(eip.status)}
- {eip.deprecated && ( - <> -
Deprecated
-
Yes
- - )} -
- {eip.parameters && formatEIPParameters(eip.parameters)} - {formatStringList('Notes', eip.notes)} -
- -
- - ); -}; - -const formatEIPCategory = (s: EIPCategory): string => - s === EIPCategory.Execution - ? 'Execution' - : s === EIPCategory.Consensus - ? 'Consensus' - : (() => { - throw new Error(`Unsupported category: ${s}`); - })(); - -const formatEIPState = (s: EIPState): string => - s === EIPState.Draft - ? 'Draft' - : s === EIPState.Review - ? 'Review' - : s === EIPState.LastCall - ? 'LastCall' - : s === EIPState.Final - ? 'Final' - : s === EIPState.Stagnant - ? 'Stagnant' - : s === EIPState.Withdrawn - ? 'Withdrawn' - : s === EIPState.Living - ? 'Living' - : (() => { - throw new Error(`Unsupported status: ${s}`); - })(); - -const formatEIPParameters = (params: EIPParameter[]): JSX.Element => { - if (!Array.isArray(params)) return <>; - const contents = ( - <> -
    - {params.map((p) => ( -
  • - - {p.name}: {p.value.toString()} -
  • - ))} -
- - ); - return ; -}; - -// Convert an `EIP` object to a simpler struct in order to compare it to other EIPs. -// Note: casting an object from a type with properties X, Y and Z to a subset type with properties -// X and Y using the `as` keyword will still retain the field Z unless you explicitly remove it. -// That's why this function exists. -export const convertToComparableEIP = (eip: EIP): Omit => { - return { - number: eip.number, - title: eip.title, - category: eip.category, - status: eip.status, - deprecated: eip.deprecated, - parameters: eip.parameters, - notes: eip.notes, - references: eip.references, - }; -}; diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx new file mode 100644 index 00000000..5b3909c7 --- /dev/null +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -0,0 +1,89 @@ +import { getAddress } from 'viem'; +import { evmStackAddresses, type EVMStackResult } from '@/../script/checks/evm-stack-addresses'; +import type { Chain } from '@/../script/index'; +import { RenderDiff } from '@/components/diff/utils/RenderDiff'; +import { Copyable } from '@/components/ui/Copyable'; +import { FormattedAddress } from '@/lib/utils'; + +type EvmStackResults = Chain['evmStackAddresses']; +type Props = { + base: EvmStackResults; + target: EvmStackResults; + onlyShowDiff: boolean; +}; + +const formatStackHeader = (stack: keyof EvmStackResults) => { + if (stack === 'OP') return 'OP Stack'; + if (stack === 'Orbit') return 'Orbit'; + return stack; +}; + +export const DiffEVMStackAddresses = ({ base, target, onlyShowDiff }: Props) => { + const stacks = Object.keys(evmStackAddresses) as Array; + + const isEqual = (base: EVMStackResult | undefined, target: EVMStackResult | undefined) => { + return JSON.stringify(base) === JSON.stringify(target); + }; + + const diffContent = ( + <> + {stacks.map((stack) => { + const baseStackAddresses = base[stack]; + const targetStackAddresses = target[stack]; + + const diffAddresses = baseStackAddresses.filter((baseAddr) => { + const targetStackAddress = targetStackAddresses.find( + (p) => getAddress(p.address) === getAddress(baseAddr.address), + ); + return !isEqual(baseAddr, targetStackAddress); + }); + + return ( +
+
{formatStackHeader(stack)}
+
+ {diffAddresses.length === 0 ? ( +
No differences found.
+ ) : ( + diffAddresses.map((baseStackAddress) => { + const targetStackAddress = targetStackAddresses.find( + (p) => getAddress(p.address) === getAddress(baseStackAddress.address), + ); + + const isEqual = + JSON.stringify(baseStackAddress) === JSON.stringify(targetStackAddress); + const show = !isEqual || !onlyShowDiff; + if (!show) return false; + + const name = baseStackAddress?.name || targetStackAddress?.name; + const addr = getAddress(baseStackAddress.address); + return ( +
+
+
{name}
+ } + textToCopy={addr} + /> +
+
+ {baseStackAddress.exists ? 'Yes' : 'No'} +
+
{targetStackAddress?.exists ? 'Yes' : 'No'}
+
+ ); + }) + )} +
+
+ ); + })} + + ); + + return ; +}; diff --git a/src/components/diff/DiffJSON.tsx b/src/components/diff/DiffJSON.tsx new file mode 100644 index 00000000..c11be835 --- /dev/null +++ b/src/components/diff/DiffJSON.tsx @@ -0,0 +1,110 @@ +import ReactDiffViewer from 'react-diff-viewer-continued'; +import { useTheme } from 'next-themes'; + +type Props = { + base: string; + target: string; + onlyShowDiff: boolean; +}; + +const styles = { + variables: { + light: { + addedBackground: '#dafbe1ff', + addedColor: '#24292e', + addedGutterBackground: '#cdffd8', + addedGutterColor: '#212529', + codeFoldBackground: '#e0f2fe', + codeFoldContentColor: '#0c4a6e', + codeFoldGutterBackground: '#dbedff', + diffViewerBackground: '#fff', + diffViewerColor: '#212529', + diffViewerTitleBackground: '#fafbfc', + diffViewerTitleBorderColor: '#eee', + diffViewerTitleColor: '#212529', + emptyLineBackground: '#fafbfc', + gutterBackground: '#f7f7f7', + gutterBackgroundDark: '#f3f1f1', + gutterColor: '#212529', + highlightBackground: '#fffbdd', + highlightGutterBackground: '#fff5b1', + removedBackground: '#ffebe9ff', + removedColor: '#24292e', + removedGutterBackground: '#ffdce0', + removedGutterColor: '#212529', + wordAddedBackground: '#acf2bd77', + wordRemovedBackground: '#fecaca77', + }, + dark: { + addedBackground: '#2ea04326', + addedColor: 'white', + addedGutterBackground: '#034148', + addedGutterColor: '#8c8c8c', + codeFoldBackground: '#082f49aa', + codeFoldContentColor: '#7dd3fcaa', + codeFoldGutterBackground: '#21232b', + diffViewerBackground: '#2e303c', + diffViewerColor: '#fff', + diffViewerTitleBackground: '#2f323e', + diffViewerTitleBorderColor: '#353846', + diffViewerTitleColor: '#555a7b', + emptyLineBackground: '#27272a', + gutterBackground: '#18181b', + gutterBackgroundDark: '#18181b', + gutterColor: '#464c67', + highlightBackground: '#2a3967', + highlightGutterBackground: '#2d4077', + removedBackground: '#f8514926', + removedColor: 'white', + removedGutterBackground: '#632b30', + removedGutterColor: '#8c8c8c', + wordAddedBackground: '#2ea04333', + wordRemovedBackground: '#f8514933', + }, + }, + // codeFoldContent: {}, + // content: {}, + // emptyLine: {}, + // highlightedGutter: {}, + // line: {}, + // lineNumber: {}, + // marker: {}, + splitView: {}, + // titleBlock: {}, + codeFold: { padding: '0px', margin: '0px' }, + codeFoldGutter: { backgroundColor: 'transparent' }, + // contentText: {}, + diffAdded: { paddingTop: '0px', paddingBottom: '0px', marginTop: '0px', marginBottom: '0px' }, + diffContainer: { backgroundColor: 'transparent' }, + diffRemoved: { paddingTop: '0px', paddingBottom: '0px', marginTop: '0px', marginBottom: '0px' }, + emptyGutter: { padding: '0px', margin: '0px' }, + // gutter: {}, + highlightedLine: { padding: '0px', margin: '0px' }, + wordAdded: { padding: '0px', margin: '0px' }, + wordDiff: { padding: '0px', margin: '0px' }, + wordRemoved: { padding: '0px', margin: '0px' }, +}; + +export const DiffJSON = ({ base, target, onlyShowDiff }: Props): JSX.Element => { + const { resolvedTheme } = useTheme(); + return ( + <> +
+
+ Note that not all chains have the same set of metadata fields. For example, not all L2s + will have a JSON field that indicates its an L2. +
+
+ +
+
+ + ); +}; diff --git a/src/components/diff/DiffMempools.tsx b/src/components/diff/DiffMempools.tsx deleted file mode 100644 index 2df5f616..00000000 --- a/src/components/diff/DiffMempools.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { Mempool } from '@/types'; - -type Props = { - base: Mempool[]; - target: Mempool[]; - onlyShowDiff: boolean; -}; - -const formatMempool = (contents: Mempool | undefined) => { - const mempoolPropertiesKeys = [ - 'isPrivate', - 'tracksIpAddress', - 'refundsMev', - 'includesFailedTxs', - 'canSpecifyBuilders', - 'isFree', - 'configurable', - 'txLifespan', - 'rateLimit', - 'burstRateLimit', - ]; - if (!contents) return

Not present

; - return ( - <> -
- -
- {contents.rpcUrl} -
-
-
- {mempoolPropertiesKeys.map((key) => { - const value = contents.properties[key as keyof Mempool['properties']]; - // Return a two column table of the property name and description. - return ( -
-
- {key === 'isPrivate' && 'Is private'} - {key === 'tracksIpAddress' && 'Tracks IP Address'} - {key === 'refundsMev' && 'Refunds MEV'} - {key === 'includesFailedTxs' && 'Includes failed transactions'} - {key === 'canSpecifyBuilders' && 'Can specify builders'} - {key === 'isFree' && 'Is free'} - {key === 'configurable' && 'Configurable'} - {key === 'txLifespan' && 'Transaction lifespan'} - {key === 'rateLimit' && 'Rate limit'} - {key === 'burstRateLimit' && 'Burst Rate limit'} -
-
- {typeof value === 'undefined' ? 'Unknown' : value ? 'Yes' : 'No'} -
-
- ); - })} -
- -
- {!!contents.notes?.length && } - -
- - ); -}; - -export const DiffMempools = ({ base, target, onlyShowDiff }: Props) => { - // Generate a sorted list of all account types from both base and target. - const sortedMempoolNames = [...base.map((a) => a.name), ...target.map((a) => a.name)].sort( - (a, b) => a.localeCompare(b) - ); - const mempoolNames = [...new Set(sortedMempoolNames)]; - - const diffContent = ( - <> - {mempoolNames.map((name) => { - const baseMempool = base.find((a) => a.name === name); - const targetMempool = target.find((a) => a.name === name); - - const isEqual = JSON.stringify(baseMempool) === JSON.stringify(targetMempool); - const showMempool = !isEqual || !onlyShowDiff; - - return ( - showMempool && ( -
-
- -
-
{formatMempool(baseMempool)}
-
{formatMempool(targetMempool)}
-
- ) - ); - })} - - ); - - return ; -}; diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index 9d1b0c43..39aee2c6 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -1,127 +1,135 @@ -import { Chain as Metadata } from '@wagmi/chains'; -import { getAddress } from 'viem'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { classNames, toUppercase } from '@/lib/utils'; -import { ExternalLink } from '../layout/ExternalLink'; +import { ExternalLink } from '@/components/layout/ExternalLink'; +type Metadata = Chain['metadata']; type MetadataKey = keyof Metadata; type Props = { - base: Metadata; - target: Metadata; - onlyShowDiff: boolean; + base: Metadata; + target: Metadata; + onlyShowDiff: boolean; }; const hiddenField = (field: MetadataKey) => { - return ['network'].includes(field); + return [ + 'networkId', + 'ens', + 'features', + 'icon', + 'slip44', + 'faucets', + 'chain', + 'parent', + 'status', + ].includes(field); }; const formatFieldDisplayName = (field: MetadataKey) => { - if (field === 'id') return 'Chain ID'; - if (field === 'name') return 'Name'; - if (field === 'rpcUrls') return 'RPC URLs'; - if (field === 'blockExplorers') return 'Block Explorers'; - if (field === 'nativeCurrency') return 'Native Currency'; - if (field === 'contracts') return 'Multicall3'; - return field; + if (field === 'chainId') return 'Chain ID'; + if (field === 'explorers') return 'Block Explorers'; + if (field === 'name') return 'Name'; + if (field === 'nativeCurrency') return 'Native Currency'; + if (field === 'rpc') return 'RPC URLs'; + if (field === 'shortName') return 'Short Name'; + if (field === 'infoURL') return 'Info URL'; + return field; }; -const formatRpcUrls = (data: Metadata['rpcUrls']) => { - const renderRpcUrls = (rpcUrls: Metadata['rpcUrls']['default']) => ( -
    - {rpcUrls.http.map((url) => ( -
  • - -
  • - ))} - {rpcUrls.webSocket && - rpcUrls.webSocket.map((url) => ( -
  • - -
  • - ))} -
- ); +const FormattedShortName = ({ shortName }: { shortName: string }) => { + return ; // Remove leading and trailing quotes. +}; - return ( -
- {Object.entries(data).map(([key, rpcUrls], index) => ( -
-

0 && 'mt-6')}>{toUppercase(key)}

- {renderRpcUrls(rpcUrls)} -
- ))} -
- ); +const FormattedInfoURL = ({ infoURL }: { infoURL: string }) => { + return ; }; -const formatBlockExplorerUrls = (data: Metadata['blockExplorers']) => { - if (!data) return null; - return ( -
- {Object.entries(data).map(([key, blockExplorer], index) => ( -
-

0 && 'mt-6')}>{toUppercase(key)}

-

- -

-
- ))} -
- ); +const FormattedNativeCurrency = ({ + nativeCurrency, +}: { nativeCurrency: Metadata['nativeCurrency'] }) => { + return ( + <> +
+ {nativeCurrency.name} ({nativeCurrency.symbol}) +
+
{nativeCurrency.decimals} decimals
+ + ); }; -const formatFieldInfo = (field: MetadataKey, contents: Metadata[MetadataKey]) => { - if (field === 'id') return ; - if (field === 'name') return ; - if (field === 'rpcUrls') return formatRpcUrls(contents as Metadata['rpcUrls']); - if (field === 'blockExplorers') { - return formatBlockExplorerUrls(contents as Metadata['blockExplorers']); - } - if (field === 'nativeCurrency') { - const c = contents as Metadata['nativeCurrency']; - return `${c.name} (${c.symbol})`; - } - if (field === 'contracts') { - const c = contents as Metadata['contracts']; - const multicall3 = c?.multicall3?.address; - return multicall3 ? getAddress(multicall3) : 'None'; - } - return JSON.stringify(contents); +const FormattedRpcUrls = ({ rpcUrls }: { rpcUrls: Metadata['rpc'] }) => { + return ( + <> + {rpcUrls.map((url) => ( + + ))} + + ); }; -export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { - const fields = Object.keys(base) as MetadataKey[]; - const diffContent = ( - <> - {fields.map((field) => { - if (hiddenField(field)) return null; +const FormattedBlockExplorerUrls = ({ data }: { data: Metadata['explorers'] }) => { + if (!data) return null; + return ( +
+ {Object.entries(data).map(([key, blockExplorer]) => ( +
+ } + textToCopy={blockExplorer.url} + /> +
+ ))} +
+ ); +}; - // When comparing the contracts field, we only consider the Multicall3 field. The other - // fields are around ENS which is just mainnet (and a testnet). - const isEqual = - field === 'contracts' - ? JSON.stringify(base[field]?.multicall3?.address) === - JSON.stringify(target[field]?.multicall3?.address) - : JSON.stringify(base[field]) === JSON.stringify(target[field]); - const showField = !isEqual || !onlyShowDiff; +const FormattedFieldInfo = ({ + field, + contents, +}: { field: MetadataKey; contents: Metadata[MetadataKey] }) => { + if (field === 'chainId') return ; + if (field === 'name') return ; + if (field === 'rpc') return ; + if (field === 'shortName') + return ; + if (field === 'infoURL') return ; + if (field === 'nativeCurrency') + return ; + if (field === 'explorers') { + return ; + } + return <>JSON.stringify(contents); +}; + +export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { + const fields = Object.keys(base) as MetadataKey[]; + const diffContent = ( + <> + {fields.map((field) => { + if (hiddenField(field)) return null; + const isEqual = JSON.stringify(base[field]) === JSON.stringify(target[field]); + const show = !isEqual || !onlyShowDiff; - return ( - showField && ( -
-
{formatFieldDisplayName(field)}
-
{formatFieldInfo(field, base[field])}
-
{formatFieldInfo(field, target[field])}
-
- ) - ); - })} - - ); + if (!show) return false; + return ( +
+
{formatFieldDisplayName(field)}
+
+ +
+
+ +
+
+ ); + })} + + ); - return ; + return ; }; diff --git a/src/components/diff/DiffNodes.tsx b/src/components/diff/DiffNodes.tsx deleted file mode 100644 index 9e9c2000..00000000 --- a/src/components/diff/DiffNodes.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { Language, Node, NodeType, SyncStrategy } from '@/types'; -import { Collapsible } from './utils/Collapsible'; -import { Markdown } from './utils/Markdown'; - -type Props = { - base: Node[]; - target: Node[]; - onlyShowDiff: boolean; -}; - -export const DiffNodes = ({ base, target, onlyShowDiff }: Props) => { - const sortedNodeNames = [...base.map((n) => n.name), ...target.map((n) => n.name)].sort((a, b) => - a.localeCompare(b) - ); - const nodeNames = [...new Set(sortedNodeNames)]; - - const diffContent = ( - <> - {nodeNames.map((name) => { - const baseNode = base.find((n) => n.name === name); - const targetNode = target.find((n) => n.name === name); - if (!baseNode && !targetNode) { - return <>; - } - - const isEqual = JSON.stringify(baseNode) === JSON.stringify(targetNode); - const showNode = !isEqual || !onlyShowDiff; - - return ( - showNode && ( -
-
- -
-
{formatNode(baseNode)}
-
{formatNode(targetNode)}
-
- ) - ); - })} - - ); - - return ; -}; - -const formatNode = (node: Node | undefined) => { - if (!node) return
Not present
; - return ( - <> - -
- -
-
- {node.forkOf && ( - <> -
Fork of
-
{node.forkOf}
- - )} -
Language
-
{formatLanguage(node.language)}
- {node.type == NodeType.Execution && node.syncStrategy && formatSyncStrategies(node)} -
-
- -
- - ); -}; - -const formatLanguage = (l: Language) => { - if (l === Language.Java) return 'Java'; - if (l === Language.Go) return 'Go'; - if (l === Language.CSharp) return 'CSharp'; - if (l === Language.Rust) return 'Rust'; - if (l === Language.TypeScript) return 'TypeScript'; - if (l === Language.Nim) return 'Nim'; -}; - -const formatSyncStrategies = (n: Node) => { - return ( - <> -
Sync Strategies
-
- {n.syncStrategy && n.syncStrategy.map((s) => formatSyncStrategy(s)!).join(', ')} -
- - ); -}; - -const formatSyncStrategy = (s: SyncStrategy) => { - if (s === SyncStrategy.Snap) return 'Snap'; - if (s === SyncStrategy.Full) return 'Full'; - if (s === SyncStrategy.Fast) return 'Fast'; -}; diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index ec62bcbb..2ccf8f6e 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -1,299 +1,62 @@ -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { ExternalLink } from '@/components/layout/ExternalLink'; import { Copyable } from '@/components/ui/Copyable'; -import { classNames, formatPrefixByte } from '@/lib/utils'; -import { toUppercase } from '@/lib/utils'; -import { Example, Opcode, Variable } from '@/types'; -import { GasComputation } from '@/types/opcode'; -import { formatHardfork, formatStringList } from './utils/format'; +import { toUppercaseHex } from '@/lib/utils'; +import { knownOpcodes } from '@/../script/checks/opcodes'; -type Props = { - base: Opcode[]; - target: Opcode[]; - onlyShowDiff: boolean; -}; - -const formatVariables = (title: string, array?: Variable[]): JSX.Element => { - return ( - <> -

{toUppercase(title)}

- {array === undefined || array.length === 0 ? ( - <>None - ) : ( -
    - {array.map((v, id) => ( -
  • {formatVariable(v)}
  • - ))} -
- )} - - ); -}; - -const formatVariable = (v: Variable): JSX.Element => { - return ( -
-

- {v.name}: {v.description} -

- {v.expression && ( - <> -
-
- Sub-variables ({v.name}) -
- - {v.name} = {v.expression} - - {v.variables && ( - <> -
    {v.variables.map((subvariables) => formatVariable(subvariables))}
- - )} -
-
- - )} -
- ); -}; - -const formatExamples = (opcode: Opcode): JSX.Element => { - if (!opcode.examples || opcode.examples.length === 0) return <>; - const contents = ( - <> -
- Stack inputs are shown on the left of the arrow symbol and stack outputs on the right.{' '} - {opcode.playgroundLink && ( - - Or,{' '} - - try it out - {' '} - on the playground. - - )} -
-
    - {opcode.examples.map((e, id) => ( -
  • {formatExample(e, id)}
  • - ))} -
- - ); - - return ; -}; - -const formatExample = (e: Example, id: number): JSX.Element => { - const input = e.input ? '[' + e.input.toString() + ']' : '[]'; - const output = '[' + (e.output ? e.output : '') + ']'; - return ( - <> -

Example #{id}

-
- {e.description &&

{e.description}

} - - {input} {'=>'} {output} - - {e.memory && ( - <> -
Memory
-
Before
- - {e.memory.before ? e.memory.before : '[]'} - -
After
- {e.memory.after ? e.memory.after : '[]'} - - )} - {e.storage && ( - <> -
Storage
-
Before
- - {e.storage.before && formatStorage(e.storage.before)} - -
After
- - {e.storage.after && formatStorage(e.storage.after)} - - - )} - {e.calldata && ( - <> -
Calldata
- {e.calldata} - - )} - {e.code && ( - <> -
Code
- {e.code} - - )} - {e.returndata && ( - <> -
Return Data
- {e.returndata} - - )} -
- - ); -}; - -const formatStorage = (record: Record): JSX.Element => { - if (!record || record === undefined) return <>; - const keyValues: JSX.Element[] = []; - for (const key in record) { - keyValues.push( -
  • - {key}: {record[key]} -
  • - ); - } - return
      {keyValues}
    ; -}; - -const formatGasComputation = (gc: GasComputation | undefined): JSX.Element => { - if (!gc) return <>; - const contents = ( - <> - gas_cost = static_gas_cost + dynamic_gas_cost - -
    - {gc.staticGasCost && ( - <> - - static_gas_cost = {gc.staticGasCost.expression} - - {gc.staticGasCost.variables && ( - <> -
    Sub-variables (static_gas_cost)
    -
      - {gc.staticGasCost.variables.map((v) => ( -
    • {formatVariable(v)}
    • - ))} -
    - - )} - - )} -
    +type Opcodes = Chain['opcodes']; +type Opcode = Opcodes[0]; -
    - {gc.dynamicGasCost && ( - <> - - dynamic_gas_cost = {gc.dynamicGasCost.expression} - - {gc.dynamicGasCost.variables && ( - <> -
    - Sub-variables (dynamic_gas_cost) -
    -
      - {gc.dynamicGasCost.variables.map((v) => ( -
    • {formatVariable(v)}
    • - ))} -
    - - )} - - )} -
    - -

    Refunds

    -

    {gc.refunds || 'No refunds'}

    - - ); - return ; +type Props = { + base: Opcodes; + target: Opcodes; + onlyShowDiff: boolean; }; -const formatOpcode = (opcode: Opcode | undefined): JSX.Element => { - if (!opcode) return

    Not present

    ; - return ( - <> - - {formatHardfork(opcode.supportedHardforks)} -

    ⛽️ Minimum Gas: {opcode.minGas}

    - {formatVariables('Inputs', opcode.inputs)} - {formatVariables('Outputs', opcode.outputs)} - {formatStringList('Error Cases', opcode.errorCases)} - {formatStringList('Notes', opcode.notes)} -
    - {formatExamples(opcode)} - {formatGasComputation(opcode.gasComputation)} - -
    - - ); +const FormattedOpcode = ({ opcode }: { opcode: Opcode | undefined }): JSX.Element => { + return ( +
    {opcode?.supported === 'unknown' ? 'Unknown' : opcode?.supported ? 'Yes' : 'No'}
    + ); }; export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element => { - if (!Array.isArray(base) || !Array.isArray(target)) return <>; - - // Generate a sorted list of all opcode numbers from both base and target. - const sortedOpcodeNumbers = [ - ...base.map((opcode) => opcode.number), - ...target.map((opcode) => opcode.number), - ].sort((a, b) => a - b); - const opcodeNumbers = [...new Set(sortedOpcodeNumbers)]; - - const diffContent = ( - <> - {opcodeNumbers.map((number) => { - const baseOpcode = base.find((opcode) => opcode.number === number); - const targetOpcode = target.find((opcode) => opcode.number === number); - if (!baseOpcode || !targetOpcode) { - return <>; - } - - const isEqual = - JSON.stringify(convertToComparableOpcode(baseOpcode)) === - JSON.stringify(convertToComparableOpcode(targetOpcode)); - const showOpcode = !isEqual || !onlyShowDiff; - - return ( - showOpcode && ( -
    -
    - - -
    -
    {formatOpcode(baseOpcode)}
    -
    {formatOpcode(targetOpcode)}
    -
    - ) - ); - })} - - ); - - return ; -}; - -// Convert an `Opcode` object to a simpler struct in order to compare it to other opcodes. -// Note: casting an object from a type with properties X, Y and Z to a subset type with properties -// X and Y using the `as` keyword will still retain the field Z unless you explicitly remove it. -// That's why this function exists. -export const convertToComparableOpcode = ( - opcode: Opcode -): Omit => { - return { - number: opcode.number, - name: opcode.name, - description: opcode.description, - minGas: opcode.minGas, - gasComputation: opcode.gasComputation, - inputs: opcode.inputs, - outputs: opcode.outputs, - errorCases: opcode.errorCases, - }; + if (!Array.isArray(base) || !Array.isArray(target)) return <>; + + const opcodeNumbers = Object.keys(knownOpcodes).map(Number); + + const diffContent = ( + <> + {opcodeNumbers.map((number) => { + const baseOpcode = base.find((opcode) => Number(opcode.number) === number); + const targetOpcode = target.find((opcode) => Number(opcode.number) === number); + if (!baseOpcode || !targetOpcode) { + return false; + } + + const isEqual = JSON.stringify(baseOpcode) === JSON.stringify(targetOpcode); + const show = !isEqual || !onlyShowDiff; + + if (!show) return false; + return ( +
    +
    + + +
    +
    + +
    +
    + +
    +
    + ); + })} + + ); + + return ; }; diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index 9dbe43d7..62ed59fd 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -1,98 +1,63 @@ -import { Address, getAddress } from 'viem'; -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; +import { getAddress } from 'viem'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { Precompile } from '@/types'; +import { FormattedAddress } from '@/lib/utils'; +type Precompile = Chain['precompiles'][0]; type Props = { - base: Precompile[]; - target: Precompile[]; - onlyShowDiff: boolean; + base: Precompile[]; + target: Precompile[]; + onlyShowDiff: boolean; }; -const Abi = ({ precompile }: { precompile: Precompile }) => { - let abi = ( -
    - This interface is not yet rendered, but the data exists in the EVM Diff repository. -
    - ); - - if ('logicAbi' in precompile && !precompile.logicAbi.length) { - abi =
    ABI not found.
    ; - } else if ('logicAbi' in precompile && precompile.logicAbi.length > 0) { - abi = ( -
      - {precompile.logicAbi.map((sig) => ( -
    • - {sig} -
    • - ))} -
    - ); - } - - return ; -}; - -const formatPrecompile = (precompile: Precompile | undefined) => { - if (!precompile) return
    Not present
    ; - return ( - <> -
    - -
    -
    - -
    -
    - - -
    - - ); -}; - -// TODO Dedupe this helper method -const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; +const FormattedPrecompile = ({ precompile }: { precompile: Precompile | undefined }) => { + if (!precompile) return
    Not present
    ; + return
    {precompile.implemented ? 'Yes' : 'No'}
    ; }; export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { - // Generate a sorted list of all precompiles from both base and target. - const sortedAddrs = [ - ...base.map((p) => getAddress(p.address)), - ...target.map((p) => getAddress(p.address)), - ].sort((a, b) => a.localeCompare(b)); - const precompileAddrs = [...new Set(sortedAddrs)]; - - const diffContent = ( - <> - {precompileAddrs.map((addr) => { - const basePrecompile = base.find((p) => getAddress(p.address) === addr); - const targetPrecompile = target.find((p) => getAddress(p.address) === addr); - - const isEqual = JSON.stringify(basePrecompile) === JSON.stringify(targetPrecompile); - const showPrecompile = !isEqual || !onlyShowDiff; - - return ( - showPrecompile && ( -
    -
    - -
    -
    {formatPrecompile(basePrecompile)}
    -
    {formatPrecompile(targetPrecompile)}
    -
    - ) - ); - })} - - ); - - return ; + // Generate a sorted list of all precompiles from both base and target. + const sortedAddrs = [ + ...base.map((p) => getAddress(p.address)), + ...target.map((p) => getAddress(p.address)), + ].sort((a, b) => a.localeCompare(b)); + const precompileAddrs = [...new Set(sortedAddrs)]; + + const diffContent = ( + <> + {precompileAddrs.map((addr) => { + const basePrecompile = base.find((p) => getAddress(p.address) === addr); + const targetPrecompile = target.find((p) => getAddress(p.address) === addr); + + const isEqual = JSON.stringify(basePrecompile) === JSON.stringify(targetPrecompile); + const show = !isEqual || !onlyShowDiff; + + if (!show) return false; + return ( +
    +
    +
    {basePrecompile?.name || targetPrecompile?.name}
    + } + textToCopy={addr} + /> +
    +
    + +
    +
    + +
    +
    + ); + })} + + ); + + return ; }; diff --git a/src/components/diff/DiffPredeploys.tsx b/src/components/diff/DiffPredeploys.tsx deleted file mode 100644 index c7a1ab73..00000000 --- a/src/components/diff/DiffPredeploys.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { Address, getAddress } from 'viem'; -import { Abi } from '@/components/diff/utils/Abi'; -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { Predeploy } from '@/types'; - -type Props = { - base: Predeploy[]; - target: Predeploy[]; - onlyShowDiff: boolean; -}; - -const formatPredeploy = (predeploy: Predeploy | undefined) => { - if (!predeploy) return

    Not present

    ; - return ( - <> -
    - -
    -
    - -
    -
    - - -
    - - ); -}; - -const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; -}; - -export const DiffPredeploys = ({ base, target, onlyShowDiff }: Props) => { - // Generate a sorted list of all predeploys from both base and target. - const sortedAddrs = [ - ...base.map((p) => getAddress(p.address)), - ...target.map((p) => getAddress(p.address)), - ].sort((a, b) => a.localeCompare(b)); - const predeployAddrs = [...new Set(sortedAddrs)]; - - const diffContent = ( - <> - {predeployAddrs.map((addr) => { - const basePredeploy = base.find((p) => getAddress(p.address) === addr); - const targetPredeploy = target.find((p) => getAddress(p.address) === addr); - - const isEqual = JSON.stringify(basePredeploy) === JSON.stringify(targetPredeploy); - const showPredeploy = !isEqual || !onlyShowDiff; - - return ( - showPredeploy && ( -
    -
    - -
    -
    {formatPredeploy(basePredeploy)}
    -
    {formatPredeploy(targetPredeploy)}
    -
    - ) - ); - })} - - ); - - return ; -}; diff --git a/src/components/diff/DiffSignatureTypes.tsx b/src/components/diff/DiffSignatureTypes.tsx index 418c1566..1bfdcac8 100644 --- a/src/components/diff/DiffSignatureTypes.tsx +++ b/src/components/diff/DiffSignatureTypes.tsx @@ -1,68 +1,68 @@ -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; -import { RenderDiff } from '@/components/diff/utils/RenderDiff'; -import { Copyable } from '@/components/ui/Copyable'; -import { formatPrefixByte } from '@/lib/utils'; -import { SignatureType } from '@/types'; +// import { Collapsible } from '@/components/diff/utils/Collapsible'; +// import { Markdown } from '@/components/diff/utils/Markdown'; +// import { RenderDiff } from '@/components/diff/utils/RenderDiff'; +// import { Copyable } from '@/components/ui/Copyable'; +// import { toUppercaseHex } from '@/lib/utils'; +// import type { SignatureType } from '@/types'; -type Props = { - base: SignatureType[]; - target: SignatureType[]; - onlyShowDiff: boolean; -}; +// type Props = { +// base: SignatureType[]; +// target: SignatureType[]; +// onlyShowDiff: boolean; +// }; -const formatSigType = (contents: SignatureType | undefined) => { - if (!contents) return

    Not present

    ; - return ( - <> -
    - -
    - {contents.signedData?.map((data) => ( -
    - -
    - ))} +// const formatSigType = (contents: SignatureType | undefined) => { +// if (!contents) return

    Not present

    ; +// return ( +// <> +//
    +// +//
    +// {contents.signedData?.map((data) => ( +//
    +// +//
    +// ))} - - - ); -}; +// +// +// ); +// }; -export const DiffSignatureTypes = ({ base, target, onlyShowDiff }: Props) => { - // Generate a sorted list of all transaction types from both base and target. - const allPrefixBytes = [...base.map((t) => t.prefixByte), ...target.map((t) => t.prefixByte)]; - const prefixBytes = [...new Set(allPrefixBytes.sort((a, b) => a - b))]; +// export const DiffSignatureTypes = ({ base, target, onlyShowDiff }: Props) => { +// // Generate a sorted list of all transaction types from both base and target. +// const allPrefixBytes = [...base.map((t) => t.prefixByte), ...target.map((t) => t.prefixByte)]; +// const prefixBytes = [...new Set(allPrefixBytes.sort((a, b) => a - b))]; - const diffContent = ( - <> -

    - The || symbol indicates concatenation -

    - {prefixBytes.map((prefix) => { - const baseSigType = base.find((s) => s.prefixByte === prefix); - const targetSigType = target.find((s) => s.prefixByte === prefix); +// const diffContent = ( +// <> +//

    +// The || symbol indicates concatenation +//

    +// {prefixBytes.map((prefix) => { +// const baseSigType = base.find((s) => s.prefixByte === prefix); +// const targetSigType = target.find((s) => s.prefixByte === prefix); - const isEqual = JSON.stringify(baseSigType) === JSON.stringify(targetSigType); - const showSigType = !isEqual || !onlyShowDiff; +// const isEqual = JSON.stringify(baseSigType) === JSON.stringify(targetSigType); +// const showSigType = !isEqual || !onlyShowDiff; - return ( - showSigType && ( -
    -
    - -
    -
    {formatSigType(baseSigType)}
    -
    {formatSigType(targetSigType)}
    -
    - ) - ); - })} - - ); +// return ( +// showSigType && ( +//
    +//
    +// +//
    +//
    {formatSigType(baseSigType)}
    +//
    {formatSigType(targetSigType)}
    +//
    +// ) +// ); +// })} +// +// ); - return ; -}; +// return ; +// }; diff --git a/src/components/diff/utils/Abi.tsx b/src/components/diff/utils/Abi.tsx index dddb17aa..7d36483b 100644 --- a/src/components/diff/utils/Abi.tsx +++ b/src/components/diff/utils/Abi.tsx @@ -1,84 +1,80 @@ -import { Address, getAddress } from 'viem'; +import type { Address } from 'viem'; import { Collapsible } from '@/components/diff/utils/Collapsible'; import { Copyable } from '@/components/ui/Copyable'; - -const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; -}; +import { FormattedAddress } from '@/lib/utils'; type StandardContractAbi = { - logicAbi: string[]; + logicAbi: string[]; }; type ProxiedContractAbi = { - proxyAbi: string[]; - logicAbi: string[]; - logicAddress: Address; + proxyAbi: string[]; + logicAbi: string[]; + logicAddress: Address; }; type ContractAbi = StandardContractAbi | ProxiedContractAbi; export const Abi = ({ contract }: { contract: ContractAbi }) => { - const hasProxyAbi = 'proxyAbi' in contract && contract.proxyAbi.length > 0; - const hasLogicAbi = 'logicAbi' in contract && contract.logicAbi.length > 0; - const hasLogicAddress = 'logicAddress' in contract && contract.logicAddress.length > 0; + const hasProxyAbi = 'proxyAbi' in contract && contract.proxyAbi.length > 0; + const hasLogicAbi = 'logicAbi' in contract && contract.logicAbi.length > 0; + const hasLogicAddress = 'logicAddress' in contract && contract.logicAddress.length > 0; - let proxyAbi = <>; - let logicAbi = <>; + let proxyAbi = <>; + let logicAbi = <>; - if (!hasProxyAbi) { - proxyAbi =
    ABI not found.
    ; - } else if (hasProxyAbi) { - proxyAbi = ( -
      - {contract.proxyAbi.map((sig) => ( -
    • - {sig} -
    • - ))} -
    - ); - } + if (!hasProxyAbi) { + proxyAbi =
    ABI not found.
    ; + } else if (hasProxyAbi) { + proxyAbi = ( +
      + {contract.proxyAbi.map((sig) => ( +
    • + {sig} +
    • + ))} +
    + ); + } - if (!hasLogicAbi) { - logicAbi =
    ABI not found.
    ; - } else if (hasLogicAbi) { - logicAbi = ( -
      - {contract.logicAbi.map((sig) => ( -
    • - {sig} -
    • - ))} -
    - ); - } + if (!hasLogicAbi) { + logicAbi =
    ABI not found.
    ; + } else if (hasLogicAbi) { + logicAbi = ( +
      + {contract.logicAbi.map((sig) => ( +
    • + {sig} +
    • + ))} +
    + ); + } - const proxyAbiContent = ( - <> -
    Proxy Contract ABI
    - {proxyAbi} -
    Logic Contract ABI
    -
    - {hasLogicAddress && ( -
    - {/* For some reason the text is not horizontally aligned so we manually add some margin to fix it */} -
    - Implementation at -
    - -
    - )} -
    - {logicAbi} - - ); + const proxyAbiContent = ( + <> +
    Proxy Contract ABI
    + {proxyAbi} +
    Logic Contract ABI
    +
    + {hasLogicAddress && ( +
    + {/* For some reason the text is not horizontally aligned so we manually add some margin to fix it */} +
    + Implementation at +
    + } + textToCopy={contract.logicAddress} + /> +
    + )} +
    + {logicAbi} + + ); - return ( - - ); + return ( + + ); }; diff --git a/src/components/diff/utils/Collapsible.tsx b/src/components/diff/utils/Collapsible.tsx index 7ea4e501..c48a6531 100644 --- a/src/components/diff/utils/Collapsible.tsx +++ b/src/components/diff/utils/Collapsible.tsx @@ -5,59 +5,59 @@ import { Markdown } from '@/components/diff/utils/Markdown'; import { classNames } from '@/lib/utils'; export const Collapsible = ({ - kind, - contents, - className, - title, + kind, + contents, + className, + title, }: { - kind: 'references' | 'notes' | 'custom'; - contents: string[] | string | JSX.Element | undefined; - className?: string; - title?: string; + kind: 'references' | 'notes' | 'custom'; + contents: string[] | string | JSX.Element | undefined; + className?: string; + title?: string; }) => { - if (contents === undefined) return <>; - const refs = Array.isArray(contents) ? contents : [contents]; + if (contents === undefined) return <>; + const refs = Array.isArray(contents) ? contents : [contents]; - let headerTitle = 'unknown'; - if (title) headerTitle = title; - else if (kind === 'references') headerTitle = 'References'; - else if (kind === 'notes') headerTitle = 'Notes'; + let headerTitle = 'unknown'; + if (title) headerTitle = title; + else if (kind === 'references') headerTitle = 'References'; + else if (kind === 'notes') headerTitle = 'Notes'; - const panelContent = - kind === 'custom' ? ( - contents - ) : ( -
      - {refs.map((reference) => { - return ( -
    1. - -
    2. - ); - })} -
    - ); + const panelContent = + kind === 'custom' ? ( + contents + ) : ( +
      + {refs.map((reference) => { + return ( +
    1. + +
    2. + ); + })} +
    + ); - return ( -
    - - {({ open }) => ( - <> - - {headerTitle} - - - {panelContent} - - )} - -
    - ); + return ( +
    + + {({ open }) => ( + <> + + {headerTitle} + + + {panelContent} + + )} + +
    + ); }; diff --git a/src/components/diff/utils/Markdown.tsx b/src/components/diff/utils/Markdown.tsx index c6665efd..c6ca1517 100644 --- a/src/components/diff/utils/Markdown.tsx +++ b/src/components/diff/utils/Markdown.tsx @@ -1,80 +1,80 @@ -import React from 'react'; +import type React from 'react'; import ReactMarkdown from 'react-markdown'; import { ExternalLink } from '@/components/layout/ExternalLink'; export const Markdown: React.FC<{ content: string; codeSize?: string; className?: string }> = ({ - content, - codeSize, - className, + content, + codeSize, + className, }) => { - // --- Transform Content --- - const transformURLs = (content: string): string => { - // Define regex patterns for the different types of URLs we want to convert to named links. - const eipURLPattern = /(https:\/\/eips\.ethereum\.org\/EIPS\/eip-(\d+))/g; - const evmCodesURLPattern = /(https:\/\/www\.evm\.codes\/#([0-9a-fA-F]{2}))/g; - const githubIssueURLPattern = /(https:\/\/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+))/g; - const githubURLPattern = - /(https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/([^#]+)(?:#([^ ]+))?)/g; + // --- Transform Content --- + const transformURLs = (content: string): string => { + // Define regex patterns for the different types of URLs we want to convert to named links. + const eipURLPattern = /(https:\/\/eips\.ethereum\.org\/EIPS\/eip-(\d+))/g; + const evmCodesURLPattern = /(https:\/\/www\.evm\.codes\/#([0-9a-fA-F]{2}))/g; + const githubIssueURLPattern = /(https:\/\/github\.com\/([^/]+)\/([^/]+)\/issues\/(\d+))/g; + const githubURLPattern = + /(https:\/\/github\.com\/([^/]+)\/([^/]+)\/blob\/([^/]+)\/([^#]+)(?:#([^ ]+))?)/g; - // Do the conversions. - let matched = false; - const transformedContent: string = content - .replace(eipURLPattern, (_match, fullUrl, number) => { - matched = true; - return `[EIP-${number}](${fullUrl})`; - }) - .replace(evmCodesURLPattern, (_match, fullUrl, opcode) => { - matched = true; - return `[evm.codes, opcode \`0x${opcode}\`](${fullUrl})`; - }) - .replace(githubIssueURLPattern, (_match, fullUrl, user, repo, issueNumber) => { - matched = true; - return `[${user}/${repo}, Issue #${issueNumber}](${fullUrl})`; - }) - .replace(githubURLPattern, (_match, fullUrl, user, repo, commit, path, _line) => { - matched = true; - return `[${user}/${repo}, \`${path}@${commit.substring(0, 7)}\`](${fullUrl})`; - }); + // Do the conversions. + let matched = false; + const transformedContent: string = content + .replace(eipURLPattern, (_match, fullUrl, number) => { + matched = true; + return `[EIP-${number}](${fullUrl})`; + }) + .replace(evmCodesURLPattern, (_match, fullUrl, opcode) => { + matched = true; + return `[evm.codes, opcode \`0x${opcode}\`](${fullUrl})`; + }) + .replace(githubIssueURLPattern, (_match, fullUrl, user, repo, issueNumber) => { + matched = true; + return `[${user}/${repo}, Issue #${issueNumber}](${fullUrl})`; + }) + .replace(githubURLPattern, (_match, fullUrl, user, repo, commit, path, _line) => { + matched = true; + return `[${user}/${repo}, \`${path}@${commit.substring(0, 7)}\`](${fullUrl})`; + }); - if (matched) { - return transformedContent; - } + if (matched) { + return transformedContent; + } - // Add a fallback for any URLs that don't match the predefined patterns. - // We take care to avoid matching URLs that are already included in markdown style. - const fallbackPattern = /(? `[${fullUrl}](${fullUrl})` - ); - }; + // Add a fallback for any URLs that don't match the predefined patterns. + // We take care to avoid matching URLs that are already included in markdown style. + const fallbackPattern = /(? `[${fullUrl}](${fullUrl})`, + ); + }; - const transformedContent = transformURLs(content); + const transformedContent = transformURLs(content); - // --- Render --- - return ( - { - if (!href) return <>; - const isExternal = href.startsWith('http://') || href.startsWith('https://'); - if (isExternal) return {children}; - return ( - - {children} - - ); - }, - // Make sure all code blocks have a smaller font size because otherwise they look big - // relative to the text. - code: ({ node: _node, inline: _inline, ...props }) => ( - - ), - }} - > - {transformedContent} - - ); + // --- Render --- + return ( + { + if (!href) return <>; + const isExternal = href.startsWith('http://') || href.startsWith('https://'); + if (isExternal) return {children}; + return ( + + {children} + + ); + }, + // Make sure all code blocks have a smaller font size because otherwise they look big + // relative to the text. + code: ({ node: _node, inline: _inline, ...props }) => ( + + ), + }} + > + {transformedContent} + + ); }; diff --git a/src/components/diff/utils/RenderDiff.tsx b/src/components/diff/utils/RenderDiff.tsx index 2924d35b..b01c069c 100644 --- a/src/components/diff/utils/RenderDiff.tsx +++ b/src/components/diff/utils/RenderDiff.tsx @@ -1,11 +1,11 @@ // Shows content if present, or a message if there's no diff. export const RenderDiff = ({ content }: { content: JSX.Element }) => { - const children = content.props.children as (boolean | null | JSX.Element)[]; - const isEmpty = children.every((child) => child === false); + const children = content.props.children as (boolean | null | JSX.Element)[]; + const isEmpty = children.every((child) => child === false); - const EmptyDiff = () => ( -
    No differences found.
    - ); + const EmptyDiff = () => ( +
    No differences found.
    + ); - return !isEmpty ? content : ; + return !isEmpty ? content : ; }; diff --git a/src/components/diff/utils/format.tsx b/src/components/diff/utils/format.tsx deleted file mode 100644 index 5e5c20c1..00000000 --- a/src/components/diff/utils/format.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { MainnetHardfork } from '@/chains/mainnet/hardforks'; -import { CURRENT_OPTIMISM_HARDFORK, OptimismHardfork } from '@/chains/optimism/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; -import { classNames, toUppercase } from '@/lib/utils'; - -export const formatHardfork = (array: string[]): JSX.Element => { - if (!array || array.length == 0) { - return

    No information provided on supported hard forks.

    ; - } - - const first = array[0]; - const last = array[array.length - 1]; - const currentMainnetHardforkName = MainnetHardfork[CURRENT_MAINNET_HARDFORK]; - const currentOptimismHardforkName = OptimismHardfork[CURRENT_OPTIMISM_HARDFORK]; - if (array.length == 1) { - const supportedText = - first === currentMainnetHardforkName || first === currentOptimismHardforkName - ? `Supported since ${first} hard fork.` - : `Supported only in ${first} hard fork.`; - return ( -

    - {supportedText} -

    - ); - } - - const supportedText = - last === currentMainnetHardforkName || last === currentOptimismHardforkName - ? `Supported since ${first} hard fork.` - : `Supported between ${first} and ${last} hard forks.`; - return ( -

    - {supportedText} -

    - ); -}; - -export const formatStringList = (title: string, array: string[] | undefined): JSX.Element => { - if (array === undefined || array.length === 0) return <>; - return ( - <> -

    {toUppercase(title)}

    -
      - {array.map((v, id) => ( -
    • {toUppercase(v)}
    • - ))} -
    - - ); -}; diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index d2ec7b5b..b6de1323 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -1,107 +1,330 @@ -import { useState } from 'react'; -import { ChevronDownIcon } from '@heroicons/react/20/solid'; -import { chains } from '@/chains'; +import { useState, useEffect } from 'react'; +import type { Chain } from '@/../script/index'; +import { chainLogoUrl, classNames } from '@/lib/utils'; +import { ExternalLink } from '@/components/layout/ExternalLink'; +import { toUppercaseHex } from '@/lib/utils'; +import { deployedContracts } from '@/../script/checks/deployed-contracts'; +import { precompiles } from '@/../script/checks/precompiles'; +import { Copyable } from '@/components/ui/Copyable'; +import { evmStackAddresses, type EVMStackResult } from '@/../script/checks/evm-stack-addresses'; +import { knownOpcodes } from '@/../script/checks/opcodes'; +import { getAddress } from 'viem'; +import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; +import Image from 'next/image'; +import { BASE_DATA_URL, type Feature } from '@/lib/constants'; +import { FormattedAddress } from '@/lib/utils'; + +type Metadata = Chain['metadata']; +type Opcodes = Chain['opcodes']; +type DeployedContracts = Chain['deployedContracts']; +type Precompiles = Chain['precompiles']; +type EvmStackResults = Chain['evmStackAddresses']; + +const tbodyClasses = 'divide-y divide-zinc-200 dark:divide-zinc-600'; +const trClasses = 'bg-secondary group'; +const td1Classes = + 'text-primary text-center p-2 text-sm font-medium sticky z-10 left-0 bg-zinc-50 dark:bg-zinc-900'; +const td2Classes = 'text-primary px-3 py-4 text-center text-sm'; +const supportedClasses = 'bg-green-100/80 dark:bg-green-900/60'; +const unsupportedClasses = 'bg-red-100 dark:bg-red-900/80'; + +// TODO Dedupe this helper method +const formatStackHeader = (stack: keyof EvmStackResults) => { + if (stack === 'OP') return 'OP Stack'; + if (stack === 'Orbit') return 'Orbit'; + return stack; +}; + +const MetadataTable = ({ featureData }: { featureData: Record }) => { + return ( + + {/* Chain ID */} + + Chain ID + {Object.keys(featureData).map((chainId) => ( + + {featureData[chainId].chainId} + + ))} + + {/* Native Currency */} + + Native Currency + {Object.keys(featureData).map((chainId) => ( + + {`${featureData[chainId].nativeCurrency.name} (${featureData[chainId].nativeCurrency.symbol})`} + + ))} + + {/* Block Explorers */} + + Block Explorers + {Object.keys(featureData).map((chainId) => ( + + {featureData[chainId].explorers?.map((explorer) => ( +
    + +
    + ))} + + ))} + + + ); +}; + +const DeployedContractsTable = ({ + featureData, +}: { featureData: Record }) => { + return ( + + {deployedContracts.map((contract) => ( + + +
    {contract.name}
    + } + textToCopy={getAddress(contract.address)} + /> + + {Object.keys(featureData).map((chainId) => { + const contractData = featureData[chainId].find((c) => c.name === contract.name); + const bgColor = contractData + ? contractData.hasCode + ? supportedClasses + : unsupportedClasses + : ''; + return ( + + {contractData ? (contractData.hasCode ? 'Yes' : 'No') : 'Unknown'} + + ); + })} + + ))} + + ); +}; + +const PrecompilesTable = ({ featureData }: { featureData: Record }) => { + return ( + + {precompiles.map((precompile) => ( + + +
    {precompile.name}
    + } + textToCopy={getAddress(precompile.address)} + /> + + {Object.keys(featureData).map((chainId) => { + const precompileData = featureData[chainId].find((p) => p.name === precompile.name); + const bgColor = precompileData + ? precompileData.implemented + ? supportedClasses + : unsupportedClasses + : ''; + return ( + + {precompileData ? (precompileData.implemented ? 'Yes' : 'No') : 'Unknown'} + + ); + })} + + ))} + + ); +}; + +const OpcodesTable = ({ featureData }: { featureData: Record }) => { + return ( + + {Object.keys(knownOpcodes) + .map(Number) + .map((op: number) => ( + + + {knownOpcodes[op]} +
    {toUppercaseHex(op)}
    + + {Object.keys(featureData).map((chainId) => { + const opcode = featureData[chainId].find((opcode) => Number(opcode.number) === op); + const bgColor = opcode + ? opcode.supported + ? supportedClasses + : unsupportedClasses + : ''; + return ( + + {opcode ? (opcode.supported ? 'Yes' : 'No') : 'Unknown'} + + ); + })} + + ))} + + ); +}; + +const EvmStackAddressesTable = ({ + featureData, +}: { featureData: Record }) => { + const stacks = Object.keys(evmStackAddresses) as Array; + return ( + + {stacks.map((stack) => { + return evmStackAddresses[stack].map((account) => { + return ( + + +
    {formatStackHeader(stack)}
    +
    {account.name}
    + } + textToCopy={getAddress(account.address)} + /> + + {Object.keys(featureData).map((chainId) => { + const accountData = featureData[chainId][stack].find( + (a: EVMStackResult) => a.name === account.name, + ); + const bgColor = accountData + ? accountData.exists + ? supportedClasses + : unsupportedClasses + : ''; + return ( + + {accountData ? (accountData.exists ? 'Yes' : 'No') : 'Unknown'} + + ); + })} + + ); + }); + })} + + ); +}; export const FeatureTable = ({ - kind, - name, - className, -}: { - kind: string; - name: string; - className?: string; -}) => { - const chainsArray = Object.values(chains); - const supportData = chainsArray.map((chain) => { - if (kind === 'opcode') { - const opcode = chain.opcodes.find((op) => op.name?.toLowerCase() === name.toLowerCase()); - if (!opcode) return undefined; - return opcode.description?.includes('not supported') ? 'No' : 'Yes'; - } - }); - const adjustedChains = chainsArray.map((chain, i) => { - return { ...chain, supported: supportData[i] }; - }); - - // --- Sorting and filtering --- - const [sortField, setSortField] = useState(null as 'name' | 'col1' | null); - const [sortDirection, setSortDirection] = useState('ascending'); - - const onHeaderClick = (field: 'name' | 'col1') => { - if (sortField === field) { - setSortDirection(sortDirection === 'ascending' ? 'descending' : 'ascending'); - } else { - setSortField(field); - setSortDirection('ascending'); - } - }; - - const sortedChains = adjustedChains.sort((a, b) => { - // Don't change default sort order if sort field is null. - if (sortField === null) return 0; - let aValue: string | number = 0; - let bValue: string | number = 0; - - if (sortField === 'name') { - aValue = a.metadata.name.toLowerCase(); - bValue = b.metadata.name.toLowerCase(); - } else if (sortField === 'col1') { - aValue = a.supported?.toLowerCase() === 'true' ? 0 : 1; - bValue = b.supported?.toLowerCase() === 'true' ? 0 : 1; - } - - if (sortDirection === 'ascending') { - return aValue > bValue ? 1 : aValue < bValue ? -1 : 0; - } else { - return aValue < bValue ? 1 : aValue > bValue ? -1 : 0; - } - }); - - return ( -
    - - - - - - - - - {sortedChains.map((chain) => ( - - - - - ))} - -
    -
    onHeaderClick('name')} - > - Name - - -
    -
    -
    onHeaderClick('col1')} - > - Is {name} supported? - - -
    -
    - {chain.metadata.name} - - {chain.supported} -
    -
    - ); + feature, + featureMap, + className, +}: { feature: string; featureMap: Record; className?: string }) => { + const [metadata, setMetadata] = useState | null>(null); + const [featureData, setFeatureData] = useState< + | Record + | Record + | Record + | Record + | Record + | null + >(null); + + useEffect(() => { + const fetchData = async () => { + try { + const urls = [ + `${BASE_DATA_URL}/feature/metadata.json`, + `${BASE_DATA_URL}/feature/${feature}.json`, + ]; + + const [metadata, featureData] = await Promise.all( + urls.map(async (url) => { + const response = await fetch(url); + return response.json(); + }), + ); + + setMetadata(metadata); + setFeatureData(featureData); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, [feature]); + + if (!metadata || !featureData) return null; + + const renderTableBody = () => { + switch (feature) { + case 'metadata': + return } />; + case 'opcodes': + return } />; + case 'deployedContracts': + return ( + } /> + ); + case 'precompiles': + return } />; + case 'evmStackAddresses': + return ( + } /> + ); + default: + return null; + } + }; + + return ( +
    +
    +
    + + + + + {Object.keys(featureData).map((chainId) => { + return ( + + ); + })} + + + {renderTableBody()} +
    +
    + {feature === 'metadata' ? 'Property' : featureMap[feature].title.slice(0, -1)} +
    +
    +
    + +
    {metadata[chainId].name}
    + + + +
    +
    +
    +
    +
    + ); }; diff --git a/src/components/layout/ExternalLink.tsx b/src/components/layout/ExternalLink.tsx index 32002dbd..891eaacf 100644 --- a/src/components/layout/ExternalLink.tsx +++ b/src/components/layout/ExternalLink.tsx @@ -1,16 +1,16 @@ type Props = { - href: string; - className?: string; + href: string; + className?: string; } & ( - | { text: string; children?: never } - | { text?: never; children: JSX.Element } - | { text?: never; children: React.ReactNode } + | { text: string; children?: never } + | { text?: never; children: JSX.Element } + | { text?: never; children: React.ReactNode } ); export const ExternalLink = ({ href, className, text, children }: Props) => { - return ( - - {text || children} - - ); + return ( + + {text || children} + + ); }; diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index de715b3c..aecb2617 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -1,59 +1,14 @@ import { ExternalLink } from '@/components/layout/ExternalLink'; -import { ThemeSwitcher } from '@/components/layout/ThemeSwitcher'; -import { COMPANY_NAME, COMPANY_URL, GITHUB_URL, TWITTER_URL } from '@/lib/constants'; - -const navigation = [ - { - name: 'Twitter', - href: TWITTER_URL, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - icon: (props: any) => ( - - - - ), - }, - { - name: 'GitHub', - href: GITHUB_URL, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - icon: (props: any) => ( - - - - ), - }, -]; +import { COMPANY_NAME, COMPANY_URL } from '@/lib/constants'; export const Footer = () => { - const currentYear = new Date().getFullYear(); - return ( -
    -
    -
    -

    - © {currentYear} . All rights - reserved. -

    -
    - -
    - {navigation.map((item) => ( - - <> - {item.name} - - ))} -
    - - {} -
    -
    - ); + const currentYear = new Date().getFullYear(); + return ( +
    +
    + © {currentYear} . All rights + reserved. +
    +
    + ); }; diff --git a/src/components/layout/Head.tsx b/src/components/layout/Head.tsx index 63dc3aba..3ce3ed9a 100644 --- a/src/components/layout/Head.tsx +++ b/src/components/layout/Head.tsx @@ -1,54 +1,64 @@ import NextHead from 'next/head'; -import { NextRouter, useRouter } from 'next/router'; -import { getChainById } from '@/chains'; +import { type NextRouter, useRouter } from 'next/router'; +import { chainNameFromId } from '@/lib/utils'; +import { featureMap } from '@/lib/constants'; import { - COMPANY_URL, - OG_ENDPOINT, - SITE_DESCRIPTION, - SITE_NAME, - SITE_URL, - TWITTER_URL, + COMPANY_URL, + OG_ENDPOINT, + SITE_DESCRIPTION, + SITE_NAME, + SITE_URL, + TWITTER_URL, } from '@/lib/constants'; // Function to generate the query parameter string based on base and target values. const getRouteData = (router: NextRouter) => { - const defaultRouteData = { title: SITE_NAME, imageUrl: '' }; - const path = router.pathname; - if (path === '/diff') { - const { base, target } = router.query; - if (!base || !target) defaultRouteData; - - const baseTitle = getChainById(base as string)?.metadata.name; - const targetTitle = getChainById(target as string)?.metadata.name; - if (!baseTitle || !targetTitle) return defaultRouteData; - - const title = `${baseTitle} vs ${targetTitle} | ${SITE_NAME}`; - const imageUrl = `?base=${base}&target=${target}`; - return { title, imageUrl }; - } - return defaultRouteData; + const defaultRouteData = { title: SITE_NAME, imageUrl: '' }; + const path = router.pathname; + if (path === '/diff') { + const { base, target } = router.query; + if (!base || !target) defaultRouteData; + + const baseTitle = chainNameFromId(Number(base)); + const targetTitle = chainNameFromId(Number(target)); + if (!baseTitle || !targetTitle) return defaultRouteData; + + const title = `${baseTitle} vs. ${targetTitle} | ${SITE_NAME}`; + const imageUrl = `?base=${base}&target=${target}`; + return { title, imageUrl }; + } + + if (path === '/features') { + const { feature } = router.query; + if (!feature) return defaultRouteData; + + const title = `${featureMap[feature as string].title} Comparison | ${SITE_NAME}`; + return { title, imageUrl: '' }; + } + + return defaultRouteData; }; export const Head = () => { - const router = useRouter(); - const { title, imageUrl } = getRouteData(router); - const imgUrl = `${SITE_URL}${OG_ENDPOINT}${imageUrl}`; - - return ( - - {title} - - - - - - - - - - - - - - ); + const router = useRouter(); + const { title, imageUrl } = getRouteData(router); + const imgUrl = `${SITE_URL}${OG_ENDPOINT}${imageUrl}`; + + return ( + + {title} + + + + + + + + + + + + + + ); }; diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 2183852e..b2a06bdd 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -3,33 +3,73 @@ import Link from 'next/link'; import { useTheme } from 'next-themes'; import logoDark from 'public/logo-dark.png'; import logoLight from 'public/logo-light.png'; -import { COMPANY_NAME } from '@/lib/constants'; +import { COMPANY_NAME, GITHUB_URL, TWITTER_URL } from '@/lib/constants'; import { ExternalLink } from './ExternalLink'; +import { ThemeSwitcher } from '@/components/layout/ThemeSwitcher'; + +const navigation = [ + { + name: 'Twitter', + href: TWITTER_URL, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + icon: (props: any) => ( + + + + ), + }, + { + name: 'GitHub', + href: GITHUB_URL, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + icon: (props: any) => ( + + + + ), + }, +]; export const Header = () => { - const { resolvedTheme } = useTheme(); - const logo = resolvedTheme === 'light' ? logoDark.src : logoLight.src; - return ( -
    -
    - This site is under active development. Check out{' '} - {' '} - to help contribute. -
    -
    -
    -
    - - {COMPANY_NAME} - logo - -
    -
    -
    -
    - ); + const { resolvedTheme } = useTheme(); + const logo = resolvedTheme === 'light' ? logoDark.src : logoLight.src; + + return ( +
    + {/*
    + This site is under active development. Check out{' '} + {' '} + to help contribute. +
    */} + +
    +
    + + {COMPANY_NAME} + logo + +
    + +
    + {navigation.map((item) => ( + + <> + {item.name} + + ))} + {} +
    +
    +
    + ); }; diff --git a/src/components/layout/Layout.tsx b/src/components/layout/Layout.tsx index af814a92..1102543c 100644 --- a/src/components/layout/Layout.tsx +++ b/src/components/layout/Layout.tsx @@ -4,49 +4,49 @@ import { Header } from '@/components/layout/Header'; import { classNames } from '@/lib/utils'; interface Props { - children: JSX.Element; + children: JSX.Element; } export const Layout = ({ children }: Props) => { - const { route } = useRouter(); - const isHome = route === '/'; + const { route } = useRouter(); + const isHome = route === '/'; - return ( -
    -
    -
    - {children} -
    -
    - -
    - ); + return ( +
    +
    +
    + {children} +
    +
    + +
    + ); }; diff --git a/src/components/layout/ThemeSwitcher.tsx b/src/components/layout/ThemeSwitcher.tsx index a44dcb13..8840c571 100644 --- a/src/components/layout/ThemeSwitcher.tsx +++ b/src/components/layout/ThemeSwitcher.tsx @@ -3,16 +3,16 @@ import { MoonIcon, SunIcon } from '@heroicons/react/20/solid'; import { useTheme } from 'next-themes'; export const ThemeSwitcher = ({ className = '' }: { className?: string }) => { - const { resolvedTheme, setTheme } = useTheme(); + const { resolvedTheme, setTheme } = useTheme(); - const toggleTheme = useCallback(() => { - setTheme(resolvedTheme === 'light' ? 'dark' : 'light'); - }, [resolvedTheme, setTheme]); + const toggleTheme = useCallback(() => { + setTheme(resolvedTheme === 'light' ? 'dark' : 'light'); + }, [resolvedTheme, setTheme]); - return ( - - ); + return ( + + ); }; diff --git a/src/components/ui/BaseCombobox.tsx b/src/components/ui/BaseCombobox.tsx index f419cdfa..0b91199c 100644 --- a/src/components/ui/BaseCombobox.tsx +++ b/src/components/ui/BaseCombobox.tsx @@ -4,111 +4,111 @@ import { CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid'; import { classNames } from '@/lib/utils'; type Option = { - name: string; - isHeader?: boolean; - [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any + name: string; + isHeader?: boolean; + [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any }; export const BaseCombobox = ({ - label, - options, - value, - onChange, - className, + label, + options, + value, + onChange, + className, }: { - label: string; - options: Option[]; - value: Option; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChange: (opt: any) => void; - className?: string; + label: string; + options: Option[]; + value: Option; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onChange: (opt: any) => void; + className?: string; }) => { - const [query, setQuery] = useState(''); - const [option, setOption] = useState(value); + const [query, setQuery] = useState(''); + const [option, setOption] = useState(value); - useEffect(() => { - setOption(value); - }, [value]); + useEffect(() => { + setOption(value); + }, [value]); - const filteredOpts = - query === '' - ? options - : options.filter((opt) => { - return ( - opt.name.toLowerCase().includes(query.toLowerCase()) || - (opt.kind && String(opt.kind).toLowerCase().includes(query.toLowerCase())) - ); - }); + const filteredOpts = + query === '' + ? options + : options.filter((opt) => { + return ( + opt.name.toLowerCase().includes(query.toLowerCase()) || + (opt.kind && String(opt.kind).toLowerCase().includes(query.toLowerCase())) + ); + }); - return ( - { - setOption(val); - onChange(val); - }} - > - - {label} - -
    - setQuery(event.target.value)} - displayValue={(opt: Option) => opt.name} - /> + return ( + { + setOption(val); + onChange(val); + }} + > + + {label} + +
    + setQuery(event.target.value)} + displayValue={(opt: Option) => opt.name} + /> - - + + - {filteredOpts.length > 0 && ( - - {filteredOpts.map((opt, index) => ( - - classNames( - 'relative cursor-pointer select-none py-2 pl-3 pr-9', - active ? 'text-primary bg-green-600/10 dark:bg-green-500/10' : 'text-primary' - ) - } - > - {({ active, selected }) => ( - <> -
    - - {opt.name} - -
    + {filteredOpts.length > 0 && ( + + {filteredOpts.map((opt) => ( + + classNames( + 'relative cursor-pointer select-none py-2 pl-3 pr-9', + active ? 'text-primary bg-green-600/10 dark:bg-green-500/10' : 'text-primary', + ) + } + > + {({ active, selected }) => ( + <> +
    + + {opt.name} + +
    - {selected && ( - - - )} - - )} -
    - ))} -
    - )} -
    -
    - ); + {selected && ( + + + )} + + )} + + ))} + + )} +
    +
    + ); }; diff --git a/src/components/ui/ChainDiffSelectorChainCombobox.tsx b/src/components/ui/ChainDiffSelectorChainCombobox.tsx index 1565c0ad..8f405a9d 100644 --- a/src/components/ui/ChainDiffSelectorChainCombobox.tsx +++ b/src/components/ui/ChainDiffSelectorChainCombobox.tsx @@ -3,100 +3,111 @@ import Image from 'next/image'; import { Combobox } from '@headlessui/react'; import { CheckIcon, ChevronUpDownIcon } from '@heroicons/react/20/solid'; import { chainLogoUrl, classNames } from '@/lib/utils'; -import { Chain } from '@/types'; + +interface Chain { + name: string; + chainId: number; +} interface Props { - label: string; - chains: Chain[]; - value: Chain; - onChange: (chain: Chain) => void; + label: string; + chains: Chain[]; + value: Chain; + onChange: (chain: Chain) => void; } export const ChainDiffSelectorChainCombobox = ({ label, chains, value, onChange }: Props) => { - const [query, setQuery] = useState(''); - const [chain, setChain] = useState(value); + const [query, setQuery] = useState(''); + const [chain, setChain] = useState(value); - useEffect(() => { - setChain(value); - }, [value]); + useEffect(() => { + setChain(value); + }, [value]); - const filteredChains = - query === '' - ? chains - : chains.filter((chain) => { - return ( - chain.metadata.name.toLowerCase().includes(query.toLowerCase()) || - chain.metadata.id.toString().includes(query.toLowerCase()) - ); - }); + const filteredChains = + query === '' + ? chains + : chains.filter((chain) => { + return ( + chain.name.toLowerCase().includes(query.toLowerCase()) || + chain.chainId.toString().includes(query.toLowerCase()) + ); + }); - return ( - { - setChain(val); - onChange(val); - }} - > - - {label} - -
    - setQuery(event.target.value)} - displayValue={(chain: Chain) => chain?.metadata.name} - /> - - + return ( + { + setChain(val); + onChange(val); + }} + > + + {label} + +
    + + setQuery(event.target.value)} + displayValue={(chain: Chain) => chain.name} + /> + + - {filteredChains.length > 0 && ( - - {filteredChains.map((chain) => ( - - classNames( - 'relative cursor-pointer select-none py-2 pl-3 pr-9', - active ? 'text-primary bg-green-600/10 dark:bg-green-500/10' : 'text-primary' - ) - } - > - {({ active, selected }) => ( - <> -
    - - - {chain.metadata.name} - -
    + {filteredChains.length > 0 && ( + + {filteredChains.map((chain) => ( + + classNames( + 'relative cursor-pointer select-none py-2 pl-3 pr-9', + active ? 'text-primary bg-green-600/10 dark:bg-green-500/10' : 'text-primary', + ) + } + > + {({ active, selected }) => ( + <> +
    + + + {chain.name} + +
    - {selected && ( - - - )} - - )} -
    - ))} -
    - )} -
    -
    - ); + {selected && ( + + + )} + + )} + + ))} + + )} +
    +
    + ); }; diff --git a/src/components/ui/Copyable.tsx b/src/components/ui/Copyable.tsx index bd8d1bf4..7ec67816 100644 --- a/src/components/ui/Copyable.tsx +++ b/src/components/ui/Copyable.tsx @@ -1,52 +1,59 @@ import { useState } from 'react'; import { ClipboardDocumentIcon } from '@heroicons/react/24/outline'; -import { classNames, copyToClipboard } from '@/lib/utils'; +import { classNames } from '@/lib/utils'; import { Tooltip } from './Tooltip'; // When content is a string, `textToCopy` is optional. interface ContentStringProps { - content: string; - textToCopy?: string; - Icon?: typeof ClipboardDocumentIcon; - className?: string; + content: string; + textToCopy?: string; + Icon?: typeof ClipboardDocumentIcon; + className?: string; } // When text is a JSX element, `textToCopy` is required. interface ContentElementProps { - content: JSX.Element; - textToCopy: string; - Icon?: typeof ClipboardDocumentIcon; - className?: string; + content: JSX.Element; + textToCopy: string; + Icon?: typeof ClipboardDocumentIcon; + className?: string; } export const Copyable = ({ - content, - textToCopy, - Icon = ClipboardDocumentIcon, - className = '', + content, + textToCopy, + Icon = ClipboardDocumentIcon, + className = '', }: ContentStringProps | ContentElementProps) => { - const [isShowing, setIsShowing] = useState(false); + const [isShowing, setIsShowing] = useState(false); - const onCopy = (text: string) => { - setIsShowing(true); - copyToClipboard(text); - setTimeout(() => setIsShowing(false), 1000); - }; + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text).then( + () => {}, + (err) => console.error('Could not copy text to clipboard: ', err), + ); + }; - return ( -
    -
    - {content} - onCopy(String(textToCopy || content))} - className='ml-2 h-4 cursor-pointer opacity-0 transition-opacity group-hover:opacity-100' - /> -
    -
    - -
    -
    - ); + const onCopy = (text: string) => { + setIsShowing(true); + copyToClipboard(text); + setTimeout(() => setIsShowing(false), 1000); + }; + + return ( +
    +
    + {content} + onCopy(String(textToCopy || content))} + className="ml-2 h-4 cursor-pointer opacity-0 transition-opacity group-hover:opacity-100" + /> +
    +
    + +
    +
    + ); }; diff --git a/src/components/ui/LoadingSpinner.tsx b/src/components/ui/LoadingSpinner.tsx index 95166c6a..cd21fff6 100644 --- a/src/components/ui/LoadingSpinner.tsx +++ b/src/components/ui/LoadingSpinner.tsx @@ -1,27 +1,27 @@ export const LoadingSpinner = () => { - return ( -
    - - - - -
    - ); + return ( +
    + + + + +
    + ); }; diff --git a/src/components/ui/Toggle.tsx b/src/components/ui/Toggle.tsx index 79373330..d55ec85b 100644 --- a/src/components/ui/Toggle.tsx +++ b/src/components/ui/Toggle.tsx @@ -1,34 +1,70 @@ -import { Switch } from '@headlessui/react'; +import { Tab } from '@headlessui/react'; import { classNames } from '@/lib/utils'; +import { useRouter } from 'next/router'; type Props = { - enabled: boolean; - setEnabled: (enabled: boolean) => void; - label: string; + enabled: boolean; + setEnabled: (enabled: boolean) => void; + enabledText: string; + disabledText: string; + queryParamName?: string; }; -export const Toggle = ({ enabled, setEnabled, label }: Props) => { - return ( - - - - - {label} - - - ); +export const Toggle = ({ + enabled, + setEnabled, + enabledText, + disabledText, + queryParamName, +}: Props) => { + const router = useRouter(); + + const setQueryParam = (newValue: boolean) => { + if (!queryParamName) return; + + const currentQueryParams = router.query; + const isParamPresent = Object.prototype.hasOwnProperty.call(currentQueryParams, queryParamName); + const newQueryParams = { ...currentQueryParams, [queryParamName]: newValue.toString() }; + + if (isParamPresent && currentQueryParams[queryParamName] === newValue.toString()) return; + router.replace({ pathname: router.pathname, query: newQueryParams }); + }; + + const onChange = (index: number) => { + setEnabled(index === 0); + setQueryParam(index === 0); + }; + + return ( +
    + onChange(index)}> + + + classNames( + selected + ? 'bg-zinc-50 text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' + : 'text-zinc-500 hover:bg-zinc-50/[0.12] hover:text-zinc-600 dark:text-zinc-500 dark:hover:bg-zinc-700 dark:hover:text-zinc-300', + 'rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-200 ease-in-out', + ) + } + > + {enabledText} + + + classNames( + selected + ? 'bg-zinc-50 text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' + : 'text-zinc-500 hover:bg-zinc-50/[0.12] hover:text-zinc-600 dark:text-zinc-500 dark:hover:bg-zinc-700 dark:hover:text-zinc-300', + 'rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-200 ease-in-out', + ) + } + > + {disabledText} + + + +
    + ); }; diff --git a/src/components/ui/Tooltip.tsx b/src/components/ui/Tooltip.tsx index 4ec3e088..c3ad6c1e 100644 --- a/src/components/ui/Tooltip.tsx +++ b/src/components/ui/Tooltip.tsx @@ -1,20 +1,20 @@ import { InformationCircleIcon } from '@heroicons/react/20/solid'; export const Tooltip = ({ - text, - showIcon = true, - width = 24, + text, + showIcon = true, + width = 24, }: { - text: string; - showIcon?: boolean; - width?: number; + text: string; + showIcon?: boolean; + width?: number; }) => { - return ( -
    - {showIcon && } - - {text} - -
    - ); + return ( +
    + {showIcon && } + + {text} + +
    + ); }; diff --git a/src/lib/chains.json b/src/lib/chains.json new file mode 100644 index 00000000..f95d8502 --- /dev/null +++ b/src/lib/chains.json @@ -0,0 +1,11 @@ +[ + { "chainId": 1, "name": "Ethereum Mainnet" }, + { "chainId": 10, "name": "OP Mainnet" }, + { "chainId": 137, "name": "Polygon Mainnet" }, + { "chainId": 34443, "name": "Mode" }, + { "chainId": 42161, "name": "Arbitrum One" }, + { "chainId": 43114, "name": "Avalanche C-Chain" }, + { "chainId": 534352, "name": "Scroll" }, + { "chainId": 59144, "name": "Linea" }, + { "chainId": 8453, "name": "Base" } +] diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 77a3e326..654dfb7f 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -2,18 +2,42 @@ export const SITE_NAME = 'EVM Diff'; export const SITE_DESCRIPTION = 'Diff EVM-compatible chains'; export const SITE_URL = - process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : 'https://www.evmdiff.com'; + process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : 'https://www.evmdiff.com'; export const OG_ENDPOINT = '/api/og'; // For reference, see `src/pages/og.tsx`. export const COMPANY_NAME = 'Matt Solomon'; export const COMPANY_URL = 'https://twitter.com/msolomon44'; export const GITHUB_URL = 'https://github.com/mds1/evm-diff'; export const TWITTER_URL = 'https://twitter.com/msolomon44'; -// -------- Data and References -------- -export { CURRENT_MAINNET_HARDFORK } from '@/chains/mainnet/hardforks'; +// -------- Other Data -------- +const BRANCH_NAME = process.env.NEXT_PUBLIC_BRANCH_NAME; +export const BASE_DATA_URL = `https://raw.githubusercontent.com/mds1/evm-diff/${BRANCH_NAME}/script/data`; -// All opcodes are linked to their implementation in https://github.com/ethereum/execution-specs. -// To avoid broken links, our links are referenced to a commit hash (there's no releases or tags). -export const ETHEREUM_EXECUTION_SPECS_URL = 'https://github.com/ethereum/execution-specs'; -export const ETHEREUM_EXECUTION_SPECS_COMMIT_ID = '87f5e4f5ec03c6a23b2d2cd909482664f870fd1e'; -export const EVM_OPCODES_URL = 'https://www.evm.codes'; +// This defines the source of truth for the data that is shown/hidden on the website. +export interface Feature { + title: string; + infoText?: string; + hide?: boolean; +} + +export const featureMap: Record = { + metadata: { title: 'Metadata' }, + opcodes: { + title: 'Opcodes', + infoText: 'Whether or not standard opcodes are supported.', + }, + deployedContracts: { + title: 'Deployed Contracts', + infoText: 'Whether common utility contracts used by developers and users exist.', + }, + precompiles: { + title: 'Precompiles', + infoText: 'Whether or not standard precompiles are supported.', + }, + evmStackAddresses: { + title: 'EVM Stack Addresses', + infoText: + 'Existence of "stack-specific" accounts on a chain, to determine what kind of chain it is. If an account exists on both chains but shows up in the diff, it indicates the code hash is different. This does not necessarily mean the contract is different.', + hide: true, // TODO refactor this into a summary of what stack/config is used, instead of showing all stack addresses. + }, +}; diff --git a/src/lib/features.json b/src/lib/features.json new file mode 100644 index 00000000..3627c3f5 --- /dev/null +++ b/src/lib/features.json @@ -0,0 +1,7 @@ +[ + { "feature": "deployedContracts" }, + { "feature": "evmStackAddresses" }, + { "feature": "metadata" }, + { "feature": "opcodes" }, + { "feature": "precompiles" } +] diff --git a/src/lib/opcodes.ts b/src/lib/opcodes.ts deleted file mode 100644 index 9bdc3087..00000000 --- a/src/lib/opcodes.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { MainnetHardfork } from '@/chains/mainnet/hardforks'; -import { - ETHEREUM_EXECUTION_SPECS_COMMIT_ID, - ETHEREUM_EXECUTION_SPECS_URL, - EVM_OPCODES_URL, -} from './constants'; - -export enum OpcodeGroup { - Arithmetic = 'arithmetic', - Bitwise = 'bitwise', - Block = 'block', - Comparison = 'comparison', - ControlFlow = 'control_flow', - Environment = 'environment', - Keccak = 'keccak', - Log = 'log', - Memory = 'memory', - Stack = 'stack', - Storage = 'storage', - System = 'system', -} - -// Returns a hex string (without the '0x' prefix) padded to 2 characters. -const formatOpcodeNumber = (n: number): string => n.toString(16).padStart(2, '0'); - -// Returns a link to the Ethereum execution specs for the given hardfork, opcode, and line number. -export const ethSpecsOpcodeSrc = ( - hardfork: MainnetHardfork, - group: OpcodeGroup, - line: number -): string => - `${ETHEREUM_EXECUTION_SPECS_URL}/blob/${ETHEREUM_EXECUTION_SPECS_COMMIT_ID}/src/ethereum/${MainnetHardfork[ - hardfork - ].toLowerCase()}/vm/instructions/${group}.py#L${line}`; - -export const evmCodesOpcodesLink = (opcodeNumber: number): string => - `${EVM_OPCODES_URL}/#${formatOpcodeNumber(opcodeNumber)}`; - -export const evmCodesPlaygroundLink = (codeParam: string): string => - `${EVM_OPCODES_URL}/playground?unit=Wei&codeType=Mnemonic&code=${codeParam}`; diff --git a/src/lib/utils.ts b/src/lib/utils.ts deleted file mode 100644 index 7fe6eb45..00000000 --- a/src/lib/utils.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { pad } from 'viem'; -import { Chain } from '@/types'; - -// Takes an arbitrary number of class names, filtering out any falsey values. -export const classNames = (...classes: (string | boolean)[]) => classes.filter(Boolean).join(' '); - -// Copies the provided text to the clipboard -export const copyToClipboard = (text: string) => { - navigator.clipboard.writeText(text).then( - () => {}, - (err) => console.error('Could not copy text to clipboard: ', err) - ); -}; - -// Given a `record` (i.e. an object), return an array of its values sorted by the given `field`. -// Make sure the field is a number or string or the sort behavior based on `>` and `<` may be -// undefined. -export const sortedArrayByField = ( - record: Record, - field: K -): U[] => { - return (Object.values(record) as U[]).sort((a, b) => { - if (a[field] > b[field]) return 1; - if (a[field] < b[field]) return -1; - return 0; - }); -}; - -// Given a `record` (i.e. an object), return an array of its values sorted by the given `fields`, -// in the order specified. -// Make sure the field is a number or string or the sort behavior based on `>` and `<` may be -// undefined. -export const sortedArrayByFields = ( - record: Record, - fields: K[] -): U[] => { - return (Object.values(record) as U[]).sort((a, b) => { - for (const field of fields) { - if (a[field] > b[field]) return 1; - if (a[field] < b[field]) return -1; - } - return 0; - }); -}; - -// Returns a hex string with a leading `0x` and padded to 2 characters. -export const formatPrefixByte = (prefix: number) => { - return pad(`0x${prefix.toString(16).toUpperCase()}`, { size: 1 }); -}; - -export const toUppercase = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - -export const chainLogoUrl = (chain: Chain) => { - if (chain.metadata.id === 42161) return 'https://icons.llamao.fi/icons/chains/rsz_arbitrum.jpg'; - return `https://icons.llamao.fi/icons/chains/rsz_${chain.metadata.name.toLowerCase()}.jpg`; -}; diff --git a/src/lib/utils.tsx b/src/lib/utils.tsx new file mode 100644 index 00000000..c43c4332 --- /dev/null +++ b/src/lib/utils.tsx @@ -0,0 +1,30 @@ +import { getAddress, pad, type Address } from 'viem'; +import chains from '@/lib/chains.json'; + +// Takes an arbitrary number of class names, filtering out any falsey values. +export const classNames = (...classes: (string | boolean)[]) => classes.filter(Boolean).join(' '); + +// Returns a hex string with a leading `0x` and padded to 2 characters. +export const toUppercaseHex = (prefix: number) => { + return pad(`0x${prefix.toString(16).toUpperCase()}`, { size: 1 }); +}; + +// Given a chain object, returns the URL of the chain's logo. +export const chainLogoUrl = (chain: { name: string; chainId: number }) => { + if (chain.chainId === 1) return 'https://icons.llamao.fi/icons/chains/rsz_ethereum.jpg'; + if (chain.chainId === 137) return 'https://icons.llamao.fi/icons/chains/rsz_polygon.jpg'; + if (chain.chainId === 42161) return 'https://icons.llamao.fi/icons/chains/rsz_arbitrum.jpg'; + if (chain.chainId === 43114) return 'https://icons.llamao.fi/icons/chains/rsz_avalanche.jpg'; + return `https://icons.llamao.fi/icons/chains/rsz_${chain.name.toLowerCase()}.jpg`; +}; + +export const chainNameFromId = (chainId: number) => { + if (!chainId) return undefined; + const chain = chains.find((chain) => chain.chainId === chainId); + return chain?.name; +}; + +export const FormattedAddress = ({ addr, className }: { addr: Address; className?: string }) => { + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; +}; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index f3ee81ee..4efb07de 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -10,21 +10,21 @@ import '@/styles/globals.css'; const font = Open_Sans({ subsets: ['latin'] }); function App({ Component, pageProps }: AppProps) { - const [mounted, setMounted] = React.useState(false); - React.useEffect(() => setMounted(true), []); - return ( - - - {mounted && ( - -
    - - -
    -
    - )} -
    - ); + const [mounted, setMounted] = React.useState(false); + React.useEffect(() => setMounted(true), []); + return ( + + + {mounted && ( + +
    + + +
    +
    + )} +
    + ); } export default App; diff --git a/src/pages/api/og.tsx b/src/pages/api/og.tsx index 6eabfc59..43361410 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -1,224 +1,65 @@ -import { NextRequest } from 'next/server'; +import type { NextRequest } from 'next/server'; import { ImageResponse } from '@vercel/og'; -import { getAddress } from 'viem'; -import { getChainById } from '@/chains'; -import { convertToComparableOpcode } from '@/components/diff/DiffOpcodes'; import { SITE_DESCRIPTION } from '@/lib/constants'; -import { Chain, Opcode, Precompile, Predeploy, SignatureType } from '@/types'; export const config = { - runtime: 'edge', + runtime: 'edge', }; -type Comparator = (a: T, b: T) => boolean; -type ObjectKeyExtractor = (item: T) => string | number; - -function countDifferences( - base: T[], - target: T[], - getKey: ObjectKeyExtractor, - isEqual: Comparator -): number { - const sortedKeys = [...base.map(getKey), ...target.map(getKey)].sort((a, b) => { - if (typeof a === 'string' && typeof b === 'string') { - return a.localeCompare(b); - } else if (typeof a === 'number' && typeof b === 'number') { - return a - b; - } else { - throw new Error('Invalid key types for sorting.'); - } - }); - const keys = [...new Set(sortedKeys)]; - - return keys.reduce((count: number, key: string | number) => { - const baseItem = base.find((item) => getKey(item) === key); - const targetItem = target.find((item) => getKey(item) === key); - if (!baseItem || !targetItem) { - count++; - return count; - } - - if (!isEqual(baseItem, targetItem)) { - count++; - } - return count; - }, 0); -} - -const countPrecompilesDiff = (base: Precompile[], target: Precompile[]): number => { - const getKey = (p: Precompile) => getAddress(p.address); - const isEqual = (a: Precompile, b: Precompile) => JSON.stringify(a) === JSON.stringify(b); - return countDifferences(base, target, getKey, isEqual); -}; - -const countPredeployDiffs = (base: Predeploy[], target: Predeploy[]): number => { - const getKey = (p: Predeploy) => getAddress(p.address); - const isEqual = (a: Predeploy, b: Predeploy) => JSON.stringify(a) === JSON.stringify(b); - return countDifferences(base, target, getKey, isEqual); -}; - -const countOpcodeDiffs = (base: Opcode[], target: Opcode[]): number => { - const getKey = (o: Opcode) => o.number; - const isEqual = (a: Opcode, b: Opcode) => - JSON.stringify(convertToComparableOpcode(a)) === JSON.stringify(convertToComparableOpcode(b)); - return countDifferences(base, target, getKey, isEqual); -}; - -const countSignatureTypeDiffs = (base: SignatureType[], target: SignatureType[]): number => { - const getKey = (s: SignatureType) => s.prefixByte; - const isEqual = (a: SignatureType, b: SignatureType) => JSON.stringify(a) === JSON.stringify(b); - return countDifferences(base, target, getKey, isEqual); -}; - -export default async function handler(request: NextRequest) { - const getLogoImageData = async () => { - return await fetch(new URL('public/logo-dark-tight.png', import.meta.url)).then((res) => - res.arrayBuffer() - ); - }; - const generateDefaultImage = async () => { - const imageData = await getLogoImageData(); - return new ImageResponse( - ( -
    -

    - {/* +export default async function handler(_request: NextRequest) { + const getLogoImageData = async () => { + return await fetch(new URL('public/logo-dark-tight.png', import.meta.url)).then((res) => + res.arrayBuffer(), + ); + }; + + const generateDefaultImage = async () => { + const imageData = await getLogoImageData(); + return new ImageResponse( +
    +

    + {/* Temporarily disable eslint: warnings around using `img` over the NextImage, and TS errors with `Type 'ArrayBuffer' is not assignable to type 'string'`, but this does works and is recommended in the NextJS docs: https://vercel.com/docs/concepts/functions/edge-functions/og-image-generation/og-image-examples#using-a-local-image */} - {/* eslint-disable */} - {/* @ts-ignore */} - - {/* eslint-enable */} -

    -

    -

    {SITE_DESCRIPTION}

    -

    -
    - ), - { - width: 1200, - height: 630, - } - ); - }; - - const generateDiffImage = async (baseChain: Chain, targetChain: Chain) => { - const imageData = await getLogoImageData(); - - const precompileDiffs = countPrecompilesDiff(baseChain.precompiles, targetChain.precompiles); - const predeployDiffs = countPredeployDiffs(baseChain.predeploys, targetChain.predeploys); - const opcodeDiffs = countOpcodeDiffs( - baseChain.opcodes as Opcode[], - targetChain.opcodes as Opcode[] - ); - const signatureTypeDiffs = countSignatureTypeDiffs( - baseChain.signatureTypes, - targetChain.signatureTypes - ); - const totalDiffs = precompileDiffs + predeployDiffs + opcodeDiffs + signatureTypeDiffs; - - return new ImageResponse( - ( -
    - {/* - Temporarily disable eslint: warnings around using `img` over the NextImage, and TS - errors with `Type 'ArrayBuffer' is not assignable to type 'string'`, but this does - works and is recommended in the NextJS docs: https://vercel.com/docs/concepts/functions/edge-functions/og-image-generation/og-image-examples#using-a-local-image - */} - {/* eslint-disable */} - {/* @ts-ignore */} - - {/* eslint-enable */} -

    - {`${totalDiffs} difference${totalDiffs !== 1 ? 's' : ''} between ${ - baseChain.metadata.name - } and ${targetChain.metadata.name}`} -

    - -
    -
      -
    • {`Precompiles: ${precompileDiffs} differences`}
    • -
    • {`Predeploys: ${predeployDiffs} differences`}
    • -
    • {`Opcodes: ${opcodeDiffs} differences`}
    • -
    • {`SignatureTypes: ${signatureTypeDiffs} differences`}
    • -
    -
    -
    - ), - { - width: 1200, - height: 630, - } - ); - }; - - try { - const { searchParams } = request.nextUrl; - const base = searchParams.get('base'); // ?base= - const target = searchParams.get('target')?.slice(0, 100); // ?target= - if (!base || !target) return generateDefaultImage(); - - const baseChain = getChainById(base as string); - if (baseChain === undefined) return generateDefaultImage(); - - const targetChain = getChainById(target as string); - if (targetChain === undefined) return generateDefaultImage(); - - return await generateDiffImage(baseChain, targetChain); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (e: any) { - console.log(`OG image generation failed with error: ${e.message}`); - return generateDefaultImage(); - } + {/* eslint-disable */} + {/* @ts-ignore */} + + {/* eslint-enable */} +

    +

    +

    {SITE_DESCRIPTION}

    +

    +
    , + { + width: 1200, + height: 630, + }, + ); + }; + + return generateDefaultImage(); } diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 60dcdb26..822e3b0b 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,145 +1,245 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; -import { LinkIcon } from '@heroicons/react/20/solid'; -import { getChainById } from '@/chains'; +import { LinkIcon, ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; +import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; -import { DiffAccountTypes } from '@/components/diff/DiffAccountTypes'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; -import { DiffEIPs } from '@/components/diff/DiffEIPs'; -import { DiffMempools } from '@/components/diff/DiffMempools'; +import { DiffEVMStackAddresses } from '@/components/diff/DiffEVMStackAddresses'; +import { DiffJSON } from '@/components/diff/DiffJSON'; import { DiffMetadata } from '@/components/diff/DiffMetadata'; -import { DiffNodes } from '@/components/diff/DiffNodes'; import { DiffOpcodes } from '@/components/diff/DiffOpcodes'; import { DiffPrecompiles } from '@/components/diff/DiffPrecompiles'; -import { DiffPredeploys } from '@/components/diff/DiffPredeploys'; -import { DiffSignatureTypes } from '@/components/diff/DiffSignatureTypes'; import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; -import { classNames } from '@/lib/utils'; -import { Chain } from '@/types'; +import { chainLogoUrl } from '@/lib/utils'; +import Image from 'next/image'; +import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; +import { BASE_DATA_URL, featureMap } from '@/lib/constants'; interface Props { - base: T; - target: T; - onlyShowDiff: boolean; + base: T; + target: T; + onlyShowDiff: boolean; } -interface Section { - title: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - component: React.ComponentType>; - hide?: boolean; -} - -const SECTION_MAP: Record = { - metadata: { title: 'Metadata', component: DiffMetadata }, - precompiles: { title: 'Precompiles', component: DiffPrecompiles }, - predeploys: { title: 'Predeploys', component: DiffPredeploys }, - signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, - accountTypes: { title: 'Account Types', component: DiffAccountTypes }, - opcodes: { title: 'Opcodes', component: DiffOpcodes }, - mempools: { title: 'Mempools', component: DiffMempools }, - deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, - eips: { title: 'Execution EIPs', component: DiffEIPs }, - executionNodes: { title: 'Execution Nodes', component: DiffNodes }, - consensusNodes: { title: 'Consensus Nodes', component: DiffNodes, hide: true }, // Hidden to scope UI to execution data +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const componentMap: Record>> = { + metadata: DiffMetadata, + opcodes: DiffOpcodes, + deployedContracts: DiffDeployedContracts, + precompiles: DiffPrecompiles, + evmStackAddresses: DiffEVMStackAddresses, + // signatureTypes: DiffSignatureTypes , }; const Diff = () => { - // -------- Parse query parameters -------- - const router = useRouter(); - const { base, target } = router.query; - - const baseChain = getChainById(base as string); - const targetChain = getChainById(target as string); - - const ErrorDiv = () => ( -
    -

    Oops!

    -

    - Invalid chain(s) provided, please try again below. -

    -
    - -
    -
    - ); - - // -------- Show diff -------- - - const [onlyShowDiff, setOnlyShowDiff] = useState(true); - - const SectionComponent = ({ - section, - base, - target, - onlyShowDiff, - }: { - section: string; - base: Chain[keyof Chain]; - target: Chain[keyof Chain]; - onlyShowDiff: boolean; - }) => { - const Component = SECTION_MAP[section].component; - return ; - }; - - // We take `baseChain` and `targetChain` as arguments to ensure that they are not `undefined` - // and remove the need for `?` and `!` operators. - const DiffDiv = ({ baseChain, targetChain }: { baseChain: Chain; targetChain: Chain }) => { - const sections = Object.keys(baseChain); - return ( - <> -
    - - - {/* Show chain names at top */} -
    -
    -
    {baseChain.metadata.name}
    -
    {targetChain.metadata.name}
    -
    - - {/* Show content */} - {sections.map((section, index) => { - const hideComponent = SECTION_MAP[section].hide; - if (hideComponent) return <>; - - const base = baseChain[section as keyof Chain]; - const target = targetChain[section as keyof Chain]; - return ( -
    - {/* Header */} - - - {/* Diff */} - -
    - ); - })} -
    - - ); - }; - - return ( -
    - {(!baseChain || !targetChain) && } - {baseChain && targetChain && } -
    - ); + // -------- Parse query parameters -------- + const router = useRouter(); + const { + base, + target, + onlyShowDiff: onlyShowDiffParam, + showPrettyDiff: showPrettyDiffParam, + } = router.query; + + const [loading, setLoading] = useState(true); + const [baseChain, setBaseChain] = useState(null); + const [targetChain, setTargetChain] = useState(null); + const [onlyShowDiff, setOnlyShowDiff] = useState(true); + const [showPrettyDiff, setShowPrettyDiff] = useState(true); + + useEffect(() => { + if (!base || !target) { + setLoading(false); + return; + } + + if (onlyShowDiffParam !== undefined) setOnlyShowDiff(onlyShowDiffParam === 'true'); + if (showPrettyDiffParam !== undefined) setShowPrettyDiff(showPrettyDiffParam === 'true'); + + const fetchData = async () => { + try { + const urls = [ + `${BASE_DATA_URL}/chain/${base}.json`, + `${BASE_DATA_URL}/chain/${target}.json`, + ]; + + const chainData = await Promise.all( + urls.map(async (url) => { + const response = await fetch(url); + return response.json(); + }), + ); + + setBaseChain(chainData[0]); + setTargetChain(chainData[1]); + setLoading(false); + } catch (error) { + console.error('Error fetching data:', error); + setLoading(false); + } + }; + + fetchData(); + }, [base, target, onlyShowDiffParam, showPrettyDiffParam]); + + const ErrorDiv = () => ( +
    +

    Oops!

    +

    + Invalid chain(s) provided, please try again below. +

    +
    + +
    +
    + ); + + const LoadingDiv = () => ( +
    + +

    Fetching Data...

    +
    + ); + + // -------- Show diff -------- + const SectionComponent = ({ + section, + base, + target, + onlyShowDiff, + }: { + section: string; + base: Chain[keyof Chain]; + target: Chain[keyof Chain]; + onlyShowDiff: boolean; + }) => { + // if (!SECTION_MAP[section]) return <>; + const Component = componentMap[section]; + return ; + }; + + // We take `baseChain` and `targetChain` as arguments to ensure that they are not `undefined` + // and remove the need for `?` and `!` operators. + const DiffDiv = ({ baseChain, targetChain }: { baseChain: Chain; targetChain: Chain }) => { + const sections = Object.keys(featureMap); + const onBack = (e: React.MouseEvent) => { + e.preventDefault(); + router.push({ pathname: '/' }); + }; + + return ( + <> +
    + +
    +
    + + +
    +
    +

    + + There may still be diffs between chains with the same support level. For example, an + opcode may behave differently between chains. Be sure to read a chain's + documentation to learn more. +

    + + {/* Show chain names at top */} +
    +
    +
    + +
    {baseChain.metadata.name}
    +
    +
    + +
    {targetChain.metadata.name}
    +
    +
    + + {!showPrettyDiff && ( + + )} + + {/* Show content */} + {showPrettyDiff && + sections.map((section) => { + if (featureMap[section].hide) return null; + const base = baseChain[section as keyof Chain]; + const target = targetChain[section as keyof Chain]; + return ( +
    +
    +
    + +
    {featureMap[section].infoText}
    +
    +
    +
    + +
    +
    + ); + })} +
    + + ); + }; + + return ( +
    + {loading && } + {!loading && (!baseChain || !targetChain) && } + {!loading && baseChain && targetChain && ( + + )} +
    + ); }; export default Diff; diff --git a/src/pages/features.tsx b/src/pages/features.tsx index 772f1130..ca26eb0b 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -1,113 +1,67 @@ -import { useState } from 'react'; -import Link from 'next/link'; import { useRouter } from 'next/router'; -import { ExclamationTriangleIcon } from '@heroicons/react/20/solid'; -import { chains } from '@/chains'; +import { ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { FeatureTable } from '@/components/features/FeatureTable'; -import { BaseCombobox } from '@/components/ui/BaseCombobox'; -import { Chain } from '@/types'; +import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; +import { FeatureDiffSelector } from '@/components/FeatureDiffSelector'; +import { featureMap } from '@/lib/constants'; -const Features = () => { - // --- URL Parsing --- - const router = useRouter(); - const { name, kind } = router.query; - - // --- Prepare options --- - // TODO Support more kinds. - type Kind = 'opcode'; - type FeatureHeader = { - name: string; - isHeader: boolean; - }; - - type FeatureItem = { - name: string; - kind: Kind; - }; +const LoadingDiv = () => ( +
    + +

    Fetching Data...

    +
    +); - type Feature = FeatureHeader | FeatureItem; +const ErrorDiv = () => ( +
    +

    Oops!

    +

    + Invalid feature provided, please try again below. +

    +
    + +
    +
    +); - const chainsArray: Chain[] = Object.values(chains); - const allOpcodes = chainsArray - .map(({ opcodes }) => { - return opcodes.map(({ name }) => ({ - name: name!.toLocaleUpperCase(), - kind: 'opcode' as Kind, - })); - }) - .flat(); - - const opcodeOptions = allOpcodes.filter((opcode, index, self) => { - return index === self.findIndex((o) => o.name === opcode.name); - }); - - const options: Feature[] = [{ name: 'Opcodes', isHeader: true }, ...opcodeOptions]; +const Features = () => { + const router = useRouter(); + const { feature } = router.query; - // --- Form handling --- - // Set PUSH0 as the default. - const push0Index = options.findIndex((opt) => opt.name === 'PUSH0'); - const [option, setOption] = useState(options[push0Index]); + const onBack = (e: React.MouseEvent) => { + e.preventDefault(); + router.push({ pathname: '/' }); + }; - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - router.push({ - pathname: '/features', - query: option, - }); - }; + if (!router.isReady) return ; + if (!((feature as string) in featureMap)) return ; - // --- Selector Div --- - const SelectorDiv = () => ( -
    -
    -

    - Compare Feature Support -

    -

    - Choose an opcode and check its support across chains. -

    -

    - More feature comparisons coming soon! -

    -
    - - - -
    -
    - ); + return ( +
    +

    + {featureMap[feature as keyof typeof featureMap].title} Comparison +

    - // --- Feature Table --- - const FeatureTableDiv = () => { - return ( -
    -

    - Compare {name} Support -

    -
    - -

    - - There may still be diffs between chains with the same support level. Be sure to{' '} - - view a diff - {' '} - of specific chains to see details. -

    -
    -
    - ); - }; +
    +
    + - // --- Render --- - return <>{name && kind ? : }; +

    + + There may still be diffs between chains with the same support level. For example, an + opcode may behave differently between chains. Be sure to read a chain's + documentation to learn more. +

    + +
    +
    +
    + ); }; export default Features; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 7e63e802..c2d36674 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,24 +1,39 @@ import { ChainDiffSelector } from '@/components/ChainDiffSelector'; -import { SITE_DESCRIPTION } from '@/lib/constants'; +import { FeatureDiffSelector } from '@/components/FeatureDiffSelector'; const Home = () => { - return ( - <> -
    -
    -

    - {SITE_DESCRIPTION} -

    -

    - Compare execution layer differences between chains in a friendly format -

    -
    - -
    -
    -
    - - ); + return ( + <> +
    +
    +
    +
    +
    + Diff Two Chains +
    +

    + Compare all execution layer differences between chains in various formats +

    +
    + +
    +
    +
    +
    + Compare Across Chains +
    +

    + Choose a feature or property and see its support across chains. +

    +
    + +
    +
    +
    +
    +
    + + ); }; export default Home; diff --git a/src/types/accountType.ts b/src/types/accountType.ts deleted file mode 100644 index b05eee06..00000000 --- a/src/types/accountType.ts +++ /dev/null @@ -1,12 +0,0 @@ -export type AccountType = { - name: string; - description: string; - references: string[]; - properties: { - canBatchTxs: boolean; - canInitiateTxs: boolean; - hasCode: boolean; - hasKeyPair: boolean; - hasStorage: boolean; - }; -}; diff --git a/src/types/chain.ts b/src/types/chain.ts deleted file mode 100644 index c6684186..00000000 --- a/src/types/chain.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Chain as Metadata } from '@wagmi/chains'; -import { AccountType } from './accountType'; -import { DeployedContract } from './deployedContract'; -import { EIP } from './eip'; -import { Mempool } from './mempool'; -import { Node } from './node'; -import { Opcode } from './opcode'; -import { Precompile } from './precompile'; -import { Predeploy } from './predeploy'; -import { SignatureType } from './signatureType'; - -export type Chain = { - metadata: Metadata; - precompiles: Precompile[]; - predeploys: Predeploy[]; - signatureTypes: SignatureType[]; - accountTypes: AccountType[]; - opcodes: Partial[]; - mempools: Mempool[]; - deployedContracts: DeployedContract[]; - eips: EIP[]; - executionNodes: Node[]; - consensusNodes: Node[]; -}; diff --git a/src/types/deployedContract.ts b/src/types/deployedContract.ts deleted file mode 100644 index 1fa676b9..00000000 --- a/src/types/deployedContract.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Address } from 'viem'; - -export enum DeployedContractKind { - WrappedNativeAsset, - Utility, -} - -type DeployedContractBase = { - name: string; - description: string; - kind: DeployedContractKind; - tokenName?: string; - tokenSymbol?: string; - address: Address; - deploymentInstructions?: string; - references: string[]; - notes?: string[]; -}; - -export type StandardDeployedContract = DeployedContractBase & { - logicAbi: string[]; -}; - -export type ProxiedDeployedContract = DeployedContractBase & { - proxyAbi: string[]; - logicAbi: string[]; - logicAddress: Address; -}; - -export type DeployedContract = StandardDeployedContract | ProxiedDeployedContract; diff --git a/src/types/eip.ts b/src/types/eip.ts deleted file mode 100644 index 432979ea..00000000 --- a/src/types/eip.ts +++ /dev/null @@ -1,34 +0,0 @@ -export type EIP = { - number: number; - title: string; - category: EIPCategory; - status: EIPState; // The status should always be `Final` for now. - activeHardforks: string[]; - deprecated?: boolean; - // Some EIPs have parameters, such as EIP-1559, but these parameters may not be the same on all - // chains. This field is intended to list the names and values of any parameters that exist. - parameters?: EIPParameter[]; - notes?: string[]; - references: string[]; -}; - -// EIPCategory defines if the EIP is execution or consensus related. -export enum EIPCategory { - Execution, - Consensus, -} - -export enum EIPState { - Draft, - Review, - LastCall, - Final, - Stagnant, - Withdrawn, - Living, -} - -export type EIPParameter = { - name: string; - value: string | number | bigint | boolean; -}; diff --git a/src/types/index.ts b/src/types/index.ts deleted file mode 100644 index 28f7531f..00000000 --- a/src/types/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export type { Chain } from './chain'; -export type { Variable, Example, Opcode } from './opcode'; -export type { Precompile } from './precompile'; -export type { Predeploy } from './predeploy'; -export type { AccountType } from './accountType'; -export type { SignatureType } from './signatureType'; -export type { Mempool } from './mempool'; -export type { - DeployedContract, - StandardDeployedContract, - ProxiedDeployedContract, -} from './deployedContract'; -export { DeployedContractKind } from './deployedContract'; -export type { Node } from './node'; -export { NodeType, Language, SyncStrategy } from './node'; diff --git a/src/types/mempool.ts b/src/types/mempool.ts deleted file mode 100644 index 0d22bbcf..00000000 --- a/src/types/mempool.ts +++ /dev/null @@ -1,20 +0,0 @@ -export type Mempool = { - name: string; - description: string; - rpcUrl: string; - references: string[]; - notes?: string[]; - // All properties are private, and a missing field indicates that the property is unknown. - properties: { - isPrivate?: boolean; - tracksIpAddress?: boolean; - refundsMev?: boolean; - includesFailedTxs?: boolean; - canSpecifyBuilders?: boolean; - isFree?: boolean; - configurable?: boolean; - txLifespan?: number; // Seconds until kicked from mempool. - rateLimit?: string; - burstRateLimit?: string; - }; -}; diff --git a/src/types/node.ts b/src/types/node.ts deleted file mode 100644 index a26f9185..00000000 --- a/src/types/node.ts +++ /dev/null @@ -1,30 +0,0 @@ -export type Node = { - name: string; - description: string; - type: NodeType; - language: Language; - syncStrategy?: SyncStrategy[]; // only for execution nodes. - forkOf?: string; - repository: string; - documentation: string; -}; - -export enum NodeType { - Execution, - Consensus, -} - -export enum Language { - Java, - Go, - CSharp, - Rust, - TypeScript, - Nim, -} - -export enum SyncStrategy { - Snap, - Fast, - Full, -} diff --git a/src/types/opcode.ts b/src/types/opcode.ts deleted file mode 100644 index bb2ffc4f..00000000 --- a/src/types/opcode.ts +++ /dev/null @@ -1,51 +0,0 @@ -export type Variable = { - name: string; - description: string; - expression?: string; - variables?: Variable[]; -}; - -type Memory = { - before: string; - after: string; -}; - -export type Storage = { - before: Record; - after: Record; -}; - -export type Example = { - description?: string; - input?: string | string[]; - output?: string | string[]; - memory?: Memory; - storage?: Storage; - calldata?: string; - code?: string; - returndata?: string; -}; - -type ComputationCost = Partial & Required>; - -export type GasComputation = { - staticGasCost: ComputationCost; - dynamicGasCost: ComputationCost; - refunds?: string; -}; - -export type Opcode = { - number: number; - name: string; - description: string; - minGas: number; - gasComputation?: GasComputation; - inputs?: Variable[]; - outputs?: Variable[]; - examples: Example[]; - playgroundLink?: string; - errorCases: string[]; - notes?: string[]; - references: string[]; - supportedHardforks: string[]; -}; diff --git a/src/types/precompile.ts b/src/types/precompile.ts deleted file mode 100644 index 7e4ca664..00000000 --- a/src/types/precompile.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Address } from 'viem'; - -type PrecompileParam = { - byteStart: number | string; - byteLength: number | string; - name: string; - description: string; -}; - -export type PrecompileBase = { - address: Address; - name: string; - description: string; - minGas?: number; - deprecated: boolean; - references: string[]; - notes?: string[]; -}; - -export type PrecompileInputOutput = PrecompileBase & { - input: PrecompileParam[]; - output: PrecompileParam[]; -}; - -export type PrecompileAbi = PrecompileBase & { - logicAbi: string[]; -}; - -export type Precompile = PrecompileInputOutput | PrecompileAbi; diff --git a/src/types/predeploy.ts b/src/types/predeploy.ts deleted file mode 100644 index 7f65b55d..00000000 --- a/src/types/predeploy.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Address } from 'viem'; - -type PredeployBase = { - address: Address; - name: string; - description: string; - deprecated: boolean; - references: string[]; -}; - -type StandardPredeploy = PredeployBase & { - logicAbi: string[]; -}; - -type ProxiedPredeploy = PredeployBase & { - proxyAbi: string[]; - logicAbi: string[]; - logicAddress: Address; -}; - -export type Predeploy = StandardPredeploy | ProxiedPredeploy; diff --git a/src/types/signatureType.ts b/src/types/signatureType.ts deleted file mode 100644 index 18efe4c7..00000000 --- a/src/types/signatureType.ts +++ /dev/null @@ -1,10 +0,0 @@ -export type SignatureType = { - prefixByte: number; - description: string; - // The data that is RLP encoded and signed to generate a signed transaction. - signedData: string[] | undefined; - // Some signature types are used to sign transactions, others are used to sign data. - signs: 'transaction' | 'data' | undefined; - references: string[]; - notes?: string[]; -}; diff --git a/tailwind.config.js b/tailwind.config.js index 15a61d1b..0ced252f 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,16 +1,16 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'], - darkMode: 'class', - plugins: [require('@tailwindcss/forms')], - theme: { - extend: { - colors: { - zinc: { - 0: '#fcfcfc', - 1000: '#121212', - }, - }, - }, - }, + content: ['./src/**/*.{js,ts,jsx,tsx,mdx}'], + darkMode: 'class', + plugins: [require('@tailwindcss/forms')], + theme: { + extend: { + colors: { + zinc: { + 0: '#fcfcfc', + 1000: '#121212', + }, + }, + }, + }, }; diff --git a/tsconfig.json b/tsconfig.json index 919dc91e..53d02125 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,28 @@ { - "compilerOptions": { - "target": "ES2020", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "compilerOptions": { + "target": "ES2020", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] }