From 4eab5203b288883ad58417a4da3bb376f27469a8 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 13 Apr 2024 11:14:45 -0700 Subject: [PATCH 01/75] organize script folder --- script/{ => archive}/fetch-abi.ts | 0 script/{ => archive}/json-abi-to-viem-human-readable.ts | 0 script/{ => archive}/optimism-difficulty.sh | 0 script/{ => archive}/precompile-check.ts | 0 script/index.ts | 4 ++++ script/opcodes.ts | 0 6 files changed, 4 insertions(+) rename script/{ => archive}/fetch-abi.ts (100%) rename script/{ => archive}/json-abi-to-viem-human-readable.ts (100%) rename script/{ => archive}/optimism-difficulty.sh (100%) rename script/{ => archive}/precompile-check.ts (100%) create mode 100644 script/index.ts create mode 100644 script/opcodes.ts diff --git a/script/fetch-abi.ts b/script/archive/fetch-abi.ts similarity index 100% rename from script/fetch-abi.ts rename to script/archive/fetch-abi.ts diff --git a/script/json-abi-to-viem-human-readable.ts b/script/archive/json-abi-to-viem-human-readable.ts similarity index 100% rename from script/json-abi-to-viem-human-readable.ts rename to script/archive/json-abi-to-viem-human-readable.ts 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/precompile-check.ts b/script/archive/precompile-check.ts similarity index 100% rename from script/precompile-check.ts rename to script/archive/precompile-check.ts diff --git a/script/index.ts b/script/index.ts new file mode 100644 index 00000000..9a2e52be --- /dev/null +++ b/script/index.ts @@ -0,0 +1,4 @@ +/** + * Takes a chain ID as an input, fetches data from https://chainid.network/chains.json, uses that + * to read and infer various data and properties of the chain, and writes the result to `data/${chainId}.toml`. + */ \ No newline at end of file diff --git a/script/opcodes.ts b/script/opcodes.ts new file mode 100644 index 00000000..e69de29b From da1e10465002808c2886ecd19af640ed57b0c548 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 13 Apr 2024 11:16:24 -0700 Subject: [PATCH 02/75] init bun scripts --- script/.gitignore | 175 +++++++++++++++++++++++++++++++++++++++++++ script/README.md | 15 ++++ script/bun.lockb | Bin 0 -> 3125 bytes script/package.json | 11 +++ script/tsconfig.json | 27 +++++++ 5 files changed, 228 insertions(+) create mode 100644 script/.gitignore create mode 100644 script/README.md create mode 100755 script/bun.lockb create mode 100644 script/package.json create mode 100644 script/tsconfig.json diff --git a/script/.gitignore b/script/.gitignore new file mode 100644 index 00000000..9b1ee42e --- /dev/null +++ b/script/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/script/README.md b/script/README.md new file mode 100644 index 00000000..ca06cb3b --- /dev/null +++ b/script/README.md @@ -0,0 +1,15 @@ +# script + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.0. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/script/bun.lockb b/script/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2a176847eeec1e8e134d6beac70d5422bb939316 GIT binary patch literal 3125 zcmY#Z)GsYA(of3F(@)JSQ%EY!;{sycoc!eMw9K4T-L(9o+{6;yG6OCq1_lO>%ik6+ z*L7=u%bWUgS*DDDmU@oD2kWRwDN0k-WsbBQU&;+s1O)65ih%=-Zh-Q$VG0ZjN=_j(&NeyM(w zezrsCwbJ6#Gb-n2UCNxOAJwb2)z*?T-{#n>z*)QJt2XFpx27fmjiCsDLIDIsfY=P^ z9+-JRw-E(k`h$V0t&#Mr5T%=e0j7TuP`wFIKPZG*ffy8i!~mH7Ye2Z+pfFezf z7|lR6F#R$>k2?bOgY1?9Vh~LXfa%W!>bHUFX8~#?RzJuNkQpEh3VUWK8>An^XM@tP z1O}sl!er|E$NvvxFf{?tJVpkHxyVMdtoZg*^vr_1DU+^TIM|yrfiu11o741zYC`UT z>bv*M{>3cb5W{99S!DG?^#4Y;wYLxSg-nkWvr;f$x#--Jk2wdnBAE*dXOOd58W%}l z)mg~y6j{@#@V@?uM?}`5P%YJhU7w~e*d==G(5i25s@E%@e8TT^S)r=_ikU^hwYjy0 zHyXQcDyIHk;3Yl{$y`u)!vM>^6rsT5x28?fx+tIZ?#YW=p>JM3>{xccU|Z2$qyOGv zlax95|Ly!1xY#muVfa$Tj*Z8o7jOtQx7FM3t7egSu<;9$xu7%v11u%QR_QXTvz|q{ zrSjMP&HS!Ci)#Pxuo!i>t`^e}i;FVyE(tjxvb80EUrnFCH%w*slD72^ zv&;1Sk<3L-S1f7)J=V_`mN;>(3M`zwNItAVBrL=D?NRG9_7A_7m8>>ju~G3^z*N7p zD*Ag{W<*x9#^`s{Y?`F_{o#IZ(X>}pOOVV3r85{{*?Y($Xi7r!*$hQd)`PNQ9*w8A z$EK@qX$TABReC>R+44;>{}(J}D*8LmPTZ~SsG^0@8s(GK*Z$f(n6Sa{24nj{pt%DD zVBrp<$#KU3I-eZp4wRk^(6Z-+u@Ic?6UWKR^xSfL6C$Hl@Z!c0heNOaR3fsC)qBWl+3> z%&>s!4I$DDSUC$a2V@4!EKq*yfSO?ktjIxt%O={$EVk4F=qoe0n+(x?1*z9z^|SzE zoT;9Ho<01GNlbH9ZGYPGU)FF|f@5Yb(I&ekMjkpcZ3bwG3-Dz*+%JjCDo^dWMF2 z#;|q;tepUqvCuQsGc>@WM+@S723Xqz)|LS3G1W6N(=%b{fco$R+^5JyGn|S zQ;UG6#a>ou3`+C<5etk&Pe6PP#4UFw!naC02tneID@;SvLF@G_HqC- z^?|LvjFOUqVk>?9qSW-v;*z3Dy}W|ltYW?VqI7+PB7I$uQe99;8ye}Aq*sA>U?cEo zhpU0=2CD~~VQdC618RI;eo88oSze6CIJg?1aplFjkO%~sLs$>U3ZO0!r3+0G1|XfK zc`2F6nFKw8tPE%jGFKOzCQQLW0**XLgyC@#A`XB?Avi#TOn^xe=qPCV8*~%^)0;sG literal 0 HcmV?d00001 diff --git a/script/package.json b/script/package.json new file mode 100644 index 00000000..84384b93 --- /dev/null +++ b/script/package.json @@ -0,0 +1,11 @@ +{ + "name": "script", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/bun": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} \ No newline at end of file diff --git a/script/tsconfig.json b/script/tsconfig.json new file mode 100644 index 00000000..238655f2 --- /dev/null +++ b/script/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} From 9f13306627524c119655a77f1d4e8145f0ff22fd Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 09:25:19 -0700 Subject: [PATCH 03/75] style: init biome --- script/archive/fetch-abi.ts | 130 ++++++++++++++-------------- script/archive/precompile-check.ts | 132 ++++++++++++++--------------- script/biome.jsonc | 23 +++++ script/bun.lockb | Bin 3125 -> 6627 bytes script/package.json | 24 +++--- script/tsconfig.json | 44 +++++----- 6 files changed, 190 insertions(+), 163 deletions(-) create mode 100644 script/biome.jsonc diff --git a/script/archive/fetch-abi.ts b/script/archive/fetch-abi.ts index 87e3c396..2d5a7836 100644 --- a/script/archive/fetch-abi.ts +++ b/script/archive/fetch-abi.ts @@ -3,95 +3,95 @@ // bun script/fetch-abi.ts https://arbiscan.io/address/0x0000000000000000000000000000000000000064 import { formatAbi } from 'abitype'; import clipboardy from 'clipboardy'; -import { Address } from 'viem'; +import type { Address } from 'viem'; type ChainConfig = { - name: string; - urlPart: string; - apiPrefix: string; - apiKey: string; + 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!, - }, + 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); + // 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); + // 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}`); + 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}`; + 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'); + // 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 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); + // 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; + // 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 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; + // 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}`); + // 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/archive/precompile-check.ts b/script/archive/precompile-check.ts index e1c84178..283eaa45 100644 --- a/script/archive/precompile-check.ts +++ b/script/archive/precompile-check.ts @@ -4,83 +4,83 @@ // 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'; +import { http, type Address, createPublicClient, getAddress } from 'viem'; +import { type Chain, arbitrum, optimism } from 'viem/chains'; type ChainConfig = { - addresses: Address[]; - chain: Chain; - rpcUrl: string; + 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', - ], - }, + 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 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 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' - ); + 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]}`)); + addresses.forEach((address, i) => console.log(`${getAddress(address)} ${kinds[i]}`)); } main().catch(console.error); diff --git a/script/biome.jsonc b/script/biome.jsonc new file mode 100644 index 00000000..bd62e7a6 --- /dev/null +++ b/script/biome.jsonc @@ -0,0 +1,23 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", + "files": { + "ignore": ["archive/**/*"] + }, + "organizeImports": { + "enabled": true + }, + "formatter": { + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} diff --git a/script/bun.lockb b/script/bun.lockb index 2a176847eeec1e8e134d6beac70d5422bb939316..a541c22fad155ff32efad27089b07c49d3d746a4 100755 GIT binary patch literal 6627 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 diff --git a/script/package.json b/script/package.json index 84384b93..d777d8f3 100644 --- a/script/package.json +++ b/script/package.json @@ -1,11 +1,15 @@ { - "name": "script", - "module": "index.ts", - "type": "module", - "devDependencies": { - "@types/bun": "latest" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } -} \ No newline at end of file + "name": "script", + "module": "index.ts", + "type": "module", + "scripts": { + "check": "bunx @biomejs/biome check --apply ." + }, + "devDependencies": { + "@biomejs/biome": "1.6.4", + "@types/bun": "^1.0.12" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } +} diff --git a/script/tsconfig.json b/script/tsconfig.json index 238655f2..ffc08abf 100644 --- a/script/tsconfig.json +++ b/script/tsconfig.json @@ -1,27 +1,27 @@ { - "compilerOptions": { - // Enable latest features - "lib": ["ESNext", "DOM"], - "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, - // Some stricter flags (disabled by default) - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false - } + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } } From a260cebd8c3bacf55eef9b4814b145121619f174 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 09:52:04 -0700 Subject: [PATCH 04/75] save metadata to json --- script/data/1.json | 50 ++++++++++++++++++++++++++++++++++++++++++++++ script/index.ts | 39 ++++++++++++++++++++++++++++++++---- script/types.ts | 38 +++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 script/data/1.json create mode 100644 script/types.ts diff --git a/script/data/1.json b/script/data/1.json new file mode 100644 index 00000000..14b3c90e --- /dev/null +++ b/script/data/1.json @@ -0,0 +1,50 @@ +{ + "metadata": { + "name": "Ethereum Mainnet", + "chain": "ETH", + "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" + ], + "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://ethereum.org", + "shortName": "eth", + "chainId": 1, + "networkId": 1, + "slip44": 60, + "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" + } + ] + } +} diff --git a/script/index.ts b/script/index.ts index 9a2e52be..4cfd2aa4 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,4 +1,35 @@ -/** - * Takes a chain ID as an input, fetches data from https://chainid.network/chains.json, uses that - * to read and infer various data and properties of the chain, and writes the result to `data/${chainId}.toml`. - */ \ No newline at end of file +import type { Metadata } from './types'; + +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 }; +} + +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) { + await Bun.write(`data/${chainId}.json`, JSON.stringify(chainObj)); + console.log(`✅ Chain data for chainId ${chainId} written to data/${chainId}.json`); +} + +async function main() { + const { chainId } = init(); + const metadata = await getMetadata(chainId); + const chain = { metadata }; + await save(chainId, chain); +} + +main().catch((error) => { + console.error('An error occurred:', error); + process.exit(1); +}); diff --git a/script/types.ts b/script/types.ts new file mode 100644 index 00000000..4504d792 --- /dev/null +++ b/script/types.ts @@ -0,0 +1,38 @@ +export type Metadata = { + name: string; + chain: string; + icon?: string; + rpc: string[]; + features?: Feature[]; + faucets: string[]; + nativeCurrency: NativeCurrency; + infoURL: string; + shortName: string; + chainId: number; + networkId: number; + slip44: number; + ens?: Ens; + explorers?: Explorer[]; + title?: string; +}; + +export type Ens = { + registry: string; +}; + +export type Explorer = { + name: string; + url: string; + standard: string; + icon?: string; +}; + +export type Feature = { + name: string; +}; + +export type NativeCurrency = { + name: string; + symbol: string; + decimals: number; +}; From b750baf1be9331589330c557e4353b6792458c9c Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 18:15:31 -0700 Subject: [PATCH 05/75] feat: check opcodes --- script/.env.example | 1 + script/biome.jsonc | 5 +- script/bun.lockb | Bin 6627 -> 11346 bytes script/data/1.json | 258 ++++++++++++++++++++++++++++++++++++ script/data/10.json | 294 +++++++++++++++++++++++++++++++++++++++++ script/data/42161.json | 292 ++++++++++++++++++++++++++++++++++++++++ script/index.ts | 50 ++++++- script/opcodes.ts | 187 ++++++++++++++++++++++++++ script/package.json | 3 + 9 files changed, 1083 insertions(+), 7 deletions(-) create mode 100644 script/.env.example create mode 100644 script/data/10.json create mode 100644 script/data/42161.json 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/biome.jsonc b/script/biome.jsonc index bd62e7a6..7163d47a 100644 --- a/script/biome.jsonc +++ b/script/biome.jsonc @@ -17,7 +17,10 @@ "linter": { "enabled": true, "rules": { - "recommended": true + "recommended": true, + "complexity": { + "useSimpleNumberKeys": "off" + } } } } diff --git a/script/bun.lockb b/script/bun.lockb index a541c22fad155ff32efad27089b07c49d3d746a4..fed5fe0cf57831145023698940d29728163b0af5 100755 GIT binary patch delta 4254 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 delta 1204 zcmc&!O-NKx6h8OOkMrxiX~yYUEjn<|_uY5Cd+z1jd)~YH z*|Mw3=4i{sse+xp9$EhQ-1UC)@ZI9sbH_eq{dzE27;;vf3GUAZ)x_>tUc6RZn*g*m zoj%dp4j|D73qYct&`dax!hS+4&2t%mjgT~uNqA5I$RVsC+(_srq#Ox5p@(pZ^t5AQ zif}#QQ$ijeB=oq5P#$%|#sj_6U*&iqzF=c`*-$AQ0US4kgdsqSF(k|Zh6#!oULt5` zIBpCX+Gvvod}*vOOc1M6nXCiYr?OUJ5tWS)i>l0~2iU8!24ZWvJH%9-u&PIkd3&7H zzy}=>C3QdIEIP#$t@?Vis#nsLK-vLmtHe;tFf{(0roOeW+4g+EgkK62c zO^h%DPSZ@X+i{mO!ZNVi8Dl2=Lf(u!*2S0wZ<4p-ck(veG5T zVG||7Pq@8lH})rN__TDL<-u z;XK_?DqXD$7joK#dcgjC$*Z+Wck!Xlf`?Vx1lCbnq67j;*#O|1d@1<1poo%j)4I!i zs`A-Fv~Pr#mMf(}WeW^4%$22});@28!!=J{{bEo^180-^Y_Cu{&XZsEzIq+3xCQr qyncYazLE`#MEP&x!q)N$b~bZGbn_7PSvJo2ny{lVV|cWn%kUd%jL`W2 diff --git a/script/data/1.json b/script/data/1.json index 14b3c90e..11fda283 100644 --- a/script/data/1.json +++ b/script/data/1.json @@ -46,5 +46,263 @@ "standard": "EIP3091" } ] + }, + "opcodes": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": true }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } } } diff --git a/script/data/10.json b/script/data/10.json new file mode 100644 index 00000000..484f812c --- /dev/null +++ b/script/data/10.json @@ -0,0 +1,294 @@ +{ + "metadata": { + "name": "OP Mainnet", + "chain": "ETH", + "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" + ], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://optimism.io", + "shortName": "oeth", + "chainId": 10, + "networkId": 10, + "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" + } + ] + }, + "opcodes": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": true }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + } +} diff --git a/script/data/42161.json b/script/data/42161.json new file mode 100644 index 00000000..6c290c7b --- /dev/null +++ b/script/data/42161.json @@ -0,0 +1,292 @@ +{ + "metadata": { + "name": "Arbitrum One", + "chainId": 42161, + "shortName": "arb1", + "chain": "ETH", + "networkId": 42161, + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "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" + ], + "faucets": [], + "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" + } + ], + "infoURL": "https://arbitrum.io", + "parent": { + "type": "L2", + "chain": "eip155-1", + "bridges": [{ "url": "https://bridge.arbitrum.io" }] + } + }, + "opcodes": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": false }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + } +} diff --git a/script/index.ts b/script/index.ts index 4cfd2aa4..b90d74ea 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,14 +1,31 @@ +import { http, createPublicClient } from 'viem'; +import { checkOpcodes } from './opcodes'; import type { Metadata } from './types'; +async function main() { + const { chainId } = init(); + const metadata = await getMetadata(chainId); + const rpcUrl = selectRpcUrl(metadata.rpc); + const client = initClient(rpcUrl); + const opcodes = await checkOpcodes(client); + const chain = { metadata, opcodes }; + 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'); + if (chainId <= 0 || chainId > Number.MAX_SAFE_INTEGER) throw new Error('chainId not supported'); return { chainId }; } +function initClient(rpcUrl: string) { + const transport = http(rpcUrl); + return createPublicClient({ transport }); +} + async function getMetadata(chainId: number): Promise { const response = await fetch('https://chainid.network/chains.json'); const data = await response.json(); @@ -22,11 +39,32 @@ async function save(chainId: number, chainObj: object) { console.log(`✅ Chain data for chainId ${chainId} written to data/${chainId}.json`); } -async function main() { - const { chainId } = init(); - const metadata = await getMetadata(chainId); - const chain = { metadata }; - await save(chainId, chain); +function selectRpcUrl(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; + }; + + // 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 httpUrls = rpcUrls.filter((url) => !url.startsWith('wss://')); + for (const url of httpUrls) { + if (hasPlaceholder(url)) { + const replacedUrl = replacePlaceholder(url); + if (replacedUrl !== url) return replacedUrl; + } + } + + // Otherwise, return the first URL that does not have a placeholder. + return httpUrls.find((url) => !hasPlaceholder(url)) || ''; } main().catch((error) => { diff --git a/script/opcodes.ts b/script/opcodes.ts index e69de29b..0a117001 100644 --- a/script/opcodes.ts +++ b/script/opcodes.ts @@ -0,0 +1,187 @@ +import { type PublicClient, toHex } from 'viem'; + +type Opcode = number; +type CallError = { details: string }; + +export async function checkOpcodes( + client: PublicClient, +): Promise> { + const opcodes = Array.from(Array(0xff + 1).keys()); + const supported = await Promise.all(opcodes.map(async (opcode) => checkOpcode(opcode, client))); + const result: Record = {}; + opcodes.forEach((opcode, index) => { + result[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; + + throw new Error(`Unexpected error: ${err}`); + } +} + +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/package.json b/script/package.json index d777d8f3..ce2256ba 100644 --- a/script/package.json +++ b/script/package.json @@ -11,5 +11,8 @@ }, "peerDependencies": { "typescript": "^5.0.0" + }, + "dependencies": { + "viem": "^2.9.16" } } From e7561d96858ae397e4775694aecbd74223dc9423 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 18:29:19 -0700 Subject: [PATCH 06/75] chore: sort keys --- script/data/1.json | 48 +++++++++++++++++++++--------------------- script/data/10.json | 26 +++++++++++------------ script/data/42161.json | 24 ++++++++++----------- script/index.ts | 23 +++++++++++++++++++- 4 files changed, 71 insertions(+), 50 deletions(-) diff --git a/script/data/1.json b/script/data/1.json index 11fda283..a8a93f27 100644 --- a/script/data/1.json +++ b/script/data/1.json @@ -1,7 +1,30 @@ { "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}", @@ -22,30 +45,7 @@ "https://eth.drpc.org", "wss://eth.drpc.org" ], - "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], - "faucets": [], - "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "infoURL": "https://ethereum.org", - "shortName": "eth", - "chainId": 1, - "networkId": 1, - "slip44": 60, - "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" - } - ] + "slip44": 60 }, "opcodes": { "0x00": { "name": "STOP", "supported": true }, diff --git a/script/data/10.json b/script/data/10.json index 484f812c..5dc12a81 100644 --- a/script/data/10.json +++ b/script/data/10.json @@ -1,22 +1,12 @@ { "metadata": { "name": "OP Mainnet", - "chain": "ETH", - "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" - ], - "faucets": [], - "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "infoURL": "https://optimism.io", "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" }, { @@ -31,6 +21,16 @@ "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": { diff --git a/script/data/42161.json b/script/data/42161.json index 6c290c7b..2a36b92f 100644 --- a/script/data/42161.json +++ b/script/data/42161.json @@ -1,19 +1,12 @@ { "metadata": { "name": "Arbitrum One", - "chainId": 42161, "shortName": "arb1", - "chain": "ETH", + "chainId": 42161, "networkId": 42161, + "infoURL": "https://arbitrum.io", "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, - "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" - ], - "faucets": [], + "chain": "ETH", "explorers": [ { "name": "Arbiscan", "url": "https://arbiscan.io", "standard": "EIP3091" }, { "name": "Arbitrum Explorer", "url": "https://explorer.arbitrum.io", "standard": "EIP3091" }, @@ -24,12 +17,19 @@ "standard": "EIP3091" } ], - "infoURL": "https://arbitrum.io", + "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": { "0x00": { "name": "STOP", "supported": true }, diff --git a/script/index.ts b/script/index.ts index b90d74ea..0a85019b 100644 --- a/script/index.ts +++ b/script/index.ts @@ -8,7 +8,17 @@ async function main() { const rpcUrl = selectRpcUrl(metadata.rpc); const client = initClient(rpcUrl); const opcodes = await checkOpcodes(client); - const chain = { metadata, opcodes }; + const chain = { + metadata: sortObjectKeys(metadata, [ + 'name', + 'shortName', + 'chainId', + 'networkId', + 'infoURL', + 'nativeCurrency', + ]), + opcodes, + }; await save(chainId, chain); } @@ -39,6 +49,17 @@ async function save(chainId: number, chainObj: object) { console.log(`✅ Chain data for chainId ${chainId} written to 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 selectRpcUrl(rpcUrls: string[]): string { const hasPlaceholder = (str: string): boolean => str.includes('${'); From 033d1017574b49d437adfdc3a1df05555c6a7a9d Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 20:16:13 -0700 Subject: [PATCH 07/75] feat: slice by feature --- script/data/{ => chain}/1.json | 0 script/data/{ => chain}/10.json | 0 script/data/{ => chain}/42161.json | 0 script/data/feature/metadata.json | 116 +++++ script/data/feature/opcodes.json | 776 +++++++++++++++++++++++++++++ script/index.ts | 2 +- script/postprocess.ts | 30 ++ 7 files changed, 923 insertions(+), 1 deletion(-) rename script/data/{ => chain}/1.json (100%) rename script/data/{ => chain}/10.json (100%) rename script/data/{ => chain}/42161.json (100%) create mode 100644 script/data/feature/metadata.json create mode 100644 script/data/feature/opcodes.json create mode 100644 script/postprocess.ts diff --git a/script/data/1.json b/script/data/chain/1.json similarity index 100% rename from script/data/1.json rename to script/data/chain/1.json diff --git a/script/data/10.json b/script/data/chain/10.json similarity index 100% rename from script/data/10.json rename to script/data/chain/10.json diff --git a/script/data/42161.json b/script/data/chain/42161.json similarity index 100% rename from script/data/42161.json rename to script/data/chain/42161.json diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json new file mode 100644 index 00000000..d7f1273a --- /dev/null +++ b/script/data/feature/metadata.json @@ -0,0 +1,116 @@ +{ + "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" + ] + }, + "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" + ] + } +} diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json new file mode 100644 index 00000000..d55d46eb --- /dev/null +++ b/script/data/feature/opcodes.json @@ -0,0 +1,776 @@ +{ + "1": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": true }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + }, + "10": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": true }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + }, + "42161": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x0c": { "name": "unknown", "supported": false }, + "0x0d": { "name": "unknown", "supported": false }, + "0x0e": { "name": "unknown", "supported": false }, + "0x0f": { "name": "unknown", "supported": false }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x1e": { "name": "unknown", "supported": false }, + "0x1f": { "name": "unknown", "supported": false }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x21": { "name": "unknown", "supported": false }, + "0x22": { "name": "unknown", "supported": false }, + "0x23": { "name": "unknown", "supported": false }, + "0x24": { "name": "unknown", "supported": false }, + "0x25": { "name": "unknown", "supported": false }, + "0x26": { "name": "unknown", "supported": false }, + "0x27": { "name": "unknown", "supported": false }, + "0x28": { "name": "unknown", "supported": false }, + "0x29": { "name": "unknown", "supported": false }, + "0x2a": { "name": "unknown", "supported": false }, + "0x2b": { "name": "unknown", "supported": false }, + "0x2c": { "name": "unknown", "supported": false }, + "0x2d": { "name": "unknown", "supported": false }, + "0x2e": { "name": "unknown", "supported": false }, + "0x2f": { "name": "unknown", "supported": false }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": true }, + "0x4a": { "name": "BLOBBASEFEE", "supported": false }, + "0x4b": { "name": "unknown", "supported": false }, + "0x4c": { "name": "unknown", "supported": false }, + "0x4d": { "name": "unknown", "supported": false }, + "0x4e": { "name": "unknown", "supported": false }, + "0x4f": { "name": "unknown", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xa5": { "name": "unknown", "supported": false }, + "0xa6": { "name": "unknown", "supported": false }, + "0xa7": { "name": "unknown", "supported": false }, + "0xa8": { "name": "unknown", "supported": false }, + "0xa9": { "name": "unknown", "supported": false }, + "0xaa": { "name": "unknown", "supported": false }, + "0xab": { "name": "unknown", "supported": false }, + "0xac": { "name": "unknown", "supported": false }, + "0xad": { "name": "unknown", "supported": false }, + "0xae": { "name": "unknown", "supported": false }, + "0xaf": { "name": "unknown", "supported": false }, + "0xb0": { "name": "unknown", "supported": false }, + "0xb1": { "name": "unknown", "supported": false }, + "0xb2": { "name": "unknown", "supported": false }, + "0xb3": { "name": "unknown", "supported": false }, + "0xb4": { "name": "unknown", "supported": false }, + "0xb5": { "name": "unknown", "supported": false }, + "0xb6": { "name": "unknown", "supported": false }, + "0xb7": { "name": "unknown", "supported": false }, + "0xb8": { "name": "unknown", "supported": false }, + "0xb9": { "name": "unknown", "supported": false }, + "0xba": { "name": "unknown", "supported": false }, + "0xbb": { "name": "unknown", "supported": false }, + "0xbc": { "name": "unknown", "supported": false }, + "0xbd": { "name": "unknown", "supported": false }, + "0xbe": { "name": "unknown", "supported": false }, + "0xbf": { "name": "unknown", "supported": false }, + "0xc0": { "name": "unknown", "supported": false }, + "0xc1": { "name": "unknown", "supported": false }, + "0xc2": { "name": "unknown", "supported": false }, + "0xc3": { "name": "unknown", "supported": false }, + "0xc4": { "name": "unknown", "supported": false }, + "0xc5": { "name": "unknown", "supported": false }, + "0xc6": { "name": "unknown", "supported": false }, + "0xc7": { "name": "unknown", "supported": false }, + "0xc8": { "name": "unknown", "supported": false }, + "0xc9": { "name": "unknown", "supported": false }, + "0xca": { "name": "unknown", "supported": false }, + "0xcb": { "name": "unknown", "supported": false }, + "0xcc": { "name": "unknown", "supported": false }, + "0xcd": { "name": "unknown", "supported": false }, + "0xce": { "name": "unknown", "supported": false }, + "0xcf": { "name": "unknown", "supported": false }, + "0xd0": { "name": "unknown", "supported": false }, + "0xd1": { "name": "unknown", "supported": false }, + "0xd2": { "name": "unknown", "supported": false }, + "0xd3": { "name": "unknown", "supported": false }, + "0xd4": { "name": "unknown", "supported": false }, + "0xd5": { "name": "unknown", "supported": false }, + "0xd6": { "name": "unknown", "supported": false }, + "0xd7": { "name": "unknown", "supported": false }, + "0xd8": { "name": "unknown", "supported": false }, + "0xd9": { "name": "unknown", "supported": false }, + "0xda": { "name": "unknown", "supported": false }, + "0xdb": { "name": "unknown", "supported": false }, + "0xdc": { "name": "unknown", "supported": false }, + "0xdd": { "name": "unknown", "supported": false }, + "0xde": { "name": "unknown", "supported": false }, + "0xdf": { "name": "unknown", "supported": false }, + "0xe0": { "name": "unknown", "supported": false }, + "0xe1": { "name": "unknown", "supported": false }, + "0xe2": { "name": "unknown", "supported": false }, + "0xe3": { "name": "unknown", "supported": false }, + "0xe4": { "name": "unknown", "supported": false }, + "0xe5": { "name": "unknown", "supported": false }, + "0xe6": { "name": "unknown", "supported": false }, + "0xe7": { "name": "unknown", "supported": false }, + "0xe8": { "name": "unknown", "supported": false }, + "0xe9": { "name": "unknown", "supported": false }, + "0xea": { "name": "unknown", "supported": false }, + "0xeb": { "name": "unknown", "supported": false }, + "0xec": { "name": "unknown", "supported": false }, + "0xed": { "name": "unknown", "supported": false }, + "0xee": { "name": "unknown", "supported": false }, + "0xef": { "name": "unknown", "supported": false }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xf6": { "name": "unknown", "supported": false }, + "0xf7": { "name": "unknown", "supported": false }, + "0xf8": { "name": "unknown", "supported": false }, + "0xf9": { "name": "unknown", "supported": false }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfb": { "name": "unknown", "supported": false }, + "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + } +} diff --git a/script/index.ts b/script/index.ts index 0a85019b..72d30374 100644 --- a/script/index.ts +++ b/script/index.ts @@ -45,7 +45,7 @@ async function getMetadata(chainId: number): Promise { } async function save(chainId: number, chainObj: object) { - await Bun.write(`data/${chainId}.json`, JSON.stringify(chainObj)); + await Bun.write(`data/chain/${chainId}.json`, JSON.stringify(chainObj)); console.log(`✅ Chain data for chainId ${chainId} written to data/${chainId}.json`); } diff --git a/script/postprocess.ts b/script/postprocess.ts new file mode 100644 index 00000000..06b82d5a --- /dev/null +++ b/script/postprocess.ts @@ -0,0 +1,30 @@ +import { readdir } from 'node:fs/promises'; +import { join } from 'node:path'; + +const DATA_PATH = join(import.meta.dir, 'data', 'chain'); + +async function main() { + 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(import.meta.dir, 'data', 'feature', `${key}.json`); + await Bun.write(outfile, JSON.stringify(dataOut)); + } +} + +main().catch((error) => { + console.error('An error occurred:', error); + process.exit(1); +}); From 78a98b2182007fcd187be48891b63c7ea6ed0656 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 20:53:24 -0700 Subject: [PATCH 08/75] build: generate data with 'bun main {chainId}' --- script/main.sh | 5 +++++ script/package.json | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 script/main.sh diff --git a/script/main.sh b/script/main.sh new file mode 100644 index 00000000..b2249b45 --- /dev/null +++ b/script/main.sh @@ -0,0 +1,5 @@ +#!/bin/bash +set -euo pipefail +bun index.ts "$1" +bun postprocess.ts +bun check \ No newline at end of file diff --git a/script/package.json b/script/package.json index ce2256ba..6ed87852 100644 --- a/script/package.json +++ b/script/package.json @@ -3,7 +3,8 @@ "module": "index.ts", "type": "module", "scripts": { - "check": "bunx @biomejs/biome check --apply ." + "check": "bunx @biomejs/biome check --apply .", + "main": "bash ./main.sh" }, "devDependencies": { "@biomejs/biome": "1.6.4", From 2191b428fbbae280a042dd38c6735ce4bdeb2087 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 14 Apr 2024 20:55:03 -0700 Subject: [PATCH 09/75] chore: slim down opcode output --- script/data/chain/1.json | 107 ------- script/data/chain/10.json | 107 ------- script/data/chain/137.json | 188 ++++++++++++ script/data/chain/42161.json | 107 ------- script/data/feature/metadata.json | 35 +++ script/data/feature/opcodes.json | 472 ++++++++++-------------------- script/opcodes.ts | 14 +- 7 files changed, 384 insertions(+), 646 deletions(-) create mode 100644 script/data/chain/137.json diff --git a/script/data/chain/1.json b/script/data/chain/1.json index a8a93f27..558a15b7 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -60,10 +60,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -78,24 +74,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -123,11 +102,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -213,94 +187,13 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } diff --git a/script/data/chain/10.json b/script/data/chain/10.json index 5dc12a81..809ce2f1 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -46,10 +46,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -64,24 +60,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -109,11 +88,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -199,94 +173,13 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } diff --git a/script/data/chain/137.json b/script/data/chain/137.json new file mode 100644 index 00000000..8a03cf9f --- /dev/null +++ b/script/data/chain/137.json @@ -0,0 +1,188 @@ +{ + "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": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": false }, + "0x4a": { "name": "BLOBBASEFEE", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xfa": { "name": "STATICCALL", "supported": true }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + } +} diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index 2a36b92f..cab17ac2 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -44,10 +44,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -62,24 +58,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -107,11 +86,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -197,94 +171,13 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json index d7f1273a..8c4ee814 100644 --- a/script/data/feature/metadata.json +++ b/script/data/feature/metadata.json @@ -81,6 +81,41 @@ "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 + }, "42161": { "name": "Arbitrum One", "shortName": "arb1", diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json index d55d46eb..81324518 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -12,10 +12,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -30,24 +26,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -75,11 +54,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -165,94 +139,13 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } @@ -270,10 +163,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -288,24 +177,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -333,11 +205,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -423,94 +290,164 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, + "0xfd": { "name": "REVERT", "supported": true }, + "0xfe": { "name": "INVALID", "supported": true }, + "0xff": { "name": "SELFDESTRUCT", "supported": true } + }, + "137": { + "0x00": { "name": "STOP", "supported": true }, + "0x01": { "name": "ADD", "supported": true }, + "0x02": { "name": "MUL", "supported": true }, + "0x03": { "name": "SUB", "supported": true }, + "0x04": { "name": "DIV", "supported": true }, + "0x05": { "name": "SDIV", "supported": true }, + "0x06": { "name": "MOD", "supported": true }, + "0x07": { "name": "SMOD", "supported": true }, + "0x08": { "name": "ADDMOD", "supported": true }, + "0x09": { "name": "MULMOD", "supported": true }, + "0x0a": { "name": "EXP", "supported": true }, + "0x0b": { "name": "SIGNEXTEND", "supported": true }, + "0x10": { "name": "LT", "supported": true }, + "0x11": { "name": "GT", "supported": true }, + "0x12": { "name": "SLT", "supported": true }, + "0x13": { "name": "SGT", "supported": true }, + "0x14": { "name": "EQ", "supported": true }, + "0x15": { "name": "ISZERO", "supported": true }, + "0x16": { "name": "AND", "supported": true }, + "0x17": { "name": "OR", "supported": true }, + "0x18": { "name": "XOR", "supported": true }, + "0x19": { "name": "NOT", "supported": true }, + "0x1a": { "name": "BYTE", "supported": true }, + "0x1b": { "name": "SHL", "supported": true }, + "0x1c": { "name": "SHR", "supported": true }, + "0x1d": { "name": "SAR", "supported": true }, + "0x20": { "name": "KECCAK256", "supported": true }, + "0x30": { "name": "ADDRESS", "supported": true }, + "0x31": { "name": "BALANCE", "supported": true }, + "0x32": { "name": "ORIGIN", "supported": true }, + "0x33": { "name": "CALLER", "supported": true }, + "0x34": { "name": "CALLVALUE", "supported": true }, + "0x35": { "name": "CALLDATALOAD", "supported": true }, + "0x36": { "name": "CALLDATASIZE", "supported": true }, + "0x37": { "name": "CALLDATACOPY", "supported": true }, + "0x38": { "name": "CODESIZE", "supported": true }, + "0x39": { "name": "CODECOPY", "supported": true }, + "0x3a": { "name": "GASPRICE", "supported": true }, + "0x3b": { "name": "EXTCODESIZE", "supported": true }, + "0x3c": { "name": "EXTCODECOPY", "supported": true }, + "0x3d": { "name": "RETURNDATASIZE", "supported": true }, + "0x3e": { "name": "RETURNDATACOPY", "supported": true }, + "0x3f": { "name": "EXTCODEHASH", "supported": true }, + "0x40": { "name": "BLOCKHASH", "supported": true }, + "0x41": { "name": "COINBASE", "supported": true }, + "0x42": { "name": "TIMESTAMP", "supported": true }, + "0x43": { "name": "NUMBER", "supported": true }, + "0x44": { "name": "PREVRANDAO", "supported": true }, + "0x45": { "name": "GASLIMIT", "supported": true }, + "0x46": { "name": "CHAINID", "supported": true }, + "0x47": { "name": "SELFBALANCE", "supported": true }, + "0x48": { "name": "BASEFEE", "supported": true }, + "0x49": { "name": "BLOBHASH", "supported": false }, + "0x4a": { "name": "BLOBBASEFEE", "supported": false }, + "0x50": { "name": "POP", "supported": true }, + "0x51": { "name": "MLOAD", "supported": true }, + "0x52": { "name": "MSTORE", "supported": true }, + "0x53": { "name": "MSTORE8", "supported": true }, + "0x54": { "name": "SLOAD", "supported": true }, + "0x55": { "name": "SSTORE", "supported": true }, + "0x56": { "name": "JUMP", "supported": true }, + "0x57": { "name": "JUMPI", "supported": true }, + "0x58": { "name": "PC", "supported": true }, + "0x59": { "name": "MSIZE", "supported": true }, + "0x5a": { "name": "GAS", "supported": true }, + "0x5b": { "name": "JUMPDEST", "supported": true }, + "0x5c": { "name": "TLOAD", "supported": true }, + "0x5d": { "name": "TSTORE", "supported": true }, + "0x5e": { "name": "MCOPY", "supported": true }, + "0x5f": { "name": "PUSH0", "supported": true }, + "0x60": { "name": "PUSH1", "supported": true }, + "0x61": { "name": "PUSH2", "supported": true }, + "0x62": { "name": "PUSH3", "supported": true }, + "0x63": { "name": "PUSH4", "supported": true }, + "0x64": { "name": "PUSH5", "supported": true }, + "0x65": { "name": "PUSH6", "supported": true }, + "0x66": { "name": "PUSH7", "supported": true }, + "0x67": { "name": "PUSH8", "supported": true }, + "0x68": { "name": "PUSH9", "supported": true }, + "0x69": { "name": "PUSH10", "supported": true }, + "0x6a": { "name": "PUSH11", "supported": true }, + "0x6b": { "name": "PUSH12", "supported": true }, + "0x6c": { "name": "PUSH13", "supported": true }, + "0x6d": { "name": "PUSH14", "supported": true }, + "0x6e": { "name": "PUSH15", "supported": true }, + "0x6f": { "name": "PUSH16", "supported": true }, + "0x70": { "name": "PUSH17", "supported": true }, + "0x71": { "name": "PUSH18", "supported": true }, + "0x72": { "name": "PUSH19", "supported": true }, + "0x73": { "name": "PUSH20", "supported": true }, + "0x74": { "name": "PUSH21", "supported": true }, + "0x75": { "name": "PUSH22", "supported": true }, + "0x76": { "name": "PUSH23", "supported": true }, + "0x77": { "name": "PUSH24", "supported": true }, + "0x78": { "name": "PUSH25", "supported": true }, + "0x79": { "name": "PUSH26", "supported": true }, + "0x7a": { "name": "PUSH27", "supported": true }, + "0x7b": { "name": "PUSH28", "supported": true }, + "0x7c": { "name": "PUSH29", "supported": true }, + "0x7d": { "name": "PUSH30", "supported": true }, + "0x7e": { "name": "PUSH31", "supported": true }, + "0x7f": { "name": "PUSH32", "supported": true }, + "0x80": { "name": "DUP1", "supported": true }, + "0x81": { "name": "DUP2", "supported": true }, + "0x82": { "name": "DUP3", "supported": true }, + "0x83": { "name": "DUP4", "supported": true }, + "0x84": { "name": "DUP5", "supported": true }, + "0x85": { "name": "DUP6", "supported": true }, + "0x86": { "name": "DUP7", "supported": true }, + "0x87": { "name": "DUP8", "supported": true }, + "0x88": { "name": "DUP9", "supported": true }, + "0x89": { "name": "DUP10", "supported": true }, + "0x8a": { "name": "DUP11", "supported": true }, + "0x8b": { "name": "DUP12", "supported": true }, + "0x8c": { "name": "DUP13", "supported": true }, + "0x8d": { "name": "DUP14", "supported": true }, + "0x8e": { "name": "DUP15", "supported": true }, + "0x8f": { "name": "DUP16", "supported": true }, + "0x90": { "name": "SWAP1", "supported": true }, + "0x91": { "name": "SWAP2", "supported": true }, + "0x92": { "name": "SWAP3", "supported": true }, + "0x93": { "name": "SWAP4", "supported": true }, + "0x94": { "name": "SWAP5", "supported": true }, + "0x95": { "name": "SWAP6", "supported": true }, + "0x96": { "name": "SWAP7", "supported": true }, + "0x97": { "name": "SWAP8", "supported": true }, + "0x98": { "name": "SWAP9", "supported": true }, + "0x99": { "name": "SWAP10", "supported": true }, + "0x9a": { "name": "SWAP11", "supported": true }, + "0x9b": { "name": "SWAP12", "supported": true }, + "0x9c": { "name": "SWAP13", "supported": true }, + "0x9d": { "name": "SWAP14", "supported": true }, + "0x9e": { "name": "SWAP15", "supported": true }, + "0x9f": { "name": "SWAP16", "supported": true }, + "0xa0": { "name": "LOG0", "supported": true }, + "0xa1": { "name": "LOG1", "supported": true }, + "0xa2": { "name": "LOG2", "supported": true }, + "0xa3": { "name": "LOG3", "supported": true }, + "0xa4": { "name": "LOG4", "supported": true }, + "0xf0": { "name": "CREATE", "supported": true }, + "0xf1": { "name": "CALL", "supported": true }, + "0xf2": { "name": "CALLCODE", "supported": true }, + "0xf3": { "name": "RETURN", "supported": true }, + "0xf4": { "name": "DELEGATECALL", "supported": true }, + "0xf5": { "name": "CREATE2", "supported": true }, + "0xfa": { "name": "STATICCALL", "supported": true }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } @@ -528,10 +465,6 @@ "0x09": { "name": "MULMOD", "supported": true }, "0x0a": { "name": "EXP", "supported": true }, "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x0c": { "name": "unknown", "supported": false }, - "0x0d": { "name": "unknown", "supported": false }, - "0x0e": { "name": "unknown", "supported": false }, - "0x0f": { "name": "unknown", "supported": false }, "0x10": { "name": "LT", "supported": true }, "0x11": { "name": "GT", "supported": true }, "0x12": { "name": "SLT", "supported": true }, @@ -546,24 +479,7 @@ "0x1b": { "name": "SHL", "supported": true }, "0x1c": { "name": "SHR", "supported": true }, "0x1d": { "name": "SAR", "supported": true }, - "0x1e": { "name": "unknown", "supported": false }, - "0x1f": { "name": "unknown", "supported": false }, "0x20": { "name": "KECCAK256", "supported": true }, - "0x21": { "name": "unknown", "supported": false }, - "0x22": { "name": "unknown", "supported": false }, - "0x23": { "name": "unknown", "supported": false }, - "0x24": { "name": "unknown", "supported": false }, - "0x25": { "name": "unknown", "supported": false }, - "0x26": { "name": "unknown", "supported": false }, - "0x27": { "name": "unknown", "supported": false }, - "0x28": { "name": "unknown", "supported": false }, - "0x29": { "name": "unknown", "supported": false }, - "0x2a": { "name": "unknown", "supported": false }, - "0x2b": { "name": "unknown", "supported": false }, - "0x2c": { "name": "unknown", "supported": false }, - "0x2d": { "name": "unknown", "supported": false }, - "0x2e": { "name": "unknown", "supported": false }, - "0x2f": { "name": "unknown", "supported": false }, "0x30": { "name": "ADDRESS", "supported": true }, "0x31": { "name": "BALANCE", "supported": true }, "0x32": { "name": "ORIGIN", "supported": true }, @@ -591,11 +507,6 @@ "0x48": { "name": "BASEFEE", "supported": true }, "0x49": { "name": "BLOBHASH", "supported": true }, "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x4b": { "name": "unknown", "supported": false }, - "0x4c": { "name": "unknown", "supported": false }, - "0x4d": { "name": "unknown", "supported": false }, - "0x4e": { "name": "unknown", "supported": false }, - "0x4f": { "name": "unknown", "supported": false }, "0x50": { "name": "POP", "supported": true }, "0x51": { "name": "MLOAD", "supported": true }, "0x52": { "name": "MSTORE", "supported": true }, @@ -681,94 +592,13 @@ "0xa2": { "name": "LOG2", "supported": true }, "0xa3": { "name": "LOG3", "supported": true }, "0xa4": { "name": "LOG4", "supported": true }, - "0xa5": { "name": "unknown", "supported": false }, - "0xa6": { "name": "unknown", "supported": false }, - "0xa7": { "name": "unknown", "supported": false }, - "0xa8": { "name": "unknown", "supported": false }, - "0xa9": { "name": "unknown", "supported": false }, - "0xaa": { "name": "unknown", "supported": false }, - "0xab": { "name": "unknown", "supported": false }, - "0xac": { "name": "unknown", "supported": false }, - "0xad": { "name": "unknown", "supported": false }, - "0xae": { "name": "unknown", "supported": false }, - "0xaf": { "name": "unknown", "supported": false }, - "0xb0": { "name": "unknown", "supported": false }, - "0xb1": { "name": "unknown", "supported": false }, - "0xb2": { "name": "unknown", "supported": false }, - "0xb3": { "name": "unknown", "supported": false }, - "0xb4": { "name": "unknown", "supported": false }, - "0xb5": { "name": "unknown", "supported": false }, - "0xb6": { "name": "unknown", "supported": false }, - "0xb7": { "name": "unknown", "supported": false }, - "0xb8": { "name": "unknown", "supported": false }, - "0xb9": { "name": "unknown", "supported": false }, - "0xba": { "name": "unknown", "supported": false }, - "0xbb": { "name": "unknown", "supported": false }, - "0xbc": { "name": "unknown", "supported": false }, - "0xbd": { "name": "unknown", "supported": false }, - "0xbe": { "name": "unknown", "supported": false }, - "0xbf": { "name": "unknown", "supported": false }, - "0xc0": { "name": "unknown", "supported": false }, - "0xc1": { "name": "unknown", "supported": false }, - "0xc2": { "name": "unknown", "supported": false }, - "0xc3": { "name": "unknown", "supported": false }, - "0xc4": { "name": "unknown", "supported": false }, - "0xc5": { "name": "unknown", "supported": false }, - "0xc6": { "name": "unknown", "supported": false }, - "0xc7": { "name": "unknown", "supported": false }, - "0xc8": { "name": "unknown", "supported": false }, - "0xc9": { "name": "unknown", "supported": false }, - "0xca": { "name": "unknown", "supported": false }, - "0xcb": { "name": "unknown", "supported": false }, - "0xcc": { "name": "unknown", "supported": false }, - "0xcd": { "name": "unknown", "supported": false }, - "0xce": { "name": "unknown", "supported": false }, - "0xcf": { "name": "unknown", "supported": false }, - "0xd0": { "name": "unknown", "supported": false }, - "0xd1": { "name": "unknown", "supported": false }, - "0xd2": { "name": "unknown", "supported": false }, - "0xd3": { "name": "unknown", "supported": false }, - "0xd4": { "name": "unknown", "supported": false }, - "0xd5": { "name": "unknown", "supported": false }, - "0xd6": { "name": "unknown", "supported": false }, - "0xd7": { "name": "unknown", "supported": false }, - "0xd8": { "name": "unknown", "supported": false }, - "0xd9": { "name": "unknown", "supported": false }, - "0xda": { "name": "unknown", "supported": false }, - "0xdb": { "name": "unknown", "supported": false }, - "0xdc": { "name": "unknown", "supported": false }, - "0xdd": { "name": "unknown", "supported": false }, - "0xde": { "name": "unknown", "supported": false }, - "0xdf": { "name": "unknown", "supported": false }, - "0xe0": { "name": "unknown", "supported": false }, - "0xe1": { "name": "unknown", "supported": false }, - "0xe2": { "name": "unknown", "supported": false }, - "0xe3": { "name": "unknown", "supported": false }, - "0xe4": { "name": "unknown", "supported": false }, - "0xe5": { "name": "unknown", "supported": false }, - "0xe6": { "name": "unknown", "supported": false }, - "0xe7": { "name": "unknown", "supported": false }, - "0xe8": { "name": "unknown", "supported": false }, - "0xe9": { "name": "unknown", "supported": false }, - "0xea": { "name": "unknown", "supported": false }, - "0xeb": { "name": "unknown", "supported": false }, - "0xec": { "name": "unknown", "supported": false }, - "0xed": { "name": "unknown", "supported": false }, - "0xee": { "name": "unknown", "supported": false }, - "0xef": { "name": "unknown", "supported": false }, "0xf0": { "name": "CREATE", "supported": true }, "0xf1": { "name": "CALL", "supported": true }, "0xf2": { "name": "CALLCODE", "supported": true }, "0xf3": { "name": "RETURN", "supported": true }, "0xf4": { "name": "DELEGATECALL", "supported": true }, "0xf5": { "name": "CREATE2", "supported": true }, - "0xf6": { "name": "unknown", "supported": false }, - "0xf7": { "name": "unknown", "supported": false }, - "0xf8": { "name": "unknown", "supported": false }, - "0xf9": { "name": "unknown", "supported": false }, "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfb": { "name": "unknown", "supported": false }, - "0xfc": { "name": "unknown", "supported": false }, "0xfd": { "name": "REVERT", "supported": true }, "0xfe": { "name": "INVALID", "supported": true }, "0xff": { "name": "SELFDESTRUCT", "supported": true } diff --git a/script/opcodes.ts b/script/opcodes.ts index 0a117001..79544715 100644 --- a/script/opcodes.ts +++ b/script/opcodes.ts @@ -10,10 +10,15 @@ export async function checkOpcodes( const supported = await Promise.all(opcodes.map(async (opcode) => checkOpcode(opcode, client))); const result: Record = {}; opcodes.forEach((opcode, index) => { - result[toHex(opcode, { size: 1 })] = { - name: knownOpcodes[opcode] || 'unknown', - supported: supported[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[toHex(opcode, { size: 1 })] = { + name: knownOpcodes[opcode] || 'unknown', + supported: supported[index], + }; + } }); return result; } @@ -29,6 +34,7 @@ async function checkOpcode(opcode: Opcode, client: PublicClient): Promise Date: Mon, 15 Apr 2024 19:47:16 -0700 Subject: [PATCH 10/75] refactor: change to arrays --- script/opcodes.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/script/opcodes.ts b/script/opcodes.ts index 79544715..9269edeb 100644 --- a/script/opcodes.ts +++ b/script/opcodes.ts @@ -1,23 +1,25 @@ -import { type PublicClient, toHex } from 'viem'; +import { type Hex, type PublicClient, toHex } from 'viem'; type Opcode = number; type CallError = { details: string }; export async function checkOpcodes( client: PublicClient, -): Promise> { +): 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: Record = {}; + + 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[toHex(opcode, { size: 1 })] = { + result.push({ + number: toHex(opcode, { size: 1 }), name: knownOpcodes[opcode] || 'unknown', supported: supported[index], - }; + }); } }); return result; From 03699bdb3c6639fad2d7b3c6f906da8b5362b06a Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 16 Apr 2024 20:08:08 -0700 Subject: [PATCH 11/75] feat: add deployed contracts checks --- script/deployed-contracts.ts | 34 ++++++++++++++++++++++++++++++++++ script/index.ts | 3 +++ 2 files changed, 37 insertions(+) create mode 100644 script/deployed-contracts.ts diff --git a/script/deployed-contracts.ts b/script/deployed-contracts.ts new file mode 100644 index 00000000..b668c4bf --- /dev/null +++ b/script/deployed-contracts.ts @@ -0,0 +1,34 @@ +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 }); + if (!code || code.length < 6) console.log('code', code); + const codeHash = (code && keccak256(code)) || NO_CODE_HASH; + return { name, address, codeHash, hasCode: codeHash !== NO_CODE_HASH }; + }); + return await Promise.all(result); +} + +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 EntryPoint v0.6', address: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' }, + { + name: 'ERC-4337 SimpleAccountFactory v0.6', + address: '0x9406Cc6185a346906296840746125a0E44976454', + }, + // Other + { name: 'Multicall3', address: '0xcA11bde05977b3631167028862bE2a173976CA11' }, + { name: 'Permit2', address: '0x000000000022D473030F116dDEE9F6B43aC78BA3' }, +]; diff --git a/script/index.ts b/script/index.ts index 72d30374..0c2364b0 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,4 +1,5 @@ import { http, createPublicClient } from 'viem'; +import { checkDeployedContracts } from './deployed-contracts'; import { checkOpcodes } from './opcodes'; import type { Metadata } from './types'; @@ -8,6 +9,7 @@ async function main() { const rpcUrl = selectRpcUrl(metadata.rpc); const client = initClient(rpcUrl); const opcodes = await checkOpcodes(client); + const deployedContracts = await checkDeployedContracts(client); const chain = { metadata: sortObjectKeys(metadata, [ 'name', @@ -18,6 +20,7 @@ async function main() { 'nativeCurrency', ]), opcodes, + deployedContracts, }; await save(chainId, chain); } From 7c4228c0a414296c2dac1bde99ed0b471a8844c6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 16 Apr 2024 20:09:25 -0700 Subject: [PATCH 12/75] improve ux --- script/README.md | 12 +- script/data/chain/1.json | 346 +++--- script/data/chain/10.json | 346 +++--- script/data/chain/137.json | 346 +++--- script/data/chain/42161.json | 346 +++--- script/data/feature/deployedContracts.json | 178 +++ script/data/feature/opcodes.json | 1208 ++++++++++---------- script/main.sh | 31 +- 8 files changed, 1598 insertions(+), 1215 deletions(-) create mode 100644 script/data/feature/deployedContracts.json diff --git a/script/README.md b/script/README.md index ca06cb3b..0131eabb 100644 --- a/script/README.md +++ b/script/README.md @@ -1,15 +1,19 @@ # script -To install dependencies: +Install dependencies: ```bash bun install ``` -To run: +Fetch all data for a single chain: ```bash -bun run index.ts +bun main [chainId] ``` -This project was created using `bun init` in bun v1.1.0. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. +Fetch all data for all chains: + +```bash +bun main +``` diff --git a/script/data/chain/1.json b/script/data/chain/1.json index 558a15b7..0425bea7 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -47,155 +47,199 @@ ], "slip44": 60 }, - "opcodes": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - } + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xc67d1657868aa5146eaf24fb879fb1fdec3d2d493b3683a61c9c2f4fb2851131", + "hasCode": true + } + ] } diff --git a/script/data/chain/10.json b/script/data/chain/10.json index 809ce2f1..b44096cb 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -33,155 +33,199 @@ "wss://optimism.drpc.org" ] }, - "opcodes": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - } + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x375714c2c948abd47bf468552c0a842d0e8002ca721efd85061a1297d6824617", + "hasCode": true + } + ] } diff --git a/script/data/chain/137.json b/script/data/chain/137.json index 8a03cf9f..78afee67 100644 --- a/script/data/chain/137.json +++ b/script/data/chain/137.json @@ -34,155 +34,199 @@ ], "slip44": 966 }, - "opcodes": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": false }, - "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - } + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xdb0dd198c1767513d04589d8b3da05423ddc97e543440f84afe0e216693af9bb", + "hasCode": true + } + ] } diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index cab17ac2..a236a46d 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -31,155 +31,199 @@ "wss://arbitrum-one.publicnode.com" ] }, - "opcodes": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - } + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x9e51dcb64cf56fc09a82cb41edbc17c6a2250f18dbd1b91e884c0aca02acd57c", + "hasCode": true + } + ] } diff --git a/script/data/feature/deployedContracts.json b/script/data/feature/deployedContracts.json new file mode 100644 index 00000000..1bdf0787 --- /dev/null +++ b/script/data/feature/deployedContracts.json @@ -0,0 +1,178 @@ +{ + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory 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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory 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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0xdb0dd198c1767513d04589d8b3da05423ddc97e543440f84afe0e216693af9bb", + "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 EntryPoint v0.6", + "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", + "hasCode": true + }, + { + "name": "ERC-4337 SimpleAccountFactory v0.6", + "address": "0x9406Cc6185a346906296840746125a0E44976454", + "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", + "hasCode": true + }, + { + "name": "Multicall3", + "address": "0xcA11bde05977b3631167028862bE2a173976CA11", + "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", + "hasCode": true + }, + { + "name": "Permit2", + "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", + "codeHash": "0x9e51dcb64cf56fc09a82cb41edbc17c6a2250f18dbd1b91e884c0aca02acd57c", + "hasCode": true + } + ] +} diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json index 81324518..2a32529f 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -1,606 +1,606 @@ { - "1": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - }, - "10": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": true }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - }, - "137": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": false }, - "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - }, - "42161": { - "0x00": { "name": "STOP", "supported": true }, - "0x01": { "name": "ADD", "supported": true }, - "0x02": { "name": "MUL", "supported": true }, - "0x03": { "name": "SUB", "supported": true }, - "0x04": { "name": "DIV", "supported": true }, - "0x05": { "name": "SDIV", "supported": true }, - "0x06": { "name": "MOD", "supported": true }, - "0x07": { "name": "SMOD", "supported": true }, - "0x08": { "name": "ADDMOD", "supported": true }, - "0x09": { "name": "MULMOD", "supported": true }, - "0x0a": { "name": "EXP", "supported": true }, - "0x0b": { "name": "SIGNEXTEND", "supported": true }, - "0x10": { "name": "LT", "supported": true }, - "0x11": { "name": "GT", "supported": true }, - "0x12": { "name": "SLT", "supported": true }, - "0x13": { "name": "SGT", "supported": true }, - "0x14": { "name": "EQ", "supported": true }, - "0x15": { "name": "ISZERO", "supported": true }, - "0x16": { "name": "AND", "supported": true }, - "0x17": { "name": "OR", "supported": true }, - "0x18": { "name": "XOR", "supported": true }, - "0x19": { "name": "NOT", "supported": true }, - "0x1a": { "name": "BYTE", "supported": true }, - "0x1b": { "name": "SHL", "supported": true }, - "0x1c": { "name": "SHR", "supported": true }, - "0x1d": { "name": "SAR", "supported": true }, - "0x20": { "name": "KECCAK256", "supported": true }, - "0x30": { "name": "ADDRESS", "supported": true }, - "0x31": { "name": "BALANCE", "supported": true }, - "0x32": { "name": "ORIGIN", "supported": true }, - "0x33": { "name": "CALLER", "supported": true }, - "0x34": { "name": "CALLVALUE", "supported": true }, - "0x35": { "name": "CALLDATALOAD", "supported": true }, - "0x36": { "name": "CALLDATASIZE", "supported": true }, - "0x37": { "name": "CALLDATACOPY", "supported": true }, - "0x38": { "name": "CODESIZE", "supported": true }, - "0x39": { "name": "CODECOPY", "supported": true }, - "0x3a": { "name": "GASPRICE", "supported": true }, - "0x3b": { "name": "EXTCODESIZE", "supported": true }, - "0x3c": { "name": "EXTCODECOPY", "supported": true }, - "0x3d": { "name": "RETURNDATASIZE", "supported": true }, - "0x3e": { "name": "RETURNDATACOPY", "supported": true }, - "0x3f": { "name": "EXTCODEHASH", "supported": true }, - "0x40": { "name": "BLOCKHASH", "supported": true }, - "0x41": { "name": "COINBASE", "supported": true }, - "0x42": { "name": "TIMESTAMP", "supported": true }, - "0x43": { "name": "NUMBER", "supported": true }, - "0x44": { "name": "PREVRANDAO", "supported": true }, - "0x45": { "name": "GASLIMIT", "supported": true }, - "0x46": { "name": "CHAINID", "supported": true }, - "0x47": { "name": "SELFBALANCE", "supported": true }, - "0x48": { "name": "BASEFEE", "supported": true }, - "0x49": { "name": "BLOBHASH", "supported": true }, - "0x4a": { "name": "BLOBBASEFEE", "supported": false }, - "0x50": { "name": "POP", "supported": true }, - "0x51": { "name": "MLOAD", "supported": true }, - "0x52": { "name": "MSTORE", "supported": true }, - "0x53": { "name": "MSTORE8", "supported": true }, - "0x54": { "name": "SLOAD", "supported": true }, - "0x55": { "name": "SSTORE", "supported": true }, - "0x56": { "name": "JUMP", "supported": true }, - "0x57": { "name": "JUMPI", "supported": true }, - "0x58": { "name": "PC", "supported": true }, - "0x59": { "name": "MSIZE", "supported": true }, - "0x5a": { "name": "GAS", "supported": true }, - "0x5b": { "name": "JUMPDEST", "supported": true }, - "0x5c": { "name": "TLOAD", "supported": true }, - "0x5d": { "name": "TSTORE", "supported": true }, - "0x5e": { "name": "MCOPY", "supported": true }, - "0x5f": { "name": "PUSH0", "supported": true }, - "0x60": { "name": "PUSH1", "supported": true }, - "0x61": { "name": "PUSH2", "supported": true }, - "0x62": { "name": "PUSH3", "supported": true }, - "0x63": { "name": "PUSH4", "supported": true }, - "0x64": { "name": "PUSH5", "supported": true }, - "0x65": { "name": "PUSH6", "supported": true }, - "0x66": { "name": "PUSH7", "supported": true }, - "0x67": { "name": "PUSH8", "supported": true }, - "0x68": { "name": "PUSH9", "supported": true }, - "0x69": { "name": "PUSH10", "supported": true }, - "0x6a": { "name": "PUSH11", "supported": true }, - "0x6b": { "name": "PUSH12", "supported": true }, - "0x6c": { "name": "PUSH13", "supported": true }, - "0x6d": { "name": "PUSH14", "supported": true }, - "0x6e": { "name": "PUSH15", "supported": true }, - "0x6f": { "name": "PUSH16", "supported": true }, - "0x70": { "name": "PUSH17", "supported": true }, - "0x71": { "name": "PUSH18", "supported": true }, - "0x72": { "name": "PUSH19", "supported": true }, - "0x73": { "name": "PUSH20", "supported": true }, - "0x74": { "name": "PUSH21", "supported": true }, - "0x75": { "name": "PUSH22", "supported": true }, - "0x76": { "name": "PUSH23", "supported": true }, - "0x77": { "name": "PUSH24", "supported": true }, - "0x78": { "name": "PUSH25", "supported": true }, - "0x79": { "name": "PUSH26", "supported": true }, - "0x7a": { "name": "PUSH27", "supported": true }, - "0x7b": { "name": "PUSH28", "supported": true }, - "0x7c": { "name": "PUSH29", "supported": true }, - "0x7d": { "name": "PUSH30", "supported": true }, - "0x7e": { "name": "PUSH31", "supported": true }, - "0x7f": { "name": "PUSH32", "supported": true }, - "0x80": { "name": "DUP1", "supported": true }, - "0x81": { "name": "DUP2", "supported": true }, - "0x82": { "name": "DUP3", "supported": true }, - "0x83": { "name": "DUP4", "supported": true }, - "0x84": { "name": "DUP5", "supported": true }, - "0x85": { "name": "DUP6", "supported": true }, - "0x86": { "name": "DUP7", "supported": true }, - "0x87": { "name": "DUP8", "supported": true }, - "0x88": { "name": "DUP9", "supported": true }, - "0x89": { "name": "DUP10", "supported": true }, - "0x8a": { "name": "DUP11", "supported": true }, - "0x8b": { "name": "DUP12", "supported": true }, - "0x8c": { "name": "DUP13", "supported": true }, - "0x8d": { "name": "DUP14", "supported": true }, - "0x8e": { "name": "DUP15", "supported": true }, - "0x8f": { "name": "DUP16", "supported": true }, - "0x90": { "name": "SWAP1", "supported": true }, - "0x91": { "name": "SWAP2", "supported": true }, - "0x92": { "name": "SWAP3", "supported": true }, - "0x93": { "name": "SWAP4", "supported": true }, - "0x94": { "name": "SWAP5", "supported": true }, - "0x95": { "name": "SWAP6", "supported": true }, - "0x96": { "name": "SWAP7", "supported": true }, - "0x97": { "name": "SWAP8", "supported": true }, - "0x98": { "name": "SWAP9", "supported": true }, - "0x99": { "name": "SWAP10", "supported": true }, - "0x9a": { "name": "SWAP11", "supported": true }, - "0x9b": { "name": "SWAP12", "supported": true }, - "0x9c": { "name": "SWAP13", "supported": true }, - "0x9d": { "name": "SWAP14", "supported": true }, - "0x9e": { "name": "SWAP15", "supported": true }, - "0x9f": { "name": "SWAP16", "supported": true }, - "0xa0": { "name": "LOG0", "supported": true }, - "0xa1": { "name": "LOG1", "supported": true }, - "0xa2": { "name": "LOG2", "supported": true }, - "0xa3": { "name": "LOG3", "supported": true }, - "0xa4": { "name": "LOG4", "supported": true }, - "0xf0": { "name": "CREATE", "supported": true }, - "0xf1": { "name": "CALL", "supported": true }, - "0xf2": { "name": "CALLCODE", "supported": true }, - "0xf3": { "name": "RETURN", "supported": true }, - "0xf4": { "name": "DELEGATECALL", "supported": true }, - "0xf5": { "name": "CREATE2", "supported": true }, - "0xfa": { "name": "STATICCALL", "supported": true }, - "0xfd": { "name": "REVERT", "supported": true }, - "0xfe": { "name": "INVALID", "supported": true }, - "0xff": { "name": "SELFDESTRUCT", "supported": true } - } + "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 } + ], + "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 } + ] } diff --git a/script/main.sh b/script/main.sh index b2249b45..cc4e8659 100644 --- a/script/main.sh +++ b/script/main.sh @@ -1,5 +1,30 @@ #!/bin/bash + set -euo pipefail -bun index.ts "$1" -bun postprocess.ts -bun check \ No newline at end of file + +fetchDataForChainId() { + bun index.ts "$1" + bun postprocess.ts + bun check +} + +if [ $# -eq 0 ]; then + # No input provided, find all *.json files in the data/chain folder + chainFiles=(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)" + fetchDataForChainId "$input" + index=$((index + 1)) + done +else + # Input provided, run the script with the provided input + echo "Running for chain ID $1" + fetchDataForChainId "$1" "1" "1" +fi From 6ebc8d87ce32e5d96bf1fd47ba71f63fceba810d Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 17 Apr 2024 06:45:36 -0700 Subject: [PATCH 13/75] feat: precompile support --- script/data/chain/1.json | 52 +++++++ script/data/chain/10.json | 52 +++++++ script/data/chain/137.json | 52 +++++++ script/data/chain/42161.json | 52 +++++++ script/data/feature/precompiles.json | 210 +++++++++++++++++++++++++++ script/index.ts | 9 ++ script/precompiles.ts | 95 ++++++++++++ 7 files changed, 522 insertions(+) create mode 100644 script/data/feature/precompiles.json create mode 100644 script/precompiles.ts diff --git a/script/data/chain/1.json b/script/data/chain/1.json index 0425bea7..293256a8 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -241,5 +241,57 @@ "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 + } ] } diff --git a/script/data/chain/10.json b/script/data/chain/10.json index b44096cb..45e86316 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -227,5 +227,57 @@ "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 + } ] } diff --git a/script/data/chain/137.json b/script/data/chain/137.json index 78afee67..6afa1b04 100644 --- a/script/data/chain/137.json +++ b/script/data/chain/137.json @@ -228,5 +228,57 @@ "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 + } ] } diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index a236a46d..175fae1a 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -225,5 +225,57 @@ "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 + } ] } diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json new file mode 100644 index 00000000..54f48d1f --- /dev/null +++ b/script/data/feature/precompiles.json @@ -0,0 +1,210 @@ +{ + "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 + } + ], + "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 + } + ], + "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 + } + ], + "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 + } + ] +} diff --git a/script/index.ts b/script/index.ts index 0c2364b0..6bd1fc8e 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,15 +1,23 @@ import { http, createPublicClient } from 'viem'; import { checkDeployedContracts } from './deployed-contracts'; import { checkOpcodes } from './opcodes'; +import { checkPrecompiles } from './precompiles'; import type { Metadata } from './types'; async function main() { + // Initialize chain data. const { chainId } = init(); const metadata = await getMetadata(chainId); const rpcUrl = selectRpcUrl(metadata.rpc); const client = initClient(rpcUrl); + + // Fetch data. + // We intentionally await each check sequentially to avoid being rate-limited by the node. const opcodes = await checkOpcodes(client); const deployedContracts = await checkDeployedContracts(client); + const precompiles = await checkPrecompiles(client); + + // Format and save the output. const chain = { metadata: sortObjectKeys(metadata, [ 'name', @@ -21,6 +29,7 @@ async function main() { ]), opcodes, deployedContracts, + precompiles, }; await save(chainId, chain); } diff --git a/script/precompiles.ts b/script/precompiles.ts new file mode 100644 index 00000000..be948077 --- /dev/null +++ b/script/precompiles.ts @@ -0,0 +1,95 @@ +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 }) => { + const res = await client.call({ to: address, data: testCalldata }); + const implemented = res.data === expectedResponse; + return { name, address, implemented }; + }); + 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. +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', + }, + ]; From de92994851d865bc1e6459c2a7a44cc21381909f Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 17 Apr 2024 07:33:44 -0700 Subject: [PATCH 14/75] refactor: move to checks folder --- script/{ => checks}/deployed-contracts.ts | 0 script/{ => checks}/opcodes.ts | 0 script/{ => checks}/precompiles.ts | 0 script/index.ts | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename script/{ => checks}/deployed-contracts.ts (100%) rename script/{ => checks}/opcodes.ts (100%) rename script/{ => checks}/precompiles.ts (100%) diff --git a/script/deployed-contracts.ts b/script/checks/deployed-contracts.ts similarity index 100% rename from script/deployed-contracts.ts rename to script/checks/deployed-contracts.ts diff --git a/script/opcodes.ts b/script/checks/opcodes.ts similarity index 100% rename from script/opcodes.ts rename to script/checks/opcodes.ts diff --git a/script/precompiles.ts b/script/checks/precompiles.ts similarity index 100% rename from script/precompiles.ts rename to script/checks/precompiles.ts diff --git a/script/index.ts b/script/index.ts index 6bd1fc8e..7c932a50 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,7 +1,7 @@ import { http, createPublicClient } from 'viem'; -import { checkDeployedContracts } from './deployed-contracts'; -import { checkOpcodes } from './opcodes'; -import { checkPrecompiles } from './precompiles'; +import { checkDeployedContracts } from './checks/deployed-contracts'; +import { checkOpcodes } from './checks/opcodes'; +import { checkPrecompiles } from './checks/precompiles'; import type { Metadata } from './types'; async function main() { From a135007fad2df22a904f8fa9f2e0874cd9c681d7 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 17 Apr 2024 20:40:07 -0700 Subject: [PATCH 15/75] chore: remove log --- script/checks/deployed-contracts.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/script/checks/deployed-contracts.ts b/script/checks/deployed-contracts.ts index b668c4bf..33c18bed 100644 --- a/script/checks/deployed-contracts.ts +++ b/script/checks/deployed-contracts.ts @@ -7,7 +7,6 @@ export async function checkDeployedContracts( ): Promise<{ name: string; address: Address; codeHash: Hex; hasCode: boolean }[]> { const result = deployedContracts.map(async ({ name, address }) => { const code = await client.getBytecode({ address }); - if (!code || code.length < 6) console.log('code', code); const codeHash = (code && keccak256(code)) || NO_CODE_HASH; return { name, address, codeHash, hasCode: codeHash !== NO_CODE_HASH }; }); From f140c557e066a825101c66d1329cf04c8f3e74e9 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 18 Apr 2024 06:11:22 -0700 Subject: [PATCH 16/75] chore: split up lint and fmt jobs --- script/archive/fetch-abi.ts | 4 ++-- script/archive/json-abi-to-viem-human-readable.ts | 10 ---------- script/main.sh | 7 ++++--- script/package.json | 4 +++- 4 files changed, 9 insertions(+), 16 deletions(-) delete mode 100644 script/archive/json-abi-to-viem-human-readable.ts diff --git a/script/archive/fetch-abi.ts b/script/archive/fetch-abi.ts index 2d5a7836..e9a96562 100644 --- a/script/archive/fetch-abi.ts +++ b/script/archive/fetch-abi.ts @@ -2,7 +2,7 @@ // Example usage: // bun script/fetch-abi.ts https://arbiscan.io/address/0x0000000000000000000000000000000000000064 import { formatAbi } from 'abitype'; -import clipboardy from 'clipboardy'; +// import clipboardy from 'clipboardy'; import type { Address } from 'viem'; type ChainConfig = { @@ -89,7 +89,7 @@ async function main() { const fullAbi = formattedAbi2 ? formattedAbi1.concat('--------', formattedAbi2) : formattedAbi1; // Copy the formatted ABI to the clipboard. - clipboardy.writeSync(JSON.stringify(fullAbi)); + // clipboardy.writeSync(JSON.stringify(fullAbi)); const kind = formattedAbi2 ? ' proxy and implementation ' : ' '; console.log(`✅ Copied${kind}ABI to clipboard for ${chain.name} contract ${address}`); } diff --git a/script/archive/json-abi-to-viem-human-readable.ts b/script/archive/json-abi-to-viem-human-readable.ts deleted file mode 100644 index db196f1b..00000000 --- a/script/archive/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 index cc4e8659..558dd660 100644 --- a/script/main.sh +++ b/script/main.sh @@ -3,9 +3,10 @@ set -euo pipefail fetchDataForChainId() { - bun index.ts "$1" - bun postprocess.ts - bun check + bun lint # Lint for potential issues. + bun index.ts "$1" # Fetch data for the given chain ID. + bun postprocess.ts # Slice data by feature. + bun fmt # Format the generated files. } if [ $# -eq 0 ]; then diff --git a/script/package.json b/script/package.json index 6ed87852..ee4b9c25 100644 --- a/script/package.json +++ b/script/package.json @@ -3,7 +3,9 @@ "module": "index.ts", "type": "module", "scripts": { - "check": "bunx @biomejs/biome check --apply .", + "lint": "tsc --noEmit && bunx @biomejs/biome lint --apply .", + "fmt": "bunx @biomejs/biome format --write .", + "check": "bun lint && bun fmt", "main": "bash ./main.sh" }, "devDependencies": { From 9339ceb5366f897713e87620cbcf8944d529103c Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Fri, 19 Apr 2024 15:06:22 -0700 Subject: [PATCH 17/75] feat: add addresses that uniquely identify an evm stack --- script/checks/evm-stack-addresses.ts | 89 +++ script/data/chain/1.json | 211 ++++++- script/data/chain/10.json | 211 ++++++- script/data/chain/137.json | 284 ---------- script/data/chain/42161.json | 211 ++++++- script/data/feature/deployedContracts.json | 44 -- script/data/feature/evmStackAddresses.json | 629 +++++++++++++++++++++ script/data/feature/metadata.json | 35 -- script/data/feature/opcodes.json | 151 ----- script/data/feature/precompiles.json | 52 -- script/data/feature/predeploys.json | 408 +++++++++++++ script/index.ts | 49 +- 12 files changed, 1790 insertions(+), 584 deletions(-) create mode 100644 script/checks/evm-stack-addresses.ts delete mode 100644 script/data/chain/137.json create mode 100644 script/data/feature/evmStackAddresses.json create mode 100644 script/data/feature/predeploys.json diff --git a/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts new file mode 100644 index 00000000..a4a72d1a --- /dev/null +++ b/script/checks/evm-stack-addresses.ts @@ -0,0 +1,89 @@ +import { type Address, type Hex, type PublicClient, keccak256 } from 'viem'; + +type EVMStack = 'OP' | 'Orbit'; + +type Predeploy = { + name: string; + address: Address; + kind: 'Predeploy' | 'Precompile'; +}; + +type Result = Predeploy & { + 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. +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/data/chain/1.json b/script/data/chain/1.json index 293256a8..54d94efc 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -293,5 +293,214 @@ "address": "0x000000000000000000000000000000000000000a", "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/10.json b/script/data/chain/10.json index 45e86316..f3830fbc 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -279,5 +279,214 @@ "address": "0x000000000000000000000000000000000000000a", "implemented": true } - ] + ], + "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 deleted file mode 100644 index 6afa1b04..00000000 --- a/script/data/chain/137.json +++ /dev/null @@ -1,284 +0,0 @@ -{ - "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 EntryPoint v0.6", - "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", - "hasCode": true - }, - { - "name": "ERC-4337 SimpleAccountFactory 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 - } - ] -} diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index 175fae1a..26da3a5b 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -277,5 +277,214 @@ "address": "0x000000000000000000000000000000000000000a", "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/feature/deployedContracts.json b/script/data/feature/deployedContracts.json index 1bdf0787..38f6d64d 100644 --- a/script/data/feature/deployedContracts.json +++ b/script/data/feature/deployedContracts.json @@ -87,50 +87,6 @@ "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 EntryPoint v0.6", - "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", - "hasCode": true - }, - { - "name": "ERC-4337 SimpleAccountFactory v0.6", - "address": "0x9406Cc6185a346906296840746125a0E44976454", - "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", - "hasCode": true - }, - { - "name": "Multicall3", - "address": "0xcA11bde05977b3631167028862bE2a173976CA11", - "codeHash": "0xd5c15df687b16f2ff992fc8d767b4216323184a2bbc6ee2f9c398c318e770891", - "hasCode": true - }, - { - "name": "Permit2", - "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3", - "codeHash": "0xdb0dd198c1767513d04589d8b3da05423ddc97e543440f84afe0e216693af9bb", - "hasCode": true - } - ], "42161": [ { "name": "CreateX", diff --git a/script/data/feature/evmStackAddresses.json b/script/data/feature/evmStackAddresses.json new file mode 100644 index 00000000..d5f506a6 --- /dev/null +++ b/script/data/feature/evmStackAddresses.json @@ -0,0 +1,629 @@ +{ + "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 + } + ] + }, + "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 + } + ] + } +} diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json index 8c4ee814..d7f1273a 100644 --- a/script/data/feature/metadata.json +++ b/script/data/feature/metadata.json @@ -81,41 +81,6 @@ "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 - }, "42161": { "name": "Arbitrum One", "shortName": "arb1", diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json index 2a32529f..fddc1f04 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -301,157 +301,6 @@ { "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 } - ], "42161": [ { "number": "0x00", "name": "STOP", "supported": true }, { "number": "0x01", "name": "ADD", "supported": true }, diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json index 54f48d1f..629c541e 100644 --- a/script/data/feature/precompiles.json +++ b/script/data/feature/precompiles.json @@ -103,58 +103,6 @@ "implemented": true } ], - "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 - } - ], "42161": [ { "name": "ecRecover", diff --git a/script/data/feature/predeploys.json b/script/data/feature/predeploys.json new file mode 100644 index 00000000..f467dada --- /dev/null +++ b/script/data/feature/predeploys.json @@ -0,0 +1,408 @@ +{ + "1": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GasPriceOracle", + "address": "0x420000000000000000000000000000000000000F", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "GovernanceToken", + "address": "0x4200000000000000000000000000000000000042", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1Block", + "address": "0x4200000000000000000000000000000000000015", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ToL1MessagePasser", + "address": "0x4200000000000000000000000000000000000016", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L2ERC721Bridge", + "address": "0x4200000000000000000000000000000000000014", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "OptimismMintableERC721Factory", + "address": "0x4200000000000000000000000000000000000017", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ProxyAdmin", + "address": "0x4200000000000000000000000000000000000018", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "BaseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "L1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ], + "Orbit": [ + { + "name": "ArbAddressTable", + "address": "0x0000000000000000000000000000000000000066", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbAggregator", + "address": "0x000000000000000000000000000000000000006D", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbFunctionTable", + "address": "0x0000000000000000000000000000000000000068", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbGasInfo", + "address": "0x000000000000000000000000000000000000006C", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbInfo", + "address": "0x0000000000000000000000000000000000000065", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwner", + "address": "0x0000000000000000000000000000000000000070", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbOwnerPublic", + "address": "0x000000000000000000000000000000000000006b", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbRetryableTx", + "address": "0x000000000000000000000000000000000000006E", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbStatistics", + "address": "0x000000000000000000000000000000000000006F", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "ArbSys", + "address": "0x0000000000000000000000000000000000000064", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + }, + { + "name": "NodeInterface", + "address": "0x00000000000000000000000000000000000000C8", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false + } + ] + }, + "10": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "codeHash": "0x0947f7bbeb5659a3b6e9a2045605fee6c606c66cb27eacfcf9ec3c2a4d426c51", + "hasCode": true + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "codeHash": "0x779bbf2a738ef09d961c945116197e2ac764c1b39304b2b4418cd4e42668b173", + "hasCode": true + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "GasPriceOracle`", + "address": "0x420000000000000000000000000000000000000F", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "GovernanceToken`", + "address": "0x4200000000000000000000000000000000000042", + "codeHash": "0x8551d935f4e67ad3c98609f0d9f0f234740c4c4599f82674633b55204393e07f", + "hasCode": true + }, + { + "name": "L1Block`", + "address": "0x4200000000000000000000000000000000000015", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "L2ToL1MessagePasser`", + "address": "0x4200000000000000000000000000000000000016", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "L2ERC721Bridge`", + "address": "0x4200000000000000000000000000000000000014", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "OptimismMintableERC721Factory`", + "address": "0x4200000000000000000000000000000000000017", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "ProxyAdmin`", + "address": "0x4200000000000000000000000000000000000018", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "aseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + }, + { + "name": "1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "hasCode": true + } + ], + "Orbit": [] + }, + "42161": { + "OP": [ + { + "name": "LegacyMessagePasser", + "address": "0x4200000000000000000000000000000000000000", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "DeployerWhitelist", + "address": "0x4200000000000000000000000000000000000002", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "LegacyERC20ETH", + "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "WETH9", + "address": "0x4200000000000000000000000000000000000006", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L2CrossDomainMessenger", + "address": "0x4200000000000000000000000000000000000007", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L2StandardBridge", + "address": "0x4200000000000000000000000000000000000010", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "SequencerFeeVault", + "address": "0x4200000000000000000000000000000000000011", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "OptimismMintableERC20Factory", + "address": "0x4200000000000000000000000000000000000012", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L1BlockNumber", + "address": "0x4200000000000000000000000000000000000013", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "GasPriceOracle`", + "address": "0x420000000000000000000000000000000000000F", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "GovernanceToken`", + "address": "0x4200000000000000000000000000000000000042", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L1Block`", + "address": "0x4200000000000000000000000000000000000015", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L2ToL1MessagePasser`", + "address": "0x4200000000000000000000000000000000000016", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "L2ERC721Bridge`", + "address": "0x4200000000000000000000000000000000000014", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "OptimismMintableERC721Factory`", + "address": "0x4200000000000000000000000000000000000017", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "ProxyAdmin`", + "address": "0x4200000000000000000000000000000000000018", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "aseFeeVault", + "address": "0x4200000000000000000000000000000000000019", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + }, + { + "name": "1FeeVault", + "address": "0x420000000000000000000000000000000000001a", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hasCode": false + } + ], + "Orbit": [] + } +} diff --git a/script/index.ts b/script/index.ts index 7c932a50..091247df 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,5 +1,6 @@ -import { http, createPublicClient } from 'viem'; +import { http, fallback, createPublicClient } from 'viem'; import { checkDeployedContracts } from './checks/deployed-contracts'; +import { checkEvmStackAddresses } from './checks/evm-stack-addresses'; import { checkOpcodes } from './checks/opcodes'; import { checkPrecompiles } from './checks/precompiles'; import type { Metadata } from './types'; @@ -8,14 +9,16 @@ async function main() { // Initialize chain data. const { chainId } = init(); const metadata = await getMetadata(chainId); - const rpcUrl = selectRpcUrl(metadata.rpc); - const client = initClient(rpcUrl); + const rpcUrls = selectRpcUrls(metadata.rpc); + const client = initClient(rpcUrls); // Fetch data. - // We intentionally await each check sequentially to avoid being rate-limited by the node. - const opcodes = await checkOpcodes(client); - const deployedContracts = await checkDeployedContracts(client); - const precompiles = await checkPrecompiles(client); + const [opcodes, deployedContracts, precompiles, evmStackAddresses] = await Promise.all([ + checkOpcodes(client), + checkDeployedContracts(client), + checkPrecompiles(client), + checkEvmStackAddresses(client), + ]); // Format and save the output. const chain = { @@ -30,6 +33,7 @@ async function main() { opcodes, deployedContracts, precompiles, + evmStackAddresses, }; await save(chainId, chain); } @@ -43,8 +47,10 @@ function init() { return { chainId }; } -function initClient(rpcUrl: string) { - const transport = http(rpcUrl); +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 }); } @@ -72,7 +78,7 @@ function sortObjectKeys(obj: T, orderedKeys: (keyof T)[]): T { return Object.fromEntries(sortedEntries) as T; } -function selectRpcUrl(rpcUrls: string[]): string { +function selectRpcUrls(rpcUrls: string[]): string[] { const hasPlaceholder = (str: string): boolean => str.includes('${'); const replacePlaceholder = (str: string): string => { @@ -85,19 +91,32 @@ function selectRpcUrl(rpcUrls: string[]): string { 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. + ]; + 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 httpUrls = rpcUrls.filter((url) => !url.startsWith('wss://')); - for (const url of httpUrls) { + const replacedUrls: string[] = []; + const normalUrls: string[] = []; + for (const url of filteredRpcUrls) { if (hasPlaceholder(url)) { const replacedUrl = replacePlaceholder(url); - if (replacedUrl !== url) return replacedUrl; + if (replacedUrl !== url) replacedUrls.push(replacedUrl); + } else { + normalUrls.push(url); } } - // Otherwise, return the first URL that does not have a placeholder. - return httpUrls.find((url) => !hasPlaceholder(url)) || ''; + return [...replacedUrls, ...normalUrls]; // Prefer URLs with API keys. } main().catch((error) => { From 6b0840a663db0826400ef411f9ccacb63fae9f97 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 24 Apr 2024 19:10:06 -0700 Subject: [PATCH 18/75] build: fix lint error --- package.json | 1 + pnpm-lock.yaml | 5036 +++++++++++++++++++++++++++--------------------- 2 files changed, 2795 insertions(+), 2242 deletions(-) diff --git a/package.json b/package.json index 4e901fa4..fb872ec6 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "devDependencies": { "@tailwindcss/forms": "^0.5.3", "@trivago/prettier-plugin-sort-imports": "^4.1.1", + "@types/bun": "^1.1.0", "@types/node": "18.16.3", "@types/react": "18.2.5", "@types/react-dom": "18.2.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca819ec6..4e286609 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,530 +1,349 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.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 +importers: + + .: + dependencies: + '@headlessui/react': + specifier: ^1.7.16 + version: 1.7.16(react-dom@18.2.0(react@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))(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@18.2.0))(react-dom@18.2.0(react@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)(zod@3.21.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/bun': + specifier: ^1.1.0 + version: 1.1.0 + '@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))(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)(zod@3.21.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))(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: + '@adraffy/ens-normalize@1.9.0': resolution: {integrity: sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==} - dev: false - /@alloc/quick-lru@5.2.0: + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - dev: true - /@babel/code-frame@7.21.4: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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): + '@eslint-community/eslint-utils@4.4.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: + '@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: + '@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: + '@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): + '@headlessui/react@1.7.16': 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): + '@heroicons/react@2.0.17': resolution: {integrity: sha512-90GMZktkA53YbNzHp6asVEDevUQCMtxWH+2UK2S8OpnLEu7qckTJPhNxNQG52xIR1WFTwFqtH6bt7a60ZNcLLA==} peerDependencies: react: '>= 16' - dependencies: - react: 18.2.0 - dev: false - /@humanwhocodes/config-array@0.11.8: + '@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: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@1.2.1: + '@humanwhocodes/object-schema@1.2.1': resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - /@jridgewell/gen-mapping@0.3.3: + '@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: + '@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: + '@jridgewell/set-array@1.1.2': resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.14: + '@jridgewell/sourcemap-codec@1.4.14': resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - /@jridgewell/trace-mapping@0.3.18: + '@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: + '@next/env@13.4.12': resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==} - dev: false - /@next/eslint-plugin-next@13.4.12: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@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: + '@noble/curves@1.0.0': resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} - dependencies: - '@noble/hashes': 1.3.0 - dev: false - /@noble/hashes@1.3.0: + '@noble/hashes@1.3.0': resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} - dev: false - /@nodelib/fs.scandir@2.1.5: + '@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: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@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: + '@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: + '@resvg/resvg-wasm@2.4.1': resolution: {integrity: sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg==} engines: {node: '>= 10'} - dev: false - /@rushstack/eslint-patch@1.3.0: + '@rushstack/eslint-patch@1.3.0': resolution: {integrity: sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==} - dev: true - /@scure/base@1.1.1: + '@scure/base@1.1.1': resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} - dev: false - /@scure/bip32@1.3.0: + '@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: + '@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: + '@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: + '@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): + '@tailwindcss/forms@0.5.3': 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): + '@trivago/prettier-plugin-sort-imports@4.1.1': resolution: {integrity: sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw==} peerDependencies: '@vue/compiler-sfc': 3.x @@ -532,80 +351,56 @@ packages: 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: + '@types/bun@1.1.0': + resolution: {integrity: sha512-QGK0yU4jh0OK1A7DyhPkQuKjHQCC5jSJa3dpWIEhHv/rPfb6zLfdArc4/uUUZBMTcjilsafRXnPWO+1owb572Q==} + + '@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: + '@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: + '@types/json-schema@7.0.12': resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - dev: true - /@types/json5@0.0.29: + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - /@types/mdast@3.0.12: + '@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: + '@types/ms@0.7.31': resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - dev: false - /@types/node@18.16.3: + '@types/node@18.16.3': resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} - dev: true - /@types/prop-types@15.7.5: + '@types/node@20.11.30': + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + + '@types/prop-types@15.7.5': resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/react-dom@18.2.3: + '@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: + '@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: + '@types/scheduler@0.16.3': resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - /@types/semver@7.5.0: + '@types/semver@7.5.0': resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - dev: true - /@types/unist@2.0.7: + '@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): + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@typescript-eslint/eslint-plugin@6.1.0': resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -615,27 +410,8 @@ packages: 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): + '@typescript-eslint/parser@5.59.7': resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -644,18 +420,8 @@ packages: 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): + '@typescript-eslint/parser@6.1.0': resolution: {integrity: sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -664,35 +430,16 @@ packages: 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: + '@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: + '@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): + '@typescript-eslint/type-utils@6.1.0': resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -701,28 +448,16 @@ packages: 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: + '@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: + '@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): + '@typescript-eslint/typescript-estree@5.59.7': resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -730,20 +465,8 @@ packages: 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): + '@typescript-eslint/typescript-estree@6.1.0': resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -751,90 +474,45 @@ packages: 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): + '@typescript-eslint/utils@6.1.0': 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: + '@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: + '@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: + '@vercel/analytics@1.0.1': resolution: {integrity: sha512-Ux0c9qUfkcPqng3vrR0GTrlQdqNJ2JREn/2ydrVuKwM3RtMfF2mWX31Ijqo1opSjNAq6rK76PwtANw6kl6TAow==} - dev: false - /@vercel/og@0.5.10: + '@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): + '@wagmi/chains@0.3.1': 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): + '@wagmi/chains@1.6.0': 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): + abitype@0.9.3: resolution: {integrity: sha512-dz4qCQLurx97FQhnb/EIYTk/ldQ+oafEDUqC0VVIeQS1Q48/YWt/9YNfMmp9SLFqN41ktxny3c8aYxHjmFIB/w==} peerDependencies: typescript: '>=5.0.4' @@ -844,11 +522,8 @@ packages: optional: true zod: optional: true - dependencies: - typescript: 5.0.4 - dev: false - /abitype@0.9.6(typescript@5.0.4): + abitype@0.9.6: resolution: {integrity: sha512-bnx3yBJ9BhF5SWlIy+fMRprm2w5VhOrDj5bh0K9Aj40AfgQoICuIolm3GmSIhE+lE8qTqRv9PmTg3C9b25vmag==} peerDependencies: typescript: '>=5.0.4' @@ -858,145 +533,2198 @@ packages: optional: true zod: optional: true - dependencies: - typescript: 5.0.4 - dev: true - /acorn-jsx@5.3.2(acorn@8.8.2): + acorn-jsx@5.3.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: + 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: + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + + ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + + autoprefixer@10.4.14: + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + axe-core@4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + + axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + 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 + + bun-types@1.1.0: + resolution: {integrity: sha512-GhMDD7TosdJzQPGUOcQD5PZshvXVxDfwGAZs2dq+eSaPsRn3iUCzvpFlsg7Q51bXVzLAUs+FWHlnmpgZ5UggIg==} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + 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'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clipboardy@3.0.0: + resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: 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==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + electron-to-chromium@1.4.409: + resolution: {integrity: sha512-+2mRCBG9dR66sprh2dLuO6vr+O1xqHXvhmMglfut3OmfeUVRUho2nZYxxD9pG6G4PLDkZeqhlA/Gk6LpjVSHag==} + + emoji-regex@10.2.1: + resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + enhanced-resolve@5.14.1: + resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} + engines: {node: '>=10.13.0'} + + es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + + es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@13.4.12: + resolution: {integrity: sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + + eslint-import-resolver-typescript@3.5.5: + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.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 + + eslint-plugin-import@2.27.5: + 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 + + eslint-plugin-jsx-a11y@6.7.1: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: + 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 + + eslint-plugin-react@7.32.2: + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.39.0: + resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + fflate@0.7.4: + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + 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==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: 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 + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-map@2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@5.0.0: + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + jiti@1.18.2: + resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} + hasBin: true + + js-sdsl@4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + 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==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-themes@0.2.1: + resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} + peerDependencies: + next: '*' + react: '*' + react-dom: '*' + + next@13.4.12: + 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 + + node-releases@2.0.12: + resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + 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'} + + object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + + object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.1: + 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 + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + + 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} + + postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-tailwindcss@0.2.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 + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + + punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + react-markdown@8.0.7: + resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + + resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + satori@0.10.2: + resolution: {integrity: sha512-38povLat5QMuKiKBudM/oIk+a0Z5tEfHh8oD/bsh58L0jlOXxfuhAVpDtlG3M0g5FGLajIV0LaKQftXtaYoSUQ==} + engines: {node: '>=16'} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + 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'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + + string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + + string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + + string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + + styled-jsx@5.1.1: + 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 + + sucrase@3.32.0: + resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} + engines: {node: '>=8'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwindcss@3.3.2: + resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + ts-api-utils@1.0.1: + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.2: + resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + + tsutils@3.21.0: + 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' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + 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==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.11: + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + viem@1.5.0: + resolution: {integrity: sha512-+SVCVaXJRR+fE9q6Sf6q9droB6TunPGY1JfwB3uTdxwWrkgr3qq/NbXaRdtEk+TyaOEjzZQr7t6vUzjOL0zL0Q==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + + which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + 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 + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.1: + resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + engines: {node: '>= 14'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yoga-wasm-web@0.3.3: + resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} + + zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + +snapshots: + + '@adraffy/ens-normalize@1.9.0': {} + + '@alloc/quick-lru@5.2.0': {} + + '@babel/code-frame@7.21.4': + dependencies: + '@babel/highlight': 7.18.6 + + '@babel/generator@7.17.7': + dependencies: + '@babel/types': 7.17.0 + jsesc: 2.5.2 + source-map: 0.5.7 + + '@babel/helper-environment-visitor@7.22.1': {} + + '@babel/helper-function-name@7.21.0': + dependencies: + '@babel/template': 7.21.9 + '@babel/types': 7.22.0 + + '@babel/helper-hoist-variables@7.18.6': + dependencies: + '@babel/types': 7.22.0 + + '@babel/helper-split-export-declaration@7.18.6': + dependencies: + '@babel/types': 7.22.0 + + '@babel/helper-string-parser@7.21.5': {} + + '@babel/helper-validator-identifier@7.19.1': {} + + '@babel/highlight@7.18.6': + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/parser@7.22.0': + dependencies: + '@babel/types': 7.17.0 + + '@babel/runtime@7.22.0': + dependencies: + regenerator-runtime: 0.13.11 + + '@babel/template@7.21.9': + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.22.0 + '@babel/types': 7.22.0 + + '@babel/traverse@7.17.3': + 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 + + '@babel/types@7.17.0': + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + '@babel/types@7.22.0': + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + '@eslint-community/eslint-utils@4.4.0(eslint@8.39.0)': + dependencies: + eslint: 8.39.0 + eslint-visitor-keys: 3.4.1 + + '@eslint-community/regexpp@4.5.1': {} + + '@eslint/eslintrc@2.0.3': + 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 + + '@eslint/js@8.39.0': {} + + '@headlessui/react@1.7.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + client-only: 0.0.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@heroicons/react@2.0.17(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@humanwhocodes/config-array@0.11.8': + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@1.2.1': {} + + '@jridgewell/gen-mapping@0.3.3': + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + + '@jridgewell/resolve-uri@3.1.0': {} + + '@jridgewell/set-array@1.1.2': {} + + '@jridgewell/sourcemap-codec@1.4.14': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.18': + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + + '@next/env@13.4.12': {} + + '@next/eslint-plugin-next@13.4.12': + dependencies: + glob: 7.1.7 + + '@next/swc-darwin-arm64@13.4.12': + optional: true + + '@next/swc-darwin-x64@13.4.12': + optional: true + + '@next/swc-linux-arm64-gnu@13.4.12': + optional: true + + '@next/swc-linux-arm64-musl@13.4.12': + optional: true + + '@next/swc-linux-x64-gnu@13.4.12': + optional: true + + '@next/swc-linux-x64-musl@13.4.12': + optional: true + + '@next/swc-win32-arm64-msvc@13.4.12': + optional: true + + '@next/swc-win32-ia32-msvc@13.4.12': + optional: true + + '@next/swc-win32-x64-msvc@13.4.12': + optional: true + + '@noble/curves@1.0.0': + dependencies: + '@noble/hashes': 1.3.0 + + '@noble/hashes@1.3.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + + '@pkgr/utils@2.4.1': + 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 + + '@resvg/resvg-wasm@2.4.1': {} + + '@rushstack/eslint-patch@1.3.0': {} + + '@scure/base@1.1.1': {} + + '@scure/bip32@1.3.0': + dependencies: + '@noble/curves': 1.0.0 + '@noble/hashes': 1.3.0 + '@scure/base': 1.1.1 + + '@scure/bip39@1.2.0': + dependencies: + '@noble/hashes': 1.3.0 + '@scure/base': 1.1.1 + + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.4 + string.prototype.codepointat: 0.2.1 + + '@swc/helpers@0.5.1': + dependencies: + tslib: 2.5.2 + + '@tailwindcss/forms@0.5.3(tailwindcss@3.3.2)': + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.3.2 + + '@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8)': + 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 + + '@types/bun@1.1.0': + dependencies: + bun-types: 1.1.0 + + '@types/debug@4.1.8': + dependencies: + '@types/ms': 0.7.31 + + '@types/hast@2.3.5': + dependencies: + '@types/unist': 2.0.7 + + '@types/json-schema@7.0.12': {} + + '@types/json5@0.0.29': {} + + '@types/mdast@3.0.12': + dependencies: + '@types/unist': 2.0.7 + + '@types/ms@0.7.31': {} + + '@types/node@18.16.3': {} + + '@types/node@20.11.30': + dependencies: + undici-types: 5.26.5 + + '@types/prop-types@15.7.5': {} + + '@types/react-dom@18.2.3': + dependencies: + '@types/react': 18.2.5 + + '@types/react@18.2.5': + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + + '@types/scheduler@0.16.3': {} + + '@types/semver@7.5.0': {} + + '@types/unist@2.0.7': {} + + '@types/ws@8.5.10': + dependencies: + '@types/node': 18.16.3 + + '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint@8.39.0)(typescript@5.0.4)': + 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) + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4)': + 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 + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4)': + 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 + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.59.7': + dependencies: + '@typescript-eslint/types': 5.59.7 + '@typescript-eslint/visitor-keys': 5.59.7 + + '@typescript-eslint/scope-manager@6.1.0': + dependencies: + '@typescript-eslint/types': 6.1.0 + '@typescript-eslint/visitor-keys': 6.1.0 + + '@typescript-eslint/type-utils@6.1.0(eslint@8.39.0)(typescript@5.0.4)': + 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) + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.59.7': {} + + '@typescript-eslint/types@6.1.0': {} + + '@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.4)': + 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) + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@6.1.0(typescript@5.0.4)': + 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) + optionalDependencies: + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.1.0(eslint@8.39.0)(typescript@5.0.4)': + 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 + + '@typescript-eslint/visitor-keys@5.59.7': + dependencies: + '@typescript-eslint/types': 5.59.7 + eslint-visitor-keys: 3.4.1 + + '@typescript-eslint/visitor-keys@6.1.0': + dependencies: + '@typescript-eslint/types': 6.1.0 + eslint-visitor-keys: 3.4.1 + + '@vercel/analytics@1.0.1': {} + + '@vercel/og@0.5.10': + dependencies: + '@resvg/resvg-wasm': 2.4.1 + satori: 0.10.2 + yoga-wasm-web: 0.3.3 + + '@wagmi/chains@0.3.1(typescript@5.0.4)': + optionalDependencies: + typescript: 5.0.4 + + '@wagmi/chains@1.6.0(typescript@5.0.4)': + optionalDependencies: + typescript: 5.0.4 + + abitype@0.9.3(typescript@5.0.4)(zod@3.21.4): + optionalDependencies: + typescript: 5.0.4 + zod: 3.21.4 + + abitype@0.9.6(typescript@5.0.4)(zod@3.21.4): + optionalDependencies: + typescript: 5.0.4 + zod: 3.21.4 + + acorn-jsx@5.3.2(acorn@8.8.2): + dependencies: + acorn: 8.8.2 + + acorn@8.8.2: {} + + ajv@6.12.6: 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-regex@5.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: true - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: true - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: 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 + arch@2.2.0: {} - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true + arg@5.0.2: {} - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true + argparse@2.0.1: {} - /aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.1.3: 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==} + array-buffer-byte-length@1.0.0: 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'} + array-includes@3.1.6: 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-union@2.1.0: {} - /array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.1: 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'} + array.prototype.flatmap@1.3.1: 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==} + array.prototype.tosorted@1.1.1: 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 + ast-types-flow@0.0.7: {} - /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 + autoprefixer@10.4.14(postcss@8.4.23): dependencies: browserslist: 4.21.5 caniuse-lite: 1.0.30001489 @@ -1005,141 +2733,85 @@ packages: 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 + available-typed-arrays@1.0.5: {} - /axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} - engines: {node: '>=4'} - dev: true + axe-core@4.7.2: {} - /axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + axobject-query@3.1.1: dependencies: deep-equal: 2.2.1 - dev: true - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true + balanced-match@1.0.2: {} - /base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - dev: false + base64-js@0.0.8: {} - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true + big-integer@1.6.51: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.51 - dev: true - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: 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'} + braces@3.0.2: 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 + browserslist@4.21.5: 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'} + bun-types@1.1.0: + dependencies: + '@types/node': 20.11.30 + '@types/ws': 8.5.10 + + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - dev: true - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 - dev: false - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + call-bind@1.0.2: 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 + callsites@3.1.0: {} - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: true + camelcase-css@2.0.1: {} - /camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: false + camelize@1.0.1: {} - /caniuse-lite@1.0.30001489: - resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==} + caniuse-lite@1.0.30001489: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: 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'} + chalk@4.1.2: 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 + character-entities@2.0.2: {} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -1150,127 +2822,70 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.2 - dev: true - /client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - dev: false + client-only@0.0.1: {} - /clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + clipboardy@3.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==} + color-convert@1.9.3: 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'} + color-convert@2.0.1: 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.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true + concat-map@0.0.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: 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-background-parser@0.1.0: {} - /css-box-shadow@1.0.0-3: - resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - dev: false + css-box-shadow@1.0.0-3: {} - /css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - dev: false + css-color-keywords@1.0.0: {} - /css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-to-react-native@3.2.0: 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 + cssesc@3.0.0: {} - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.1.2: {} - /damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true + damerau-levenshtein@1.0.8: {} - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: 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 + debug@4.3.4: dependencies: ms: 2.1.2 - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - dev: false - /deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} + deep-equal@2.2.1: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -1290,105 +2905,60 @@ packages: 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 + deep-is@0.1.4: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: 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'} + default-browser@4.0.0: 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-lazy-prop@3.0.0: {} - /define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.0: 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 + dequal@2.0.3: {} - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true + didyoumean@1.2.2: {} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false + diff@5.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true + dlv@1.1.3: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /electron-to-chromium@1.4.409: - resolution: {integrity: sha512-+2mRCBG9dR66sprh2dLuO6vr+O1xqHXvhmMglfut3OmfeUVRUho2nZYxxD9pG6G4PLDkZeqhlA/Gk6LpjVSHag==} - dev: true + electron-to-chromium@1.4.409: {} - /emoji-regex@10.2.1: - resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - dev: false + emoji-regex@10.2.1: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true + emoji-regex@9.2.2: {} - /enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.14.1: 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'} + es-abstract@1.21.2: dependencies: array-buffer-byte-length: 1.0.0 available-typed-arrays: 1.0.5 @@ -1424,10 +2994,8 @@ packages: 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==} + es-get-iterator@1.1.3: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 @@ -1438,98 +3006,64 @@ packages: 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'} + es-set-tostringtag@2.0.1: 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==} + es-shim-unscopables@1.0.0: dependencies: has: 1.0.3 - dev: true - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: 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 + escalade@3.1.1: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /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 + eslint-config-next@13.4.12(eslint@8.39.0)(typescript@5.0.4): 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-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(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)(typescript@5.0.4))(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) + optionalDependencies: typescript: 5.0.4 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + eslint-import-resolver-node@0.3.7: 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: '*' + eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0): 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) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0))(eslint@8.39.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint@8.39.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.1 @@ -1537,81 +3071,33 @@ packages: 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 + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0))(eslint@8.39.0): dependencies: - '@typescript-eslint/parser': 5.59.7(eslint@8.39.0)(typescript@5.0.4) debug: 3.2.7 + optionalDependencies: + '@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-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(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 + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint@8.39.0): dependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) 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 + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint@8.39.0): 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 @@ -1619,7 +3105,7 @@ packages: 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) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(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 @@ -1628,17 +3114,14 @@ packages: resolve: 1.22.2 semver: 6.3.0 tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) 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 + eslint-plugin-jsx-a11y@6.7.1(eslint@8.39.0): dependencies: '@babel/runtime': 7.22.0 aria-query: 5.1.3 @@ -1657,22 +3140,12 @@ packages: 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 + eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.39.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 + eslint-plugin-react@7.32.2(eslint@8.39.0): dependencies: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -1690,25 +3163,15 @@ packages: 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} + eslint-scope@7.2.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-visitor-keys@3.4.1: {} - /eslint@8.39.0: - resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.39.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.39.0) '@eslint-community/regexpp': 4.5.1 @@ -1752,44 +3215,26 @@ packages: 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} + espree@9.5.2: 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'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.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 + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -1800,11 +3245,8 @@ packages: 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} + execa@7.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -1815,165 +3257,98 @@ packages: 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 + extend@3.0.2: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true + fast-deep-equal@3.1.3: {} - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-glob@3.2.12: 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-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - dev: true - /fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - dev: false + fflate@0.7.4: {} - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.0.4 - dev: true - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: 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} + flat-cache@3.0.4: 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 + flatted@3.2.7: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true + fraction.js@4.2.0: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + fs.realpath@1.0.0: {} - /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 + fsevents@2.3.2: optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + function-bind@1.1.1: {} - /function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.5: 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 + functions-have-names@1.2.3: {} - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + get-intrinsic@1.2.1: 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-stream@6.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: 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 + get-tsconfig@4.5.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: 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'} + glob-parent@6.0.2: 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-to-regexp@0.4.1: {} - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1981,10 +3356,8 @@ packages: 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==} + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1992,10 +3365,8 @@ packages: 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==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -2003,30 +3374,18 @@ packages: 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@11.12.0: {} - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} + globals@13.20.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.0 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -2034,486 +3393,269 @@ packages: 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} + globby@13.1.4: 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==} + gopd@1.0.1: 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==} + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + grapheme-splitter@1.0.4: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true + has-flag@4.0.0: {} - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + has-property-descriptors@1.0.0: 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-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + has@1.0.3: dependencies: function-bind: 1.1.1 - dev: true - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false + hast-util-whitespace@2.0.1: {} - /hex-rgb@4.3.0: - resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} - engines: {node: '>=6'} - dev: false + hex-rgb@4.3.0: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true + ignore@5.2.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: 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 + imurmurhash@0.1.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: true - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + inherits@2.0.4: {} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + inline-style-parser@0.1.1: {} - /internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + internal-slot@1.0.5: 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'} + is-arguments@1.1.1: 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==} + is-array-buffer@3.0.2: 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==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: 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-buffer@2.0.5: {} - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-callable@1.2.7: {} - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + is-core-module@2.12.1: dependencies: has: 1.0.3 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: 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@2.2.1: {} - /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-docker@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + is-extglob@2.1.1: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: 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 + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: true - /is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true + is-map@2.0.2: {} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.2: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: 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-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@4.1.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.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-set@2.0.2: {} - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: 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@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.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'} + is-typed-array@1.1.10: 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-weakmap@2.0.1: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.2 - dev: true - /is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.2: 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'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isomorphic-ws@5.0.0(ws@8.12.0): - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' + isomorphic-ws@5.0.0(ws@8.12.0): dependencies: ws: 8.12.0 - dev: false - /javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - dev: true + javascript-natural-sort@0.7.1: {} - /jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - dev: true + jiti@1.18.2: {} - /js-sdsl@4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} - dev: true + js-sdsl@4.4.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: true - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} + jsx-ast-utils@3.3.3: 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 + kleur@4.1.5: {} - /language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true + language-subtag-registry@0.3.22: {} - /language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + language-tags@1.0.5: 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'} + levn@0.4.1: 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 + lilconfig@2.1.0: {} - /linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + linebreak@1.1.0: 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 + lines-and-columns@1.2.4: {} - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: 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 + lodash.merge@4.6.2: {} - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + lodash@4.17.21: {} + + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + mdast-util-definitions@5.1.2: 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==} + mdast-util-from-markdown@1.3.1: dependencies: '@types/mdast': 3.0.12 '@types/unist': 2.0.7 @@ -2529,10 +3671,8 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + mdast-util-to-hast@12.3.0: dependencies: '@types/hast': 2.3.5 '@types/mdast': 3.0.12 @@ -2542,25 +3682,16 @@ packages: 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==} + mdast-util-to-string@3.2.0: dependencies: '@types/mdast': 3.0.12 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -2578,140 +3709,100 @@ packages: 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==} + micromark-factory-destination@1.1.0: 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==} + micromark-factory-label@1.1.0: 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==} + micromark-factory-space@1.1.0: 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==} + micromark-factory-title@1.1.0: 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==} + micromark-factory-whitespace@1.1.0: 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==} + micromark-util-character@1.2.0: 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==} + micromark-util-chunked@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@1.1.0: 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==} + micromark-util-combine-extensions@1.1.0: 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==} + micromark-util-decode-numeric-character-reference@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@1.1.0: 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-encode@1.1.0: {} - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: false + micromark-util-html-tag-name@1.2.0: {} - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: false - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@1.1.0: dependencies: micromark-util-types: 1.1.0 - dev: false - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@1.2.0: 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==} + micromark-util-subtokenize@1.1.0: 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-symbol@1.1.0: {} - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: false + micromark-util-types@1.1.0: {} - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@3.2.0: dependencies: '@types/debug': 4.1.8 debug: 4.3.4 @@ -2732,103 +3823,49 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: 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@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} - hasBin: true - dev: true + mini-svg-data-uri@1.4.4: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true + minimist@1.2.8: {} - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false + mri@1.2.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true + ms@2.1.3: {} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: 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 + nanoid@3.3.6: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /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: '*' + next-themes@0.2.1(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))(react@18.2.0): dependencies: - next: 13.4.12(react-dom@18.2.0)(react@18.2.0) + next: 13.4.12(react-dom@18.2.0(react@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 + next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 13.4.12 '@swc/helpers': 0.5.1 @@ -2853,139 +3890,84 @@ packages: transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - dev: false - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - dev: true + node-releases@2.0.12: {} - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-range@0.1.2: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: 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} + npm-run-path@5.1.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-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: true + object-hash@3.0.0: {} - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - dev: true + object-inspect@1.12.3: {} - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} + object-is@1.1.5: 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-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.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'} + object.entries@1.1.6: 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'} + object.fromentries@2.0.6: 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==} + object.hasown@1.1.2: 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'} + object.values@1.1.6: 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==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: true - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: 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'} + optionator@0.9.1: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -2993,271 +3975,122 @@ packages: 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'} + p-limit@3.1.0: 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'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - dev: false + pako@0.2.9: {} - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-css-color@0.2.1: - resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + parse-css-color@0.2.1: 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==} + path-exists@4.0.0: {} - /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 + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pirates@4.0.5: {} + + postcss-import@15.1.0(postcss@8.4.23): + dependencies: + postcss: 8.4.23 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.2 + + postcss-js@4.0.1(postcss@8.4.23): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.23 + + postcss-load-config@4.0.1(postcss@8.4.23): + dependencies: + lilconfig: 2.1.0 + yaml: 2.3.1 + optionalDependencies: + postcss: 8.4.23 + + postcss-nested@6.0.1(postcss@8.4.23): + dependencies: + postcss: 8.4.23 + postcss-selector-parser: 6.0.13 + + postcss-selector-parser@6.0.13: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.14: + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + postcss@8.4.23: + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + prelude-ls@1.2.1: {} + + prettier-plugin-tailwindcss@0.2.8(@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8))(prettier@2.8.8): dependencies: - '@trivago/prettier-plugin-sort-imports': 4.1.1(prettier@2.8.8) prettier: 2.8.8 - dev: true + optionalDependencies: + '@trivago/prettier-plugin-sort-imports': 4.1.1(prettier@2.8.8) - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + prop-types@15.8.1: 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 + property-information@6.2.0: {} - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - dev: true + punycode@2.3.0: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 + react-dom@18.2.0(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@16.13.1: {} - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: false + react-is@18.2.0: {} - /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' + react-markdown@8.0.7(@types/react@18.2.5)(react@18.2.0): dependencies: '@types/hast': 2.3.5 '@types/prop-types': 15.7.5 @@ -3278,126 +4111,81 @@ packages: 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'} + react@18.2.0: dependencies: loose-envify: 1.4.0 - dev: false - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true + regenerator-runtime@0.13.11: {} - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.0: 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==} + remark-parse@10.0.2: 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==} + remark-rehype@10.1.0: 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-from@4.0.0: {} - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true + resolve@1.22.2: 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 + resolve@2.0.0-next.4: 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 + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: 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'} + sade@1.8.1: dependencies: mri: 1.2.0 - dev: false - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: 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'} + satori@0.10.2: dependencies: '@shuding/opentype.js': 1.4.0-beta.0 css-background-parser: 0.1.0 @@ -3409,92 +4197,50 @@ packages: 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==} + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 - dev: false - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true + semver@6.3.0: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: 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 + signal-exit@3.0.7: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true + slash@4.0.0: {} - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + source-map-js@1.0.2: {} - /source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: true + source-map@0.5.7: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + space-separated-tokens@2.0.2: {} - /stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + stop-iteration-iterator@1.0.0: 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 + streamsearch@1.1.0: {} - /string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - dev: false + string.prototype.codepointat@0.2.1: {} - /string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + string.prototype.matchall@4.0.8: dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -3504,87 +4250,47 @@ packages: 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'} + string.prototype.trim@1.2.7: 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==} + string.prototype.trimend@1.0.6: 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==} + string.prototype.trimstart@1.0.6: 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'} + strip-ansi@6.0.1: 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-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true + strip-json-comments@3.1.1: {} - /style-to-object@0.4.2: - resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} + style-to-object@0.4.2: 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 + styled-jsx@5.1.1(react@18.2.0): 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 + sucrase@3.32.0: dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 @@ -3593,39 +4299,23 @@ packages: 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'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: true - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: 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 + supports-preserve-symlinks-flag@1.0.0: {} - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.5: 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 + tailwindcss@3.3.2: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -3652,141 +4342,84 @@ packages: sucrase: 3.32.0 transitivePeerDependencies: - ts-node - dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - dev: false + tiny-inflate@1.0.3: {} - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true + titleize@3.0.0: {} - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + trim-lines@3.0.1: {} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false + trough@2.1.0: {} - /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' + ts-api-utils@1.0.1(typescript@5.0.4): dependencies: typescript: 5.0.4 - dev: true - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + ts-interface-checker@0.1.13: {} - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.14.2: 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@1.14.1: {} - /tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} + tslib@2.5.2: {} - /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' + tsutils@3.21.0(typescript@5.0.4): 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'} + type-check@0.4.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 + type-fest@0.20.2: {} - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: 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 + typescript@5.0.4: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: 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==} + undici-types@5.26.5: {} + + unicode-trie@2.0.0: dependencies: pako: 0.2.9 tiny-inflate: 1.0.3 - dev: false - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@10.1.2: dependencies: '@types/unist': 2.0.7 bail: 2.0.2 @@ -3795,105 +4428,66 @@ packages: 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-generated@2.0.1: {} - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.7 - dev: false - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.7 - dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.7 - dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: 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==} + unist-util-visit@4.1.2: 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 + untildify@4.0.0: {} - /update-browserslist-db@1.0.11(browserslist@4.21.5): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.11(browserslist@4.21.5): dependencies: browserslist: 4.21.5 escalade: 3.1.1 picocolors: 1.0.0 - dev: true - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.0 - dev: true - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true + util-deprecate@1.0.2: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + uvu@0.5.6: 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==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.7 unist-util-stringify-position: 3.0.3 - dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: 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 + viem@1.5.0(typescript@5.0.4)(zod@3.21.4): dependencies: '@adraffy/ens-normalize': 1.9.0 '@noble/curves': 1.0.0 @@ -3901,46 +4495,37 @@ packages: '@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) + abitype: 0.9.3(typescript@5.0.4)(zod@3.21.4) isomorphic-ws: 5.0.0(ws@8.12.0) - typescript: 5.0.4 ws: 8.12.0 + optionalDependencies: + typescript: 5.0.4 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'} + watchpack@2.4.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==} + which-boxed-primitive@1.0.2: 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==} + which-collection@1.0.1: 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'} + which-typed-array@1.1.9: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -3948,56 +4533,23 @@ packages: 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 + which@2.0.2: 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 + word-wrap@1.2.3: {} - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true + wrappy@1.0.2: {} - /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 + ws@8.12.0: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - dev: true + yaml@2.3.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true + yocto-queue@0.1.0: {} - /yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - dev: false + yoga-wasm-web@0.3.3: {} - /zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - dev: false + zod@3.21.4: {} From 4dd380453fb8201ff495f2a401cd12b6627224c6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 28 Apr 2024 09:11:15 -0700 Subject: [PATCH 19/75] start UI work --- .prettierignore | 3 +- script/checks/evm-stack-addresses.ts | 8 +- script/index.ts | 25 ++++++- src/components/diff/DiffMetadata.tsx | 105 ++++++++++++--------------- src/pages/diff.tsx | 62 +++++++++++----- 5 files changed, 119 insertions(+), 84 deletions(-) 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/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts index a4a72d1a..f4988f8c 100644 --- a/script/checks/evm-stack-addresses.ts +++ b/script/checks/evm-stack-addresses.ts @@ -1,6 +1,6 @@ import { type Address, type Hex, type PublicClient, keccak256 } from 'viem'; -type EVMStack = 'OP' | 'Orbit'; +export type EVMStack = 'OP' | 'Orbit'; type Predeploy = { name: string; @@ -8,7 +8,7 @@ type Predeploy = { kind: 'Predeploy' | 'Precompile'; }; -type Result = Predeploy & { +export type EVMStackResult = Predeploy & { codeHash: Hex; exists: boolean; }; @@ -18,8 +18,8 @@ const INVALID_CODE_HASH = keccak256('0xfe'); export async function checkEvmStackAddresses( client: PublicClient, -): Promise> { - const result: Record = { +): Promise> { + const result: Record = { OP: [], Orbit: [], }; diff --git a/script/index.ts b/script/index.ts index 091247df..56f9950d 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,10 +1,31 @@ import { http, fallback, createPublicClient } from 'viem'; import { checkDeployedContracts } from './checks/deployed-contracts'; -import { checkEvmStackAddresses } from './checks/evm-stack-addresses'; +import { checkEvmStackAddresses, EVMStack, EVMStackResult } from './checks/evm-stack-addresses'; import { checkOpcodes } from './checks/opcodes'; import { checkPrecompiles } from './checks/precompiles'; import type { Metadata } from './types'; +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(); @@ -21,7 +42,7 @@ async function main() { ]); // Format and save the output. - const chain = { + const chain: Chain = { metadata: sortObjectKeys(metadata, [ 'name', 'shortName', diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index 9d1b0c43..14737d42 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -1,10 +1,11 @@ -import { Chain as Metadata } from '@wagmi/chains'; import { getAddress } from 'viem'; +import { 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'; +type Metadata = Chain['metadata']; type MetadataKey = keyof Metadata; type Props = { @@ -14,58 +15,58 @@ type Props = { }; const hiddenField = (field: MetadataKey) => { - return ['network'].includes(field); + return ['networkId', 'ens', 'features', 'icon', 'slip44', 'faucets', 'chain', 'parent'].includes( + field + ); }; const formatFieldDisplayName = (field: MetadataKey) => { - if (field === 'id') return 'Chain ID'; + if (field === 'chainId') return 'Chain ID'; + if (field === 'explorers') return 'Block Explorers'; 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'; + 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 formatShortName = (shortName: string) => { + return ; // Remove leading and trailing quotes. +}; +const formatInfoURL = (infoURL: string) => { + return ; +}; + +const formatNativeCurrency = (nativeCurrency: Metadata['nativeCurrency']) => { return ( -
- {Object.entries(data).map(([key, rpcUrls], index) => ( -
-

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

- {renderRpcUrls(rpcUrls)} -
- ))} -
+ <> +
+ {nativeCurrency.name} ({nativeCurrency.symbol}) +
+
{nativeCurrency.decimals} decimals
+ ); }; -const formatBlockExplorerUrls = (data: Metadata['blockExplorers']) => { +const formatRpcUrls = (rpcUrls: Metadata['rpc']) => { + return rpcUrls.map((url) => ( + + )); +}; + +const formatBlockExplorerUrls = (data: Metadata['explorers']) => { if (!data) return null; return (
- {Object.entries(data).map(([key, blockExplorer], index) => ( + {Object.entries(data).map(([key, blockExplorer]) => (
-

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

-

- -

+ } + textToCopy={blockExplorer.url} + />
))}
@@ -73,20 +74,15 @@ const formatBlockExplorerUrls = (data: Metadata['blockExplorers']) => { }; const formatFieldInfo = (field: MetadataKey, contents: Metadata[MetadataKey]) => { - if (field === 'id') return ; + if (field === 'chainId') 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'; + if (field === 'rpc') return formatRpcUrls(contents as Metadata['rpc']); + if (field === 'shortName') return formatShortName(contents as Metadata['shortName']); + if (field === 'infoURL') return formatInfoURL(contents as Metadata['infoURL']); + if (field === 'nativeCurrency') + return formatNativeCurrency(contents as Metadata['nativeCurrency']); + if (field === 'explorers') { + return formatBlockExplorerUrls(contents as Metadata['explorers']); } return JSON.stringify(contents); }; @@ -97,21 +93,14 @@ export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { <> {fields.map((field) => { if (hiddenField(field)) return null; - - // 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 isEqual = JSON.stringify(base[field]) === JSON.stringify(target[field]); const showField = !isEqual || !onlyShowDiff; return ( showField && (
{formatFieldDisplayName(field)}
{formatFieldInfo(field, base[field])}
diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 60dcdb26..21c9a037 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,6 +1,7 @@ -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; import { LinkIcon } from '@heroicons/react/20/solid'; +import { Chain } from '@/../script/index'; import { getChainById } from '@/chains'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffAccountTypes } from '@/components/diff/DiffAccountTypes'; @@ -16,7 +17,6 @@ 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'; interface Props { base: T; @@ -28,21 +28,20 @@ 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 + // 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 }; const Diff = () => { @@ -50,8 +49,35 @@ const Diff = () => { const router = useRouter(); const { base, target } = router.query; - const baseChain = getChainById(base as string); - const targetChain = getChainById(target as string); + // ================================ START NEW STUFF ================================ + const [baseChain, setBaseChain] = useState(null); + const [targetChain, setTargetChain] = useState(null); + + useEffect(() => { + const fetchData = async () => { + try { + const urls = [ + `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/chain/${base}.json`, + `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/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]); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, [base, target]); + // ================================ END NEW STUFF ================================ const ErrorDiv = () => (
@@ -80,6 +106,7 @@ const Diff = () => { target: Chain[keyof Chain]; onlyShowDiff: boolean; }) => { + // if (!SECTION_MAP[section]) return <>; const Component = SECTION_MAP[section].component; return ; }; @@ -87,7 +114,7 @@ const Diff = () => { // 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); + const sections = Object.keys(SECTION_MAP); return ( <>
@@ -106,9 +133,6 @@ const Diff = () => { {/* 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 ( From df8838df801acc96d80d49bca022e064aa9cb7ce Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 29 Apr 2024 06:40:37 -0700 Subject: [PATCH 20/75] feat: add opcodes back to UI --- src/components/diff/DiffOpcodes.tsx | 261 ++-------------------------- src/pages/diff.tsx | 3 +- 2 files changed, 15 insertions(+), 249 deletions(-) diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index ec62bcbb..f89bfd47 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -1,3 +1,4 @@ +import { Chain } from '@/../script/index'; import { Collapsible } from '@/components/diff/utils/Collapsible'; import { Markdown } from '@/components/diff/utils/Markdown'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; @@ -5,256 +6,39 @@ 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'; +type Opcodes = Chain['opcodes']; +type Opcode = Opcodes[0]; + type Props = { - base: Opcode[]; - target: Opcode[]; + base: Opcodes; + target: Opcodes; 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)}
    • - ))} -
    - - )} - - )} -
    - -
    - {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 ; -}; - 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)} - -
    - +
    {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 opcodeNumbers = Array.from(Array(0xff + 1).keys()); const diffContent = ( <> {opcodeNumbers.map((number) => { - const baseOpcode = base.find((opcode) => opcode.number === number); - const targetOpcode = target.find((opcode) => opcode.number === number); + const baseOpcode = base.find((opcode) => Number(opcode.number) === number); + const targetOpcode = target.find((opcode) => Number(opcode.number) === number); if (!baseOpcode || !targetOpcode) { - return <>; + return false } - const isEqual = - JSON.stringify(convertToComparableOpcode(baseOpcode)) === - JSON.stringify(convertToComparableOpcode(targetOpcode)); + const isEqual = JSON.stringify(baseOpcode) === JSON.stringify(targetOpcode); const showOpcode = !isEqual || !onlyShowDiff; return ( @@ -265,7 +49,7 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element >
    - +
    {formatOpcode(baseOpcode)}
    {formatOpcode(targetOpcode)}
    @@ -278,22 +62,3 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element 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, - }; -}; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 21c9a037..6be1f994 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -32,11 +32,11 @@ interface Section { const SECTION_MAP: Record = { metadata: { title: 'Metadata', component: DiffMetadata }, + opcodes: { title: 'Opcodes', component: DiffOpcodes }, // 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 }, @@ -54,6 +54,7 @@ const Diff = () => { const [targetChain, setTargetChain] = useState(null); useEffect(() => { + if (!base || !target) return; const fetchData = async () => { try { const urls = [ From 2aa413ed6e5008e76f146a0eaf63359bb76656a2 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 30 Apr 2024 06:04:23 -0700 Subject: [PATCH 21/75] add deployed contracts to UI --- script/checks/deployed-contracts.ts | 4 +- script/data/chain/1.json | 4 +- script/data/chain/10.json | 4 +- script/data/chain/42161.json | 4 +- script/data/feature/deployedContracts.json | 12 +-- script/index.ts | 24 +++-- src/components/diff/DiffDeployedContracts.tsx | 98 +++---------------- src/components/diff/DiffOpcodes.tsx | 2 +- src/pages/diff.tsx | 2 +- 9 files changed, 44 insertions(+), 110 deletions(-) diff --git a/script/checks/deployed-contracts.ts b/script/checks/deployed-contracts.ts index 33c18bed..b5bb7769 100644 --- a/script/checks/deployed-contracts.ts +++ b/script/checks/deployed-contracts.ts @@ -22,9 +22,9 @@ const deployedContracts: { name: string; address: Address }[] = [ }, { name: 'Create2Deployer', address: '0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2' }, // ERC-4337. - { name: 'ERC-4337 EntryPoint v0.6', address: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' }, + { name: 'ERC-4337 Entry Point v0.6', address: '0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789' }, { - name: 'ERC-4337 SimpleAccountFactory v0.6', + name: 'ERC-4337 Simple Account Factory v0.6', address: '0x9406Cc6185a346906296840746125a0E44976454', }, // Other diff --git a/script/data/chain/1.json b/script/data/chain/1.json index 54d94efc..8b549c18 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -218,13 +218,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true diff --git a/script/data/chain/10.json b/script/data/chain/10.json index f3830fbc..2baf9731 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -204,13 +204,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index 26da3a5b..36bf865a 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -202,13 +202,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true diff --git a/script/data/feature/deployedContracts.json b/script/data/feature/deployedContracts.json index 38f6d64d..5951cc8d 100644 --- a/script/data/feature/deployedContracts.json +++ b/script/data/feature/deployedContracts.json @@ -19,13 +19,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true @@ -63,13 +63,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true @@ -107,13 +107,13 @@ "hasCode": true }, { - "name": "ERC-4337 EntryPoint v0.6", + "name": "ERC-4337 Entry Point v0.6", "address": "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", "codeHash": "0xc93c806e738300b5357ecdc2e971d6438d34d8e4e17b99b758b1f9cac91c8e70", "hasCode": true }, { - "name": "ERC-4337 SimpleAccountFactory v0.6", + "name": "ERC-4337 Simple Account Factory v0.6", "address": "0x9406Cc6185a346906296840746125a0E44976454", "codeHash": "0xe7ca0f7aa741031b27df24056c8000e7df56cf8a4ff434e28b1bbe1aa6eaa515", "hasCode": true diff --git a/script/index.ts b/script/index.ts index 56f9950d..e00d7cbc 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1,6 +1,10 @@ import { http, fallback, createPublicClient } from 'viem'; import { checkDeployedContracts } from './checks/deployed-contracts'; -import { checkEvmStackAddresses, EVMStack, EVMStackResult } from './checks/evm-stack-addresses'; +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'; @@ -8,23 +12,23 @@ import type { Metadata } from './types'; export type Chain = { metadata: Metadata; opcodes: { - number: `0x${string}`; - name: string; - supported: string | boolean; + number: `0x${string}`; + name: string; + supported: string | boolean; }[]; deployedContracts: { name: string; - address: `0x${string}`; - codeHash: `0x${string}`; - hasCode: boolean; + address: `0x${string}`; + codeHash: `0x${string}`; + hasCode: boolean; }[]; precompiles: { name: string; - address: `0x${string}`; - implemented: boolean; + address: `0x${string}`; + implemented: boolean; }[]; evmStackAddresses: Record; -} +}; async function main() { // Initialize chain data. diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 569d0137..57188a11 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -1,16 +1,9 @@ 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 { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { - DeployedContract, - DeployedContractKind, - ProxiedDeployedContract, - StandardDeployedContract, -} from '@/types'; +type DeployedContract = Chain['deployedContracts'][0]; type Props = { base: DeployedContract[]; target: DeployedContract[]; @@ -19,86 +12,34 @@ type Props = { 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
    -
    - -
    -
    -
    - - +
    Deployed?
    +
    {deployedContract.hasCode ? 'Yes' : 'No'}
    ); }; +export const convertToComparableContract = (contract: DeployedContract | undefined) => { + if (typeof contract === 'undefined') return undefined; + const slimmedContract = contract as any; + delete slimmedContract.codeHash; + return slimmedContract; +}; + 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 DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => { const sortedNames = [...base.map((c) => c.name), ...target.map((c) => c.name)].sort((a, b) => a.localeCompare(b) @@ -117,24 +58,13 @@ export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => 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}
    +
    {name}
    {formatDeployedContract(baseDeployedContract)}
    {formatDeployedContract(targetDeployedContract)}
    diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index f89bfd47..8a1338eb 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -35,7 +35,7 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element const baseOpcode = base.find((opcode) => Number(opcode.number) === number); const targetOpcode = target.find((opcode) => Number(opcode.number) === number); if (!baseOpcode || !targetOpcode) { - return false + return false; } const isEqual = JSON.stringify(baseOpcode) === JSON.stringify(targetOpcode); diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 6be1f994..10b838c3 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -33,12 +33,12 @@ interface Section { const SECTION_MAP: Record = { metadata: { title: 'Metadata', component: DiffMetadata }, opcodes: { title: 'Opcodes', component: DiffOpcodes }, + deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, // precompiles: { title: 'Precompiles', component: DiffPrecompiles }, // predeploys: { title: 'Predeploys', component: DiffPredeploys }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, // 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 From 11f3fe041ec1645dbda0f79611c76c33580eef13 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 30 Apr 2024 07:19:23 -0700 Subject: [PATCH 22/75] add precompiles to UI --- src/components/diff/DiffPrecompiles.tsx | 51 +++++-------------------- src/pages/diff.tsx | 2 +- 2 files changed, 11 insertions(+), 42 deletions(-) diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index 9dbe43d7..fa6625c0 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -1,62 +1,26 @@ import { Address, getAddress } from 'viem'; +import { Chain } from '@/../script/index'; 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 { Precompile } from '@/types'; +type Precompile = Chain['precompiles'][0]; type Props = { 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 ( - <> -
    - -
    -
    - -
    -
    - - -
    - - ); + return
    {precompile.implemented ? 'Yes' : 'No'}
    ; }; // TODO Dedupe this helper method const formatAddress = (addr: Address) => { addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; + return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; }; export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { @@ -83,7 +47,12 @@ export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { className='grid grid-cols-12 items-center border-b border-zinc-500/10 py-6 dark:border-zinc-500/20' >
    - +
    {basePrecompile?.name || targetPrecompile?.name}
    +
    {formatPrecompile(basePrecompile)}
    {formatPrecompile(targetPrecompile)}
    diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 10b838c3..c5c68d86 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -34,7 +34,7 @@ const SECTION_MAP: Record = { metadata: { title: 'Metadata', component: DiffMetadata }, opcodes: { title: 'Opcodes', component: DiffOpcodes }, deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, - // precompiles: { title: 'Precompiles', component: DiffPrecompiles }, + precompiles: { title: 'Precompiles', component: DiffPrecompiles }, // predeploys: { title: 'Predeploys', component: DiffPredeploys }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, From 9d636055abe1ed73bb9d2d9158959d501a072615 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 1 May 2024 06:26:04 -0700 Subject: [PATCH 23/75] add stack addrs to UI --- script/checks/evm-stack-addresses.ts | 2 +- src/components/diff/DiffEVMStackAddresses.tsx | 77 +++++++++++++++++++ src/components/diff/DiffPredeploys.tsx | 74 ------------------ src/pages/diff.tsx | 4 +- 4 files changed, 80 insertions(+), 77 deletions(-) create mode 100644 src/components/diff/DiffEVMStackAddresses.tsx delete mode 100644 src/components/diff/DiffPredeploys.tsx diff --git a/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts index f4988f8c..2298747c 100644 --- a/script/checks/evm-stack-addresses.ts +++ b/script/checks/evm-stack-addresses.ts @@ -52,7 +52,7 @@ function evmStackAddressExists(stack: EVMStack, codeHash: Hex): boolean { // Maps an EVM Stack to the expected predeploys for that stack. // biome-ignore format: Easier to skim and update with one line per address. -const evmStackAddresses: Record = { +export const evmStackAddresses: Record = { OP: [ { address: '0x4200000000000000000000000000000000000000', name: 'LegacyMessagePasser', kind: 'Predeploy' }, { address: '0x4200000000000000000000000000000000000002', name: 'DeployerWhitelist', kind: 'Predeploy' }, diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx new file mode 100644 index 00000000..e5b07fda --- /dev/null +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -0,0 +1,77 @@ +import { Address, getAddress } from 'viem'; +import { evmStackAddresses } from '@/../script/checks/evm-stack-addresses'; +import { Chain } from '@/../script/index'; +import { RenderDiff } from '@/components/diff/utils/RenderDiff'; +import { Copyable } from '@/components/ui/Copyable'; + +type EvmStackResults = Chain['evmStackAddresses']; +type Props = { + base: EvmStackResults; + target: EvmStackResults; + onlyShowDiff: boolean; +}; + +const formatAddress = (addr: Address) => { + addr = getAddress(addr); + return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; +}; + +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 diffContent = ( + <> + {stacks.map((stack) => { + const baseStackAddresses = base[stack]; + const targetStackAddresses = target[stack]; + return ( +
    +
    {formatStackHeader(stack)}
    +
    + {baseStackAddresses.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; + + const name = baseStackAddress?.name || targetStackAddress?.name; + const addr = getAddress(baseStackAddress.address); + return ( + show && ( +
    +
    +
    {name}
    + +
    +
    + {baseStackAddress.exists ? 'Yes' : 'No'} +
    +
    {targetStackAddress?.exists ? 'Yes' : 'No'}
    +
    + ) + ); + })} +
    +
    + ); + })} + + ); + + 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/pages/diff.tsx b/src/pages/diff.tsx index c5c68d86..25e1ba65 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -7,12 +7,12 @@ import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffAccountTypes } from '@/components/diff/DiffAccountTypes'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; import { DiffEIPs } from '@/components/diff/DiffEIPs'; +import { DiffEVMStackAddresses } from '@/components/diff/DiffEVMStackAddresses'; import { DiffMempools } from '@/components/diff/DiffMempools'; 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'; @@ -35,7 +35,7 @@ const SECTION_MAP: Record = { opcodes: { title: 'Opcodes', component: DiffOpcodes }, deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, precompiles: { title: 'Precompiles', component: DiffPrecompiles }, - // predeploys: { title: 'Predeploys', component: DiffPredeploys }, + evmStackAddresses: { title: 'EVM Stack', component: DiffEVMStackAddresses }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, // mempools: { title: 'Mempools', component: DiffMempools }, From d354f412eddb007d1c7e26c8da9a01f28a3bfa8f Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 1 May 2024 06:26:17 -0700 Subject: [PATCH 24/75] style: reduce row spacing --- src/components/diff/DiffDeployedContracts.tsx | 4 ++-- src/components/diff/DiffMetadata.tsx | 2 +- src/components/diff/DiffOpcodes.tsx | 2 +- src/components/diff/DiffPrecompiles.tsx | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 57188a11..959d59ec 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -15,7 +15,7 @@ const formatDeployedContract = (deployedContract: DeployedContract | undefined) const addr = getAddress(deployedContract.address); return ( <> -
    +
    Address
    @@ -62,7 +62,7 @@ export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => showDeployedContract && (
    {name}
    {formatDeployedContract(baseDeployedContract)}
    diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index 14737d42..091627b0 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -100,7 +100,7 @@ export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { showField && (
    {formatFieldDisplayName(field)}
    {formatFieldInfo(field, base[field])}
    diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 8a1338eb..b10e0e02 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -45,7 +45,7 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element showOpcode && (
    diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index fa6625c0..d497fe62 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -44,7 +44,7 @@ export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { showPrecompile && (
    {basePrecompile?.name || targetPrecompile?.name}
    From 77b0d48d5f541dda10050d85131e53aa9ecd1ec6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 1 May 2024 06:28:51 -0700 Subject: [PATCH 25/75] build: fix lint errors --- src/components/diff/DiffDeployedContracts.tsx | 2 +- src/components/diff/DiffMetadata.tsx | 2 -- src/components/diff/DiffOpcodes.tsx | 8 +------- src/components/diff/DiffPrecompiles.tsx | 2 -- src/pages/api/og.tsx | 4 +--- src/pages/diff.tsx | 6 ------ 6 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 959d59ec..1263c47d 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -30,7 +30,7 @@ const formatDeployedContract = (deployedContract: DeployedContract | undefined) export const convertToComparableContract = (contract: DeployedContract | undefined) => { if (typeof contract === 'undefined') return undefined; - const slimmedContract = contract as any; + const slimmedContract = contract as any; // eslint-disable-line @typescript-eslint/no-explicit-any delete slimmedContract.codeHash; return slimmedContract; }; diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index 091627b0..f39e1a27 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -1,8 +1,6 @@ -import { getAddress } from 'viem'; import { 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'; type Metadata = Chain['metadata']; diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index b10e0e02..35bd1d84 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -1,13 +1,7 @@ import { Chain } from '@/../script/index'; -import { Collapsible } from '@/components/diff/utils/Collapsible'; -import { Markdown } from '@/components/diff/utils/Markdown'; 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 { GasComputation } from '@/types/opcode'; -import { formatHardfork, formatStringList } from './utils/format'; +import { formatPrefixByte } from '@/lib/utils'; type Opcodes = Chain['opcodes']; type Opcode = Opcodes[0]; diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index d497fe62..c2da8e97 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -1,7 +1,5 @@ import { Address, getAddress } from 'viem'; import { Chain } from '@/../script/index'; -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'; diff --git a/src/pages/api/og.tsx b/src/pages/api/og.tsx index 6eabfc59..739519f0 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -2,7 +2,6 @@ import { 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'; @@ -59,8 +58,7 @@ const countPredeployDiffs = (base: Predeploy[], target: Predeploy[]): number => 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)); + const isEqual = (a: Opcode, b: Opcode) => JSON.stringify(a) === JSON.stringify(b); return countDifferences(base, target, getKey, isEqual); }; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 25e1ba65..b4f938c7 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -2,18 +2,12 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; import { LinkIcon } from '@heroicons/react/20/solid'; import { Chain } from '@/../script/index'; -import { getChainById } from '@/chains'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; -import { DiffAccountTypes } from '@/components/diff/DiffAccountTypes'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; -import { DiffEIPs } from '@/components/diff/DiffEIPs'; import { DiffEVMStackAddresses } from '@/components/diff/DiffEVMStackAddresses'; -import { DiffMempools } from '@/components/diff/DiffMempools'; 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 { DiffSignatureTypes } from '@/components/diff/DiffSignatureTypes'; import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; import { classNames } from '@/lib/utils'; From 4953eb3bf2f03c995ff6a88d12aa90caf3361f3a Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 1 May 2024 06:33:24 -0700 Subject: [PATCH 26/75] build: move from pnpm to bun --- CONTRIBUTING.md | 9 +- bun.lockb | Bin 0 -> 216583 bytes pnpm-lock.yaml | 4555 ----------------------------------------------- 3 files changed, 6 insertions(+), 4558 deletions(-) create mode 100755 bun.lockb delete mode 100644 pnpm-lock.yaml diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2f3d1f15..dc303d8e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,13 +4,16 @@ This repo uses [Next.js](https://github.com/vercel/next.js/), [Tailwind CSS](htt ```sh # Install dependencies. -pnpm install +bun install # Start the development server. -pnpm dev +bun dev # Format files. -pnpm fmt +bun fmt + +# Lint. +bun lint ``` 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. diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..a4e0a13263156e09600e2c4a9b34c1afb12c26d4 GIT binary patch literal 216583 zcmeF4d0b81_s4I!N{W&)q@w@!So`)=$(&tl2ywqp)N8afd zYpWMJ&wi)vawKnum|4XM_*OA1fn6xlKku zgPtr_Trg;FP@mAiA62eyK4DQo9M(fV7E1)m4}n8r&??CH0drB(0<5+qMZEY?!!9CDobVVnRD7R$}m#}9jc4R}!~ z-w&PY3t9+yjDJ5U+Bpo6IH(I`u-+V00@Mf;$7?9)Akcc~tR(0;O7lT6o@Zbj+xLNX zXg3e+VI1mUAIC8V6!W&wX>1=J5sqQ8LR~#LsQw{7D6DyYobV7(oIA{WaDu~K{a7qZ z2u=a*fl7mxft?|s72p)(=7S$&KtDn`j{AHFLJD*!D8}PV<@G@2ATI{mAG94hGZ54e zexO}hP^|Ap77sTgJt*aMc2m7ZAM$rF5hy%yt$GTAS30)2S z$NW-I98Xfd2#mpy#RXCIvp_Lk7g$$l=gDBM+Cd)2F#skO$7LsU9>;MtD8?TKiv4w> z%8fxW?h#bEI4HL3kmbhl6cqj30YyLjid_5eV32V=*FibPSxuD(1%`&f8fHZ(apUy^ z#rgo(fIuHuXBE&M`|lPW>J}KqVihZM^9QN&uuwlAHx|TA`7?$7V88W2(T>_MZa&mC zED)E1mI^mcWl&tV-kkYrAzp5*JCMirGN3}BTZeP~Jf}3sbzUI2VXcQe){8?s95+Eq z-+>=o-}6+t>&D&HpX28f&3O#v*zaqgFqLtqL2CE57zaK>IZSPw8pMq% zJ&J2z2J(1+icsaBpd82Fe>8WT`Kf-kLu?pNXt;ZbYbb|xM4js=$R`BshqC;mF?tp& zL4(^a%$oyucoZv|%I83P^y}pph{MVHs>yBV?-Sq?h8 zzvomrTbmniJCx%*v_T%*p9975-8_z~sgTEcmDAz&hm4~w)MGz->N4XAH*GvO4#GD= zJUDKC6S($VDUI~@arcJ)`Gj)j!?3g7LOHI3ay_oUAlEQ&wRxPV3>XiLdogH#P(B0h zI)ALs-LHHgkLA}OkMkPB2@Uj%;IK{`vRJSbw=|$Py zV#KY7dw>(_&SHHZ!_AZXq6PA}uA*H1{UBV{F34kC_d(Hq=47tDT8bNO%q51@U3cMXVw=fAtRYY6V5ELJq|xDJ}& zGd^d6LO5YzKAaG7$ir3>=NIVV8VUIp9|e)R((_SR}vPkvl&XU>nDo1N&q^7>jk^iCcaJ6wA+( z{2Z2vBh-%-3H8`-KTuq!E)=&2b|K_LKyh4q!M%b0eY^q!LpUs!6|}=~ zB=aEv&kC&f^a=1#3lCx?LmutLQ5uA=h_Dla`uO{V!GLh<4ZseLUms6y+#x>xA+GS5 z?1Sa-8S4WB+<}1iy%5)+Ah@%90=zjPK4GCg0iJ$7UfyAa&<_2<*70NEy1<&kJZ|q{ z@E$c9{NQ+TLc_y+VEu4HgTpx?QLL@AxPCdIurk4e479^};q&G8$JISB1Sg~ql;d~| zo5w9D>%$|^JuJj0fb(DL$kq2pIIQpxA2r`l7Aq(`Aj&<^gY(>vyS}c1;`9COY!(Y% z3F7KO@jfX6r_!L8A&={z7!=1L7jz)#a!_n9LgmK=bK_eIiu2hL#GSWKpg0Z#L%4C* zLLTSo0Hs49ChYHeP<-#`4Jr=m6&M6F$701p9`A#pU>E0mP&hZ=2lD+Oe*)}axeRm@ z{ji}N*Gn^$<9JtqV!0X28Mey<#d7$bpa!qj-u>ru>s=zb_Rhm|631ga)ox`BcYl|O z<;HCb?J@pdkQW2}3iW9BEhv`9gQ7nb;ISWbpgoRiD#6zjh&;l_Co@)*}

    f?4r4gWL*BEpVs2b=1&`^$l1SbUdb?)=; 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

    Y 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 X!$QzWWRO$RJ8q%ei#q-v{r7(W$b(rA literal 0 HcmV?d00001 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 4e286609..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,4555 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@headlessui/react': - specifier: ^1.7.16 - version: 1.7.16(react-dom@18.2.0(react@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))(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@18.2.0))(react-dom@18.2.0(react@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)(zod@3.21.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/bun': - specifier: ^1.1.0 - version: 1.1.0 - '@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))(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)(zod@3.21.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))(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==} - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@babel/code-frame@7.21.4': - resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.17.7': - resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.22.1': - resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.21.0': - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.18.6': - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.18.6': - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.21.5': - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.19.1': - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.18.6': - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.22.0': - resolution: {integrity: sha512-DA65VCJRetcFmJnt9/hEmRvXNCwk0V86dxG6p6N13hzDazaLRjGdTGPGgjxZOtLuFgWzOSRX4grybmRXwQ9bSg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/runtime@7.22.0': - resolution: {integrity: sha512-TT6NB0oszYQ4oxLNUdG+FNHIc3MohXVCKA2BeyQ4WeM2VCSC6wBZ6P0Yfkdzxv+87D8Xk0LJyHeCKlWMvpZt0g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.21.9': - resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.17.3': - resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.17.0': - resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.22.0': - resolution: {integrity: sha512-NtXlm3f6cNWIv003cETdlz9sss0VMNtplyatFohxWPz90AbwuhCbHbQopkGis6bG1vOunDLN0FF/4Uv5i8LFZQ==} - engines: {node: '>=6.9.0'} - - '@eslint-community/eslint-utils@4.4.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 - - '@eslint-community/regexpp@4.5.1': - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.0.3': - resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.39.0': - resolution: {integrity: sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@headlessui/react@1.7.16': - resolution: {integrity: sha512-2MphIAZdSUacZBT6EXk8AJkj+EuvaaJbtCyHTJrPsz8inhzCl7qeNPI1uk1AUvCgWylVtdN8cVVmnhUDPxPy3g==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - - '@heroicons/react@2.0.17': - resolution: {integrity: sha512-90GMZktkA53YbNzHp6asVEDevUQCMtxWH+2UK2S8OpnLEu7qckTJPhNxNQG52xIR1WFTwFqtH6bt7a60ZNcLLA==} - peerDependencies: - react: '>= 16' - - '@humanwhocodes/config-array@0.11.8': - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.0': - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.14': - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.18': - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - - '@next/env@13.4.12': - resolution: {integrity: sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==} - - '@next/eslint-plugin-next@13.4.12': - resolution: {integrity: sha512-6rhK9CdxEgj/j1qvXIyLTWEaeFv7zOK8yJMulz3Owel0uek0U9MJCGzmKgYxM3aAUBo3gKeywCZKyQnJKto60A==} - - '@next/swc-darwin-arm64@13.4.12': - resolution: {integrity: sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@13.4.12': - resolution: {integrity: sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@13.4.12': - resolution: {integrity: sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@13.4.12': - resolution: {integrity: sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@13.4.12': - resolution: {integrity: sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@13.4.12': - resolution: {integrity: sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@13.4.12': - resolution: {integrity: sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@13.4.12': - resolution: {integrity: sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@13.4.12': - resolution: {integrity: sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@noble/curves@1.0.0': - resolution: {integrity: sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==} - - '@noble/hashes@1.3.0': - resolution: {integrity: sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@pkgr/utils@2.4.1': - resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@resvg/resvg-wasm@2.4.1': - resolution: {integrity: sha512-yi6R0HyHtsoWTRA06Col4WoDs7SvlXU3DLMNP2bdAgs7HK18dTEVl1weXgxRzi8gwLteGUbIg29zulxIB3GSdg==} - engines: {node: '>= 10'} - - '@rushstack/eslint-patch@1.3.0': - resolution: {integrity: sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==} - - '@scure/base@1.1.1': - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} - - '@scure/bip32@1.3.0': - resolution: {integrity: sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q==} - - '@scure/bip39@1.2.0': - resolution: {integrity: sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg==} - - '@shuding/opentype.js@1.4.0-beta.0': - resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} - engines: {node: '>= 8.0.0'} - hasBin: true - - '@swc/helpers@0.5.1': - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} - - '@tailwindcss/forms@0.5.3': - resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} - peerDependencies: - tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' - - '@trivago/prettier-plugin-sort-imports@4.1.1': - resolution: {integrity: sha512-dQ2r2uzNr1x6pJsuh/8x0IRA3CBUB+pWEW3J/7N98axqt7SQSm+2fy0FLNXvXGg77xEDC7KHxJlHfLYyi7PDcw==} - peerDependencies: - '@vue/compiler-sfc': 3.x - prettier: 2.x - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - - '@types/bun@1.1.0': - resolution: {integrity: sha512-QGK0yU4jh0OK1A7DyhPkQuKjHQCC5jSJa3dpWIEhHv/rPfb6zLfdArc4/uUUZBMTcjilsafRXnPWO+1owb572Q==} - - '@types/debug@4.1.8': - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - - '@types/hast@2.3.5': - resolution: {integrity: sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==} - - '@types/json-schema@7.0.12': - resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mdast@3.0.12': - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} - - '@types/ms@0.7.31': - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} - - '@types/node@18.16.3': - resolution: {integrity: sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==} - - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} - - '@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==} - - '@types/react@18.2.5': - resolution: {integrity: sha512-RuoMedzJ5AOh23Dvws13LU9jpZHIc/k90AgmK7CecAYeWmSr3553L4u5rk4sWAPBuQosfT7HmTfG4Rg5o4nGEA==} - - '@types/scheduler@0.16.3': - resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} - - '@types/semver@7.5.0': - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - - '@types/unist@2.0.7': - resolution: {integrity: sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g==} - - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - - '@typescript-eslint/eslint-plugin@6.1.0': - 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 - - '@typescript-eslint/parser@5.59.7': - 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 - - '@typescript-eslint/parser@6.1.0': - 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 - - '@typescript-eslint/scope-manager@5.59.7': - resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/scope-manager@6.1.0': - resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.1.0': - 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 - - '@typescript-eslint/types@5.59.7': - resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@6.1.0': - resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@5.59.7': - resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@6.1.0': - resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.1.0': - resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@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} - - '@typescript-eslint/visitor-keys@6.1.0': - resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@vercel/analytics@1.0.1': - resolution: {integrity: sha512-Ux0c9qUfkcPqng3vrR0GTrlQdqNJ2JREn/2ydrVuKwM3RtMfF2mWX31Ijqo1opSjNAq6rK76PwtANw6kl6TAow==} - - '@vercel/og@0.5.10': - resolution: {integrity: sha512-Iwo02EZm/MgEMI9MQjuvfdfsTt/IrhH6xGi0EWBnro72LcPKoEDEn/S/fEh8ut3LNMOmrRAjceXEhTfFqQW7sw==} - engines: {node: '>=16'} - - '@wagmi/chains@0.3.1': - resolution: {integrity: sha512-NN5qziBLFeXnx0+3ywdiKKXUSW4H73Wc1jRrygl9GKXVPawU0GBMudwXUfV7VOu6E9vmG7Arj0pVsEwq63b2Ew==} - peerDependencies: - typescript: '>=4.9.4' - peerDependenciesMeta: - typescript: - optional: true - - '@wagmi/chains@1.6.0': - resolution: {integrity: sha512-5FRlVxse5P4ZaHG3GTvxwVANSmYJas1eQrTBHhjxVtqXoorm0aLmCHbhmN8Xo1yu09PaWKlleEvfE98yH4AgIw==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - abitype@0.9.3: - 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 - - abitype@0.9.6: - resolution: {integrity: sha512-bnx3yBJ9BhF5SWlIy+fMRprm2w5VhOrDj5bh0K9Aj40AfgQoICuIolm3GmSIhE+lE8qTqRv9PmTg3C9b25vmag==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.19.1 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - - array-includes@3.1.6: - resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.1: - resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - - ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - - autoprefixer@10.4.14: - resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - - axe-core@4.7.2: - resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} - engines: {node: '>=4'} - - axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@0.0.8: - resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} - engines: {node: '>= 0.4'} - - big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - 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 - - bun-types@1.1.0: - resolution: {integrity: sha512-GhMDD7TosdJzQPGUOcQD5PZshvXVxDfwGAZs2dq+eSaPsRn3iUCzvpFlsg7Q51bXVzLAUs+FWHlnmpgZ5UggIg==} - - bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - camelize@1.0.1: - resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - - 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'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - css-background-parser@0.1.0: - resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} - - css-box-shadow@1.0.0-3: - resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} - - css-color-keywords@1.0.0: - resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} - engines: {node: '>=4'} - - css-to-react-native@3.2.0: - resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: 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==} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - deep-equal@2.2.1: - resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - electron-to-chromium@1.4.409: - resolution: {integrity: sha512-+2mRCBG9dR66sprh2dLuO6vr+O1xqHXvhmMglfut3OmfeUVRUho2nZYxxD9pG6G4PLDkZeqhlA/Gk6LpjVSHag==} - - emoji-regex@10.2.1: - resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - enhanced-resolve@5.14.1: - resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==} - engines: {node: '>=10.13.0'} - - es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} - engines: {node: '>= 0.4'} - - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-next@13.4.12: - resolution: {integrity: sha512-ZF0r5vxKaVazyZH/37Au/XItiG7qUOBw+HaH3PeyXltIMwXorsn6bdrl0Nn9N5v5v9spc+6GM2ryjugbjF6X2g==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} - - eslint-import-resolver-typescript@3.5.5: - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - - eslint-module-utils@2.8.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 - - eslint-plugin-import@2.27.5: - 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 - - eslint-plugin-jsx-a11y@6.7.1: - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: - 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 - - eslint-plugin-react@7.32.2: - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-scope@7.2.0: - resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.1: - resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.39.0: - resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.5.2: - resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@7.1.1: - resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - fflate@0.7.4: - resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - fraction.js@4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.5.0: - resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@13.1.4: - resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - 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==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - - hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - - hex-rgb@4.3.0: - resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} - engines: {node: '>=6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: 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 - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.10: - resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - - javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - - jiti@1.18.2: - resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==} - hasBin: true - - js-sdsl@4.4.0: - resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - - language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - linebreak@1.1.0: - resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-to-hast@12.3.0: - resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - mini-svg-data-uri@1.4.4: - resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} - hasBin: true - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - 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==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - next-themes@0.2.1: - resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} - peerDependencies: - next: '*' - react: '*' - react-dom: '*' - - next@13.4.12: - 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 - - node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - 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'} - - object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.6: - resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - - object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - - optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-css-color@0.2.1: - resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.1: - 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 - - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - - 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} - - postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-plugin-tailwindcss@0.2.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 - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - property-information@6.2.0: - resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} - - punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - - react-markdown@8.0.7: - resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} - engines: {node: '>= 0.4'} - - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - - remark-rehype@10.1.0: - resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - - resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - - run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - - satori@0.10.2: - resolution: {integrity: sha512-38povLat5QMuKiKBudM/oIk+a0Z5tEfHh8oD/bsh58L0jlOXxfuhAVpDtlG3M0g5FGLajIV0LaKQftXtaYoSUQ==} - engines: {node: '>=16'} - - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - - semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - 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'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - - string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} - - string.prototype.trim@1.2.7: - resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - - string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - style-to-object@0.4.2: - resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} - - styled-jsx@5.1.1: - 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 - - sucrase@3.32.0: - resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==} - engines: {node: '>=8'} - hasBin: true - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - - tailwindcss@3.3.2: - resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==} - engines: {node: '>=14.0.0'} - hasBin: true - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - tiny-inflate@1.0.3: - resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - - titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - - ts-api-utils@1.0.1: - resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.5.2: - resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==} - - tsutils@3.21.0: - 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' - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - - 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==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unicode-trie@2.0.0: - resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - update-browserslist-db@1.0.11: - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - - viem@1.5.0: - resolution: {integrity: sha512-+SVCVaXJRR+fE9q6Sf6q9droB6TunPGY1JfwB3uTdxwWrkgr3qq/NbXaRdtEk+TyaOEjzZQr7t6vUzjOL0zL0Q==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - - which-typed-array@1.1.9: - resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - 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 - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} - engines: {node: '>= 14'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yoga-wasm-web@0.3.3: - resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} - - zod@3.21.4: - resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} - -snapshots: - - '@adraffy/ens-normalize@1.9.0': {} - - '@alloc/quick-lru@5.2.0': {} - - '@babel/code-frame@7.21.4': - dependencies: - '@babel/highlight': 7.18.6 - - '@babel/generator@7.17.7': - dependencies: - '@babel/types': 7.17.0 - jsesc: 2.5.2 - source-map: 0.5.7 - - '@babel/helper-environment-visitor@7.22.1': {} - - '@babel/helper-function-name@7.21.0': - dependencies: - '@babel/template': 7.21.9 - '@babel/types': 7.22.0 - - '@babel/helper-hoist-variables@7.18.6': - dependencies: - '@babel/types': 7.22.0 - - '@babel/helper-split-export-declaration@7.18.6': - dependencies: - '@babel/types': 7.22.0 - - '@babel/helper-string-parser@7.21.5': {} - - '@babel/helper-validator-identifier@7.19.1': {} - - '@babel/highlight@7.18.6': - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - - '@babel/parser@7.22.0': - dependencies: - '@babel/types': 7.17.0 - - '@babel/runtime@7.22.0': - dependencies: - regenerator-runtime: 0.13.11 - - '@babel/template@7.21.9': - dependencies: - '@babel/code-frame': 7.21.4 - '@babel/parser': 7.22.0 - '@babel/types': 7.22.0 - - '@babel/traverse@7.17.3': - 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 - - '@babel/types@7.17.0': - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - - '@babel/types@7.22.0': - dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - - '@eslint-community/eslint-utils@4.4.0(eslint@8.39.0)': - dependencies: - eslint: 8.39.0 - eslint-visitor-keys: 3.4.1 - - '@eslint-community/regexpp@4.5.1': {} - - '@eslint/eslintrc@2.0.3': - 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 - - '@eslint/js@8.39.0': {} - - '@headlessui/react@1.7.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - client-only: 0.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@heroicons/react@2.0.17(react@18.2.0)': - dependencies: - react: 18.2.0 - - '@humanwhocodes/config-array@0.11.8': - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@1.2.1': {} - - '@jridgewell/gen-mapping@0.3.3': - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 - - '@jridgewell/resolve-uri@3.1.0': {} - - '@jridgewell/set-array@1.1.2': {} - - '@jridgewell/sourcemap-codec@1.4.14': {} - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.18': - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - - '@next/env@13.4.12': {} - - '@next/eslint-plugin-next@13.4.12': - dependencies: - glob: 7.1.7 - - '@next/swc-darwin-arm64@13.4.12': - optional: true - - '@next/swc-darwin-x64@13.4.12': - optional: true - - '@next/swc-linux-arm64-gnu@13.4.12': - optional: true - - '@next/swc-linux-arm64-musl@13.4.12': - optional: true - - '@next/swc-linux-x64-gnu@13.4.12': - optional: true - - '@next/swc-linux-x64-musl@13.4.12': - optional: true - - '@next/swc-win32-arm64-msvc@13.4.12': - optional: true - - '@next/swc-win32-ia32-msvc@13.4.12': - optional: true - - '@next/swc-win32-x64-msvc@13.4.12': - optional: true - - '@noble/curves@1.0.0': - dependencies: - '@noble/hashes': 1.3.0 - - '@noble/hashes@1.3.0': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - '@pkgr/utils@2.4.1': - 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 - - '@resvg/resvg-wasm@2.4.1': {} - - '@rushstack/eslint-patch@1.3.0': {} - - '@scure/base@1.1.1': {} - - '@scure/bip32@1.3.0': - dependencies: - '@noble/curves': 1.0.0 - '@noble/hashes': 1.3.0 - '@scure/base': 1.1.1 - - '@scure/bip39@1.2.0': - dependencies: - '@noble/hashes': 1.3.0 - '@scure/base': 1.1.1 - - '@shuding/opentype.js@1.4.0-beta.0': - dependencies: - fflate: 0.7.4 - string.prototype.codepointat: 0.2.1 - - '@swc/helpers@0.5.1': - dependencies: - tslib: 2.5.2 - - '@tailwindcss/forms@0.5.3(tailwindcss@3.3.2)': - dependencies: - mini-svg-data-uri: 1.4.4 - tailwindcss: 3.3.2 - - '@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8)': - 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 - - '@types/bun@1.1.0': - dependencies: - bun-types: 1.1.0 - - '@types/debug@4.1.8': - dependencies: - '@types/ms': 0.7.31 - - '@types/hast@2.3.5': - dependencies: - '@types/unist': 2.0.7 - - '@types/json-schema@7.0.12': {} - - '@types/json5@0.0.29': {} - - '@types/mdast@3.0.12': - dependencies: - '@types/unist': 2.0.7 - - '@types/ms@0.7.31': {} - - '@types/node@18.16.3': {} - - '@types/node@20.11.30': - dependencies: - undici-types: 5.26.5 - - '@types/prop-types@15.7.5': {} - - '@types/react-dom@18.2.3': - dependencies: - '@types/react': 18.2.5 - - '@types/react@18.2.5': - dependencies: - '@types/prop-types': 15.7.5 - '@types/scheduler': 0.16.3 - csstype: 3.1.2 - - '@types/scheduler@0.16.3': {} - - '@types/semver@7.5.0': {} - - '@types/unist@2.0.7': {} - - '@types/ws@8.5.10': - dependencies: - '@types/node': 18.16.3 - - '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint@8.39.0)(typescript@5.0.4)': - 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) - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4)': - 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 - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4)': - 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 - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.59.7': - dependencies: - '@typescript-eslint/types': 5.59.7 - '@typescript-eslint/visitor-keys': 5.59.7 - - '@typescript-eslint/scope-manager@6.1.0': - dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 - - '@typescript-eslint/type-utils@6.1.0(eslint@8.39.0)(typescript@5.0.4)': - 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) - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.59.7': {} - - '@typescript-eslint/types@6.1.0': {} - - '@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.4)': - 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) - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@6.1.0(typescript@5.0.4)': - 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) - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.1.0(eslint@8.39.0)(typescript@5.0.4)': - 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 - - '@typescript-eslint/visitor-keys@5.59.7': - dependencies: - '@typescript-eslint/types': 5.59.7 - eslint-visitor-keys: 3.4.1 - - '@typescript-eslint/visitor-keys@6.1.0': - dependencies: - '@typescript-eslint/types': 6.1.0 - eslint-visitor-keys: 3.4.1 - - '@vercel/analytics@1.0.1': {} - - '@vercel/og@0.5.10': - dependencies: - '@resvg/resvg-wasm': 2.4.1 - satori: 0.10.2 - yoga-wasm-web: 0.3.3 - - '@wagmi/chains@0.3.1(typescript@5.0.4)': - optionalDependencies: - typescript: 5.0.4 - - '@wagmi/chains@1.6.0(typescript@5.0.4)': - optionalDependencies: - typescript: 5.0.4 - - abitype@0.9.3(typescript@5.0.4)(zod@3.21.4): - optionalDependencies: - typescript: 5.0.4 - zod: 3.21.4 - - abitype@0.9.6(typescript@5.0.4)(zod@3.21.4): - optionalDependencies: - typescript: 5.0.4 - zod: 3.21.4 - - acorn-jsx@5.3.2(acorn@8.8.2): - dependencies: - acorn: 8.8.2 - - acorn@8.8.2: {} - - ajv@6.12.6: - 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 - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arch@2.2.0: {} - - arg@5.0.2: {} - - argparse@2.0.1: {} - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.1 - - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.2 - is-array-buffer: 3.0.2 - - array-includes@3.1.6: - 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 - - array-union@2.1.0: {} - - array.prototype.flat@1.3.1: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - - array.prototype.flatmap@1.3.1: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - es-shim-unscopables: 1.0.0 - - array.prototype.tosorted@1.1.1: - 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 - - ast-types-flow@0.0.7: {} - - autoprefixer@10.4.14(postcss@8.4.23): - 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 - - available-typed-arrays@1.0.5: {} - - axe-core@4.7.2: {} - - axobject-query@3.1.1: - dependencies: - deep-equal: 2.2.1 - - bail@2.0.2: {} - - balanced-match@1.0.2: {} - - base64-js@0.0.8: {} - - big-integer@1.6.51: {} - - binary-extensions@2.2.0: {} - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.51 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browserslist@4.21.5: - 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) - - bun-types@1.1.0: - dependencies: - '@types/node': 20.11.30 - '@types/ws': 8.5.10 - - bundle-name@3.0.0: - dependencies: - run-applescript: 5.0.0 - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - call-bind@1.0.2: - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 - - callsites@3.1.0: {} - - camelcase-css@2.0.1: {} - - camelize@1.0.1: {} - - caniuse-lite@1.0.30001489: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities@2.0.2: {} - - chokidar@3.5.3: - 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 - - client-only@0.0.1: {} - - clipboardy@3.0.0: - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - comma-separated-tokens@2.0.3: {} - - commander@4.1.1: {} - - concat-map@0.0.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-background-parser@0.1.0: {} - - css-box-shadow@1.0.0-3: {} - - css-color-keywords@1.0.0: {} - - css-to-react-native@3.2.0: - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - - cssesc@3.0.0: {} - - csstype@3.1.2: {} - - damerau-levenshtein@1.0.8: {} - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.4: - dependencies: - ms: 2.1.2 - - decode-named-character-reference@1.0.2: - dependencies: - character-entities: 2.0.2 - - deep-equal@2.2.1: - 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 - - deep-is@0.1.4: {} - - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - default-browser@4.0.0: - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.1.1 - titleize: 3.0.0 - - define-lazy-prop@3.0.0: {} - - define-properties@1.2.0: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - - dequal@2.0.3: {} - - didyoumean@1.2.2: {} - - diff@5.1.0: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dlv@1.1.3: {} - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - electron-to-chromium@1.4.409: {} - - emoji-regex@10.2.1: {} - - emoji-regex@9.2.2: {} - - enhanced-resolve@5.14.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - es-abstract@1.21.2: - 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 - - es-get-iterator@1.1.3: - 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 - - es-set-tostringtag@2.0.1: - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - has-tostringtag: 1.0.0 - - es-shim-unscopables@1.0.0: - dependencies: - has: 1.0.3 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - escalade@3.1.1: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - eslint-config-next@13.4.12(eslint@8.39.0)(typescript@5.0.4): - 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@8.39.0)(typescript@5.0.4))(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)(typescript@5.0.4))(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) - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - - eslint-import-resolver-node@0.3.7: - dependencies: - debug: 3.2.7 - is-core-module: 2.12.1 - resolve: 1.22.2 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0): - 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@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0))(eslint@8.39.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(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 - - eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.7(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0))(eslint@8.39.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@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@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.39.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint-import-resolver-node@0.3.7)(eslint@8.39.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - eslint: 8.39.0 - eslint-import-resolver-node: 0.3.7 - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.1.0(eslint@8.39.0)(typescript@5.0.4))(eslint@8.39.0): - dependencies: - 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@8.39.0)(typescript@5.0.4))(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 - optionalDependencies: - '@typescript-eslint/parser': 6.1.0(eslint@8.39.0)(typescript@5.0.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsx-a11y@6.7.1(eslint@8.39.0): - 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 - - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.39.0): - dependencies: - eslint: 8.39.0 - - eslint-plugin-react@7.32.2(eslint@8.39.0): - 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 - - eslint-scope@7.2.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.1: {} - - eslint@8.39.0: - 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 - - espree@9.5.2: - dependencies: - acorn: 8.8.2 - acorn-jsx: 5.3.2(acorn@8.8.2) - eslint-visitor-keys: 3.4.1 - - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - execa@5.1.1: - 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 - - execa@7.1.1: - 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 - - extend@3.0.2: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.2.12: - 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 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fflate@0.7.4: {} - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.0.4: - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - - flatted@3.2.7: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - fraction.js@4.2.0: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.2: - optional: true - - function-bind@1.1.1: {} - - function.prototype.name@1.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - get-intrinsic@1.2.1: - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 - has-symbols: 1.0.3 - - get-stream@6.0.1: {} - - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - - get-tsconfig@4.5.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob@7.1.6: - 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 - - glob@7.1.7: - 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 - - glob@7.2.3: - 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 - - globals@11.12.0: {} - - globals@13.20.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.3: - dependencies: - define-properties: 1.2.0 - - globby@11.1.0: - 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 - - globby@13.1.4: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.1 - - graceful-fs@4.2.11: {} - - grapheme-splitter@1.0.4: {} - - graphemer@1.4.0: {} - - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.1 - - has-proto@1.0.1: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - - has@1.0.3: - dependencies: - function-bind: 1.1.1 - - hast-util-whitespace@2.0.1: {} - - hex-rgb@4.3.0: {} - - human-signals@2.1.0: {} - - human-signals@4.3.1: {} - - ignore@5.2.4: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - inline-style-parser@0.1.1: {} - - internal-slot@1.0.5: - dependencies: - get-intrinsic: 1.2.1 - has: 1.0.3 - side-channel: 1.0.4 - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - is-array-buffer@3.0.2: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-typed-array: 1.1.10 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - is-buffer@2.0.5: {} - - is-callable@1.2.7: {} - - is-core-module@2.12.1: - dependencies: - has: 1.0.3 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - - is-docker@2.2.1: {} - - is-docker@3.0.0: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-map@2.0.2: {} - - is-negative-zero@2.0.2: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@4.1.0: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - is-set@2.0.2: {} - - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.2 - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.10: - 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-weakmap@2.0.1: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.2 - - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isomorphic-ws@5.0.0(ws@8.12.0): - dependencies: - ws: 8.12.0 - - javascript-natural-sort@0.7.1: {} - - jiti@1.18.2: {} - - js-sdsl@4.4.0: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@2.5.2: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - jsx-ast-utils@3.3.3: - dependencies: - array-includes: 3.1.6 - object.assign: 4.1.4 - - kleur@4.1.5: {} - - language-subtag-registry@0.3.22: {} - - language-tags@1.0.5: - dependencies: - language-subtag-registry: 0.3.22 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - linebreak@1.1.0: - dependencies: - base64-js: 0.0.8 - unicode-trie: 2.0.0 - - lines-and-columns@1.2.4: {} - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - lodash@4.17.21: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - mdast-util-definitions@5.1.2: - dependencies: - '@types/mdast': 3.0.12 - '@types/unist': 2.0.7 - unist-util-visit: 4.1.2 - - mdast-util-from-markdown@1.3.1: - 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 - - mdast-util-to-hast@12.3.0: - 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 - - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.12 - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromark-core-commonmark@1.1.0: - 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 - - micromark-factory-destination@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - - micromark-factory-title@1.1.0: - 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 - - micromark-factory-whitespace@1.1.0: - 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 - - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-decode-string@1.1.0: - 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 - - micromark-util-encode@1.1.0: {} - - micromark-util-html-tag-name@1.2.0: {} - - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-resolve-all@1.1.0: - dependencies: - micromark-util-types: 1.1.0 - - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-subtokenize@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-util-symbol@1.1.0: {} - - micromark-util-types@1.1.0: {} - - micromark@3.2.0: - 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 - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - mimic-fn@2.1.0: {} - - mimic-fn@4.0.0: {} - - mini-svg-data-uri@1.4.4: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mri@1.2.0: {} - - ms@2.1.2: {} - - ms@2.1.3: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.6: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - next-themes@0.2.1(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))(react@18.2.0): - dependencies: - next: 13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - next@13.4.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - 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 - - node-releases@2.0.12: {} - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.1.0: - dependencies: - path-key: 4.0.0 - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - object-inspect@1.12.3: {} - - object-is@1.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - - object-keys@1.1.1: {} - - object.assign@4.1.4: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.entries@1.1.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - object.fromentries@2.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - object.hasown@1.1.2: - dependencies: - define-properties: 1.2.0 - es-abstract: 1.21.2 - - object.values@1.1.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - open@9.1.0: - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - - optionator@0.9.1: - 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 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - pako@0.2.9: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-css-color@0.2.1: - dependencies: - color-name: 1.1.4 - hex-rgb: 4.3.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-type@4.0.0: {} - - picocolors@1.0.0: {} - - picomatch@2.3.1: {} - - pify@2.3.0: {} - - pirates@4.0.5: {} - - postcss-import@15.1.0(postcss@8.4.23): - dependencies: - postcss: 8.4.23 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.2 - - postcss-js@4.0.1(postcss@8.4.23): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.23 - - postcss-load-config@4.0.1(postcss@8.4.23): - dependencies: - lilconfig: 2.1.0 - yaml: 2.3.1 - optionalDependencies: - postcss: 8.4.23 - - postcss-nested@6.0.1(postcss@8.4.23): - dependencies: - postcss: 8.4.23 - postcss-selector-parser: 6.0.13 - - postcss-selector-parser@6.0.13: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - - postcss@8.4.14: - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - postcss@8.4.23: - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - prelude-ls@1.2.1: {} - - prettier-plugin-tailwindcss@0.2.8(@trivago/prettier-plugin-sort-imports@4.1.1(prettier@2.8.8))(prettier@2.8.8): - dependencies: - prettier: 2.8.8 - optionalDependencies: - '@trivago/prettier-plugin-sort-imports': 4.1.1(prettier@2.8.8) - - prettier@2.8.8: {} - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - property-information@6.2.0: {} - - punycode@2.3.0: {} - - queue-microtask@1.2.3: {} - - react-dom@18.2.0(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - - react-is@16.13.1: {} - - react-is@18.2.0: {} - - react-markdown@8.0.7(@types/react@18.2.5)(react@18.2.0): - 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 - - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.13.11: {} - - regexp.prototype.flags@1.5.0: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - functions-have-names: 1.2.3 - - remark-parse@10.0.2: - dependencies: - '@types/mdast': 3.0.12 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - - remark-rehype@10.1.0: - dependencies: - '@types/hast': 2.3.5 - '@types/mdast': 3.0.12 - mdast-util-to-hast: 12.3.0 - unified: 10.1.2 - - resolve-from@4.0.0: {} - - resolve@1.22.2: - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.4: - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - run-applescript@5.0.0: - dependencies: - execa: 5.1.1 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - sade@1.8.1: - dependencies: - mri: 1.2.0 - - safe-regex-test@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - is-regex: 1.1.4 - - satori@0.10.2: - 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 - - scheduler@0.23.0: - dependencies: - loose-envify: 1.4.0 - - semver@6.3.0: {} - - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel@1.0.4: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 - - signal-exit@3.0.7: {} - - slash@3.0.0: {} - - slash@4.0.0: {} - - source-map-js@1.0.2: {} - - source-map@0.5.7: {} - - space-separated-tokens@2.0.2: {} - - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.5 - - streamsearch@1.1.0: {} - - string.prototype.codepointat@0.2.1: {} - - string.prototype.matchall@4.0.8: - 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 - - string.prototype.trim@1.2.7: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - string.prototype.trimend@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - string.prototype.trimstart@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-json-comments@3.1.1: {} - - style-to-object@0.4.2: - dependencies: - inline-style-parser: 0.1.1 - - styled-jsx@5.1.1(react@18.2.0): - dependencies: - client-only: 0.0.1 - react: 18.2.0 - - sucrase@3.32.0: - 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 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synckit@0.8.5: - dependencies: - '@pkgr/utils': 2.4.1 - tslib: 2.5.2 - - tailwindcss@3.3.2: - 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 - - tapable@2.2.1: {} - - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - tiny-inflate@1.0.3: {} - - titleize@3.0.0: {} - - to-fast-properties@2.0.0: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - trim-lines@3.0.1: {} - - trough@2.1.0: {} - - ts-api-utils@1.0.1(typescript@5.0.4): - dependencies: - typescript: 5.0.4 - - ts-interface-checker@0.1.13: {} - - tsconfig-paths@3.14.2: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.5.2: {} - - tsutils@3.21.0(typescript@5.0.4): - dependencies: - tslib: 1.14.1 - typescript: 5.0.4 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typed-array-length@1.0.4: - dependencies: - call-bind: 1.0.2 - for-each: 0.3.3 - is-typed-array: 1.1.10 - - typescript@5.0.4: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - undici-types@5.26.5: {} - - unicode-trie@2.0.0: - dependencies: - pako: 0.2.9 - tiny-inflate: 1.0.3 - - unified@10.1.2: - 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 - - unist-util-generated@2.0.1: {} - - unist-util-is@5.2.1: - dependencies: - '@types/unist': 2.0.7 - - unist-util-position@4.0.4: - dependencies: - '@types/unist': 2.0.7 - - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.7 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - - unist-util-visit@4.1.2: - dependencies: - '@types/unist': 2.0.7 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - - untildify@4.0.0: {} - - update-browserslist-db@1.0.11(browserslist@4.21.5): - dependencies: - browserslist: 4.21.5 - escalade: 3.1.1 - picocolors: 1.0.0 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.0 - - util-deprecate@1.0.2: {} - - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.7 - unist-util-stringify-position: 3.0.3 - - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.7 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - - viem@1.5.0(typescript@5.0.4)(zod@3.21.4): - 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)(zod@3.21.4) - isomorphic-ws: 5.0.0(ws@8.12.0) - ws: 8.12.0 - optionalDependencies: - typescript: 5.0.4 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod - - watchpack@2.4.0: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - which-boxed-primitive@1.0.2: - 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 - - which-collection@1.0.1: - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - - which-typed-array@1.1.9: - 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 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.3: {} - - wrappy@1.0.2: {} - - ws@8.12.0: {} - - yallist@4.0.0: {} - - yaml@2.3.1: {} - - yocto-queue@0.1.0: {} - - yoga-wasm-web@0.3.3: {} - - zod@3.21.4: {} From b548b123547d1ff0990cedb65b3af103ef8f18a6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 2 May 2024 06:36:38 -0700 Subject: [PATCH 27/75] style: switch from prettier to biome --- .eslintrc.js | 70 +- biome.jsonc | 33 + bun.lockb | Bin 216583 -> 206834 bytes next.config.js | 16 +- package.json | 88 +- postcss.config.js | 8 +- src/chains/arbitrum/deployedContracts.ts | 470 +++---- src/chains/arbitrum/index.ts | 24 +- src/chains/arbitrum/nodes.ts | 16 +- src/chains/arbitrum/signatureTypes.ts | 168 +-- .../arbitrum/vm/opcodes/block/blockhash.ts | 40 +- .../arbitrum/vm/opcodes/block/coinbase.ts | 38 +- .../arbitrum/vm/opcodes/block/number.ts | 30 +- .../arbitrum/vm/opcodes/block/prevrandao.ts | 16 +- .../arbitrum/vm/opcodes/environment/caller.ts | 12 +- .../arbitrum/vm/opcodes/environment/origin.ts | 12 +- src/chains/arbitrum/vm/opcodes/index.ts | 24 +- src/chains/arbitrum/vm/opcodes/stack/push0.ts | 6 +- src/chains/arbitrum/vm/precompiles.ts | 526 ++++---- src/chains/arbitrum/vm/predeploys.ts | 2 +- src/chains/index.ts | 5 +- src/chains/mainnet/accountTypes.ts | 46 +- src/chains/mainnet/deployedContracts.ts | 288 ++-- src/chains/mainnet/eips.ts | 958 ++++++------- src/chains/mainnet/hardforks.ts | 62 +- src/chains/mainnet/index.ts | 24 +- src/chains/mainnet/mempools.ts | 166 +-- src/chains/mainnet/nodes/consensus.ts | 62 +- src/chains/mainnet/nodes/execution.ts | 92 +- src/chains/mainnet/signatureTypes.ts | 119 +- .../mainnet/vm/opcodes/arithmetic/add.ts | 88 +- .../mainnet/vm/opcodes/arithmetic/addmod.ts | 100 +- .../mainnet/vm/opcodes/arithmetic/div.ts | 90 +- .../mainnet/vm/opcodes/arithmetic/exp.ts | 118 +- .../mainnet/vm/opcodes/arithmetic/index.ts | 24 +- .../mainnet/vm/opcodes/arithmetic/mod.ts | 90 +- .../mainnet/vm/opcodes/arithmetic/mul.ts | 88 +- .../mainnet/vm/opcodes/arithmetic/mulmod.ts | 108 +- .../mainnet/vm/opcodes/arithmetic/sdiv.ts | 102 +- .../vm/opcodes/arithmetic/signextend.ts | 88 +- .../mainnet/vm/opcodes/arithmetic/smod.ts | 102 +- .../mainnet/vm/opcodes/arithmetic/sub.ts | 88 +- src/chains/mainnet/vm/opcodes/bitwise/and.ts | 88 +- src/chains/mainnet/vm/opcodes/bitwise/byte.ts | 90 +- .../mainnet/vm/opcodes/bitwise/index.ts | 18 +- src/chains/mainnet/vm/opcodes/bitwise/not.ts | 68 +- src/chains/mainnet/vm/opcodes/bitwise/or.ts | 88 +- src/chains/mainnet/vm/opcodes/bitwise/sar.ts | 94 +- src/chains/mainnet/vm/opcodes/bitwise/shl.ts | 94 +- src/chains/mainnet/vm/opcodes/bitwise/shr.ts | 94 +- src/chains/mainnet/vm/opcodes/bitwise/xor.ts | 88 +- .../mainnet/vm/opcodes/block/blockhash.ts | 62 +- .../mainnet/vm/opcodes/block/chainid.ts | 54 +- .../mainnet/vm/opcodes/block/coinbase.ts | 44 +- .../mainnet/vm/opcodes/block/gaslimit.ts | 44 +- src/chains/mainnet/vm/opcodes/block/index.ts | 14 +- src/chains/mainnet/vm/opcodes/block/number.ts | 44 +- .../mainnet/vm/opcodes/block/prevrandao.ts | 56 +- .../mainnet/vm/opcodes/block/timestamp.ts | 44 +- .../mainnet/vm/opcodes/comparison/eq.ts | 90 +- .../mainnet/vm/opcodes/comparison/gt.ts | 90 +- .../mainnet/vm/opcodes/comparison/index.ts | 14 +- .../mainnet/vm/opcodes/comparison/iszero.ts | 82 +- .../mainnet/vm/opcodes/comparison/lt.ts | 90 +- .../mainnet/vm/opcodes/comparison/sgt.ts | 90 +- .../mainnet/vm/opcodes/comparison/slt.ts | 92 +- .../mainnet/vm/opcodes/controlFlow/gas.ts | 50 +- .../mainnet/vm/opcodes/controlFlow/index.ts | 14 +- .../mainnet/vm/opcodes/controlFlow/jump.ts | 64 +- .../vm/opcodes/controlFlow/jumpdest.ts | 26 +- .../mainnet/vm/opcodes/controlFlow/jumpi.ts | 74 +- .../mainnet/vm/opcodes/controlFlow/pc.ts | 56 +- .../mainnet/vm/opcodes/controlFlow/stop.ts | 26 +- .../mainnet/vm/opcodes/environment/address.ts | 54 +- .../mainnet/vm/opcodes/environment/balance.ts | 90 +- .../mainnet/vm/opcodes/environment/basefee.ts | 54 +- .../vm/opcodes/environment/calldatacopy.ts | 180 +-- .../vm/opcodes/environment/calldataload.ts | 86 +- .../vm/opcodes/environment/calldatasize.ts | 56 +- .../mainnet/vm/opcodes/environment/caller.ts | 56 +- .../vm/opcodes/environment/callvalue.ts | 54 +- .../vm/opcodes/environment/codecopy.ts | 182 +-- .../vm/opcodes/environment/codesize.ts | 64 +- .../vm/opcodes/environment/extcodecopy.ts | 200 +-- .../vm/opcodes/environment/extcodehash.ts | 90 +- .../vm/opcodes/environment/extcodesize.ts | 88 +- .../vm/opcodes/environment/gasprice.ts | 54 +- .../mainnet/vm/opcodes/environment/index.ts | 38 +- .../mainnet/vm/opcodes/environment/origin.ts | 56 +- .../vm/opcodes/environment/returndatacopy.ts | 192 +-- .../vm/opcodes/environment/returndatasize.ts | 60 +- .../vm/opcodes/environment/selfbalance.ts | 60 +- src/chains/mainnet/vm/opcodes/index.ts | 26 +- src/chains/mainnet/vm/opcodes/keccak/index.ts | 4 +- .../mainnet/vm/opcodes/keccak/keccak.ts | 176 +-- src/chains/mainnet/vm/opcodes/log/index.ts | 4 +- src/chains/mainnet/vm/opcodes/log/log.ts | 174 +-- src/chains/mainnet/vm/opcodes/memory/index.ts | 10 +- src/chains/mainnet/vm/opcodes/memory/mload.ts | 158 +-- src/chains/mainnet/vm/opcodes/memory/msize.ts | 54 +- .../mainnet/vm/opcodes/memory/mstore.ts | 148 +- .../mainnet/vm/opcodes/memory/mstore8.ts | 148 +- src/chains/mainnet/vm/opcodes/stack/dup.ts | 146 +- src/chains/mainnet/vm/opcodes/stack/index.ts | 12 +- src/chains/mainnet/vm/opcodes/stack/pop.ts | 54 +- src/chains/mainnet/vm/opcodes/stack/push.ts | 132 +- src/chains/mainnet/vm/opcodes/stack/swap.ts | 154 +-- .../mainnet/vm/opcodes/storage/index.ts | 6 +- .../mainnet/vm/opcodes/storage/sload.ts | 130 +- .../mainnet/vm/opcodes/storage/sstore.ts | 160 +-- src/chains/mainnet/vm/opcodes/system/call.ts | 238 ++-- .../mainnet/vm/opcodes/system/callcode.ts | 220 +-- .../mainnet/vm/opcodes/system/create.ts | 228 ++-- .../mainnet/vm/opcodes/system/create2.ts | 210 +-- .../mainnet/vm/opcodes/system/delegatecall.ts | 210 +-- src/chains/mainnet/vm/opcodes/system/index.ts | 22 +- .../mainnet/vm/opcodes/system/invalid.ts | 22 +- .../mainnet/vm/opcodes/system/return.ts | 146 +- .../mainnet/vm/opcodes/system/revert.ts | 150 +-- .../mainnet/vm/opcodes/system/selfdestruct.ts | 102 +- .../mainnet/vm/opcodes/system/staticcall.ts | 188 +-- src/chains/mainnet/vm/precompiles.ts | 874 ++++++------ src/chains/mainnet/vm/predeploys.ts | 2 +- src/chains/optimism/deployedContracts.ts | 48 +- src/chains/optimism/eips.ts | 116 +- src/chains/optimism/hardforks.ts | 34 +- src/chains/optimism/index.ts | 24 +- src/chains/optimism/nodes.ts | 32 +- src/chains/optimism/signatureTypes.ts | 32 +- .../optimism/vm/opcodes/block/coinbase.ts | 36 +- .../optimism/vm/opcodes/block/prevrandao.ts | 30 +- .../optimism/vm/opcodes/environment/caller.ts | 30 +- .../optimism/vm/opcodes/environment/origin.ts | 30 +- src/chains/optimism/vm/opcodes/index.ts | 20 +- src/chains/optimism/vm/opcodes/stack/push0.ts | 6 +- src/chains/optimism/vm/precompiles.ts | 2 +- src/chains/optimism/vm/predeploys.ts | 1196 ++++++++--------- src/components/ChainDiffSelector.tsx | 82 +- src/components/diff/DiffAccountTypes.tsx | 119 +- src/components/diff/DiffDeployedContracts.tsx | 107 +- src/components/diff/DiffEIPs.tsx | 150 --- src/components/diff/DiffEVMStackAddresses.tsx | 113 +- src/components/diff/DiffMempools.tsx | 104 -- src/components/diff/DiffMetadata.tsx | 151 ++- src/components/diff/DiffNodes.tsx | 190 +-- src/components/diff/DiffOpcodes.tsx | 85 +- src/components/diff/DiffPrecompiles.tsx | 89 +- src/components/diff/DiffSignatureTypes.tsx | 120 +- src/components/diff/utils/Abi.tsx | 126 +- src/components/diff/utils/Collapsible.tsx | 100 +- src/components/diff/utils/Markdown.tsx | 138 +- src/components/diff/utils/RenderDiff.tsx | 12 +- src/components/diff/utils/format.tsx | 69 +- src/components/features/FeatureTable.tsx | 185 ++- src/components/layout/ExternalLink.tsx | 20 +- src/components/layout/Footer.tsx | 96 +- src/components/layout/Head.tsx | 76 +- src/components/layout/Header.tsx | 50 +- src/components/layout/Layout.tsx | 82 +- src/components/layout/ThemeSwitcher.tsx | 20 +- src/components/ui/BaseCombobox.tsx | 192 +-- .../ui/ChainDiffSelectorChainCombobox.tsx | 172 +-- src/components/ui/Copyable.tsx | 68 +- src/components/ui/LoadingSpinner.tsx | 50 +- src/components/ui/Toggle.tsx | 52 +- src/components/ui/Tooltip.tsx | 28 +- src/lib/constants.ts | 2 +- src/lib/opcodes.ts | 46 +- src/lib/utils.ts | 48 +- src/pages/_app.tsx | 30 +- src/pages/api/og.tsx | 367 +++-- src/pages/diff.tsx | 275 ++-- src/pages/features.tsx | 178 ++- src/pages/index.tsx | 34 +- src/types/accountType.ts | 20 +- src/types/chain.ts | 42 +- src/types/deployedContract.ts | 32 +- src/types/eip.ts | 44 +- src/types/index.ts | 6 +- src/types/mempool.ts | 36 +- src/types/node.ts | 38 +- src/types/opcode.ts | 64 +- src/types/precompile.ts | 30 +- src/types/predeploy.ts | 20 +- src/types/signatureType.ts | 16 +- tailwind.config.js | 26 +- tsconfig.json | 52 +- 187 files changed, 9054 insertions(+), 9305 deletions(-) create mode 100644 biome.jsonc delete mode 100644 src/components/diff/DiffEIPs.tsx delete mode 100644 src/components/diff/DiffMempools.tsx 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/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 index a4e0a13263156e09600e2c4a9b34c1afb12c26d4..8e72381b15f8f5feab20fa10f3b98b0bae3ee2cf 100755 GIT binary patch delta 38467 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 delta 44323 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 T(TPvk_(5ZcMQdpj-c0yEQJXPa 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 fb872ec6..4a03c67a 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,45 @@ { - "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/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", - "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": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", + "fmt": "bunx @biomejs/biome format --write .", + "check": "bun lint && bun fmt" + }, + "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": { + "@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/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/src/chains/arbitrum/deployedContracts.ts b/src/chains/arbitrum/deployedContracts.ts index dc844842..02e2bd73 100644 --- a/src/chains/arbitrum/deployedContracts.ts +++ b/src/chains/arbitrum/deployedContracts.ts @@ -1,246 +1,246 @@ import { deployedContracts as mainnetDeployedContracts } from '@/chains/mainnet/deployedContracts'; -import { DeployedContract, DeployedContractKind } from '@/types'; +import { type DeployedContract, DeployedContractKind } from '@/types'; const ARBITRUM_SMART_CONTRACT_ADDRESSES = - '[Arbitrum Smart Contract Addresses](https://docs.arbitrum.io/for-devs/useful-addresses)'; + '[Arbitrum Smart Contract Addresses](https://docs.arbitrum.io/for-devs/useful-addresses)'; const arbitrumDeployedContracts: Record = { - ...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)', - ], - }, + ...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', + ...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 index 94348b08..7282acf6 100644 --- a/src/chains/arbitrum/index.ts +++ b/src/chains/arbitrum/index.ts @@ -1,6 +1,6 @@ import { arbitrum as arbitrumMetadata } from '@wagmi/chains'; import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; +import type { Chain } from '@/types'; import { accountTypes } from './accountTypes'; import { deployedContracts } from './deployedContracts'; import { consensusNodes, executionNodes } from './nodes'; @@ -10,15 +10,15 @@ 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, + 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 index 149a7012..85c291bc 100644 --- a/src/chains/arbitrum/nodes.ts +++ b/src/chains/arbitrum/nodes.ts @@ -1,13 +1,13 @@ -import { Language, Node, NodeType } from '@/types'; +import { Language, type 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/', + 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]; diff --git a/src/chains/arbitrum/signatureTypes.ts b/src/chains/arbitrum/signatureTypes.ts index 1a9b8fb2..327f8953 100644 --- a/src/chains/arbitrum/signatureTypes.ts +++ b/src/chains/arbitrum/signatureTypes.ts @@ -1,111 +1,111 @@ import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import { SignatureType } from '@/types'; +import type { SignatureType } from '@/types'; const txTypeDocs = - '[Arbitrum Transaction Types](https://developer.arbitrum.io/arbos/geth#transaction-types)'; + '[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', - ], + 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', - ], + 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', - ], + 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', - ], + 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', - ], + 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', - ], + 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, - ], + 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 }, + ...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 index 79ee0ae7..84d6b997 100644 --- a/src/chains/arbitrum/vm/opcodes/block/blockhash.ts +++ b/src/chains/arbitrum/vm/opcodes/block/blockhash.ts @@ -1,25 +1,25 @@ import { blockhash as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/blockhash'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index eec479db..379665a7 100644 --- a/src/chains/arbitrum/vm/opcodes/block/coinbase.ts +++ b/src/chains/arbitrum/vm/opcodes/block/coinbase.ts @@ -1,24 +1,24 @@ import { coinbase as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/coinbase'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index 58bdb608..1d9e17ce 100644 --- a/src/chains/arbitrum/vm/opcodes/block/number.ts +++ b/src/chains/arbitrum/vm/opcodes/block/number.ts @@ -1,20 +1,20 @@ import { number as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/number'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index a22f0f19..55521a45 100644 --- a/src/chains/arbitrum/vm/opcodes/block/prevrandao.ts +++ b/src/chains/arbitrum/vm/opcodes/block/prevrandao.ts @@ -1,13 +1,13 @@ import { prevrandao as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/prevrandao'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index 754acecb..0fb03bec 100644 --- a/src/chains/arbitrum/vm/opcodes/environment/caller.ts +++ b/src/chains/arbitrum/vm/opcodes/environment/caller.ts @@ -1,11 +1,11 @@ import { caller as baseOpcode } from '@/chains/optimism/vm/opcodes/environment/caller'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index 064b1984..3d3fd9a3 100644 --- a/src/chains/arbitrum/vm/opcodes/environment/origin.ts +++ b/src/chains/arbitrum/vm/opcodes/environment/origin.ts @@ -1,11 +1,11 @@ import { origin as baseOpcode } from '@/chains/optimism/vm/opcodes/environment/origin'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index b268e06f..8dccaaca 100644 --- a/src/chains/arbitrum/vm/opcodes/index.ts +++ b/src/chains/arbitrum/vm/opcodes/index.ts @@ -1,5 +1,5 @@ import { opcodes as mainnetOpcodes } from '@/chains/mainnet/vm/opcodes'; -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { blockhash } from './block/blockhash'; import { coinbase } from './block/coinbase'; import { number } from './block/number'; @@ -9,18 +9,18 @@ import { origin } from './environment/origin'; import { push0 } from './stack/push0'; export const opcodes: Record> = { - ...mainnetOpcodes, + ...mainnetOpcodes, - // block - ...{ [blockhash.number]: blockhash }, - ...{ [coinbase.number]: coinbase }, - ...{ [prevrandao.number]: prevrandao }, - ...{ [number.number]: number }, + // block + ...{ [blockhash.number]: blockhash }, + ...{ [coinbase.number]: coinbase }, + ...{ [prevrandao.number]: prevrandao }, + ...{ [number.number]: number }, - // environment - ...{ [caller.number]: caller }, - ...{ [origin.number]: origin }, + // environment + ...{ [caller.number]: caller }, + ...{ [origin.number]: origin }, - // stack - ...{ [push0.number]: push0 }, + // stack + ...{ [push0.number]: push0 }, }; diff --git a/src/chains/arbitrum/vm/opcodes/stack/push0.ts b/src/chains/arbitrum/vm/opcodes/stack/push0.ts index e94fb216..ce7f3fff 100644 --- a/src/chains/arbitrum/vm/opcodes/stack/push0.ts +++ b/src/chains/arbitrum/vm/opcodes/stack/push0.ts @@ -1,7 +1,7 @@ import { push0 as baseOpcode } from '@/chains/mainnet/vm/opcodes/stack/push'; -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; export const push0: Opcode = { - ...baseOpcode, - supportedHardforks: ['ArbOS 11'], + ...baseOpcode, + supportedHardforks: ['ArbOS 11'], }; diff --git a/src/chains/arbitrum/vm/precompiles.ts b/src/chains/arbitrum/vm/precompiles.ts index dee0f61f..17513d10 100644 --- a/src/chains/arbitrum/vm/precompiles.ts +++ b/src/chains/arbitrum/vm/precompiles.ts @@ -1,269 +1,269 @@ import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import { Precompile } from '@/types'; +import type { Precompile } from '@/types'; const ARBITRUM_SMART_CONTRACT_ADDRESSES = - '[Arbitrum Smart Contract Addresses](https://docs.arbitrum.io/for-devs/useful-addresses#precompiles)'; + '[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)', - ], - }, + ...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 index e003601e..65fc05f8 100644 --- a/src/chains/arbitrum/vm/predeploys.ts +++ b/src/chains/arbitrum/vm/predeploys.ts @@ -1,3 +1,3 @@ -import { Predeploy } from '@/types'; +import type { Predeploy } from '@/types'; export const predeploys: Predeploy[] = []; diff --git a/src/chains/index.ts b/src/chains/index.ts index 8113619b..9965aee7 100644 --- a/src/chains/index.ts +++ b/src/chains/index.ts @@ -5,7 +5,6 @@ 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); + if (!chainId) return undefined; + return Object.values(chains).find((chain) => BigInt(chain.metadata.id) === BigInt(chainId)); }; diff --git a/src/chains/mainnet/accountTypes.ts b/src/chains/mainnet/accountTypes.ts index bd9a2ad8..9d7ba826 100644 --- a/src/chains/mainnet/accountTypes.ts +++ b/src/chains/mainnet/accountTypes.ts @@ -1,34 +1,34 @@ -import { AccountType } from '@/types'; +import type { 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, - }, + 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, - }, + 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, + [eoa.name]: eoa, + [contract.name]: contract, }; diff --git a/src/chains/mainnet/deployedContracts.ts b/src/chains/mainnet/deployedContracts.ts index 22032c96..7ba2d21a 100644 --- a/src/chains/mainnet/deployedContracts.ts +++ b/src/chains/mainnet/deployedContracts.ts @@ -1,151 +1,151 @@ -import { DeployedContract, DeployedContractKind } from '@/types'; +import { type 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', - ], - }, + { + 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 + (acc, contract) => { + acc[contract.name] = contract; + return acc; + }, + {} as Record, ); diff --git a/src/chains/mainnet/eips.ts b/src/chains/mainnet/eips.ts index 3ee0ce66..468c0ff3 100644 --- a/src/chains/mainnet/eips.ts +++ b/src/chains/mainnet/eips.ts @@ -1,554 +1,554 @@ -import { EIP, EIPCategory, EIPState } from '@/types/eip'; +import { type 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'], - }, + { + 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 + 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'], - }, + { + 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 + 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'], - }, + { + 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'], - }, + { + 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 + 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'], - }, + { + 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'], - }, + { + 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'], - }, + { + 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'], - }, + { + 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'], + 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'], - }, + 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'], - }, + { + 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'], - }, + { + 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, + number: 4399, + title: 'Supplant DIFFICULTY opcode with PREVRANDAO', + category: EIPCategory.Execution, - status: EIPState.Final, - activeHardforks: hardforksFromParis, - references: ['https://eips.ethereum.org/EIPS/eip-4399'], + 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, + { + 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'], + 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, + { + 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, + ...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 index 8133a8c3..1ba9c932 100644 --- a/src/chains/mainnet/hardforks.ts +++ b/src/chains/mainnet/hardforks.ts @@ -1,44 +1,44 @@ 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, + Frontier = 0, + Homestead = 1, + DaoFork = 2, + TangerineWhistle = 3, + SpuriousDragon = 4, + Byzantium = 5, + Constantinople = 6, + // The Petersburg hard fork doesn't exist in ethereum/execution-specs so we do not reference it. + Istanbul = 7, + MuirGlacier = 8, + Berlin = 9, + London = 10, + ArrowGlacier = 11, + GrayGlacier = 12, + Paris = 13, + Shanghai = 14, } 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); + 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 + 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.` - ); - } + 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); + // 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 index b89fa4cd..dfc76b8a 100644 --- a/src/chains/mainnet/index.ts +++ b/src/chains/mainnet/index.ts @@ -1,6 +1,6 @@ import { mainnet as mainnetMetadata } from '@wagmi/chains'; import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; +import type { Chain } from '@/types'; import { accountTypes } from './accountTypes'; import { deployedContracts } from './deployedContracts'; import { eips } from './eips'; @@ -13,15 +13,15 @@ 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, + 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 index 580e08f9..ca336871 100644 --- a/src/chains/mainnet/mempools.ts +++ b/src/chains/mainnet/mempools.ts @@ -1,101 +1,101 @@ -import { Mempool } from '@/types'; +import type { 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', - }, + 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, - }, + 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, - }, + 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, - }, + 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, - }, + 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, + [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 index 1e55f9ca..d8dec980 100644 --- a/src/chains/mainnet/nodes/consensus.ts +++ b/src/chains/mainnet/nodes/consensus.ts @@ -1,48 +1,48 @@ -import { Language, Node, NodeType } from '@/types'; +import { Language, type 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/', + 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/', + 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/', + 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/', + 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/', + 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 index 99afb617..1d808551 100644 --- a/src/chains/mainnet/nodes/execution.ts +++ b/src/chains/mainnet/nodes/execution.ts @@ -1,66 +1,66 @@ -import { Language, Node, NodeType, SyncStrategy } from '@/types'; +import { Language, type 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/', + 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/', + 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/', + 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/', + 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/', + 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/', + 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 index 89283593..b1d0a526 100644 --- a/src/chains/mainnet/signatureTypes.ts +++ b/src/chains/mainnet/signatureTypes.ts @@ -1,73 +1,76 @@ -import { SignatureType } from '@/types'; +import type { 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'; + '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], + 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, + { + 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); +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 index 49315cfa..5d756874 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/add.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/add.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c99fa5a3..1b4a1439 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts @@ -1,56 +1,56 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c8d03d29..c3d9872e 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/div.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/div.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index f9186478..6206bc2c 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/exp.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/exp.ts @@ -1,65 +1,65 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index e0f5923e..334ece06 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/index.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { add } from './add'; import { addmod } from './addmod'; import { div } from './div'; @@ -12,15 +12,15 @@ 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, + [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 index 31b28fe7..b8b25ce2 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mod.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/mod.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index d770c8ca..b35d1aa2 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mul.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/mul.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c9cd44ff..f00037df 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts @@ -1,60 +1,60 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 582e8a4e..0c8f37e2 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts @@ -1,57 +1,57 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index e42540cc..08dedab8 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index ff4e942b..5b290a2e 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/smod.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/smod.ts @@ -1,57 +1,57 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index bce98930..4009d344 100644 --- a/src/chains/mainnet/vm/opcodes/arithmetic/sub.ts +++ b/src/chains/mainnet/vm/opcodes/arithmetic/sub.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index bbd768a9..27b25754 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/and.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/and.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 7b313921..f1a0e3ea 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/byte.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/byte.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 6d00fbc1..6ec2c98b 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/index.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { and } from './and'; import { byte } from './byte'; import { not } from './not'; @@ -9,12 +9,12 @@ 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, + [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 index 9a04685c..a368e4f3 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/not.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/not.ts @@ -1,40 +1,40 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 124f425d..4229991a 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/or.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/or.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 8f9b7ead..d68c1e00 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/sar.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/sar.ts @@ -1,53 +1,53 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 5baebd7d..a177125f 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/shl.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/shl.ts @@ -1,53 +1,53 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 9d80baf0..b4bac833 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/shr.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/shr.ts @@ -1,53 +1,53 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index eadc56b0..93e11633 100644 --- a/src/chains/mainnet/vm/opcodes/bitwise/xor.ts +++ b/src/chains/mainnet/vm/opcodes/bitwise/xor.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c62212d2..1c2a474f 100644 --- a/src/chains/mainnet/vm/opcodes/block/blockhash.ts +++ b/src/chains/mainnet/vm/opcodes/block/blockhash.ts @@ -1,36 +1,36 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 864c735e..d6121b8e 100644 --- a/src/chains/mainnet/vm/opcodes/block/chainid.ts +++ b/src/chains/mainnet/vm/opcodes/block/chainid.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 6cc1d0e3..56bce38c 100644 --- a/src/chains/mainnet/vm/opcodes/block/coinbase.ts +++ b/src/chains/mainnet/vm/opcodes/block/coinbase.ts @@ -1,27 +1,27 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 3dce5a64..b2b1244e 100644 --- a/src/chains/mainnet/vm/opcodes/block/gaslimit.ts +++ b/src/chains/mainnet/vm/opcodes/block/gaslimit.ts @@ -1,27 +1,27 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 915c164a..977c9b42 100644 --- a/src/chains/mainnet/vm/opcodes/block/index.ts +++ b/src/chains/mainnet/vm/opcodes/block/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { blockhash } from './blockhash'; import { coinbase } from './coinbase'; import { gaslimit } from './gaslimit'; @@ -7,10 +7,10 @@ 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, + [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 index 9d0600ad..abdf947f 100644 --- a/src/chains/mainnet/vm/opcodes/block/number.ts +++ b/src/chains/mainnet/vm/opcodes/block/number.ts @@ -1,27 +1,27 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index becb6f08..c3d4a161 100644 --- a/src/chains/mainnet/vm/opcodes/block/prevrandao.ts +++ b/src/chains/mainnet/vm/opcodes/block/prevrandao.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index da78109c..ab9c4eb5 100644 --- a/src/chains/mainnet/vm/opcodes/block/timestamp.ts +++ b/src/chains/mainnet/vm/opcodes/block/timestamp.ts @@ -1,27 +1,27 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index bb12760d..d56966cb 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/eq.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/eq.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 3ea09b96..b3a6579d 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/gt.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/gt.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 58fbcd51..4427b51c 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/index.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { eq } from './eq'; import { gt } from './gt'; import { iszero } from './iszero'; @@ -7,10 +7,10 @@ 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, + [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 index 2116ff56..aab506c2 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/iszero.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/iszero.ts @@ -1,47 +1,47 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 24996b7f..cb2d48da 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/lt.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/lt.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 0c5c94e9..e8c52650 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/sgt.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/sgt.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 29482994..6af7c11e 100644 --- a/src/chains/mainnet/vm/opcodes/comparison/slt.ts +++ b/src/chains/mainnet/vm/opcodes/comparison/slt.ts @@ -1,52 +1,52 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index d82e9fbf..60efee63 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/gas.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/gas.ts @@ -1,31 +1,31 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 8cb7198f..6649daec 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/index.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { gas } from './gas'; import { jump } from './jump'; import { jumpdest } from './jumpdest'; @@ -7,10 +7,10 @@ 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, + [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 index d45aa301..c3c26e3c 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jump.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/jump.ts @@ -1,38 +1,38 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 7930afc1..7130c066 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts @@ -1,18 +1,18 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 583257d7..a5e8f282 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts @@ -1,43 +1,43 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index aa3bd940..b208c927 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/pc.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/pc.ts @@ -1,34 +1,34 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 4e2617b7..34ca2feb 100644 --- a/src/chains/mainnet/vm/opcodes/controlFlow/stop.ts +++ b/src/chains/mainnet/vm/opcodes/controlFlow/stop.ts @@ -1,18 +1,18 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 93f55e72..80123c16 100644 --- a/src/chains/mainnet/vm/opcodes/environment/address.ts +++ b/src/chains/mainnet/vm/opcodes/environment/address.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 81e2c3ac..04b0676d 100644 --- a/src/chains/mainnet/vm/opcodes/environment/balance.ts +++ b/src/chains/mainnet/vm/opcodes/environment/balance.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 269d6d8b..05eba41b 100644 --- a/src/chains/mainnet/vm/opcodes/environment/basefee.ts +++ b/src/chains/mainnet/vm/opcodes/environment/basefee.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 8e7e714f..cd4c42b7 100644 --- a/src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts +++ b/src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts @@ -1,96 +1,96 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 14c4bcc9..9a2dcad5 100644 --- a/src/chains/mainnet/vm/opcodes/environment/calldataload.ts +++ b/src/chains/mainnet/vm/opcodes/environment/calldataload.ts @@ -1,49 +1,49 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 2f7918d0..9f87bca8 100644 --- a/src/chains/mainnet/vm/opcodes/environment/calldatasize.ts +++ b/src/chains/mainnet/vm/opcodes/environment/calldatasize.ts @@ -1,34 +1,34 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index e04bdbfe..318c68d8 100644 --- a/src/chains/mainnet/vm/opcodes/environment/caller.ts +++ b/src/chains/mainnet/vm/opcodes/environment/caller.ts @@ -1,34 +1,34 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index d46c172e..738b42df 100644 --- a/src/chains/mainnet/vm/opcodes/environment/callvalue.ts +++ b/src/chains/mainnet/vm/opcodes/environment/callvalue.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 9c50a0e9..712a6ca2 100644 --- a/src/chains/mainnet/vm/opcodes/environment/codecopy.ts +++ b/src/chains/mainnet/vm/opcodes/environment/codecopy.ts @@ -1,97 +1,97 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index ac5b9a8a..e90a965d 100644 --- a/src/chains/mainnet/vm/opcodes/environment/codesize.ts +++ b/src/chains/mainnet/vm/opcodes/environment/codesize.ts @@ -1,38 +1,38 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 81a379f1..fae565a4 100644 --- a/src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts +++ b/src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts @@ -1,106 +1,106 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 941a3087..3f0d9e95 100644 --- a/src/chains/mainnet/vm/opcodes/environment/extcodehash.ts +++ b/src/chains/mainnet/vm/opcodes/environment/extcodehash.ts @@ -1,51 +1,51 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 18e7f821..77d0f20b 100644 --- a/src/chains/mainnet/vm/opcodes/environment/extcodesize.ts +++ b/src/chains/mainnet/vm/opcodes/environment/extcodesize.ts @@ -1,50 +1,50 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index e9171071..f8b294ba 100644 --- a/src/chains/mainnet/vm/opcodes/environment/gasprice.ts +++ b/src/chains/mainnet/vm/opcodes/environment/gasprice.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 8de1879e..beee8f61 100644 --- a/src/chains/mainnet/vm/opcodes/environment/index.ts +++ b/src/chains/mainnet/vm/opcodes/environment/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { address } from './address'; import { balance } from './balance'; import { basefee } from './basefee'; @@ -19,22 +19,22 @@ 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, + [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 index a021abdf..18ca3163 100644 --- a/src/chains/mainnet/vm/opcodes/environment/origin.ts +++ b/src/chains/mainnet/vm/opcodes/environment/origin.ts @@ -1,34 +1,34 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index b7d50e6f..fef04d9f 100644 --- a/src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts +++ b/src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts @@ -1,102 +1,102 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index d7808190..4e780a96 100644 --- a/src/chains/mainnet/vm/opcodes/environment/returndatasize.ts +++ b/src/chains/mainnet/vm/opcodes/environment/returndatasize.ts @@ -1,36 +1,36 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c2e592ca..392f34d1 100644 --- a/src/chains/mainnet/vm/opcodes/environment/selfbalance.ts +++ b/src/chains/mainnet/vm/opcodes/environment/selfbalance.ts @@ -1,36 +1,36 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index fd02f55f..3776af1a 100644 --- a/src/chains/mainnet/vm/opcodes/index.ts +++ b/src/chains/mainnet/vm/opcodes/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { opcodes as arithmeticOpcodes } from './arithmetic'; import { opcodes as bitwiseOpcodes } from './bitwise'; import { opcodes as blockOpcodes } from './block'; @@ -13,16 +13,16 @@ 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, + ...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 index 8e700efd..c281a9d7 100644 --- a/src/chains/mainnet/vm/opcodes/keccak/index.ts +++ b/src/chains/mainnet/vm/opcodes/keccak/index.ts @@ -1,6 +1,6 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { keccak } from './keccak'; export const opcodes: Record = { - [keccak.number]: keccak, + [keccak.number]: keccak, }; diff --git a/src/chains/mainnet/vm/opcodes/keccak/keccak.ts b/src/chains/mainnet/vm/opcodes/keccak/keccak.ts index 5f570f08..05b01a03 100644 --- a/src/chains/mainnet/vm/opcodes/keccak/keccak.ts +++ b/src/chains/mainnet/vm/opcodes/keccak/keccak.ts @@ -1,94 +1,94 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 10275f16..6ef055e9 100644 --- a/src/chains/mainnet/vm/opcodes/log/index.ts +++ b/src/chains/mainnet/vm/opcodes/log/index.ts @@ -1,6 +1,6 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { opcodes as logOpcodes } from './log'; export const opcodes: Record> = { - ...logOpcodes, + ...logOpcodes, }; diff --git a/src/chains/mainnet/vm/opcodes/log/log.ts b/src/chains/mainnet/vm/opcodes/log/log.ts index c5e24162..3bccf7ac 100644 --- a/src/chains/mainnet/vm/opcodes/log/log.ts +++ b/src/chains/mainnet/vm/opcodes/log/log.ts @@ -1,97 +1,97 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), - }; + 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; + 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 index 46255115..55fc56b0 100644 --- a/src/chains/mainnet/vm/opcodes/memory/index.ts +++ b/src/chains/mainnet/vm/opcodes/memory/index.ts @@ -1,12 +1,12 @@ -import { Opcode } from '@/types'; +import type { 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, + [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 index 7f495ef8..35e98fad 100644 --- a/src/chains/mainnet/vm/opcodes/memory/mload.ts +++ b/src/chains/mainnet/vm/opcodes/memory/mload.ts @@ -1,85 +1,85 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 159d0b2d..859ec6af 100644 --- a/src/chains/mainnet/vm/opcodes/memory/msize.ts +++ b/src/chains/mainnet/vm/opcodes/memory/msize.ts @@ -1,33 +1,33 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 0199a353..950dc707 100644 --- a/src/chains/mainnet/vm/opcodes/memory/mstore.ts +++ b/src/chains/mainnet/vm/opcodes/memory/mstore.ts @@ -1,80 +1,80 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index d5144993..e7d38fcf 100644 --- a/src/chains/mainnet/vm/opcodes/memory/mstore8.ts +++ b/src/chains/mainnet/vm/opcodes/memory/mstore8.ts @@ -1,80 +1,80 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 72327d84..c8f79b67 100644 --- a/src/chains/mainnet/vm/opcodes/stack/dup.ts +++ b/src/chains/mainnet/vm/opcodes/stack/dup.ts @@ -1,88 +1,88 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode, Variable } from '@/types'; +import type { 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 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), - }; + 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; + 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 index 4973aec5..7ae3050c 100644 --- a/src/chains/mainnet/vm/opcodes/stack/index.ts +++ b/src/chains/mainnet/vm/opcodes/stack/index.ts @@ -1,13 +1,13 @@ -import { Opcode } from '@/types'; +import type { 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, + ...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 index 384c445f..8223b8ca 100644 --- a/src/chains/mainnet/vm/opcodes/stack/pop.ts +++ b/src/chains/mainnet/vm/opcodes/stack/pop.ts @@ -1,34 +1,34 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index c59830fe..bb808fad 100644 --- a/src/chains/mainnet/vm/opcodes/stack/push.ts +++ b/src/chains/mainnet/vm/opcodes/stack/push.ts @@ -1,81 +1,81 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), - }; + 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; + 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), + 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 index 007143bf..ac4b5f84 100644 --- a/src/chains/mainnet/vm/opcodes/stack/swap.ts +++ b/src/chains/mainnet/vm/opcodes/stack/swap.ts @@ -1,92 +1,92 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode, Variable } from '@/types'; +import type { 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 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), - }; + 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; + 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 index 6493ff6a..82323e53 100644 --- a/src/chains/mainnet/vm/opcodes/storage/index.ts +++ b/src/chains/mainnet/vm/opcodes/storage/index.ts @@ -1,8 +1,8 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { sload } from './sload'; import { sstore } from './sstore'; export const opcodes: Record = { - [sload.number]: sload, - [sstore.number]: sstore, + [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 index 83d09f10..1b9b9fbf 100644 --- a/src/chains/mainnet/vm/opcodes/storage/sload.ts +++ b/src/chains/mainnet/vm/opcodes/storage/sload.ts @@ -1,71 +1,71 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 6e54ab12..6e497dcf 100644 --- a/src/chains/mainnet/vm/opcodes/storage/sstore.ts +++ b/src/chains/mainnet/vm/opcodes/storage/sstore.ts @@ -1,24 +1,24 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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: ` + 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 @@ -35,23 +35,23 @@ else 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: ` + 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 @@ -74,51 +74,51 @@ if value != current_value 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), + }, + 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 index 7ec786f7..58b9f81c 100644 --- a/src/chains/mainnet/vm/opcodes/system/call.ts +++ b/src/chains/mainnet/vm/opcodes/system/call.ts @@ -1,125 +1,125 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 9c2fa6cc..83361cce 100644 --- a/src/chains/mainnet/vm/opcodes/system/callcode.ts +++ b/src/chains/mainnet/vm/opcodes/system/callcode.ts @@ -1,116 +1,116 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 86ed58db..a466cb0d 100644 --- a/src/chains/mainnet/vm/opcodes/system/create.ts +++ b/src/chains/mainnet/vm/opcodes/system/create.ts @@ -1,120 +1,120 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 762124a5..1e8eff0f 100644 --- a/src/chains/mainnet/vm/opcodes/system/create2.ts +++ b/src/chains/mainnet/vm/opcodes/system/create2.ts @@ -1,111 +1,111 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 6ee1aeb5..67d31607 100644 --- a/src/chains/mainnet/vm/opcodes/system/delegatecall.ts +++ b/src/chains/mainnet/vm/opcodes/system/delegatecall.ts @@ -1,111 +1,111 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 14d2901d..49e89992 100644 --- a/src/chains/mainnet/vm/opcodes/system/index.ts +++ b/src/chains/mainnet/vm/opcodes/system/index.ts @@ -1,4 +1,4 @@ -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { call } from './call'; import { callcode } from './callcode'; import { create } from './create'; @@ -11,14 +11,14 @@ 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, + [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 index 272c5fa4..1cdca00e 100644 --- a/src/chains/mainnet/vm/opcodes/system/invalid.ts +++ b/src/chains/mainnet/vm/opcodes/system/invalid.ts @@ -1,16 +1,16 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 0e874c85..30c36fd2 100644 --- a/src/chains/mainnet/vm/opcodes/system/return.ts +++ b/src/chains/mainnet/vm/opcodes/system/return.ts @@ -1,80 +1,80 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 9e1e5628..32d81526 100644 --- a/src/chains/mainnet/vm/opcodes/system/revert.ts +++ b/src/chains/mainnet/vm/opcodes/system/revert.ts @@ -1,81 +1,81 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 6137f2d0..05bdd9a0 100644 --- a/src/chains/mainnet/vm/opcodes/system/selfdestruct.ts +++ b/src/chains/mainnet/vm/opcodes/system/selfdestruct.ts @@ -1,57 +1,57 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { - OpcodeGroup, - ethSpecsOpcodeSrc, - evmCodesOpcodesLink, - evmCodesPlaygroundLink, + OpcodeGroup, + ethSpecsOpcodeSrc, + evmCodesOpcodesLink, + evmCodesPlaygroundLink, } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 65020c02..0641cb5b 100644 --- a/src/chains/mainnet/vm/opcodes/system/staticcall.ts +++ b/src/chains/mainnet/vm/opcodes/system/staticcall.ts @@ -1,99 +1,99 @@ import { MainnetHardfork, getMainnetHardforksFrom } from '@/chains/mainnet/hardforks'; import { OpcodeGroup, ethSpecsOpcodeSrc, evmCodesOpcodesLink } from '@/lib/opcodes'; -import { Opcode } from '@/types'; +import type { 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), + 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 index 546cd4f3..5d2a26ba 100644 --- a/src/chains/mainnet/vm/precompiles.ts +++ b/src/chains/mainnet/vm/precompiles.ts @@ -1,440 +1,440 @@ -import { Precompile } from '@/types'; +import type { 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', - ], - }, + { + 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 index e003601e..65fc05f8 100644 --- a/src/chains/mainnet/vm/predeploys.ts +++ b/src/chains/mainnet/vm/predeploys.ts @@ -1,3 +1,3 @@ -import { Predeploy } from '@/types'; +import type { Predeploy } from '@/types'; export const predeploys: Predeploy[] = []; diff --git a/src/chains/optimism/deployedContracts.ts b/src/chains/optimism/deployedContracts.ts index 5d531f59..0d9a5dfe 100644 --- a/src/chains/optimism/deployedContracts.ts +++ b/src/chains/optimism/deployedContracts.ts @@ -2,30 +2,30 @@ import { deployedContracts as mainnetDeployedContracts } from '@/chains/mainnet/ 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)', - ], + ...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 index b251222d..ad2fa4d3 100644 --- a/src/chains/optimism/eips.ts +++ b/src/chains/optimism/eips.ts @@ -1,73 +1,73 @@ -import { EIP, EIPCategory } from '@/types/eip'; +import { type EIP, EIPCategory } from '@/types/eip'; import { - eip4399 as eip1399OnMainnet, - eip1559 as eip1559OnMainnet, - eip4895 as eip4895OnMainnet, - eips as ethereumEIPs, + 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/exec-engine.md#1559-parameters', - 'https://github.com/ethereum-optimism/specs/blob/main/specs/superchain-upgrades.md#canyon', - ], + ...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/exec-engine.md#1559-parameters', + 'https://github.com/ethereum-optimism/specs/blob/main/specs/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/derivation.md#building-individual-payload-attributes', - 'https://github.com/mds1/evm-diff/issues/21', - ], + ...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/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/derivation.md#building-individual-payload-attributes', - 'https://github.com/ethereum-optimism/specs/blob/main/specs/superchain-upgrades.md#canyon', - ], + ...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/derivation.md#building-individual-payload-attributes', + 'https://github.com/ethereum-optimism/specs/blob/main/specs/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; - }); + .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 index f3621126..4730aecf 100644 --- a/src/chains/optimism/hardforks.ts +++ b/src/chains/optimism/hardforks.ts @@ -2,32 +2,32 @@ // https://docs.optimism.io/builders/node-operators/network-upgrades/overview#activations // https://github.com/ethereum-optimism/specs/blob/main/specs/superchain-upgrades.md#post-bedrock-network-upgrades export enum OptimismHardfork { - Regolith, - Canyon, + Regolith = 0, + Canyon = 1, } 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); + 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 + 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.` - ); - } + 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); + // 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 index 3bb0896a..00c5532a 100644 --- a/src/chains/optimism/index.ts +++ b/src/chains/optimism/index.ts @@ -1,6 +1,6 @@ import { optimism as optimismMetadata } from '@wagmi/chains'; import { sortedArrayByField, sortedArrayByFields } from '@/lib/utils'; -import { Chain } from '@/types'; +import type { Chain } from '@/types'; import { accountTypes } from './accountTypes'; import { deployedContracts } from './deployedContracts'; import { eips } from './eips'; @@ -11,15 +11,15 @@ 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, + 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 index ed97c7ca..90918fc5 100644 --- a/src/chains/optimism/nodes.ts +++ b/src/chains/optimism/nodes.ts @@ -1,26 +1,26 @@ -import { Language, Node, NodeType } from '@/types'; +import { Language, type 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/', + 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/', + 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]; diff --git a/src/chains/optimism/signatureTypes.ts b/src/chains/optimism/signatureTypes.ts index d0e76368..37adde68 100644 --- a/src/chains/optimism/signatureTypes.ts +++ b/src/chains/optimism/signatureTypes.ts @@ -1,25 +1,25 @@ import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import { SignatureType } from '@/types'; +import type { 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/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: + 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/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 }, + ...mainnetSignatureTypes, + ...{ [depositTx.prefixByte]: depositTx }, }; diff --git a/src/chains/optimism/vm/opcodes/block/coinbase.ts b/src/chains/optimism/vm/opcodes/block/coinbase.ts index f1691829..7e44c1af 100644 --- a/src/chains/optimism/vm/opcodes/block/coinbase.ts +++ b/src/chains/optimism/vm/opcodes/block/coinbase.ts @@ -1,23 +1,23 @@ import { coinbase as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/coinbase'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index 8c898300..48841e29 100644 --- a/src/chains/optimism/vm/opcodes/block/prevrandao.ts +++ b/src/chains/optimism/vm/opcodes/block/prevrandao.ts @@ -1,20 +1,20 @@ import { prevrandao as baseOpcode } from '@/chains/mainnet/vm/opcodes/block/prevrandao'; -import { Opcode } from '@/types'; +import type { 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/derivation.md#building-individual-payload-attributes', - 'https://github.com/mds1/evm-diff/issues/21', - ], + ...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/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 index e2cf96b3..d9d4dd48 100644 --- a/src/chains/optimism/vm/opcodes/environment/caller.ts +++ b/src/chains/optimism/vm/opcodes/environment/caller.ts @@ -1,20 +1,20 @@ import { caller as baseOpcode } from '@/chains/mainnet/vm/opcodes/environment/caller'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index d719c3ba..405e9b14 100644 --- a/src/chains/optimism/vm/opcodes/environment/origin.ts +++ b/src/chains/optimism/vm/opcodes/environment/origin.ts @@ -1,20 +1,20 @@ import { origin as baseOpcode } from '@/chains/mainnet/vm/opcodes/environment/origin'; -import { Opcode } from '@/types'; +import type { 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)', - ], + ...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 index 1afc1342..868880b2 100644 --- a/src/chains/optimism/vm/opcodes/index.ts +++ b/src/chains/optimism/vm/opcodes/index.ts @@ -1,5 +1,5 @@ import { opcodes as mainnetOpcodes } from '@/chains/mainnet/vm/opcodes'; -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; import { coinbase } from './block/coinbase'; import { prevrandao } from './block/prevrandao'; import { caller } from './environment/caller'; @@ -7,16 +7,16 @@ import { origin } from './environment/origin'; import { push0 } from './stack/push0'; export const opcodes: Record> = { - ...mainnetOpcodes, + ...mainnetOpcodes, - // Block. - ...{ [coinbase.number]: coinbase }, - ...{ [prevrandao.number]: prevrandao }, + // Block. + ...{ [coinbase.number]: coinbase }, + ...{ [prevrandao.number]: prevrandao }, - // Environment. - ...{ [caller.number]: caller }, - ...{ [origin.number]: origin }, + // Environment. + ...{ [caller.number]: caller }, + ...{ [origin.number]: origin }, - // Stack. - ...{ [push0.number]: push0 }, + // Stack. + ...{ [push0.number]: push0 }, }; diff --git a/src/chains/optimism/vm/opcodes/stack/push0.ts b/src/chains/optimism/vm/opcodes/stack/push0.ts index b31ea669..ebf40ed4 100644 --- a/src/chains/optimism/vm/opcodes/stack/push0.ts +++ b/src/chains/optimism/vm/opcodes/stack/push0.ts @@ -1,7 +1,7 @@ import { push0 as baseOpcode } from '@/chains/mainnet/vm/opcodes/stack/push'; -import { Opcode } from '@/types'; +import type { Opcode } from '@/types'; export const push0: Opcode = { - ...baseOpcode, - supportedHardforks: ['Canyon'], + ...baseOpcode, + supportedHardforks: ['Canyon'], }; diff --git a/src/chains/optimism/vm/precompiles.ts b/src/chains/optimism/vm/precompiles.ts index e998fa4f..d3ce8f63 100644 --- a/src/chains/optimism/vm/precompiles.ts +++ b/src/chains/optimism/vm/precompiles.ts @@ -1,4 +1,4 @@ import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import { Precompile } from '@/types'; +import type { Precompile } from '@/types'; export const precompiles: Precompile[] = mainnetPrecompiles; diff --git a/src/chains/optimism/vm/predeploys.ts b/src/chains/optimism/vm/predeploys.ts index 7f23cd05..975a51d3 100644 --- a/src/chains/optimism/vm/predeploys.ts +++ b/src/chains/optimism/vm/predeploys.ts @@ -1,603 +1,603 @@ -import { Predeploy } from '@/types'; +import type { Predeploy } from '@/types'; const PREDEPLOYS_SPEC = 'https://github.com/ethereum-optimism/specs/blob/main/specs/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], - }, + { + 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..deb19f0b 100644 --- a/src/components/ChainDiffSelector.tsx +++ b/src/components/ChainDiffSelector.tsx @@ -2,49 +2,49 @@ import { useState } from 'react'; import { useRouter } from 'next/router'; import { chains } from '@/chains'; import { ChainDiffSelectorChainCombobox } from '@/components/ui/ChainDiffSelectorChainCombobox'; -import { Chain } from '@/types'; +import type { Chain } from '@/types'; 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 router = useRouter(); + const [base, setBase] = useState(chains.mainnet); + const [target, setTarget] = useState(chains.optimism); + const chainsArray: Chain[] = Object.values(chains); - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - router.push({ - pathname: '/diff', - query: { base: base.metadata.id, target: target.metadata.id }, - }); - }; + const onSubmit = (e: React.FormEvent) => { + e.preventDefault(); + router.push({ + pathname: '/diff', + query: { base: base.metadata.id, target: target.metadata.id }, + }); + }; - return ( - <> -

    - - ); + return ( + <> +
    +
    +
    +
    + + +
    + +
    + +
    +
    +
    + + ); }; diff --git a/src/components/diff/DiffAccountTypes.tsx b/src/components/diff/DiffAccountTypes.tsx index 9e16db45..3fef0be1 100644 --- a/src/components/diff/DiffAccountTypes.tsx +++ b/src/components/diff/DiffAccountTypes.tsx @@ -2,77 +2,76 @@ 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'; +import type { AccountType } from '@/types'; type Props = { - base: AccountType[]; - target: AccountType[]; - onlyShowDiff: boolean; + 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'}
    -
    - ); - })} -
    + 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)]; + // 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 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; + const isEqual = JSON.stringify(baseAccountType) === JSON.stringify(targetAccountType); + const show = !isEqual || !onlyShowDiff; - return ( - showAccountType && ( -
    -
    - -
    -
    {formatAccountType(baseAccountType)}
    -
    {formatAccountType(targetAccountType)}
    -
    - ) - ); - })} - - ); + if (!show) return false; + return ( +
    +
    + +
    +
    {formatAccountType(baseAccountType)}
    +
    {formatAccountType(targetAccountType)}
    +
    + ); + })} + + ); - return ; + return ; }; diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 1263c47d..872b3571 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -1,78 +1,77 @@ -import { Address, getAddress } from 'viem'; -import { Chain } from '@/../script/index'; +import { type Address, getAddress } from 'viem'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; 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 addr = getAddress(deployedContract.address); - return ( - <> -
    -
    Address
    -
    - -
    + if (!deployedContract) return

    Not present

    ; + const addr = getAddress(deployedContract.address); + return ( + <> +
    +
    Address
    +
    + +
    -
    Deployed?
    -
    {deployedContract.hasCode ? 'Yes' : 'No'}
    -
    - - ); +
    Deployed?
    +
    {deployedContract.hasCode ? 'Yes' : 'No'}
    +
    + + ); }; 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 - delete slimmedContract.codeHash; - return slimmedContract; + if (typeof contract === 'undefined') return undefined; + const slimmedContract = contract as any; // eslint-disable-line @typescript-eslint/no-explicit-any + slimmedContract.codeHash = undefined; + return slimmedContract; }; const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; }; 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 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 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 isEqual = + JSON.stringify(convertToComparableContract(baseDeployedContract)) === + JSON.stringify(convertToComparableContract(targetDeployedContract)); - const showDeployedContract = !isEqual || !onlyShowDiff; + const show = !isEqual || !onlyShowDiff; - return ( - showDeployedContract && ( -
    -
    {name}
    -
    {formatDeployedContract(baseDeployedContract)}
    -
    {formatDeployedContract(targetDeployedContract)}
    -
    - ) - ); - })} - - ); + if (!show) return false; + return ( +
    +
    {name}
    +
    {formatDeployedContract(baseDeployedContract)}
    +
    {formatDeployedContract(targetDeployedContract)}
    +
    + ); + })} + + ); - return ; + 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 index e5b07fda..125fb199 100644 --- a/src/components/diff/DiffEVMStackAddresses.tsx +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -1,77 +1,74 @@ -import { Address, getAddress } from 'viem'; +import { type Address, getAddress } from 'viem'; import { evmStackAddresses } from '@/../script/checks/evm-stack-addresses'; -import { Chain } from '@/../script/index'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; type EvmStackResults = Chain['evmStackAddresses']; type Props = { - base: EvmStackResults; - target: EvmStackResults; - onlyShowDiff: boolean; + base: EvmStackResults; + target: EvmStackResults; + onlyShowDiff: boolean; }; const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; }; const formatStackHeader = (stack: keyof EvmStackResults) => { - if (stack === 'OP') return 'OP Stack'; - if (stack === 'Orbit') return 'Orbit'; - return stack; + 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 stacks = Object.keys(evmStackAddresses) as Array; - const diffContent = ( - <> - {stacks.map((stack) => { - const baseStackAddresses = base[stack]; - const targetStackAddresses = target[stack]; - return ( -
    -
    {formatStackHeader(stack)}
    -
    - {baseStackAddresses.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; + const diffContent = ( + <> + {stacks.map((stack) => { + const baseStackAddresses = base[stack]; + const targetStackAddresses = target[stack]; + return ( +
    +
    {formatStackHeader(stack)}
    +
    + {baseStackAddresses.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 ( - show && ( -
    -
    -
    {name}
    - -
    -
    - {baseStackAddress.exists ? 'Yes' : 'No'} -
    -
    {targetStackAddress?.exists ? 'Yes' : 'No'}
    -
    - ) - ); - })} -
    -
    - ); - })} - - ); + const name = baseStackAddress?.name || targetStackAddress?.name; + const addr = getAddress(baseStackAddress.address); + return ( +
    +
    +
    {name}
    + +
    +
    {baseStackAddress.exists ? 'Yes' : 'No'}
    +
    {targetStackAddress?.exists ? 'Yes' : 'No'}
    +
    + ); + })} +
    +
    + ); + })} + + ); - return ; + return ; }; 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 f39e1a27..67f17e96 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -1,4 +1,4 @@ -import { Chain } from '@/../script/index'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; import { ExternalLink } from '../layout/ExternalLink'; @@ -7,108 +7,107 @@ 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 ['networkId', 'ens', 'features', 'icon', 'slip44', 'faucets', 'chain', 'parent'].includes( - field - ); + return ['networkId', 'ens', 'features', 'icon', 'slip44', 'faucets', 'chain', 'parent'].includes( + field, + ); }; const formatFieldDisplayName = (field: MetadataKey) => { - 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; + 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 formatShortName = (shortName: string) => { - return ; // Remove leading and trailing quotes. + return ; // Remove leading and trailing quotes. }; const formatInfoURL = (infoURL: string) => { - return ; + return ; }; const formatNativeCurrency = (nativeCurrency: Metadata['nativeCurrency']) => { - return ( - <> -
    - {nativeCurrency.name} ({nativeCurrency.symbol}) -
    -
    {nativeCurrency.decimals} decimals
    - - ); + return ( + <> +
    + {nativeCurrency.name} ({nativeCurrency.symbol}) +
    +
    {nativeCurrency.decimals} decimals
    + + ); }; const formatRpcUrls = (rpcUrls: Metadata['rpc']) => { - return rpcUrls.map((url) => ( - - )); + return rpcUrls.map((url) => ( + + )); }; const formatBlockExplorerUrls = (data: Metadata['explorers']) => { - if (!data) return null; - return ( -
    - {Object.entries(data).map(([key, blockExplorer]) => ( -
    - } - textToCopy={blockExplorer.url} - /> -
    - ))} -
    - ); + if (!data) return null; + return ( +
    + {Object.entries(data).map(([key, blockExplorer]) => ( +
    + } + textToCopy={blockExplorer.url} + /> +
    + ))} +
    + ); }; const formatFieldInfo = (field: MetadataKey, contents: Metadata[MetadataKey]) => { - if (field === 'chainId') return ; - if (field === 'name') return ; - if (field === 'rpc') return formatRpcUrls(contents as Metadata['rpc']); - if (field === 'shortName') return formatShortName(contents as Metadata['shortName']); - if (field === 'infoURL') return formatInfoURL(contents as Metadata['infoURL']); - if (field === 'nativeCurrency') - return formatNativeCurrency(contents as Metadata['nativeCurrency']); - if (field === 'explorers') { - return formatBlockExplorerUrls(contents as Metadata['explorers']); - } - return JSON.stringify(contents); + if (field === 'chainId') return ; + if (field === 'name') return ; + if (field === 'rpc') return formatRpcUrls(contents as Metadata['rpc']); + if (field === 'shortName') return formatShortName(contents as Metadata['shortName']); + if (field === 'infoURL') return formatInfoURL(contents as Metadata['infoURL']); + if (field === 'nativeCurrency') + return formatNativeCurrency(contents as Metadata['nativeCurrency']); + if (field === 'explorers') { + return formatBlockExplorerUrls(contents as Metadata['explorers']); + } + 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 showField = !isEqual || !onlyShowDiff; + 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)}
    +
    {formatFieldInfo(field, base[field])}
    +
    {formatFieldInfo(field, target[field])}
    +
    + ); + })} + + ); - return ; + return ; }; diff --git a/src/components/diff/DiffNodes.tsx b/src/components/diff/DiffNodes.tsx index 9e9c2000..9c160e7c 100644 --- a/src/components/diff/DiffNodes.tsx +++ b/src/components/diff/DiffNodes.tsx @@ -1,105 +1,105 @@ -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'; +// import { RenderDiff } from '@/components/diff/utils/RenderDiff'; +// import { Copyable } from '@/components/ui/Copyable'; +// import { Language, type Node, NodeType, SyncStrategy } from '@/types'; +// import { Collapsible } from './utils/Collapsible'; +// import { Markdown } from './utils/Markdown'; -type Props = { - base: Node[]; - target: Node[]; - onlyShowDiff: boolean; -}; +// 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)]; +// 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 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; +// const isEqual = JSON.stringify(baseNode) === JSON.stringify(targetNode); +// const showNode = !isEqual || !onlyShowDiff; - return ( - showNode && ( -
    -
    - -
    -
    {formatNode(baseNode)}
    -
    {formatNode(targetNode)}
    -
    - ) - ); - })} - - ); +// return ( +// showNode && ( +//
    +//
    +// +//
    +//
    {formatNode(baseNode)}
    +//
    {formatNode(targetNode)}
    +//
    +// ) +// ); +// })} +// +// ); - return ; -}; +// 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 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 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 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'; -}; +// 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 35bd1d84..9730adda 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -1,4 +1,4 @@ -import { Chain } from '@/../script/index'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; import { formatPrefixByte } from '@/lib/utils'; @@ -7,52 +7,51 @@ type Opcodes = Chain['opcodes']; type Opcode = Opcodes[0]; type Props = { - base: Opcodes; - target: Opcodes; - onlyShowDiff: boolean; + base: Opcodes; + target: Opcodes; + onlyShowDiff: boolean; }; const formatOpcode = (opcode: Opcode | undefined): JSX.Element => { - return ( -
    {opcode?.supported === 'unknown' ? 'Unknown' : opcode?.supported ? 'Yes' : 'No'}
    - ); + 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 <>; - - const opcodeNumbers = Array.from(Array(0xff + 1).keys()); - - 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 showOpcode = !isEqual || !onlyShowDiff; - - return ( - showOpcode && ( -
    -
    - - -
    -
    {formatOpcode(baseOpcode)}
    -
    {formatOpcode(targetOpcode)}
    -
    - ) - ); - })} - - ); - - return ; + if (!Array.isArray(base) || !Array.isArray(target)) return <>; + + const opcodeNumbers = Array.from(Array(0xff + 1).keys()); + + 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 ( +
    +
    + + +
    +
    {formatOpcode(baseOpcode)}
    +
    {formatOpcode(targetOpcode)}
    +
    + ); + })} + + ); + + return ; }; diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index c2da8e97..dc2718fc 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -1,65 +1,64 @@ -import { Address, getAddress } from 'viem'; -import { Chain } from '@/../script/index'; +import { type Address, getAddress } from 'viem'; +import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; type Precompile = Chain['precompiles'][0]; type Props = { - base: Precompile[]; - target: Precompile[]; - onlyShowDiff: boolean; + base: Precompile[]; + target: Precompile[]; + onlyShowDiff: boolean; }; const formatPrecompile = (precompile: Precompile | undefined) => { - if (!precompile) return
    Not present
    ; - return
    {precompile.implemented ? 'Yes' : 'No'}
    ; + if (!precompile) return
    Not present
    ; + return
    {precompile.implemented ? 'Yes' : 'No'}
    ; }; // TODO Dedupe this helper method const formatAddress = (addr: Address) => { - addr = getAddress(addr); - return {`${addr.slice(0, 6)}...${addr.slice(-4)}`}; + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; }; 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)]; + // 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 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; + const isEqual = JSON.stringify(basePrecompile) === JSON.stringify(targetPrecompile); + const show = !isEqual || !onlyShowDiff; - return ( - showPrecompile && ( -
    -
    -
    {basePrecompile?.name || targetPrecompile?.name}
    - -
    -
    {formatPrecompile(basePrecompile)}
    -
    {formatPrecompile(targetPrecompile)}
    -
    - ) - ); - })} - - ); + if (!show) return false; + return ( +
    +
    +
    {basePrecompile?.name || targetPrecompile?.name}
    + +
    +
    {formatPrecompile(basePrecompile)}
    +
    {formatPrecompile(targetPrecompile)}
    +
    + ); + })} + + ); - return ; + return ; }; diff --git a/src/components/diff/DiffSignatureTypes.tsx b/src/components/diff/DiffSignatureTypes.tsx index 418c1566..f8318914 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 { formatPrefixByte } 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..adad2951 100644 --- a/src/components/diff/utils/Abi.tsx +++ b/src/components/diff/utils/Abi.tsx @@ -1,84 +1,84 @@ -import { Address, getAddress } from 'viem'; +import { type Address, getAddress } 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)}`}; + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; }; 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 +
    + +
    + )} +
    + {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..271a0082 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 index 5e5c20c1..14fe85d1 100644 --- a/src/components/diff/utils/format.tsx +++ b/src/components/diff/utils/format.tsx @@ -1,50 +1,35 @@ 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.

    ; - } + 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 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)}
    • - ))} -
    - - ); + const supportedText = + last === currentMainnetHardforkName || last === currentOptimismHardforkName + ? `Supported since ${first} hard fork.` + : `Supported between ${first} and ${last} hard forks.`; + return ( +

    + {supportedText} +

    + ); }; diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index d2ec7b5b..ba4abc1d 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -3,105 +3,104 @@ import { ChevronDownIcon } from '@heroicons/react/20/solid'; import { chains } from '@/chains'; export const FeatureTable = ({ - kind, - name, - className, + kind, + name, + className, }: { - kind: string; - name: string; - className?: string; + 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] }; - }); + 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'); + // --- 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 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; + 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 (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; - } - }); + if (sortDirection === 'ascending') { + return aValue > bValue ? 1 : aValue < bValue ? -1 : 0; + } + 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} -
    -
    - ); + return ( +
    + + + + + + + + + {sortedChains.map((chain) => ( + + + + + ))} + +
    +
    onHeaderClick('name')} + > + Name + + +
    +
    +
    onHeaderClick('col1')} + > + Is {name} supported? + + +
    +
    + {chain.metadata.name} + + {chain.supported} +
    +
    + ); }; 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..1171328e 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -3,57 +3,57 @@ 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) => ( - - - - ), - }, + { + 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 Footer = () => { - const currentYear = new Date().getFullYear(); - return ( -
    -
    -
    -

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

    -
    + const currentYear = new Date().getFullYear(); + return ( +
    +
    +
    +

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

    +
    -
    - {navigation.map((item) => ( - - <> - {item.name} - - ))} -
    +
    + {navigation.map((item) => ( + + <> + {item.name} + + ))} +
    - {} -
    -
    - ); + {} +
    +
    + ); }; diff --git a/src/components/layout/Head.tsx b/src/components/layout/Head.tsx index 63dc3aba..c9d5a5b2 100644 --- a/src/components/layout/Head.tsx +++ b/src/components/layout/Head.tsx @@ -1,54 +1,54 @@ import NextHead from 'next/head'; -import { NextRouter, useRouter } from 'next/router'; +import { type NextRouter, useRouter } from 'next/router'; import { getChainById } from '@/chains'; 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 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 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 title = `${baseTitle} vs ${targetTitle} | ${SITE_NAME}`; + const imageUrl = `?base=${base}&target=${target}`; + return { title, imageUrl }; + } + return defaultRouteData; }; export const Head = () => { - const router = useRouter(); - const { title, imageUrl } = getRouteData(router); - const imgUrl = `${SITE_URL}${OG_ENDPOINT}${imageUrl}`; + const router = useRouter(); + const { title, imageUrl } = getRouteData(router); + const imgUrl = `${SITE_URL}${OG_ENDPOINT}${imageUrl}`; - return ( - - {title} - - + return ( + + {title} + + - - - - - + + + + + - - - - - ); + + + + + ); }; diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 2183852e..c18cca79 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -7,29 +7,29 @@ import { COMPANY_NAME } from '@/lib/constants'; import { ExternalLink } from './ExternalLink'; 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 + +
    +
    +
    +
    + ); }; 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..23a74ec2 100644 --- a/src/components/ui/ChainDiffSelectorChainCombobox.tsx +++ b/src/components/ui/ChainDiffSelectorChainCombobox.tsx @@ -3,100 +3,100 @@ 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'; +import type { Chain } from '@/types'; 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.metadata.name.toLowerCase().includes(query.toLowerCase()) || + chain.metadata.id.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?.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.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.metadata.name} + +
    - {selected && ( - - - )} - - )} -
    - ))} -
    - )} -
    -
    - ); + {selected && ( + + + )} + + )} + + ))} + + )} +
    +
    + ); }; diff --git a/src/components/ui/Copyable.tsx b/src/components/ui/Copyable.tsx index bd8d1bf4..a949a744 100644 --- a/src/components/ui/Copyable.tsx +++ b/src/components/ui/Copyable.tsx @@ -5,48 +5,48 @@ 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 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' - /> -
    -
    - -
    -
    - ); + 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..7e424985 100644 --- a/src/components/ui/Toggle.tsx +++ b/src/components/ui/Toggle.tsx @@ -2,33 +2,33 @@ import { Switch } from '@headlessui/react'; import { classNames } from '@/lib/utils'; type Props = { - enabled: boolean; - setEnabled: (enabled: boolean) => void; - label: string; + enabled: boolean; + setEnabled: (enabled: boolean) => void; + label: string; }; export const Toggle = ({ enabled, setEnabled, label }: Props) => { - return ( - - - - - {label} - - - ); + return ( + + + + + {label} + + + ); }; 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/constants.ts b/src/lib/constants.ts index 77a3e326..d8e7902d 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -2,7 +2,7 @@ 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'; diff --git a/src/lib/opcodes.ts b/src/lib/opcodes.ts index 9bdc3087..20ea3de8 100644 --- a/src/lib/opcodes.ts +++ b/src/lib/opcodes.ts @@ -1,23 +1,23 @@ import { MainnetHardfork } from '@/chains/mainnet/hardforks'; import { - ETHEREUM_EXECUTION_SPECS_COMMIT_ID, - ETHEREUM_EXECUTION_SPECS_URL, - EVM_OPCODES_URL, + 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', + 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. @@ -25,16 +25,16 @@ 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 + 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}`; + `${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)}`; + `${EVM_OPCODES_URL}/#${formatOpcodeNumber(opcodeNumber)}`; export const evmCodesPlaygroundLink = (codeParam: string): string => - `${EVM_OPCODES_URL}/playground?unit=Wei&codeType=Mnemonic&code=${codeParam}`; + `${EVM_OPCODES_URL}/playground?unit=Wei&codeType=Mnemonic&code=${codeParam}`; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 7fe6eb45..da267f92 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,29 +1,29 @@ import { pad } from 'viem'; -import { Chain } from '@/types'; +import type { 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) - ); + 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 + 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; - }); + 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`, @@ -31,26 +31,26 @@ export const sortedArrayByField = ` and `<` may be // undefined. export const sortedArrayByFields = ( - record: Record, - fields: K[] + 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; - }); + 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 }); + 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`; + 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/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 739519f0..c7aa4d1e 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -1,222 +1,219 @@ -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 { SITE_DESCRIPTION } from '@/lib/constants'; -import { Chain, Opcode, Precompile, Predeploy, SignatureType } from '@/types'; +import type { 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 + 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 sortedKeys = [...base.map(getKey), ...target.map(getKey)].sort((a, b) => { + if (typeof a === 'string' && typeof b === 'string') { + return a.localeCompare(b); + } + if (typeof a === 'number' && typeof b === 'number') { + return a - b; + } + throw new Error('Invalid key types for sorting.'); + }); + const keys = [...new Set(sortedKeys)]; + + return keys.reduce((acc: number, key: string | number) => { + let count = acc; + 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 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 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(a) === JSON.stringify(b); - return countDifferences(base, target, getKey, isEqual); + const getKey = (o: Opcode) => o.number; + const isEqual = (a: Opcode, b: Opcode) => JSON.stringify(a) === JSON.stringify(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); + 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( - ( -
    -

    - {/* + 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( - ( -
    - {/* + {/* 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 */} +

    + {`${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(); + } } diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index b4f938c7..4b8bb0d0 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; import { LinkIcon } from '@heroicons/react/20/solid'; -import { Chain } from '@/../script/index'; +import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; import { DiffEVMStackAddresses } from '@/components/diff/DiffEVMStackAddresses'; @@ -13,152 +13,151 @@ import { Toggle } from '@/components/ui/Toggle'; import { classNames } from '@/lib/utils'; 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>; + title: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + component: React.ComponentType>; } const SECTION_MAP: Record = { - metadata: { title: 'Metadata', component: DiffMetadata }, - opcodes: { title: 'Opcodes', component: DiffOpcodes }, - deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, - precompiles: { title: 'Precompiles', component: DiffPrecompiles }, - evmStackAddresses: { title: 'EVM Stack', component: DiffEVMStackAddresses }, - // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, - // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, - // mempools: { title: 'Mempools', component: DiffMempools }, - // 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 + metadata: { title: 'Metadata', component: DiffMetadata }, + opcodes: { title: 'Opcodes', component: DiffOpcodes }, + deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, + precompiles: { title: 'Precompiles', component: DiffPrecompiles }, + evmStackAddresses: { title: 'EVM Stack', component: DiffEVMStackAddresses }, + // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, + // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, + // 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 }; const Diff = () => { - // -------- Parse query parameters -------- - const router = useRouter(); - const { base, target } = router.query; - - // ================================ START NEW STUFF ================================ - const [baseChain, setBaseChain] = useState(null); - const [targetChain, setTargetChain] = useState(null); - - useEffect(() => { - if (!base || !target) return; - const fetchData = async () => { - try { - const urls = [ - `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/chain/${base}.json`, - `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/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]); - } catch (error) { - console.error('Error fetching data:', error); - } - }; - - fetchData(); - }, [base, target]); - // ================================ END NEW STUFF ================================ - - 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; - }) => { - // if (!SECTION_MAP[section]) return <>; - 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(SECTION_MAP); - return ( - <> -
    - - - {/* Show chain names at top */} -
    -
    -
    {baseChain.metadata.name}
    -
    {targetChain.metadata.name}
    -
    - - {/* Show content */} - {sections.map((section, index) => { - 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 } = router.query; + + // ================================ START NEW STUFF ================================ + const [baseChain, setBaseChain] = useState(null); + const [targetChain, setTargetChain] = useState(null); + + useEffect(() => { + if (!base || !target) return; + const fetchData = async () => { + try { + const urls = [ + `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/chain/${base}.json`, + `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/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]); + } catch (error) { + console.error('Error fetching data:', error); + } + }; + + fetchData(); + }, [base, target]); + // ================================ END NEW STUFF ================================ + + 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; + }) => { + // if (!SECTION_MAP[section]) return <>; + 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(SECTION_MAP); + return ( + <> +
    + + + {/* Show chain names at top */} +
    +
    +
    {baseChain.metadata.name}
    +
    {targetChain.metadata.name}
    +
    + + {/* Show content */} + {sections.map((section, index) => { + const base = baseChain[section as keyof Chain]; + const target = targetChain[section as keyof Chain]; + return ( +
    + {/* Header */} + + + {/* Diff */} + +
    + ); + })} +
    + + ); + }; + + return ( +
    + {(!baseChain || !targetChain) && } + {baseChain && targetChain && } +
    + ); }; export default Diff; diff --git a/src/pages/features.tsx b/src/pages/features.tsx index 772f1130..42483306 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -5,109 +5,107 @@ import { ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { chains } from '@/chains'; import { FeatureTable } from '@/components/features/FeatureTable'; import { BaseCombobox } from '@/components/ui/BaseCombobox'; -import { Chain } from '@/types'; +import type { Chain } from '@/types'; const Features = () => { - // --- URL Parsing --- - const router = useRouter(); - const { name, kind } = router.query; + // --- 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; - }; + // --- Prepare options --- + // TODO Support more kinds. + type Kind = 'opcode'; + type FeatureHeader = { + name: string; + isHeader: boolean; + }; - type FeatureItem = { - name: string; - kind: Kind; - }; + type FeatureItem = { + name: string; + kind: Kind; + }; - type Feature = FeatureHeader | FeatureItem; + type Feature = FeatureHeader | FeatureItem; - const chainsArray: Chain[] = Object.values(chains); - const allOpcodes = chainsArray - .map(({ opcodes }) => { - return opcodes.map(({ name }) => ({ - name: name!.toLocaleUpperCase(), - kind: 'opcode' as Kind, - })); - }) - .flat(); + const chainsArray: Chain[] = Object.values(chains); + const allOpcodes = chainsArray.flatMap(({ opcodes }) => { + return opcodes.map(({ name }) => ({ + name: name?.toLocaleUpperCase() || 'unknown', + kind: 'opcode' as Kind, + })); + }); - const opcodeOptions = allOpcodes.filter((opcode, index, self) => { - return index === self.findIndex((o) => o.name === opcode.name); - }); + 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 options: Feature[] = [{ name: 'Opcodes', isHeader: true }, ...opcodeOptions]; - // --- Form handling --- - // Set PUSH0 as the default. - const push0Index = options.findIndex((opt) => opt.name === 'PUSH0'); - const [option, setOption] = useState(options[push0Index]); + // --- Form handling --- + // Set PUSH0 as the default. + const push0Index = options.findIndex((opt) => opt.name === 'PUSH0'); + const [option, setOption] = useState(options[push0Index]); - const onSubmit = (e: React.FormEvent) => { - e.preventDefault(); - router.push({ - pathname: '/features', - query: option, - }); - }; + const onSubmit = (e: React.FormEvent) => { + e.preventDefault(); + router.push({ + pathname: '/features', + query: option, + }); + }; - // --- Selector Div --- - const SelectorDiv = () => ( -
    -
    -

    - Compare Feature Support -

    -

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

    -

    - More feature comparisons coming soon! -

    -
    - - - -
    -
    - ); + // --- Selector Div --- + const SelectorDiv = () => ( +
    +
    +

    + Compare Feature Support +

    +

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

    +

    + More feature comparisons coming soon! +

    +
    + + + +
    +
    + ); - // --- 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. -

    -
    -
    - ); - }; + // --- 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 ? : }; + // --- Render --- + return <>{name && kind ? : }; }; export default Features; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 7e63e802..5a4deb06 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -2,23 +2,23 @@ import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { SITE_DESCRIPTION } from '@/lib/constants'; const Home = () => { - return ( - <> -
    -
    -

    - {SITE_DESCRIPTION} -

    -

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

    -
    - -
    -
    -
    - - ); + return ( + <> +
    +
    +

    + {SITE_DESCRIPTION} +

    +

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

    +
    + +
    +
    +
    + + ); }; export default Home; diff --git a/src/types/accountType.ts b/src/types/accountType.ts index b05eee06..b1906cd5 100644 --- a/src/types/accountType.ts +++ b/src/types/accountType.ts @@ -1,12 +1,12 @@ export type AccountType = { - name: string; - description: string; - references: string[]; - properties: { - canBatchTxs: boolean; - canInitiateTxs: boolean; - hasCode: boolean; - hasKeyPair: boolean; - hasStorage: boolean; - }; + 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 index c6684186..1e8b9ce6 100644 --- a/src/types/chain.ts +++ b/src/types/chain.ts @@ -1,24 +1,24 @@ -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'; +import type { Chain as Metadata } from '@wagmi/chains'; +import type { AccountType } from './accountType'; +import type { DeployedContract } from './deployedContract'; +import type { EIP } from './eip'; +import type { Mempool } from './mempool'; +import type { Node } from './node'; +import type { Opcode } from './opcode'; +import type { Precompile } from './precompile'; +import type { Predeploy } from './predeploy'; +import type { 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[]; + 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 index 1fa676b9..3786180c 100644 --- a/src/types/deployedContract.ts +++ b/src/types/deployedContract.ts @@ -1,30 +1,30 @@ -import { Address } from 'viem'; +import type { Address } from 'viem'; export enum DeployedContractKind { - WrappedNativeAsset, - Utility, + WrappedNativeAsset = 0, + Utility = 1, } type DeployedContractBase = { - name: string; - description: string; - kind: DeployedContractKind; - tokenName?: string; - tokenSymbol?: string; - address: Address; - deploymentInstructions?: string; - references: string[]; - notes?: string[]; + name: string; + description: string; + kind: DeployedContractKind; + tokenName?: string; + tokenSymbol?: string; + address: Address; + deploymentInstructions?: string; + references: string[]; + notes?: string[]; }; export type StandardDeployedContract = DeployedContractBase & { - logicAbi: string[]; + logicAbi: string[]; }; export type ProxiedDeployedContract = DeployedContractBase & { - proxyAbi: string[]; - logicAbi: string[]; - logicAddress: Address; + proxyAbi: string[]; + logicAbi: string[]; + logicAddress: Address; }; export type DeployedContract = StandardDeployedContract | ProxiedDeployedContract; diff --git a/src/types/eip.ts b/src/types/eip.ts index 432979ea..bb581a2f 100644 --- a/src/types/eip.ts +++ b/src/types/eip.ts @@ -1,34 +1,34 @@ 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[]; + 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, + Execution = 0, + Consensus = 1, } export enum EIPState { - Draft, - Review, - LastCall, - Final, - Stagnant, - Withdrawn, - Living, + Draft = 0, + Review = 1, + LastCall = 2, + Final = 3, + Stagnant = 4, + Withdrawn = 5, + Living = 6, } export type EIPParameter = { - name: string; - value: string | number | bigint | boolean; + name: string; + value: string | number | bigint | boolean; }; diff --git a/src/types/index.ts b/src/types/index.ts index 28f7531f..749eca71 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -6,9 +6,9 @@ export type { AccountType } from './accountType'; export type { SignatureType } from './signatureType'; export type { Mempool } from './mempool'; export type { - DeployedContract, - StandardDeployedContract, - ProxiedDeployedContract, + DeployedContract, + StandardDeployedContract, + ProxiedDeployedContract, } from './deployedContract'; export { DeployedContractKind } from './deployedContract'; export type { Node } from './node'; diff --git a/src/types/mempool.ts b/src/types/mempool.ts index 0d22bbcf..92ccbe05 100644 --- a/src/types/mempool.ts +++ b/src/types/mempool.ts @@ -1,20 +1,20 @@ 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; - }; + 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 index a26f9185..221e2a5d 100644 --- a/src/types/node.ts +++ b/src/types/node.ts @@ -1,30 +1,30 @@ export type Node = { - name: string; - description: string; - type: NodeType; - language: Language; - syncStrategy?: SyncStrategy[]; // only for execution nodes. - forkOf?: string; - repository: string; - documentation: string; + 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, + Execution = 0, + Consensus = 1, } export enum Language { - Java, - Go, - CSharp, - Rust, - TypeScript, - Nim, + Java = 0, + Go = 1, + CSharp = 2, + Rust = 3, + TypeScript = 4, + Nim = 5, } export enum SyncStrategy { - Snap, - Fast, - Full, + Snap = 0, + Fast = 1, + Full = 2, } diff --git a/src/types/opcode.ts b/src/types/opcode.ts index bb2ffc4f..605025c1 100644 --- a/src/types/opcode.ts +++ b/src/types/opcode.ts @@ -1,51 +1,51 @@ export type Variable = { - name: string; - description: string; - expression?: string; - variables?: Variable[]; + name: string; + description: string; + expression?: string; + variables?: Variable[]; }; type Memory = { - before: string; - after: string; + before: string; + after: string; }; export type Storage = { - before: Record; - after: Record; + 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; + 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; + 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[]; + 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 index 7e4ca664..f9aad5d8 100644 --- a/src/types/precompile.ts +++ b/src/types/precompile.ts @@ -1,29 +1,29 @@ -import { Address } from 'viem'; +import type { Address } from 'viem'; type PrecompileParam = { - byteStart: number | string; - byteLength: number | string; - name: string; - description: string; + 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[]; + address: Address; + name: string; + description: string; + minGas?: number; + deprecated: boolean; + references: string[]; + notes?: string[]; }; export type PrecompileInputOutput = PrecompileBase & { - input: PrecompileParam[]; - output: PrecompileParam[]; + input: PrecompileParam[]; + output: PrecompileParam[]; }; export type PrecompileAbi = PrecompileBase & { - logicAbi: string[]; + logicAbi: string[]; }; export type Precompile = PrecompileInputOutput | PrecompileAbi; diff --git a/src/types/predeploy.ts b/src/types/predeploy.ts index 7f65b55d..9f410deb 100644 --- a/src/types/predeploy.ts +++ b/src/types/predeploy.ts @@ -1,21 +1,21 @@ -import { Address } from 'viem'; +import type { Address } from 'viem'; type PredeployBase = { - address: Address; - name: string; - description: string; - deprecated: boolean; - references: string[]; + address: Address; + name: string; + description: string; + deprecated: boolean; + references: string[]; }; type StandardPredeploy = PredeployBase & { - logicAbi: string[]; + logicAbi: string[]; }; type ProxiedPredeploy = PredeployBase & { - proxyAbi: string[]; - logicAbi: string[]; - logicAddress: Address; + proxyAbi: string[]; + logicAbi: string[]; + logicAddress: Address; }; export type Predeploy = StandardPredeploy | ProxiedPredeploy; diff --git a/src/types/signatureType.ts b/src/types/signatureType.ts index 18efe4c7..5cc33b06 100644 --- a/src/types/signatureType.ts +++ b/src/types/signatureType.ts @@ -1,10 +1,10 @@ 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[]; + 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"] } From 3f264c7e92f7bdae3850fa458054248c50b22af8 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 06:29:20 -0700 Subject: [PATCH 28/75] chore: unify dirs --- CONTRIBUTING.md | 14 +++- package.json | 3 +- script/.gitignore | 175 -------------------------------------------- script/README.md | 18 +---- script/bun.lockb | Bin 11346 -> 0 bytes script/index.ts | 4 +- script/main.sh | 6 +- script/package.json | 21 ------ 8 files changed, 23 insertions(+), 218 deletions(-) delete mode 100644 script/.gitignore delete mode 100755 script/bun.lockb delete mode 100644 script/package.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dc303d8e..bc09976c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,8 @@ # 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: +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. @@ -16,6 +18,16 @@ bun fmt bun lint ``` +Or, to fetch chain data: + +```bash +# Fetch all data for a single chain. +bun fetch-data [chainId] + +# Fetch all data for all chains. +bun fetch-data +``` + 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. ## Bounties diff --git a/package.json b/package.json index 4a03c67a..4679f4cb 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,8 @@ "start": "next start", "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", "fmt": "bunx @biomejs/biome format --write .", - "check": "bun lint && bun fmt" + "check": "bun lint && bun fmt", + "fetch-data": "bash script/main.sh" }, "dependencies": { "@headlessui/react": "^1.7.16", diff --git a/script/.gitignore b/script/.gitignore deleted file mode 100644 index 9b1ee42e..00000000 --- a/script/.gitignore +++ /dev/null @@ -1,175 +0,0 @@ -# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore - -# Logs - -logs -_.log -npm-debug.log_ -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Caches - -.cache - -# Diagnostic reports (https://nodejs.org/api/report.html) - -report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json - -# Runtime data - -pids -_.pid -_.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover - -lib-cov - -# Coverage directory used by tools like istanbul - -coverage -*.lcov - -# nyc test coverage - -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) - -.grunt - -# Bower dependency directory (https://bower.io/) - -bower_components - -# node-waf configuration - -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) - -build/Release - -# Dependency directories - -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) - -web_modules/ - -# TypeScript cache - -*.tsbuildinfo - -# Optional npm cache directory - -.npm - -# Optional eslint cache - -.eslintcache - -# Optional stylelint cache - -.stylelintcache - -# Microbundle cache - -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history - -.node_repl_history - -# Output of 'npm pack' - -*.tgz - -# Yarn Integrity file - -.yarn-integrity - -# dotenv environment variable files - -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) - -.parcel-cache - -# Next.js build output - -.next -out - -# Nuxt.js build / generate output - -.nuxt -dist - -# Gatsby files - -# Comment in the public line in if your project uses Gatsby and not Next.js - -# https://nextjs.org/blog/next-9-1#public-directory-support - -# public - -# vuepress build output - -.vuepress/dist - -# vuepress v2.x temp and cache directory - -.temp - -# Docusaurus cache and generated files - -.docusaurus - -# Serverless directories - -.serverless/ - -# FuseBox cache - -.fusebox/ - -# DynamoDB Local files - -.dynamodb/ - -# TernJS port file - -.tern-port - -# Stores VSCode versions used for testing VSCode extensions - -.vscode-test - -# yarn v2 - -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# IntelliJ based IDEs -.idea - -# Finder (MacOS) folder config -.DS_Store diff --git a/script/README.md b/script/README.md index 0131eabb..c41d606b 100644 --- a/script/README.md +++ b/script/README.md @@ -1,19 +1,5 @@ # script -Install dependencies: +This directory contains the scripts to fetch chain data and generate the output files. -```bash -bun install -``` - -Fetch all data for a single chain: - -```bash -bun main [chainId] -``` - -Fetch all data for all chains: - -```bash -bun main -``` +See the [CONTRIBUTING.md](../CONTRIBUTING.md) for more information on how to run these scripts. diff --git a/script/bun.lockb b/script/bun.lockb deleted file mode 100755 index fed5fe0cf57831145023698940d29728163b0af5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11346 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 SJkS { } async function save(chainId: number, chainObj: object) { - await Bun.write(`data/chain/${chainId}.json`, JSON.stringify(chainObj)); + 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 data/${chainId}.json`); } diff --git a/script/main.sh b/script/main.sh index 558dd660..ee3d7b72 100644 --- a/script/main.sh +++ b/script/main.sh @@ -4,14 +4,14 @@ set -euo pipefail fetchDataForChainId() { bun lint # Lint for potential issues. - bun index.ts "$1" # Fetch data for the given chain ID. - bun postprocess.ts # Slice data by feature. + bun script/index.ts "$1" # Fetch data for the given chain ID. + bun script/postprocess.ts # Slice data by feature. bun fmt # Format the generated files. } if [ $# -eq 0 ]; then # No input provided, find all *.json files in the data/chain folder - chainFiles=(data/chain/*.json) + chainFiles=(script/data/chain/*.json) numChains=${#chainFiles[@]} echo "Found $numChains chains" diff --git a/script/package.json b/script/package.json deleted file mode 100644 index ee4b9c25..00000000 --- a/script/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "script", - "module": "index.ts", - "type": "module", - "scripts": { - "lint": "tsc --noEmit && bunx @biomejs/biome lint --apply .", - "fmt": "bunx @biomejs/biome format --write .", - "check": "bun lint && bun fmt", - "main": "bash ./main.sh" - }, - "devDependencies": { - "@biomejs/biome": "1.6.4", - "@types/bun": "^1.0.12" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "dependencies": { - "viem": "^2.9.16" - } -} From 39f0412d715e45d765cec2e324a92fba20814d34 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 06:54:28 -0700 Subject: [PATCH 29/75] chore: some fixes --- script/checks/evm-stack-addresses.ts | 6 +- src/components/diff/DiffEVMStackAddresses.tsx | 75 ++++++++++++------- 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts index 2298747c..b4f0b6d8 100644 --- a/script/checks/evm-stack-addresses.ts +++ b/script/checks/evm-stack-addresses.ts @@ -2,13 +2,13 @@ import { type Address, type Hex, type PublicClient, keccak256 } from 'viem'; export type EVMStack = 'OP' | 'Orbit'; -type Predeploy = { +type StackAccount = { name: string; address: Address; kind: 'Predeploy' | 'Precompile'; }; -export type EVMStackResult = Predeploy & { +export type EVMStackResult = StackAccount & { codeHash: Hex; exists: boolean; }; @@ -52,7 +52,7 @@ function evmStackAddressExists(stack: EVMStack, codeHash: Hex): boolean { // 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 = { +export const evmStackAddresses: Record = { OP: [ { address: '0x4200000000000000000000000000000000000000', name: 'LegacyMessagePasser', kind: 'Predeploy' }, { address: '0x4200000000000000000000000000000000000002', name: 'DeployerWhitelist', kind: 'Predeploy' }, diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx index 125fb199..f08c6686 100644 --- a/src/components/diff/DiffEVMStackAddresses.tsx +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -1,5 +1,5 @@ import { type Address, getAddress } from 'viem'; -import { evmStackAddresses } from '@/../script/checks/evm-stack-addresses'; +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'; @@ -25,44 +25,63 @@ const formatStackHeader = (stack: keyof EvmStackResults) => { 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)}
    - {baseStackAddresses.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; + {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}
    - + const name = baseStackAddress?.name || targetStackAddress?.name; + const addr = getAddress(baseStackAddress.address); + return ( +
    +
    +
    {name}
    + +
    +
    + {baseStackAddress.exists ? 'Yes' : 'No'} +
    +
    {targetStackAddress?.exists ? 'Yes' : 'No'}
    -
    {baseStackAddress.exists ? 'Yes' : 'No'}
    -
    {targetStackAddress?.exists ? 'Yes' : 'No'}
    -
    - ); - })} + ); + }) + )}
    ); From eaf9e3e89ad296ad2c5765a8cdae8a9e7e0915bc Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 06:54:54 -0700 Subject: [PATCH 30/75] build: watch mode --- bun.lockb | Bin 206834 -> 217446 bytes package.json | 2 ++ 2 files changed, 2 insertions(+) diff --git a/bun.lockb b/bun.lockb index 8e72381b15f8f5feab20fa10f3b98b0bae3ee2cf..8afc5908a36882f68aaa6e87f98a63ebec8a89d6 100755 GIT binary patch delta 36116 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 delta 30305 zcmeHwd3;S*_xC*~x#Spw5OG7y1PMvR4T)S)GYK)z6$F<=B8eeX6H3iP9JNCcQ-|oI zMXRbKor^xE4qBabcv^GQR;yLK-|yM`M6}x9^Lsz5x5?FW#FSqzFhG$fVCiZ1FHbD zQd7p|py3jyte*zkCNepp!CzXoF@P10Ml=6Uf1KLz8uYSJ5|HZ>9K(zy{zygFF!U1~3R%1z&9U z5^Q7n2_X6BfzZp#-!2dG9|Y37<5R~@p9nvtXVY5_#{o1%bAQ92X~13>LVs9u80O6$ ziQ$m%52Sx=c_JF4KjT$-b07^4M+~r?ef5ZWj{HUt&@WRlQ|xeheKn0hj-WG;BW|JO zHGmx9uOU+Y1(142fi&bDgm5avhH4O(lQ7lILWndB-|nICyqg3j^ZFD*@Tg^=6XK zPRYs0@;V$oq0-Qwn#2DL#Yw5N!m=igb?ia`D_lSU8%k>-J91#lr#=HYM_vTPZ00Wm(o_4w;C}|ggb8UWIjIiEd02|+ z&A*OLi08v)2N%F|g?+5#Z?%?F5Zgw&`Z(k?{0$%t%AP(hD^S zgYDbN5k9BnC&AO;H-Maqm)%mo07yfBge=FbCi#MwZ`z@(JyjG0p%jyDpl ze)96qM92oFbe0NO38~rR9FBJ(X9at8JP)41m79{D274Vdz|*kZKz1;>i!^+js&^AS z<(Zscd<5k5=n_?)XVq)z$dBwM8ycIHG7d4~Cjn11LSDNr>15ix3+M+hKe-rj{#p}psctb<&57o<^jKuyanLs zvRoj2ovuok50+YaKrV+mLu5DJiBmJO5Pc(|R}FG5yOgwSM~$Jfe1doC_^|1jjzaKk zZ-v6lu(XVESkXXlx;MwMVwhE4A-@kA@`qwQGsOthPMNtzvj%Sumz5FBmTS{TN}f3< zCw07|qj|^(Y%h}JfKszFvr=JF3$#SfRT(W!Ng0=sMVHlsoCA)&SIR4x)hYyPk!EOx zW_ivOnQktOkvqf1zR-v62_V-&MUb~7*tm=C1BQ}F{}2m2}l(yirz zbYB3F?r1wf+HeJ%1ZFKS|FAsBk41FQ_}#$Tz))ay;KYnfXgC}j!3TivjE3mNqB_0?c~!{22GW4kbg6d;Se1L}gp8~(oLfzbOp^+8rpN}rfa|!2 z4z?5>`HyADY!Q--2kP;jca* zLwp60h9oVN1Kb2;{a7Fk4g*$k#3IwpN)5x3OAWCE7#Wb3mRJ0`MY2LJ8e}LhS}Z-| zZ=S6j*wc53oTgkQod9I>_Q_>O)S|b0LXPvq{Gs3*0Ix2S^%9m#|9oR6R0-4y&0$qS zv;Z@=O0$&Nt7W7*ffZ4s&Put@<*$$f83U{jc~i7VM^piFfa~B0+7HLh%to+WUnASW z?mG@?!|}K&E$m=wRRi-jf~y4W)e08@xjtqC8J?Lyww97*?c$E5Xo31Bx?$8U2GY6= zAmtAU>2~a_DQPL=Qx}70J2^mlFJ-JZCpRS$qR3BI*!wswz z_xrZU`Pu;F{LKfln>1i8-~b>qX&jK=Z>-9zsPY%nXZG};8Yg$*c zxS>aT**u4DA2YO(M_Xlj@qNlH#<$ZvhwpA?Xk(AI)b!%}kXhW=m-~MK3GmqBa^x|8X#mzkW@8!+&&Ek!CKU_MZijP?`7wtD^g<^aMnCF^% zjClx(p(u5lB~9JNN8oT41umko+i)R3+~6vhCC%N&XmD-8>9j{%V}`cyXeUi?3y)C_ zj&Ea?Ol#rR+L`B2vdRo?=`lV<$w0frh`_|$W3?9ny*1{!mL4s^3~gn3td+<3903)F zavyVAE4R~yDI9HvHHkG|z)^q5H52uW$_UR=&Ur7mp_bMW9Q7;Ja{0@iF|OurEyMJN zd$eM+INW2LMM;8X1+DF1hPL)-9@C5ObhEg%$GHh%6V4X3BW7qDk8uM$M+cuYaT{SZ zY%lC-CYWwm?XavAnbtN4M+zM7gbH46IY81?Nt3 zW?0)eKdci5kY$24*7QbujJ1%pf=svEd(b==Z3TZjkKqoM(;x@42wZ#UA&6VMHRwUZ zANjH)WL3>QkPSDzZnOs(1JBotXzA8JsB2Dc6>l`HXGafxJsTX?iM1ZE-il*9#;=gY zL*}sJwM&S+(@@!**4k|p)yHKT$|Uy#xIv{{_XZBfkWy|lxZ9c~;E;?|z0M8GYOV)& zyOqn}dY5XpZ{%?FE#(%2oeBt}Qqpb5Aq3R?R%u(W4DDL*qS0VN-{rlck46qMbI2 z<2_mp^BhXLHghw1Je$SuUP`iFM*SWl{9lZLt9|H=B3CuvpB)yd>vdTb62BS&DRX=>@nK5l-@w6 zn8~T&IA#P?^B6xc9xzBUX!HWOByci%dLzWRXyn)hxEPD0tB#rH?(rBk!(=i*!x;5M z)7!;koPdl$Z3TrEVV;95HC(11Oh>$1d))MP^%%DxD|Nlmv9*j!L^LLBwi(*ZV_boZ z{Udd@gW1Rey-K;)!KrC%Fw^(9x{vZ{U7rjzJtxs9vCdtyyt`Z)6PW(4}m0LK}uU{34mHgL+F zn1PLK#W~4oPnpGikn6FUnPo6ggyTqXG~CbPHYiTU$2Z_Qqf9sVw2JYAiL?@ZBK@V{ zklkQB;5I2vcKQ)G#<7*Sjb<1qJ20%Vrh?;`FtdowVpUeoTKwOF>wz+Ow58kG70tub zEnHk}Fvg;|r#nxho;o*oq@sF30#4I6B{I*l?jO4#Y}S z+92~>vPb*Q4DIjHl1y)ZkFgc8tb(Mu+j#+8H#4kptQKd64)7Q|F*00osety!Hbgfd zyfK_U;JSi?X>PYs0FDb?8hR2OEkb}`Hw!R}2YQTL2udf|cnh3L449Yes?2gJcDLd| z9%IHma%uT;2hv_QLkD||pCIFCTLz!5F0YE73P4wcpDsS7yn zj#xHWzB%CNZ0WhZ;Ao-bepdBx>VmV0SY#FUj0M@+txxY}PHquzJPje6E^me34REY( zg`d%@yR0Asb%Ekg9fNtt3?1$t?bVCmA^tg>4io^88yPf&q zx|o-S#rfd?y-*3E9+HSE=B1{w#t4EgK9EIJS&Lj$kNMoOKdyoCb&G0^4ar zBb*jU8xdH>C~#a=PIFIYj2{@f-I{-F>7f&u*S!-x#*m@X5U62EYzM~(lFgr0Tsf;O zWSE>^sW}8(J7~i7=&TSN>%qC;J^;rlkXf<$aOo&$;$mR@a4r{IRi5*DjIU5cMazC? z%MsRG!P_HnMB5=pbF09~z+&*er8op*ceim196PqQS*@d4JjG+o8YyMgxw!ExIAv&S zxAP*nZdSxaj*@cZc=&vh;?OF#%gx|8w^&Hn)IK)7=^ic6EKbK}JX-n~PQYgQsu?=f zV_b!dGlZp&O)dUjsUdfgS>O<|%As$A<4CNm;^a;rXx3iDKQg51Pf(JjRcZ@eI)# zwccf%IeARHkvmQf086Hs+c*FYi3HtGgE9Jed6t5Xac+@ehGu(=dsC&poPu58m`%`) z+wJ@TTxT<^XRNd11WW@@q?~hb)PYCFJ|0=R4CX7P+@2ySF6f81c1J_N~!4<1vhR(9iZDx6l*fd1A4VhUR*V<=|CcXyrF> zoD?fWjlmgZY8o$sL;m4tU~xibsdswD_?0p=Wgoa6vJr4Mz;U1$Huj_L)9h+oAM?P; z6;U!Y#urQp8*N$Ym~H!I&$t*rFm2Hs&h2oOvflJQ z;BkHc83v0R0=4JZ5ypre4o-FrhiZ?S-US}xywX6zPj)*y-N(hvn=RXM#LZ5|N(nf* zWlUS()}qbgg&t$wTzl#m7T3THwDg%MN8evshHdT_aB3iky8(I9ebND|ZgX>D{J?N9 zvgpLeUVE$qp>^j_i#axQQ<5K8$@$DN;xX2Q~D#?vU}V6o-Ekt59Fr5;=$o?GfMsyt}B zjWIhCoOB!S5^Vt&gIY*#J>14=RfbIrn!$_gJs@H`cKqemJ(%Sl{n{e){PKA16*F`N z(()3y^khOG01kOzM69t4N0HXR5Q5rEX6QeHjCeSz7M<8^EzuZbvbGV4}fP zw00Q()wbzeE1kj7n{dY97(Xyz1dd6`+L)Zz!40HM&b|d)l013{M}w`S3pnay z?!pe@USsJkfj@B+C!0n`Z-J9R8G&TzYs#LiQ5*5#=uK?hkHoMj$%;Z_tuz3(p-Ojf z9Fn|Hn+uM1%UyFHxK7}#D+>T61SYyfgYC^kJR2W#FiDsq!9hv`e1pTmsidmf=h% zY@K<&DBjq%PG%~c&0&>%2ab+_Td@3_3VEK3_-p3YpAhExE%Am?XuA;=^n^ll^455L zL7}-5@Ij$@ervo@d%c`|q!>(PCb)r?5#(M6*R7PRumRIw%H@FL*pQjA**yb}Q)F0Y zK$pP{F4gSva2d{d8C(bJJh=JBGOg>b$1V zw`?+ZJ`!(y1Yxvg2R2=2;AYFYjbruUo6X6O#_KCLn>zvTZ8pyXY8II-9*Z~fi%R#A z7H<7ik-77+c<0G24#zNa*JH8HmRoVMV;$w=sIPhHu{d8G^tMEGw&ASDI+}u`MC<4| z9QEaqUVgi|v$#WEF!Bn?05t*Wpk^Qq)EvYQk$fnKswCW-ISsx(NN|84YEJ}@QWXyTvBBOc7fG!6{UDLWJA?dIgy9e@x>YEFU(jTMByJW z5PTcRxy0O>>>meIqd->d0Hi2ZVH_EJ$|BEl5+J7s?os7sk)kg6B6d~fMCx}}eD^#Y zl!G70G5)7TLfYB_~pkex@j2$?t}&H(!+#dH8_B1)BN%?g~sxj)h9aLi45Ffo$8c2w#kd z<*Jm(!xi{q!>bg(nnHYtl&?{8Q_24hncg2(dPE*>*1XA>slK&Z_P^uKD^EJL$@jt4<-B2?t?+rAA_xh0~2_u{u^kX}+!A`dSsyrS@X3h^QGumoQWm!A}W705weXQ4tK{;v44$o_6BIk1k^ z;4LM%1I-&SkKOpNjzTK>DxS#0a`>XWypj{i`vEDcp!kYp@F6mKt17v_lHUboB4Ys! zsi73hB2Suvm7K`KdibgYYyo6P;S?%lG)F1^ZpiW&l+&N_I(pU2j?V<9u=_5mxgM%I zkPjM+!et__@L_fy@Z!f%xaRsH@HFqEfh`@CSug zf$Zp4#s98&T0yxlkR3aL^jJk;6<`pMo~j4ruGs|0posvoUNjI*Io!cG;KzLz)XWvn zhV*1Jom90h3VQ(AT@tV&a2Swg3F*C9XVFKh{BB5V&!D`V8FnBrkFk3J9Bsa+@Dh+(SAdm){2dcN zMC$vpt3M!}Za~g&+iSF38V zHisfD4F%ECmI}jw{FFsH<9~6vYSr(8Z`SK>ab-~TZxwK`h$hQ`L?8`H0`XH8*-$cw zh7JHx@2@XcQHam&%U7vCQi>hs>7AASxp4jG!c|_tGP3^ef|WtT@_#N||G98wEI9tT zaJAfEUC=Te|8wE`1$QHSi1f%m7p`!^KNqeHi90W3dBXV5h3h{TuK!%PT1#UK&b|J* zaQ*-1!WB<|@%ev#;rjG}BhPFTsk5}+;<>3>W$_Y@v@^oU)rN>k84#rBLhz|LKtb(H z2r+ z;yfiiWy zFBg)^4?yy(CWb$t4c33t#9rccO;lI_{9O}ci8nOyJn^O`sxJiI(!^w-=GcE|p_Zp< zCHoT=X}>s~?hxFK*q^*c8={$88v7ddOB9an-?~zJ!bh91KXHxLOgE0l$^Sw3v6#D7 zJL8P#gqs-x)mE{V`2Hcy&-qeks8HsiY=5V9S`W?nGA{Hhvi+}Q`}Y61j^96bz2?!h ziu+&MpjGs79>7lyjQ!JgXl|eVV-{%#b%F22R^$D4Xnr+^&X)f%j%QN#|Cx{2pT0xu z?&IV$@(TOst=FP7L1m|<%uZcar%vlX4~nh3v~R5j`|Q&E^t$Ur(i$zCf?D=}`x}?$ z4WFDXPuCt2`#0~>%IOX4|5I1CaI7~YJr$N5E`rq@@~QoWyEScW#e?cj{toy(qP8BJ z=eT)GexPkVv*1}F?^g1|XBXr-DBfP;$9`PFE6}QzL_WHp9`B3PQnGJVU8YKxl6|LS zyniQeJ>jm3{RD$|%RXhR`0yzP8|1B}evt9_0=`(xdveK2kIyq`9G}7tP%=Kt;34mg z?qWrJegyK619K^v^^AjebvUwmO2`KuJmh`c=1TUnl5w;xl^#QuoMyQ?eS6<$VWJIdaYm{#lR0xx;Yee7ZteP0%(ayP;%s^EwU_A3k-V z9v{_4;($i+feU4|K~E?>x{9(OP#h1epCTw>9dPjwvJqX$IB%V#qV=qXhrCN?Kc3}t z8V;&1$bLl2XEW5R2kLKl;ZA73Eh=&59UR%1QSt`A{v*1)HdQfz?ZK1#8Qk~M^E zBxLN2&uv(x5ojn5>I17OSz{b0LDm3RUCEBqMfe1(CrK6Jrbk7_*Kb>2RBocz5N(3> zOmR9`uiul~1S7Kxl)Hkufp~NEdr%4J2hfk8pFmeZKZAY&T?73J`UJ!vJ|Y^_)oau| zj>8v0FM(bL@nPaKBB8DxqP-+i>grM25%Ex6y;Iau!}_U<11^FF zBB7pMqa$NK6vTLM32FsmoL2|c0966~4Bs%$uYve0j*mbegFY1n_4JlOopE>)gyhGc z)`#^li$;UDyK%+tTg2sUO&~Geg z0>~+n>+6BldgCw=R2Ae8sxETt>#n?;F!LBJz687sY7A-yY7Pno@$vUs&^pk1&<4;V z&{EJm(0!m>&(=!k5z#=ek=GY&KTuClFHmbxQxG30JcZ%y2JHdu1APGE!<7Pb zu?obew*!HEx;qXy7Q_eBKY*CX`7oQC26v)wK+M@cgP4mrWn;wZ#LEh9}M;tU^fu&J8cBzf%xl?RL}%a9H=A61L_3gFKgO^DuF743{VA- z6I2f51M&sUa){3w>h+xS;M}o7YXsjn!{M{&at(@^_b!9DZSZOEDbRbMM?p(L%R!By z`vA%(g1UmbfjWT7gZx0t(cVhXYES`a4afwo1+4=Wf;NC204?B_vJeMXP;mtsUkO?T z;;Y|6K`lV7K?_jc9mLFk6#B)WouGe#c7b+-_JAG)ML<6i6a{Jv8jd>sLH%&N1Namu z9P|lv8}LCDA7gQ2h$gw6WiAyu9&YteNfKKO<5R-Xv+`b_zRSM3w#;GWXM_Hs`RPHv9nD^7m{dRX=P^8 zY9JkCSElXktTT|yml?OLLDXY8jblcpaqN^b`hZLSClHrEkxQP-ongpqeoJdCW1VsS zJBX)K$OBeB_#zM*_)MO^zg9av5*HwDy^U)NBseR}zY>==BXs*W*pV}^RpD%gh$9Fj1$!S>XY8v?yG;j1SM_4qr)TGIBJQxG3cq0*aL7egmH44Kc{x= zZ{9@%C+J#4On78?8*Z7ms4xQxIPc3}RpAqN<@8ytp@3GXuv{dzhpp>HY%JhWF^}9{ z@o;;6A_fq#La$LiI=oGITNqon14i>JTB1plvY)*5Th%AL{@UoaD2K5gk=y|$$x5QI zgI>E)EFvB!)1_}?Z1?Ib!Dq_FM4B7=4Zi-L}*Y`@uW=FIzsO<(bIdH4%nU_bHVCFr^AR|AGUIlpp)*jGd7 zY7VcBW27jFg`+ZY(NPKAfB(af!G+rjzM%q&p>Ut@#GwWIC5@v7{-@oJw~l;wyNe=` z9f$EhDNevJaWGC#(n>^Cm=&Ffs}@ercaJZv`oRa~GIgyZB>s@tFPMC3`A^*fuH?R{ zYb_8A{2UgeI-)f>Fzp=?;lVIZiV^n!u87aktX-yrN>jl|krEFTub4x)Q+S7__&r{4 zYq#HD^!Dh9F8hU)&hpb%ztC}KimqXTImLK)n&tHz@h;8D7vFkd8eM7fQpDnDgaS+Ih)t;Kvfp=k*%STFEayISZ-p2X zq;Kuv2)wfCsJx>5AUT))UeKgo2`%!Ij%>K?((R&%ks!zFQZE$EZ+ia0;QjT> zRlKctLR_NWozBoMiCE68{eIFN)5dqMoOj~!+tu#yg7)`gRgK>BIT8_86yH`QFxOfs)#&yZZabk9M1Jw9)O7&SDc9ca4Ms z8=tsh`l;mwlk#sXOcy6;#0qgC5n~S*AxYQ+?ANn;u4T4-zWk-d@DVmZ=D*`2JqhX? z#G)jk)yrw;#Sn<}>&?XSzF30x zt4~i1{d`rk$larKEf2p?;@(pvUg?VrYQHPBe2d zMJTjG+lZ7i;)M~Gx8UDIt)GY;1a6`jGzhk4iY0@v%g)0&O#p^?K6%`ne#@HQkILL; z+vD6`lu+GTkpUuPuPLoPsEWg~Sl_Bv?fYq6^cgRtLNJ0$tN#8E%Ia~6$QfrdA;icv$LV86ol z@!XpkQCnOIzLuff^G1sTD$H}svzcqZ&6)J-(6x`~+GI#@J21aM^d6=M_1z7YQ80ek zYp-suy2Yt$4?}{Rlclf29dznq*&Xfqo;d)}U{qo%k=Z4hvY+3#r z+E7c}e!cG5o9{l^ylv$|ltkcMA7(xyHVsGj_Ir7AOZJ^U<9SiWRaAInTU-pBfP!Y} z1=elr$nGSkW&7kA({pc*sEel15YNl!i4cbGGSPknYgG_T%#8#GA@tydG zq&Gu!9Er<@$>NcbdQ`Cea_L8wY-!XYXs8gud1Z>v*& zw)#f^Szj)VoXym|m%k6vv3Orkfg8eGq7Oi{yer-g+4=8cV#@mQbN5SUH zqS|O=wwpaftI^18Q$*L%kmiY8!Yg9eXe`Ui;yQF(`MqQyEh-N?I0l!0Ta)C9 zJS0vq(q0x92uDQ`s=Dk~iC+A+v(c#MYoIG0Sb(cBEUf=)s7Ov=oyyYSUGC}3VA!ebm4MF|u*ah1mDeXu%)jYG1m&`+-Ym0R}?x-s|I zAge3Or}f04aTr?*v1+njOO%Y$lU*I5Toq;py+HYE}Kcm;~tbkqzq1Pt7J%d*!9PJa)n|a56L-U}I&bF)`(tEb02XEod zpU9hl4((SlAFT3iardXkmq39l9$EaPcozz2NSg>3SnB9ESze*XtP5M);I-=S;9{Gn zFLrxD(e|s#hrM#yx$(10&8_xuO9HnIalXYo{pYQqhS)R_J>`iL>}k2U0C3qaZ@y5e zeo)2vO(M~dN>Vs4oCF2?EzN_Ik0hn|Kl2t8xIe;_LNQzPiSa;7W(J4x(K4%b5$;c6$B2=Z4ls zPtmx;fJw0eqh+Ha+-BycXTPmE<<$mnbT16L3dOeaR)kzpIE8?D@>o=y0uvgFmQ!G3 zr06gHPc;0jMI{tQ<3p1zKH3j4PP+Ug~_VDgW(-&#!;z*h;3Ub-+ z=8LkxKFxX-55AtzVY<1*g79}of7lX0bh%04*;%+lq{^C zYvaZ7bfmrV;!q~)=~I!p14PyPp%Ef3fWBxa@aHfBe9q z+O_^&V$a_n{a+dvN5t8MsAj*K`qKEX&;7i3P9NnKjO?P&7$wrzE}t}c`>?9-<}dG! z49-^`!0HMTeRB}N%8PBqCf1UX#t^7uhg&0Y0i(krsx}L|RwR>+{Q_Aoip=EYV~ z9me2Upm+re(e}H?Po1B6`l~v9pSo?4^?Guop@4+w&eLB#c1D$8&|#wTOtjr4UEW-F zR?m5E%fsF5`Nv8eEE1rgrHT=RJE8%lMF@J>T0bsB9@%XW7lgStw}MT-2%u zm)Wmy-?F|!yO0CRuc)>#Ujd?ZE>sVRk|np{u&_*0Ld!Bcy5)FOG|5?31990enjiYF zkv}v@>(5Ibo~%W*y>orstp&Mq{<_4@K&rz#@@whJ`7fk07c=|WX;@_!xza`BxmXu> zj$XB@Qkz;o2c;eoQ!QV(SLG%(aep1ts%6z=>0m5pTOC+;=45N)v->Su>^@X3Qg*18 zPKlH}Oq;dC)D)}pbl<eb54(l*y$rwujY|3dG-Yfolm*?rj=kdAP2`>^`5Zad(ir#QhBCo|n&B`=K88jjVT zQqBG!F2h{Qpn&^h`M)1@|9T`fdAwR!$nJNK#yd_4?jE`7eBtherBds1q?Rv|Pb*P* z0kXkg{*d@4dwg1AymctYMFFo&jFWOVrX7=BJxH)RokP9cf zeW*%cqMC)$b!n~AJ5rd4UwTI-DI0?|%dQn`?^rDkE&VT|<$nyPyUl=oCRrNAvNMbn)1kAAf6NxJt#|o6xLdh??*LL?AF@vXn?f9S;zuOWwP}TJ+6nG1IaL(o2 zVYh0&rfb_F;i9%~5x2w*l~F77AR~8yd<|83kq6dg|E-H2k4$~?bV#}KXqT5YSo!Ks zfx1NyBEDULNC*=yT<5#&KcR81+`lgb*0}E^YB6GPexmL?S@#eEMgB@XSlc5uv5x&` zIF_|MQD;YVUtY_x4sL?n?H+=tw+dGx_U(X8qWvmdquYOoqtedf$2<6LoP;KDI>#$d zWo%FJ0`6zH>_1g9c~bXlGrx#^-s;M_R;Hjw<>eta4Qkj5{(MJ768*=l60UV=bH9PI(+nY$wo1% z5axFf1!zHgTs%>zCwlFlJZBUht9t+9J_71(!y|c8|L2EQbJoe5%=TYN>3(pum{YT5 zmaM~dX8#?Pxsl-^uh#Hsh!O-fv#)yKBOjrN%NzAN?f%@sL?Jt{|GdhD*p!raB9ja> z6M>sD?b^jG79xI=UR!@ih@qSC8xz^A>yM-G*Z6BG{)(W?4=jwz>*WtD5Exsnz*x0e z1_rr0B4IP)V+?fsQ7>Ouh1UHL#*oEXI#I&E$hv;$T7(BwlQyi|isw^*j-B|9@FRR8 zpBvoKLXfsuT*t!%Mku=0H#{ubY(XRTAAc#IG-qaJ=;hA3h8tzp4j?<$k3B33w_w!r zo|*W1i(W?>(8788VdPYivO=#}W(bLBJ=*>gGH;)2`>*M{KV!D#&0jqFvH!@-<{2-B zc~3eyk8b2)%;Q}=blWvpNwj+Z!y;yz9;rMa7Hre2>toi7!fkqey~<|sJj;?di_5@Z z`|r~j8F6o(Pu}nX?y^OPV=rjy7+56Yw(GTn-@xMIk6(ISdne6#W&1#XEwxB)FjcmQ zOlY)gyhT2^Jkjpy&aeFYhtYU0i7bK8a>St|5Ou5mDAt9s^{3m;T$p@yY-{$ zGx1$|!ms+Y^lz@u7a#4=J$Qr|^oSnP!1~_|C>1xOI;ZXKUHy+9a)@D2>+l1zI2%1P zXwHryPt*^(0iO3~=LHU`ax0+iX9hgPfPSO>y#qWmI(+E2KpH)~nb`Y?{?h(AkLnLT Mw153QKJQlkKPtD!U;qFB diff --git a/package.json b/package.json index 4679f4cb..78121039 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", "fmt": "bunx @biomejs/biome format --write .", "check": "bun lint && bun fmt", + "check:watch": "chokidar 'src/**/*.{ts,tsx,js,jsx,md}' -c 'bun check'", "fetch-data": "bash script/main.sh" }, "dependencies": { @@ -35,6 +36,7 @@ "@typescript-eslint/parser": "^6.1.0", "abitype": "^0.9.6", "autoprefixer": "10.4.14", + "chokidar-cli": "^3.0.0", "clipboardy": "^3.0.0", "eslint": "8.39.0", "eslint-config-next": "13.4.12", From 81d322b9d578cdde264f996aaa67270f7cd0e659 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 06:57:52 -0700 Subject: [PATCH 31/75] chore: remove old comments --- src/pages/diff.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 4b8bb0d0..71af1417 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -42,7 +42,6 @@ const Diff = () => { const router = useRouter(); const { base, target } = router.query; - // ================================ START NEW STUFF ================================ const [baseChain, setBaseChain] = useState(null); const [targetChain, setTargetChain] = useState(null); @@ -71,7 +70,6 @@ const Diff = () => { fetchData(); }, [base, target]); - // ================================ END NEW STUFF ================================ const ErrorDiv = () => (
    From 308aa3b3cc24150c08d161d38f7e98d67efd3890 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 07:02:33 -0700 Subject: [PATCH 32/75] feat: add Base --- script/data/chain/8453.json | 493 +++++++++++++++++++++ script/data/feature/deployedContracts.json | 44 ++ script/data/feature/evmStackAddresses.json | 209 +++++++++ script/data/feature/metadata.json | 35 ++ script/data/feature/opcodes.json | 151 +++++++ script/data/feature/precompiles.json | 52 +++ 6 files changed, 984 insertions(+) create mode 100644 script/data/chain/8453.json diff --git a/script/data/chain/8453.json b/script/data/chain/8453.json new file mode 100644 index 00000000..26c66c67 --- /dev/null +++ b/script/data/chain/8453.json @@ -0,0 +1,493 @@ +{ + "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 + } + ], + "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 index 5951cc8d..942b960b 100644 --- a/script/data/feature/deployedContracts.json +++ b/script/data/feature/deployedContracts.json @@ -87,6 +87,50 @@ "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 + } + ], "42161": [ { "name": "CreateX", diff --git a/script/data/feature/evmStackAddresses.json b/script/data/feature/evmStackAddresses.json index d5f506a6..8804686e 100644 --- a/script/data/feature/evmStackAddresses.json +++ b/script/data/feature/evmStackAddresses.json @@ -417,6 +417,215 @@ } ] }, + "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 + } + ] + }, "42161": { "OP": [ { diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json index d7f1273a..a65839f7 100644 --- a/script/data/feature/metadata.json +++ b/script/data/feature/metadata.json @@ -81,6 +81,41 @@ "wss://optimism.drpc.org" ] }, + "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" + }, "42161": { "name": "Arbitrum One", "shortName": "arb1", diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json index fddc1f04..8190573b 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -301,6 +301,157 @@ { "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 } + ], "42161": [ { "number": "0x00", "name": "STOP", "supported": true }, { "number": "0x01", "name": "ADD", "supported": true }, diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json index 629c541e..8384e88b 100644 --- a/script/data/feature/precompiles.json +++ b/script/data/feature/precompiles.json @@ -103,6 +103,58 @@ "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 + } + ], "42161": [ { "name": "ecRecover", From ad0cc855dbfefd8403cbbcfa610ee42c83ee0337 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 08:23:13 -0700 Subject: [PATCH 33/75] feat: load in new chains --- package.json | 11 ++++---- script/index.ts | 2 +- script/main.sh | 27 +++++++++++++------ script/prepare-chain-data.sh | 23 ++++++++++++++++ src/components/ChainDiffSelector.tsx | 20 ++++++++------ src/components/diff/DiffMetadata.tsx | 14 +++++++--- .../ui/ChainDiffSelectorChainCombobox.tsx | 16 ++++++----- src/lib/chains.json | 6 +++++ src/lib/utils.ts | 8 +++--- 9 files changed, 92 insertions(+), 35 deletions(-) create mode 100644 script/prepare-chain-data.sh create mode 100644 src/lib/chains.json diff --git a/package.json b/package.json index 78121039..1b012874 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,15 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", + "dev": "bun prepare-chain-data && next dev", + "build": "bun prepare-chain-data && next build", + "start": "bun prepare-chain-data && next start", "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", "fmt": "bunx @biomejs/biome format --write .", - "check": "bun lint && bun fmt", + "check": "bun prepare-chain-data && bun lint && bun fmt", "check:watch": "chokidar 'src/**/*.{ts,tsx,js,jsx,md}' -c 'bun check'", - "fetch-data": "bash script/main.sh" + "fetch-data": "bash script/main.sh", + "prepare-chain-data": "bash script/prepare-chain-data.sh" }, "dependencies": { "@headlessui/react": "^1.7.16", diff --git a/script/index.ts b/script/index.ts index 4fbfe444..bc68534d 100644 --- a/script/index.ts +++ b/script/index.ts @@ -91,7 +91,7 @@ async function getMetadata(chainId: number): Promise { 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 data/${chainId}.json`); + console.log(`✅ Chain data for chainId ${chainId} written to script/data/${chainId}.json`); } function sortObjectKeys(obj: T, orderedKeys: (keyof T)[]): T { diff --git a/script/main.sh b/script/main.sh index ee3d7b72..6df7ac9a 100644 --- a/script/main.sh +++ b/script/main.sh @@ -1,14 +1,25 @@ #!/bin/bash - set -euo pipefail -fetchDataForChainId() { - bun lint # Lint for potential issues. - bun script/index.ts "$1" # Fetch data for the given chain ID. - bun script/postprocess.ts # Slice data by feature. - bun fmt # Format the generated files. +# 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) @@ -21,11 +32,11 @@ if [ $# -eq 0 ]; then input="${input##*/}" # Extract the file name without the path echo "" echo "Running for chain ID $input (chain $index of $numChains)" - fetchDataForChainId "$input" + 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" - fetchDataForChainId "$1" "1" "1" + bun script/index.ts "$1" fi diff --git a/script/prepare-chain-data.sh b/script/prepare-chain-data.sh new file mode 100644 index 00000000..4f4ed8c0 --- /dev/null +++ b/script/prepare-chain-data.sh @@ -0,0 +1,23 @@ +#!/bin/bash +set -euo pipefail + +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" < { + 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 router = useRouter(); - const [base, setBase] = useState(chains.mainnet); - const [target, setTarget] = useState(chains.optimism); - const chainsArray: Chain[] = Object.values(chains); + const [base, setBase] = useState(findChainById(1)); // Ethereum Mainnet. + const [target, setTarget] = useState(findChainById(10)); // OP Mainnet. const onSubmit = (e: React.FormEvent) => { e.preventDefault(); router.push({ pathname: '/diff', - query: { base: base.metadata.id, target: target.metadata.id }, + query: { base: base.chainId, target: target.chainId }, }); }; @@ -25,13 +29,13 @@ export const ChainDiffSelector = () => {
    { - return ['networkId', 'ens', 'features', 'icon', 'slip44', 'faucets', 'chain', 'parent'].includes( - field, - ); + return [ + 'networkId', + 'ens', + 'features', + 'icon', + 'slip44', + 'faucets', + 'chain', + 'parent', + 'status', + ].includes(field); }; const formatFieldDisplayName = (field: MetadataKey) => { diff --git a/src/components/ui/ChainDiffSelectorChainCombobox.tsx b/src/components/ui/ChainDiffSelectorChainCombobox.tsx index 23a74ec2..3597f4d6 100644 --- a/src/components/ui/ChainDiffSelectorChainCombobox.tsx +++ b/src/components/ui/ChainDiffSelectorChainCombobox.tsx @@ -3,7 +3,11 @@ 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 type { Chain } from '@/types'; + +interface Chain { + name: string; + chainId: number; +} interface Props { label: string; @@ -25,8 +29,8 @@ export const ChainDiffSelectorChainCombobox = ({ label, chains, value, onChange ? chains : chains.filter((chain) => { return ( - chain.metadata.name.toLowerCase().includes(query.toLowerCase()) || - chain.metadata.id.toString().includes(query.toLowerCase()) + chain.name.toLowerCase().includes(query.toLowerCase()) || + chain.chainId.toString().includes(query.toLowerCase()) ); }); @@ -46,7 +50,7 @@ export const ChainDiffSelectorChainCombobox = ({ label, chains, value, onChange setQuery(event.target.value)} - displayValue={(chain: Chain) => chain?.metadata.name} + displayValue={(chain: Chain) => chain.name} />
    diff --git a/src/lib/chains.json b/src/lib/chains.json new file mode 100644 index 00000000..7b0d0bcf --- /dev/null +++ b/src/lib/chains.json @@ -0,0 +1,6 @@ +[ + { "chainId": 1, "name": "Ethereum Mainnet" }, + { "chainId": 10, "name": "OP Mainnet" }, + { "chainId": 42161, "name": "Arbitrum One" }, + { "chainId": 8453, "name": "Base" } +] diff --git a/src/lib/utils.ts b/src/lib/utils.ts index da267f92..ca71a959 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,5 +1,4 @@ import { pad } from 'viem'; -import type { 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(' '); @@ -50,7 +49,8 @@ export const formatPrefixByte = (prefix: number) => { 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`; +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 === 42161) return 'https://icons.llamao.fi/icons/chains/rsz_arbitrum.jpg'; + return `https://icons.llamao.fi/icons/chains/rsz_${chain.name.toLowerCase()}.jpg`; }; From 3c03669c98ab830a26731c8bd83da645cbfdc0b2 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 08:36:04 -0700 Subject: [PATCH 34/75] style: some info/UX cleanup --- src/components/diff/DiffDeployedContracts.tsx | 9 ++++++++- src/components/diff/DiffEVMStackAddresses.tsx | 11 ++++++++++- src/components/diff/DiffOpcodes.tsx | 7 ++++++- src/components/diff/DiffPrecompiles.tsx | 9 ++++++++- src/pages/diff.tsx | 2 +- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 872b3571..c9ea13f4 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -73,5 +73,12 @@ export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => ); - return ; + return ( + <> +
    + Whether common utility contracts used by developers and users exist. +
    + + + ); }; diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx index f08c6686..b121584d 100644 --- a/src/components/diff/DiffEVMStackAddresses.tsx +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -89,5 +89,14 @@ export const DiffEVMStackAddresses = ({ base, target, onlyShowDiff }: Props) => ); - return ; + return ( + <> +
    + 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. +
    + + + ); }; diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 9730adda..15647b4d 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -53,5 +53,10 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element ); - return ; + return ( + <> +
    Whether or not standard opcodes are supported.
    + + + ); }; diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index dc2718fc..42022a8d 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -60,5 +60,12 @@ export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { ); - return ; + return ( + <> +
    + Whether or not standard precompiles are supported. +
    + + + ); }; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 71af1417..476d62b1 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -29,7 +29,7 @@ const SECTION_MAP: Record = { opcodes: { title: 'Opcodes', component: DiffOpcodes }, deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, precompiles: { title: 'Precompiles', component: DiffPrecompiles }, - evmStackAddresses: { title: 'EVM Stack', component: DiffEVMStackAddresses }, + evmStackAddresses: { title: 'EVM Stack Addresses', component: DiffEVMStackAddresses }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, // eips: { title: 'Execution EIPs', component: DiffEIPs }, From 54b18038b028c37fc917e0826a27b716e2cb80bd Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 5 May 2024 16:20:40 -0700 Subject: [PATCH 35/75] feat: json diffs --- bun.lockb | Bin 217446 -> 222052 bytes package.json | 3 +- src/components/diff/DiffJSON.tsx | 108 +++++++++++++++++++++++++++++++ src/pages/diff.tsx | 69 ++++++++++++-------- 4 files changed, 152 insertions(+), 28 deletions(-) create mode 100644 src/components/diff/DiffJSON.tsx diff --git a/bun.lockb b/bun.lockb index 8afc5908a36882f68aaa6e87f98a63ebec8a89d6..0a9abf36e29c6194fb757b571927fda13c3190cc 100755 GIT binary patch delta 46397 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 GYV-e3vdjzs delta 43641 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 diff --git a/package.json b/package.json index 1b012874..9c7027b3 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "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", - "check:watch": "chokidar 'src/**/*.{ts,tsx,js,jsx,md}' -c 'bun check'", "fetch-data": "bash script/main.sh", "prepare-chain-data": "bash script/prepare-chain-data.sh" }, @@ -22,6 +21,7 @@ "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", "viem": "^1.5.0" @@ -37,7 +37,6 @@ "@typescript-eslint/parser": "^6.1.0", "abitype": "^0.9.6", "autoprefixer": "10.4.14", - "chokidar-cli": "^3.0.0", "clipboardy": "^3.0.0", "eslint": "8.39.0", "eslint-config-next": "13.4.12", diff --git a/src/components/diff/DiffJSON.tsx b/src/components/diff/DiffJSON.tsx new file mode 100644 index 00000000..d0917e20 --- /dev/null +++ b/src/components/diff/DiffJSON.tsx @@ -0,0 +1,108 @@ +import ReactDiffViewer from 'react-diff-viewer-continued'; +import { useTheme } from 'next-themes'; + +type Props = { + base: string; + target: string; +}; + +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 }: Props): JSX.Element => { + const { resolvedTheme } = useTheme(); + return ( + <> +
    +
    + Note that not all chains have the same set of raw data. For example, not all L2s will have + JSON that clearly indicates its an L2. +
    +
    + +
    +
    + + ); +}; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 476d62b1..36e953d1 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -5,6 +5,7 @@ import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; import { DiffEVMStackAddresses } from '@/components/diff/DiffEVMStackAddresses'; +import { DiffJSON } from '@/components/diff/DiffJSON'; import { DiffMetadata } from '@/components/diff/DiffMetadata'; import { DiffOpcodes } from '@/components/diff/DiffOpcodes'; import { DiffPrecompiles } from '@/components/diff/DiffPrecompiles'; @@ -86,6 +87,7 @@ const Diff = () => { // -------- Show diff -------- const [onlyShowDiff, setOnlyShowDiff] = useState(true); + const [showPrettyDiff, setsSowPrettyDiff] = useState(false); const SectionComponent = ({ section, @@ -110,11 +112,18 @@ const Diff = () => { return ( <>
    - +
    + + +
    {/* Show chain names at top */}
    @@ -123,28 +132,36 @@ const Diff = () => {
    {targetChain.metadata.name}
    + {!showPrettyDiff && ( + + )} + {/* Show content */} - {sections.map((section, index) => { - const base = baseChain[section as keyof Chain]; - const target = targetChain[section as keyof Chain]; - return ( -
    - {/* Header */} - - - {/* Diff */} - -
    - ); - })} + {showPrettyDiff && + sections.map((section, index) => { + const base = baseChain[section as keyof Chain]; + const target = targetChain[section as keyof Chain]; + return ( +
    + {/* Header */} + + + {/* Diff */} + +
    + ); + })}
    ); From d5d77f7dd1f213e54019e55a052f3678a6294216 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 6 May 2024 05:34:47 -0700 Subject: [PATCH 36/75] style: add logos --- src/pages/diff.tsx | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 36e953d1..c5b3e5f2 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -11,7 +11,8 @@ import { DiffOpcodes } from '@/components/diff/DiffOpcodes'; import { DiffPrecompiles } from '@/components/diff/DiffPrecompiles'; import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; -import { classNames } from '@/lib/utils'; +import { classNames, chainLogoUrl } from '@/lib/utils'; +import Image from 'next/image'; interface Props { base: T; @@ -126,10 +127,34 @@ const Diff = () => {
    {/* Show chain names at top */} -
    +
    -
    {baseChain.metadata.name}
    -
    {targetChain.metadata.name}
    +
    + +
    {baseChain.metadata.name}
    +
    +
    + +
    {targetChain.metadata.name}
    +
    {!showPrettyDiff && ( From c0c28f5b7a7a9cdc8817c3cead414bcfed255bdb Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 6 May 2024 15:11:54 -0700 Subject: [PATCH 37/75] style: change toggle --- src/components/ui/Toggle.tsx | 58 +++++++++++++++++++++--------------- src/pages/diff.tsx | 32 +++++++++++--------- 2 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/components/ui/Toggle.tsx b/src/components/ui/Toggle.tsx index 7e424985..3e91807b 100644 --- a/src/components/ui/Toggle.tsx +++ b/src/components/ui/Toggle.tsx @@ -1,34 +1,44 @@ -import { Switch } from '@headlessui/react'; +import { Tab } from '@headlessui/react'; import { classNames } from '@/lib/utils'; type Props = { enabled: boolean; setEnabled: (enabled: boolean) => void; - label: string; + enabledText: string; + disabledText: string; }; -export const Toggle = ({ enabled, setEnabled, label }: Props) => { +export const Toggle = ({ enabled, setEnabled, enabledText, disabledText }: Props) => { return ( - - - - - {label} - - +
    + setEnabled(index === 0)}> + + + classNames( + selected + ? 'bg-white text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' + : 'text-zinc-500 hover:bg-white/[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-white text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' + : 'text-zinc-500 hover:bg-white/[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/pages/diff.tsx b/src/pages/diff.tsx index c5b3e5f2..6f14d3e9 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; -import { LinkIcon } from '@heroicons/react/20/solid'; +import { LinkIcon, CogIcon } from '@heroicons/react/20/solid'; import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; @@ -88,7 +88,7 @@ const Diff = () => { // -------- Show diff -------- const [onlyShowDiff, setOnlyShowDiff] = useState(true); - const [showPrettyDiff, setsSowPrettyDiff] = useState(false); + const [showPrettyDiff, setShowPrettyDiff] = useState(false); const SectionComponent = ({ section, @@ -113,21 +113,25 @@ const Diff = () => { return ( <>
    -
    - - +
    +
    + + +
    {/* Show chain names at top */} -
    +
    Date: Tue, 7 May 2024 20:11:33 -0700 Subject: [PATCH 38/75] feat: query params --- src/components/diff/DiffJSON.tsx | 4 +++- src/components/ui/Toggle.tsx | 30 ++++++++++++++++++++++++++++-- src/pages/diff.tsx | 23 ++++++++++++++++------- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/components/diff/DiffJSON.tsx b/src/components/diff/DiffJSON.tsx index d0917e20..17b3c6af 100644 --- a/src/components/diff/DiffJSON.tsx +++ b/src/components/diff/DiffJSON.tsx @@ -4,6 +4,7 @@ import { useTheme } from 'next-themes'; type Props = { base: string; target: string; + onlyShowDiff: boolean; }; const styles = { @@ -84,7 +85,7 @@ const styles = { wordRemoved: { padding: '0px', margin: '0px' }, }; -export const DiffJSON = ({ base, target }: Props): JSX.Element => { +export const DiffJSON = ({ base, target, onlyShowDiff }: Props): JSX.Element => { const { resolvedTheme } = useTheme(); return ( <> @@ -100,6 +101,7 @@ export const DiffJSON = ({ base, target }: Props): JSX.Element => { splitView={true} useDarkTheme={resolvedTheme !== 'light'} styles={styles} + showDiffOnly={onlyShowDiff} />
    diff --git a/src/components/ui/Toggle.tsx b/src/components/ui/Toggle.tsx index 3e91807b..0ac2bcd8 100644 --- a/src/components/ui/Toggle.tsx +++ b/src/components/ui/Toggle.tsx @@ -1,17 +1,43 @@ import { Tab } from '@headlessui/react'; import { classNames } from '@/lib/utils'; +import { useRouter } from 'next/router'; type Props = { enabled: boolean; setEnabled: (enabled: boolean) => void; enabledText: string; disabledText: string; + queryParamName?: string; }; -export const Toggle = ({ enabled, setEnabled, enabledText, disabledText }: Props) => { +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 (
    - setEnabled(index === 0)}> + onChange(index)}> diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 6f14d3e9..e4282ca5 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; -import { LinkIcon, CogIcon } from '@heroicons/react/20/solid'; +import { LinkIcon } from '@heroicons/react/20/solid'; import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; @@ -42,13 +42,23 @@ const SECTION_MAP: Record = { const Diff = () => { // -------- Parse query parameters -------- const router = useRouter(); - const { base, target } = router.query; + const { + base, + target, + onlyShowDiff: onlyShowDiffParam, + showPrettyDiff: showPrettyDiffParam, + } = router.query; const [baseChain, setBaseChain] = useState(null); const [targetChain, setTargetChain] = useState(null); + const [onlyShowDiff, setOnlyShowDiff] = useState(true); + const [showPrettyDiff, setShowPrettyDiff] = useState(true); useEffect(() => { if (!base || !target) return; + if (onlyShowDiffParam !== undefined) setOnlyShowDiff(onlyShowDiffParam === 'true'); + if (showPrettyDiffParam !== undefined) setShowPrettyDiff(showPrettyDiffParam === 'true'); + const fetchData = async () => { try { const urls = [ @@ -71,7 +81,7 @@ const Diff = () => { }; fetchData(); - }, [base, target]); + }, [base, target, onlyShowDiffParam, showPrettyDiffParam]); const ErrorDiv = () => (
    @@ -86,10 +96,6 @@ const Diff = () => { ); // -------- Show diff -------- - - const [onlyShowDiff, setOnlyShowDiff] = useState(true); - const [showPrettyDiff, setShowPrettyDiff] = useState(false); - const SectionComponent = ({ section, base, @@ -120,12 +126,14 @@ const Diff = () => { setEnabled={setOnlyShowDiff} enabledText="Show Diff" disabledText="Show All" + queryParamName="onlyShowDiff" />
    @@ -165,6 +173,7 @@ const Diff = () => { )} From 666c6e8852136bb875eb931d9c71f8c3dc4d7f62 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 7 May 2024 20:18:07 -0700 Subject: [PATCH 39/75] update contributing --- CONTRIBUTING.md | 39 +++++++++++++++------------------------ script/biome.jsonc | 26 -------------------------- 2 files changed, 15 insertions(+), 50 deletions(-) delete mode 100644 script/biome.jsonc diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bc09976c..1063b5b3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,14 @@ # Contributing +## 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: @@ -16,6 +25,9 @@ bun fmt # Lint. bun lint + +# Add a new chain to the UI, format, and lint. +bun check ``` Or, to fetch chain data: @@ -26,28 +38,7 @@ bun fetch-data [chainId] # Fetch all data for all chains. bun fetch-data -``` - -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. - -## Bounties - -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: -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. - -## Architecture - -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`. - -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/script/biome.jsonc b/script/biome.jsonc deleted file mode 100644 index 7163d47a..00000000 --- a/script/biome.jsonc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.6.4/schema.json", - "files": { - "ignore": ["archive/**/*"] - }, - "organizeImports": { - "enabled": true - }, - "formatter": { - "lineWidth": 100 - }, - "javascript": { - "formatter": { - "quoteStyle": "single" - } - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true, - "complexity": { - "useSimpleNumberKeys": "off" - } - } - } -} From baf24d70eae95bc913875857aef01d5b47dcec62 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 7 May 2024 20:30:28 -0700 Subject: [PATCH 40/75] style: loading spinner --- src/pages/diff.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index e4282ca5..b07c4b9f 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -49,6 +49,7 @@ const Diff = () => { showPrettyDiff: showPrettyDiffParam, } = router.query; + const [loading, setLoading] = useState(true); const [baseChain, setBaseChain] = useState(null); const [targetChain, setTargetChain] = useState(null); const [onlyShowDiff, setOnlyShowDiff] = useState(true); @@ -75,8 +76,10 @@ const Diff = () => { setBaseChain(chainData[0]); setTargetChain(chainData[1]); + setLoading(false); } catch (error) { console.error('Error fetching data:', error); + setLoading(false); } }; @@ -95,6 +98,13 @@ const Diff = () => {
    ); + const LoadingDiv = () => ( +
    +
    +

    Fetching Data...

    +
    + ); + // -------- Show diff -------- const SectionComponent = ({ section, @@ -207,8 +217,11 @@ const Diff = () => { return (
    - {(!baseChain || !targetChain) && } - {baseChain && targetChain && } + {loading && } + {!loading && (!baseChain || !targetChain) && } + {!loading && baseChain && targetChain && ( + + )}
    ); }; From 906eee92b3e25e9d6991b855eeef26b5b8d5ad4a Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 8 May 2024 15:51:09 -0700 Subject: [PATCH 41/75] style: move things from footer to header --- README.md | 3 -- src/components/layout/Footer.tsx | 53 +++------------------------ src/components/layout/Header.tsx | 62 ++++++++++++++++++++++++++------ 3 files changed, 55 insertions(+), 63 deletions(-) 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/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 1171328e..aecb2617 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -1,58 +1,13 @@ 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} - - ))} -
    - - {} +
    + © {currentYear} . All rights + reserved.
    ); diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index c18cca79..b2a06bdd 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -3,15 +3,44 @@ 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{' '} { text="the repo" />{' '} to help contribute. -
    -
    -
    -
    - - {COMPANY_NAME} - logo - -
    +
    */} + +
    +
    + + {COMPANY_NAME} + logo + +
    + +
    + {navigation.map((item) => ( + + <> + {item.name} + + ))} + {}
    From 8414d06ccbc05b7877ab2b8789e714b1378ab7d1 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 06:11:13 -0700 Subject: [PATCH 42/75] style: diff scroll improvements --- src/components/diff/DiffDeployedContracts.tsx | 9 +-- src/components/diff/DiffEVMStackAddresses.tsx | 11 +--- src/components/diff/DiffJSON.tsx | 2 +- src/components/diff/DiffOpcodes.tsx | 7 +-- src/components/diff/DiffPrecompiles.tsx | 9 +-- src/components/diff/utils/RenderDiff.tsx | 2 +- .../ui/ChainDiffSelectorChainCombobox.tsx | 11 +++- src/components/ui/Toggle.tsx | 8 +-- src/pages/diff.tsx | 61 ++++++++++++------- 9 files changed, 59 insertions(+), 61 deletions(-) diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index c9ea13f4..872b3571 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -73,12 +73,5 @@ export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => ); - return ( - <> -
    - Whether common utility contracts used by developers and users exist. -
    - - - ); + return ; }; diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx index b121584d..f08c6686 100644 --- a/src/components/diff/DiffEVMStackAddresses.tsx +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -89,14 +89,5 @@ export const DiffEVMStackAddresses = ({ base, target, onlyShowDiff }: Props) => ); - return ( - <> -
    - 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. -
    - - - ); + return ; }; diff --git a/src/components/diff/DiffJSON.tsx b/src/components/diff/DiffJSON.tsx index 17b3c6af..27dfd362 100644 --- a/src/components/diff/DiffJSON.tsx +++ b/src/components/diff/DiffJSON.tsx @@ -90,7 +90,7 @@ export const DiffJSON = ({ base, target, onlyShowDiff }: Props): JSX.Element => return ( <>
    -
    +
    Note that not all chains have the same set of raw data. For example, not all L2s will have JSON that clearly indicates its an L2.
    diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 15647b4d..9730adda 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -53,10 +53,5 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element ); - return ( - <> -
    Whether or not standard opcodes are supported.
    - - - ); + return ; }; diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index 42022a8d..dc2718fc 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -60,12 +60,5 @@ export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { ); - return ( - <> -
    - Whether or not standard precompiles are supported. -
    - - - ); + return ; }; diff --git a/src/components/diff/utils/RenderDiff.tsx b/src/components/diff/utils/RenderDiff.tsx index 271a0082..b01c069c 100644 --- a/src/components/diff/utils/RenderDiff.tsx +++ b/src/components/diff/utils/RenderDiff.tsx @@ -4,7 +4,7 @@ export const RenderDiff = ({ content }: { content: JSX.Element }) => { const isEmpty = children.every((child) => child === false); const EmptyDiff = () => ( -
    No differences found.
    +
    No differences found.
    ); return !isEmpty ? content : ; diff --git a/src/components/ui/ChainDiffSelectorChainCombobox.tsx b/src/components/ui/ChainDiffSelectorChainCombobox.tsx index 3597f4d6..8f405a9d 100644 --- a/src/components/ui/ChainDiffSelectorChainCombobox.tsx +++ b/src/components/ui/ChainDiffSelectorChainCombobox.tsx @@ -46,9 +46,16 @@ export const ChainDiffSelectorChainCombobox = ({ label, chains, value, onChange {label} -
    +
    + setQuery(event.target.value)} displayValue={(chain: Chain) => chain.name} /> diff --git a/src/components/ui/Toggle.tsx b/src/components/ui/Toggle.tsx index 0ac2bcd8..d55ec85b 100644 --- a/src/components/ui/Toggle.tsx +++ b/src/components/ui/Toggle.tsx @@ -43,8 +43,8 @@ export const Toggle = ({ className={({ selected }) => classNames( selected - ? 'bg-white text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' - : 'text-zinc-500 hover:bg-white/[0.12] hover:text-zinc-600 dark:text-zinc-500 dark:hover:bg-zinc-700 dark:hover:text-zinc-300', + ? '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', ) } @@ -55,8 +55,8 @@ export const Toggle = ({ className={({ selected }) => classNames( selected - ? 'bg-white text-zinc-900 shadow dark:bg-zinc-900 dark:text-zinc-100' - : 'text-zinc-500 hover:bg-white/[0.12] hover:text-zinc-600 dark:text-zinc-500 dark:hover:bg-zinc-700 dark:hover:text-zinc-300', + ? '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', ) } diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index b07c4b9f..0c2df820 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -11,7 +11,7 @@ import { DiffOpcodes } from '@/components/diff/DiffOpcodes'; import { DiffPrecompiles } from '@/components/diff/DiffPrecompiles'; import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; -import { classNames, chainLogoUrl } from '@/lib/utils'; +import { chainLogoUrl } from '@/lib/utils'; import Image from 'next/image'; interface Props { @@ -22,16 +22,34 @@ interface Props { interface Section { title: string; + infoText?: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any component: React.ComponentType>; } const SECTION_MAP: Record = { metadata: { title: 'Metadata', component: DiffMetadata }, - opcodes: { title: 'Opcodes', component: DiffOpcodes }, - deployedContracts: { title: 'Deployed Contracts', component: DiffDeployedContracts }, - precompiles: { title: 'Precompiles', component: DiffPrecompiles }, - evmStackAddresses: { title: 'EVM Stack Addresses', component: DiffEVMStackAddresses }, + opcodes: { + title: 'Opcodes', + component: DiffOpcodes, + infoText: 'Whether or not standard opcodes are supported.', + }, + deployedContracts: { + title: 'Deployed Contracts', + component: DiffDeployedContracts, + infoText: 'Whether common utility contracts used by developers and users exist.', + }, + precompiles: { + title: 'Precompiles', + component: DiffPrecompiles, + infoText: 'Whether or not standard precompiles are supported.', + }, + evmStackAddresses: { + title: 'EVM Stack Addresses', + component: DiffEVMStackAddresses, + 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.', + }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, // eips: { title: 'Execution EIPs', component: DiffEIPs }, @@ -149,7 +167,7 @@ const Diff = () => {
    {/* Show chain names at top */} -
    +
    { {/* Show content */} {showPrettyDiff && - sections.map((section, index) => { + sections.map((section) => { const base = baseChain[section as keyof Chain]; const target = targetChain[section as keyof Chain]; return ( -
    - {/* Header */} - - - {/* Diff */} - +
    +
    +
    + +
    {SECTION_MAP[section].infoText}
    +
    +
    +
    + +
    ); })} From 241a8252150f367173ba374e806b77adb9f186e9 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 06:23:40 -0700 Subject: [PATCH 43/75] ci: update for bun --- .github/workflows/ci.yml | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c73a12e..185992f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,40 +13,40 @@ jobs: 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 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 there was no diff + run: git diff --exit-code From 016bac80b7378d618d258bb806e2706a35d2eaa3 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:29:01 -0700 Subject: [PATCH 44/75] ci: fix? --- .github/workflows/ci.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 185992f3..310fc6bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,10 +10,11 @@ on: jobs: build: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 + with: + bun-version: latest - name: Install dependencies run: bun install @@ -23,10 +24,11 @@ jobs: lint: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 + with: + bun-version: latest - name: Install dependencies run: bun install @@ -36,10 +38,11 @@ jobs: chain-list: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 + with: + bun-version: latest - name: Install dependencies run: bun install From 6a31e00baae19d3813141d0a1b80f1f6bdc9b1c3 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:33:33 -0700 Subject: [PATCH 45/75] ci: add node --- .github/workflows/ci.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 310fc6bb..d6951648 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,9 +12,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 - uses: oven-sh/setup-bun@v1 - with: - bun-version: latest - name: Install dependencies run: bun install @@ -26,9 +25,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 - uses: oven-sh/setup-bun@v1 - with: - bun-version: latest - name: Install dependencies run: bun install @@ -40,9 +38,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 - uses: oven-sh/setup-bun@v1 - with: - bun-version: latest - name: Install dependencies run: bun install From ffdbd46a85e9e3eee67cb9c754180779a4892ea6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:40:45 -0700 Subject: [PATCH 46/75] ci: remove jq from build pipeline since vercel has no jq --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9c7027b3..1157a28e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "bun prepare-chain-data && next dev", - "build": "bun prepare-chain-data && next build", + "build": "next build", "start": "bun prepare-chain-data && next start", "lint": "next lint --fix && tsc --noEmit && bunx @biomejs/biome lint --apply .", "fmt": "bunx @biomejs/biome format --write .", From d24455538809b6cb3b31a96e39834a3c7e05b546 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:44:13 -0700 Subject: [PATCH 47/75] ci: revert ci as test --- .github/workflows/ci.yml | 52 ++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d6951648..0c73a12e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,43 +10,43 @@ on: jobs: build: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - - uses: oven-sh/setup-bun@v1 + - 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' - name: Install dependencies - run: bun install + run: pnpm install + # This runs `next lint` before building. - name: Build - run: bun build + run: pnpm build - lint: + fmt: runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - - uses: oven-sh/setup-bun@v1 - - - name: Install dependencies - run: bun install - - - name: Check linting and formatting - run: bun check - chain-list: - runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - - uses: oven-sh/setup-bun@v1 + - uses: pnpm/action-setup@v2 + with: + version: latest - - 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: Generate list of chains for the UI - run: bun prepare-chain-data + - name: Install dependencies + run: pnpm install - # When this fails, run `bun prepare-chain-data` locally and commit the changes - - name: Ensure there was no diff - run: git diff --exit-code + - name: Check formatting + run: pnpm fmt:check From d956ea93fc6d0c5f9d1525e7051fb31eb3850f05 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:46:10 -0700 Subject: [PATCH 48/75] ci: back to bun --- .github/workflows/ci.yml | 49 +++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0c73a12e..f46cbc78 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 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 there was no diff + run: git diff --exit-code From e9b635e03e2b861cfff82f7b8e98b4d11d117bab Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:51:03 -0700 Subject: [PATCH 49/75] ci/style: fmt after merge, add node --- src/chains/optimism/eips.ts | 84 +++++++++---------- src/chains/optimism/signatureTypes.ts | 24 +++--- .../optimism/vm/opcodes/block/prevrandao.ts | 28 +++---- src/chains/optimism/vm/predeploys.ts | 2 +- 4 files changed, 69 insertions(+), 69 deletions(-) diff --git a/src/chains/optimism/eips.ts b/src/chains/optimism/eips.ts index 70bd5073..383b25ab 100644 --- a/src/chains/optimism/eips.ts +++ b/src/chains/optimism/eips.ts @@ -9,54 +9,54 @@ 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', - ], + ...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', - ], + ...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', - ], + ...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 diff --git a/src/chains/optimism/signatureTypes.ts b/src/chains/optimism/signatureTypes.ts index cd2e84a1..5bd6a7f1 100644 --- a/src/chains/optimism/signatureTypes.ts +++ b/src/chains/optimism/signatureTypes.ts @@ -2,18 +2,18 @@ import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signat import type { 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: + 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].`, ], diff --git a/src/chains/optimism/vm/opcodes/block/prevrandao.ts b/src/chains/optimism/vm/opcodes/block/prevrandao.ts index 8b9e5bc2..18517ed4 100644 --- a/src/chains/optimism/vm/opcodes/block/prevrandao.ts +++ b/src/chains/optimism/vm/opcodes/block/prevrandao.ts @@ -3,18 +3,18 @@ import type { 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', - ], + ...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/predeploys.ts b/src/chains/optimism/vm/predeploys.ts index 551bcc06..2e38d2d8 100644 --- a/src/chains/optimism/vm/predeploys.ts +++ b/src/chains/optimism/vm/predeploys.ts @@ -1,7 +1,7 @@ import type { Predeploy } from '@/types'; const PREDEPLOYS_SPEC = - 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/predeploys.md'; + 'https://github.com/ethereum-optimism/specs/blob/main/specs/protocol/predeploys.md'; export const predeploys: Predeploy[] = [ { From 52efdc13a561704a60c038eabfb792bf3a8a2dae Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:52:33 -0700 Subject: [PATCH 50/75] ci: fix build command --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f46cbc78..89def825 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: run: bun install - name: Build - run: bun build + run: bun run build lint: runs-on: ubuntu-latest From 7105c80aac8f5af3236fddb07c96bf09a6e50c55 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Thu, 9 May 2024 19:58:00 -0700 Subject: [PATCH 51/75] chore: clarify copy --- src/components/diff/DiffJSON.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/diff/DiffJSON.tsx b/src/components/diff/DiffJSON.tsx index 27dfd362..c11be835 100644 --- a/src/components/diff/DiffJSON.tsx +++ b/src/components/diff/DiffJSON.tsx @@ -91,8 +91,8 @@ export const DiffJSON = ({ base, target, onlyShowDiff }: Props): JSX.Element => <>
    - Note that not all chains have the same set of raw data. For example, not all L2s will have - JSON that clearly indicates its an L2. + 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.
    Date: Sat, 11 May 2024 07:37:42 -0700 Subject: [PATCH 52/75] feat: opcode support for features view --- script/data/feature/predeploys.json | 408 ----------------------- script/postprocess.ts | 12 +- script/prepare-chain-data.sh | 21 ++ src/components/features/FeatureTable.tsx | 205 +++++++----- src/lib/features.json | 7 + src/pages/features.tsx | 89 ++--- 6 files changed, 197 insertions(+), 545 deletions(-) delete mode 100644 script/data/feature/predeploys.json create mode 100644 src/lib/features.json diff --git a/script/data/feature/predeploys.json b/script/data/feature/predeploys.json deleted file mode 100644 index f467dada..00000000 --- a/script/data/feature/predeploys.json +++ /dev/null @@ -1,408 +0,0 @@ -{ - "1": { - "OP": [ - { - "name": "LegacyMessagePasser", - "address": "0x4200000000000000000000000000000000000000", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "DeployerWhitelist", - "address": "0x4200000000000000000000000000000000000002", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "LegacyERC20ETH", - "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "WETH9", - "address": "0x4200000000000000000000000000000000000006", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L2CrossDomainMessenger", - "address": "0x4200000000000000000000000000000000000007", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L2StandardBridge", - "address": "0x4200000000000000000000000000000000000010", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "SequencerFeeVault", - "address": "0x4200000000000000000000000000000000000011", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "OptimismMintableERC20Factory", - "address": "0x4200000000000000000000000000000000000012", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L1BlockNumber", - "address": "0x4200000000000000000000000000000000000013", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "GasPriceOracle", - "address": "0x420000000000000000000000000000000000000F", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "GovernanceToken", - "address": "0x4200000000000000000000000000000000000042", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L1Block", - "address": "0x4200000000000000000000000000000000000015", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L2ToL1MessagePasser", - "address": "0x4200000000000000000000000000000000000016", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L2ERC721Bridge", - "address": "0x4200000000000000000000000000000000000014", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "OptimismMintableERC721Factory", - "address": "0x4200000000000000000000000000000000000017", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ProxyAdmin", - "address": "0x4200000000000000000000000000000000000018", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "BaseFeeVault", - "address": "0x4200000000000000000000000000000000000019", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "L1FeeVault", - "address": "0x420000000000000000000000000000000000001a", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - } - ], - "Orbit": [ - { - "name": "ArbAddressTable", - "address": "0x0000000000000000000000000000000000000066", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbAggregator", - "address": "0x000000000000000000000000000000000000006D", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbFunctionTable", - "address": "0x0000000000000000000000000000000000000068", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbGasInfo", - "address": "0x000000000000000000000000000000000000006C", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbInfo", - "address": "0x0000000000000000000000000000000000000065", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbOwner", - "address": "0x0000000000000000000000000000000000000070", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbOwnerPublic", - "address": "0x000000000000000000000000000000000000006b", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbRetryableTx", - "address": "0x000000000000000000000000000000000000006E", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbStatistics", - "address": "0x000000000000000000000000000000000000006F", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "ArbSys", - "address": "0x0000000000000000000000000000000000000064", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - }, - { - "name": "NodeInterface", - "address": "0x00000000000000000000000000000000000000C8", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "exists": false - } - ] - }, - "10": { - "OP": [ - { - "name": "LegacyMessagePasser", - "address": "0x4200000000000000000000000000000000000000", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "DeployerWhitelist", - "address": "0x4200000000000000000000000000000000000002", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "LegacyERC20ETH", - "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", - "codeHash": "0x0947f7bbeb5659a3b6e9a2045605fee6c606c66cb27eacfcf9ec3c2a4d426c51", - "hasCode": true - }, - { - "name": "WETH9", - "address": "0x4200000000000000000000000000000000000006", - "codeHash": "0x779bbf2a738ef09d961c945116197e2ac764c1b39304b2b4418cd4e42668b173", - "hasCode": true - }, - { - "name": "L2CrossDomainMessenger", - "address": "0x4200000000000000000000000000000000000007", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "L2StandardBridge", - "address": "0x4200000000000000000000000000000000000010", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "SequencerFeeVault", - "address": "0x4200000000000000000000000000000000000011", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "OptimismMintableERC20Factory", - "address": "0x4200000000000000000000000000000000000012", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "L1BlockNumber", - "address": "0x4200000000000000000000000000000000000013", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "GasPriceOracle`", - "address": "0x420000000000000000000000000000000000000F", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "GovernanceToken`", - "address": "0x4200000000000000000000000000000000000042", - "codeHash": "0x8551d935f4e67ad3c98609f0d9f0f234740c4c4599f82674633b55204393e07f", - "hasCode": true - }, - { - "name": "L1Block`", - "address": "0x4200000000000000000000000000000000000015", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "L2ToL1MessagePasser`", - "address": "0x4200000000000000000000000000000000000016", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "L2ERC721Bridge`", - "address": "0x4200000000000000000000000000000000000014", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "OptimismMintableERC721Factory`", - "address": "0x4200000000000000000000000000000000000017", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "ProxyAdmin`", - "address": "0x4200000000000000000000000000000000000018", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "aseFeeVault", - "address": "0x4200000000000000000000000000000000000019", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - }, - { - "name": "1FeeVault", - "address": "0x420000000000000000000000000000000000001a", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "hasCode": true - } - ], - "Orbit": [] - }, - "42161": { - "OP": [ - { - "name": "LegacyMessagePasser", - "address": "0x4200000000000000000000000000000000000000", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "DeployerWhitelist", - "address": "0x4200000000000000000000000000000000000002", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "LegacyERC20ETH", - "address": "0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "WETH9", - "address": "0x4200000000000000000000000000000000000006", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L2CrossDomainMessenger", - "address": "0x4200000000000000000000000000000000000007", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L2StandardBridge", - "address": "0x4200000000000000000000000000000000000010", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "SequencerFeeVault", - "address": "0x4200000000000000000000000000000000000011", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "OptimismMintableERC20Factory", - "address": "0x4200000000000000000000000000000000000012", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L1BlockNumber", - "address": "0x4200000000000000000000000000000000000013", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "GasPriceOracle`", - "address": "0x420000000000000000000000000000000000000F", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "GovernanceToken`", - "address": "0x4200000000000000000000000000000000000042", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L1Block`", - "address": "0x4200000000000000000000000000000000000015", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L2ToL1MessagePasser`", - "address": "0x4200000000000000000000000000000000000016", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "L2ERC721Bridge`", - "address": "0x4200000000000000000000000000000000000014", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "OptimismMintableERC721Factory`", - "address": "0x4200000000000000000000000000000000000017", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "ProxyAdmin`", - "address": "0x4200000000000000000000000000000000000018", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "aseFeeVault", - "address": "0x4200000000000000000000000000000000000019", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - }, - { - "name": "1FeeVault", - "address": "0x420000000000000000000000000000000000001a", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "hasCode": false - } - ], - "Orbit": [] - } -} diff --git a/script/postprocess.ts b/script/postprocess.ts index 06b82d5a..9f3ebb8a 100644 --- a/script/postprocess.ts +++ b/script/postprocess.ts @@ -1,9 +1,17 @@ -import { readdir } from 'node:fs/promises'; +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); @@ -19,7 +27,7 @@ async function main() { dataOut[chainId] = dataIn[key]; } - const outfile = join(import.meta.dir, 'data', 'feature', `${key}.json`); + const outfile = join(FEATURE_PATH, `${key}.json`); await Bun.write(outfile, JSON.stringify(dataOut)); } } diff --git a/script/prepare-chain-data.sh b/script/prepare-chain-data.sh index 4f4ed8c0..bb68ad60 100644 --- a/script/prepare-chain-data.sh +++ b/script/prepare-chain-data.sh @@ -1,6 +1,7 @@ #!/bin/bash set -euo pipefail +# First we get list of all chains. CHAIN_DIR="./script/data/chain" OUTPUT_FILE="./src/lib/chains.json" CHAINS=() @@ -19,5 +20,25 @@ cat > "$OUTPUT_FILE" < "$OUTPUT_FILE" < { - 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'); +}: { feature: string; featureMap: Record; className?: string }) => { + const [metadata, setMetadata] = useState | null>(null); + const [featureData, setFeatureData] = useState< + | Record + | Record + | Record + | Record + | Record + | null + >(null); - const onHeaderClick = (field: 'name' | 'col1') => { - if (sortField === field) { - setSortDirection(sortDirection === 'ascending' ? 'descending' : 'ascending'); - } else { - setSortField(field); - setSortDirection('ascending'); - } - }; + useEffect(() => { + const fetchData = async () => { + try { + const metadataUrl = `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/metadata.json`; + const metadataRes = await fetch(metadataUrl); + const metadata = await metadataRes.json(); + setMetadata(metadata); - 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; + const url = `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/${feature}.json`; + const res = await fetch(url); + const featureData = await res.json(); + setFeatureData(featureData); + } catch (error) { + console.error('Error fetching data:', error); + } + }; - 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; - } + fetchData(); + }, [feature]); - if (sortDirection === 'ascending') { - return aValue > bValue ? 1 : aValue < bValue ? -1 : 0; - } - return aValue < bValue ? 1 : aValue > bValue ? -1 : 0; - }); + if (!metadata || !featureData) return null; return (
    - - - - - - - - - {sortedChains.map((chain) => ( - - - - - ))} - -
    -
    onHeaderClick('name')} - > - Name - - -
    -
    -
    onHeaderClick('col1')} - > - Is {name} supported? - - -
    -
    - {chain.metadata.name} - - {chain.supported} -
    +
    +
    + + + + + {Object.keys(featureData).map((chainId) => { + return ( + + ); + })} + + + + {featureData['1' /* mainnet as source of truth for known opcodes */].map((op) => ( + + + {Object.keys(featureData).map((chainId) => { + const opcode = featureData[chainId].find( + (opcode) => opcode.number === op.number, + ); + const bgColor = opcode + ? opcode.supported + ? 'bg-green-100/80 dark:bg-green-900/60' + : 'bg-red-100 dark:bg-red-900/80' + : ''; + return ( + + ); + })} + + ))} + +
    +
    + {featureMap[feature].title.slice(0, -1)} +
    +
    +
    + {metadata[chainId].name} +
    +
    + {op.name} +
    {op.number}
    +
    + {opcode ? (opcode.supported ? 'Yes' : 'No') : 'Unknown'} +
    +
    +
    ); }; 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/pages/features.tsx b/src/pages/features.tsx index 42483306..8b3932ba 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -2,55 +2,57 @@ 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 { FeatureTable } from '@/components/features/FeatureTable'; import { BaseCombobox } from '@/components/ui/BaseCombobox'; -import type { Chain } from '@/types'; +import features from '@/lib/features.json'; + +interface Section { + title: string; + infoText?: string; +} + +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.', + }, +}; const Features = () => { // --- URL Parsing --- const router = useRouter(); - const { name, kind } = router.query; + const { feature } = router.query; // --- Prepare options --- - // TODO Support more kinds. - type Kind = 'opcode'; - type FeatureHeader = { - name: string; - isHeader: boolean; - }; - - type FeatureItem = { - name: string; - kind: Kind; - }; - - type Feature = FeatureHeader | FeatureItem; - - const chainsArray: Chain[] = Object.values(chains); - const allOpcodes = chainsArray.flatMap(({ opcodes }) => { - return opcodes.map(({ name }) => ({ - name: name?.toLocaleUpperCase() || 'unknown', - kind: 'opcode' as Kind, - })); - }); - - 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 options = features.map(({ feature }) => ({ + key: feature, + name: featureMap[feature as keyof typeof featureMap].title, + })); // --- Form handling --- // Set PUSH0 as the default. - const push0Index = options.findIndex((opt) => opt.name === 'PUSH0'); - const [option, setOption] = useState(options[push0Index]); + 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: option, + query: { feature: option.key }, }); }; @@ -59,23 +61,20 @@ const Features = () => {

    - Compare Feature Support + Compare Support Across Chains

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

    -

    - More feature comparisons coming soon! + Choose a feature or property and check its support across chains.

    @@ -87,10 +86,14 @@ const Features = () => { return (

    - Compare {name} Support + Comparison of {featureMap[feature as keyof typeof featureMap].title}

    - +

    There may still be diffs between chains with the same support level. Be sure to{' '} @@ -105,7 +108,7 @@ const Features = () => { }; // --- Render --- - return <>{name && kind ? : }; + return <>{feature ? : }; }; export default Features; From 26f7c24fcfd1543276acf640062b69e3d2575623 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 12 May 2024 19:58:07 -0700 Subject: [PATCH 53/75] feat: metadata and opcodes feature comparison --- src/components/diff/DiffMetadata.tsx | 2 +- src/components/diff/DiffOpcodes.tsx | 4 +- src/components/diff/DiffSignatureTypes.tsx | 4 +- src/components/features/FeatureTable.tsx | 135 +++++++++++++++------ src/lib/utils.ts | 2 +- 5 files changed, 104 insertions(+), 43 deletions(-) diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index 2b09d437..d70b12e3 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -1,7 +1,7 @@ import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { ExternalLink } from '../layout/ExternalLink'; +import { ExternalLink } from '@/components/layout/ExternalLink'; type Metadata = Chain['metadata']; type MetadataKey = keyof Metadata; diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 9730adda..86c9afcd 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -1,7 +1,7 @@ import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; -import { formatPrefixByte } from '@/lib/utils'; +import { toUppercaseHex } from '@/lib/utils'; type Opcodes = Chain['opcodes']; type Opcode = Opcodes[0]; @@ -43,7 +43,7 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element >

    - +
    {formatOpcode(baseOpcode)}
    {formatOpcode(targetOpcode)}
    diff --git a/src/components/diff/DiffSignatureTypes.tsx b/src/components/diff/DiffSignatureTypes.tsx index f8318914..1bfdcac8 100644 --- a/src/components/diff/DiffSignatureTypes.tsx +++ b/src/components/diff/DiffSignatureTypes.tsx @@ -2,7 +2,7 @@ // 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 { toUppercaseHex } from '@/lib/utils'; // import type { SignatureType } from '@/types'; // type Props = { @@ -53,7 +53,7 @@ // className='grid grid-cols-12 items-center border-b border-zinc-500/10 py-6 dark:border-zinc-500/20' // > //
    -// +// //
    //
    {formatSigType(baseSigType)}
    //
    {formatSigType(targetSigType)}
    diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 1e7bff9b..734ce2c9 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -1,7 +1,8 @@ import { useState, useEffect } from 'react'; -import { ChevronDownIcon } from '@heroicons/react/20/solid'; import type { Chain } from '@/../script/index'; import { classNames } from '@/lib/utils'; +import { ExternalLink } from '@/components/layout/ExternalLink'; +import { toUppercaseHex } from '@/lib/utils'; type Metadata = Chain['metadata']; type Opcodes = Chain['opcodes']; @@ -15,12 +16,85 @@ interface Section { } // metadata: TODO -// opcodes: TODO +// opcodes: done // deployedContracts: TODO // precompiles: TODO // predeploys: TODO // evmStackAddresses: TODO +const tbodyClasses = 'divide-y divide-zinc-200 dark:divide-zinc-600'; +const trClasses = 'bg-secondary group'; +const td1Classes = 'text-primary text-center py-2 text-sm font-medium'; +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'; + +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 OpcodesTable = ({ featureData }: { featureData: Record }) => { + return ( + + {featureData['1'].map((op) => ( + + + {op.name} +
    {toUppercaseHex(Number(op.number))}
    + + {Object.keys(featureData).map((chainId) => { + const opcode = featureData[chainId].find((opcode) => opcode.number === op.number); + const bgColor = opcode + ? opcode.supported + ? supportedClasses + : unsupportedClasses + : ''; + return ( + + {opcode ? (opcode.supported ? 'Yes' : 'No') : 'Unknown'} + + ); + })} + + ))} + + ); +}; + export const FeatureTable = ({ feature, featureMap, @@ -58,6 +132,23 @@ export const FeatureTable = ({ if (!metadata || !featureData) return null; + const renderTableBody = () => { + switch (feature) { + case 'metadata': + return } />; + case 'opcodes': + return } />; + // case 'deployedContracts': + // return } metadata={metadata} />; + // case 'precompiles': + // return } metadata={metadata} />; + // case 'evmStackAddresses': + // return } metadata={metadata} />; + default: + return null; + } + }; + return (
    @@ -67,10 +158,10 @@ export const FeatureTable = ({ -
    - {featureMap[feature].title.slice(0, -1)} +
    + {feature === 'metadata' ? 'Property' : featureMap[feature].title.slice(0, -1)}
    {Object.keys(featureData).map((chainId) => { @@ -80,7 +171,7 @@ export const FeatureTable = ({ scope="col" className="text-primary sticky top-0 text-center px-3 py-3.5 text-sm font-semibold bg-white dark:bg-zinc-800" > -
    +
    {metadata[chainId].name}
    @@ -88,37 +179,7 @@ export const FeatureTable = ({ })} - - {featureData['1' /* mainnet as source of truth for known opcodes */].map((op) => ( - - - {op.name} -
    {op.number}
    - - {Object.keys(featureData).map((chainId) => { - const opcode = featureData[chainId].find( - (opcode) => opcode.number === op.number, - ); - const bgColor = opcode - ? opcode.supported - ? 'bg-green-100/80 dark:bg-green-900/60' - : 'bg-red-100 dark:bg-red-900/80' - : ''; - return ( - - {opcode ? (opcode.supported ? 'Yes' : 'No') : 'Unknown'} - - ); - })} - - ))} - + {renderTableBody()}
    diff --git a/src/lib/utils.ts b/src/lib/utils.ts index ca71a959..5fce11f9 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -43,7 +43,7 @@ export const sortedArrayByFields = { +export const toUppercaseHex = (prefix: number) => { return pad(`0x${prefix.toString(16).toUpperCase()}`, { size: 1 }); }; From e270bef20001d32169e8cd96bee434df5f6edc8d Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 13 May 2024 05:33:26 -0700 Subject: [PATCH 54/75] feat: back button --- src/components/features/FeatureTable.tsx | 3 ++- src/pages/features.tsx | 29 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 734ce2c9..7aee71b5 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -113,7 +113,8 @@ export const FeatureTable = ({ useEffect(() => { const fetchData = async () => { try { - const metadataUrl = `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/metadata.json`; + const metadataUrl = + 'https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/metadata.json'; const metadataRes = await fetch(metadataUrl); const metadata = await metadataRes.json(); setMetadata(metadata); diff --git a/src/pages/features.tsx b/src/pages/features.tsx index 8b3932ba..f1b10a38 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/router'; -import { ExclamationTriangleIcon } from '@heroicons/react/20/solid'; +import { ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { FeatureTable } from '@/components/features/FeatureTable'; import { BaseCombobox } from '@/components/ui/BaseCombobox'; import features from '@/lib/features.json'; @@ -50,10 +50,12 @@ const Features = () => { const onSubmit = (e: React.FormEvent) => { e.preventDefault(); - router.push({ - pathname: '/features', - query: { feature: option.key }, - }); + router.push({ pathname: '/features', query: { feature: option.key } }); + }; + + const onBack = (e: React.MouseEvent) => { + e.preventDefault(); + router.push({ pathname: '/features' }); }; // --- Selector Div --- @@ -88,12 +90,19 @@ const Features = () => {

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

    +
    - +
    + + + +
    +

    There may still be diffs between chains with the same support level. Be sure to{' '} From 7940a802447462716e282f91d688215b780d1fcf Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Mon, 13 May 2024 20:06:59 -0700 Subject: [PATCH 55/75] feat: more diff tables --- script/checks/deployed-contracts.ts | 2 +- script/checks/precompiles.ts | 158 ++++++++++++----------- src/components/features/FeatureTable.tsx | 155 +++++++++++++++++++--- 3 files changed, 221 insertions(+), 94 deletions(-) diff --git a/script/checks/deployed-contracts.ts b/script/checks/deployed-contracts.ts index b5bb7769..91e4f478 100644 --- a/script/checks/deployed-contracts.ts +++ b/script/checks/deployed-contracts.ts @@ -13,7 +13,7 @@ export async function checkDeployedContracts( return await Promise.all(result); } -const deployedContracts: { name: string; address: Address }[] = [ +export const deployedContracts: { name: string; address: Address }[] = [ // Deterministic Deployer contracts. { name: 'CreateX', address: '0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed' }, { diff --git a/script/checks/precompiles.ts b/script/checks/precompiles.ts index be948077..85393610 100644 --- a/script/checks/precompiles.ts +++ b/script/checks/precompiles.ts @@ -16,80 +16,84 @@ export async function checkPrecompiles( // 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. -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', - }, - ]; +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', + }, +]; diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 7aee71b5..3de0e3ba 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -3,32 +3,43 @@ import type { Chain } from '@/../script/index'; import { 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 { getAddress, type Address } from 'viem'; type Metadata = Chain['metadata']; type Opcodes = Chain['opcodes']; type DeployedContracts = Chain['deployedContracts']; type Precompiles = Chain['precompiles']; -type EvmStackAddresses = Chain['evmStackAddresses']; +type EvmStackResults = Chain['evmStackAddresses']; interface Section { title: string; infoText?: string; } -// metadata: TODO -// opcodes: done -// deployedContracts: TODO -// precompiles: TODO -// predeploys: TODO -// evmStackAddresses: TODO - const tbodyClasses = 'divide-y divide-zinc-200 dark:divide-zinc-600'; const trClasses = 'bg-secondary group'; -const td1Classes = 'text-primary text-center py-2 text-sm font-medium'; +const td1Classes = 'text-primary text-center p-2 text-sm font-medium'; 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 formatAddress = (addr: Address) => { + const a = getAddress(addr); + return {`${a.slice(0, 6)}...${a.slice(-4)}`}; +}; + +// 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 ( @@ -67,6 +78,72 @@ const MetadataTable = ({ featureData }: { featureData: Record ); }; +const DeployedContractsTable = ({ + featureData, +}: { featureData: Record }) => { + return ( + + {deployedContracts.map((contract) => ( + + +

    {contract.name}
    + + + {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}
    + + + {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 ( @@ -95,6 +172,48 @@ const OpcodesTable = ({ featureData }: { featureData: Record }) ); }; +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}
    + + + {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 = ({ feature, featureMap, @@ -106,7 +225,7 @@ export const FeatureTable = ({ | Record | Record | Record - | Record + | Record | null >(null); @@ -139,12 +258,16 @@ export const FeatureTable = ({ return } />; case 'opcodes': return } />; - // case 'deployedContracts': - // return } metadata={metadata} />; - // case 'precompiles': - // return } metadata={metadata} />; - // case 'evmStackAddresses': - // return } metadata={metadata} />; + case 'deployedContracts': + return ( + } /> + ); + case 'precompiles': + return } />; + case 'evmStackAddresses': + return ( + } /> + ); default: return null; } From 4c95e57982bcbbc39c22e42839e0655cec61fdac Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 14 May 2024 20:48:06 -0700 Subject: [PATCH 56/75] feat: add chains --- script/checks/precompiles.ts | 11 +- script/data/chain/137.json | 493 +++++++++ script/data/chain/34443.json | 473 ++++++++ script/data/chain/43114.json | 477 ++++++++ script/data/chain/534352.json | 480 ++++++++ script/data/chain/59144.json | 497 +++++++++ script/data/feature/deployedContracts.json | 220 ++++ script/data/feature/evmStackAddresses.json | 1157 +++++++++++++++++++- script/data/feature/metadata.json | 130 +++ script/data/feature/opcodes.json | 759 ++++++++++++- script/data/feature/precompiles.json | 260 +++++ script/index.ts | 1 + src/lib/chains.json | 5 + 13 files changed, 4902 insertions(+), 61 deletions(-) create mode 100644 script/data/chain/137.json create mode 100644 script/data/chain/34443.json create mode 100644 script/data/chain/43114.json create mode 100644 script/data/chain/534352.json create mode 100644 script/data/chain/59144.json diff --git a/script/checks/precompiles.ts b/script/checks/precompiles.ts index 85393610..19bed141 100644 --- a/script/checks/precompiles.ts +++ b/script/checks/precompiles.ts @@ -4,9 +4,14 @@ export async function checkPrecompiles( client: PublicClient, ): Promise<{ name: string; address: Address; implemented: boolean }[]> { const result = precompiles.map(async ({ name, address, testCalldata, expectedResponse }) => { - const res = await client.call({ to: address, data: testCalldata }); - const implemented = res.data === expectedResponse; - return { name, address, implemented }; + 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); } diff --git a/script/data/chain/137.json b/script/data/chain/137.json new file mode 100644 index 00000000..5b9cafe1 --- /dev/null +++ b/script/data/chain/137.json @@ -0,0 +1,493 @@ +{ + "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 + } + ], + "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..3eddb24f --- /dev/null +++ b/script/data/chain/34443.json @@ -0,0 +1,473 @@ +{ + "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 + } + ], + "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/43114.json b/script/data/chain/43114.json new file mode 100644 index 00000000..f9c5aca0 --- /dev/null +++ b/script/data/chain/43114.json @@ -0,0 +1,477 @@ +{ + "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 + } + ], + "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..0021d68e --- /dev/null +++ b/script/data/chain/534352.json @@ -0,0 +1,480 @@ +{ + "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 + } + ], + "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..3e13da1b --- /dev/null +++ b/script/data/chain/59144.json @@ -0,0 +1,497 @@ +{ + "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 + } + ], + "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/feature/deployedContracts.json b/script/data/feature/deployedContracts.json index 942b960b..747a1f50 100644 --- a/script/data/feature/deployedContracts.json +++ b/script/data/feature/deployedContracts.json @@ -87,6 +87,50 @@ "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", @@ -131,6 +175,50 @@ "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", @@ -174,5 +262,137 @@ "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 index 8804686e..20da8b7a 100644 --- a/script/data/feature/evmStackAddresses.json +++ b/script/data/feature/evmStackAddresses.json @@ -417,21 +417,1066 @@ } ] }, + "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 + "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": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "LegacyERC20ETH", @@ -444,106 +1489,106 @@ "name": "WETH9", "address": "0x4200000000000000000000000000000000000006", "kind": "Predeploy", - "codeHash": "0x8a3a1f6a9f9dce633117adee5b458245835a8645a8c8726a26382a4622508b1c", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L2CrossDomainMessenger", "address": "0x4200000000000000000000000000000000000007", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L2StandardBridge", "address": "0x4200000000000000000000000000000000000010", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "SequencerFeeVault", "address": "0x4200000000000000000000000000000000000011", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "OptimismMintableERC20Factory", "address": "0x4200000000000000000000000000000000000012", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L1BlockNumber", "address": "0x4200000000000000000000000000000000000013", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "GasPriceOracle", "address": "0x420000000000000000000000000000000000000F", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "GovernanceToken", "address": "0x4200000000000000000000000000000000000042", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L1Block", "address": "0x4200000000000000000000000000000000000015", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L2ToL1MessagePasser", "address": "0x4200000000000000000000000000000000000016", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L2ERC721Bridge", "address": "0x4200000000000000000000000000000000000014", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "OptimismMintableERC721Factory", "address": "0x4200000000000000000000000000000000000017", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ProxyAdmin", "address": "0x4200000000000000000000000000000000000018", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "BaseFeeVault", "address": "0x4200000000000000000000000000000000000019", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "L1FeeVault", "address": "0x420000000000000000000000000000000000001a", "kind": "Predeploy", - "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false } ], "Orbit": [ @@ -626,7 +1671,7 @@ } ] }, - "42161": { + "534352": { "OP": [ { "name": "LegacyMessagePasser", @@ -760,78 +1805,78 @@ "name": "ArbAddressTable", "address": "0x0000000000000000000000000000000000000066", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbAggregator", "address": "0x000000000000000000000000000000000000006D", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbFunctionTable", "address": "0x0000000000000000000000000000000000000068", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbGasInfo", "address": "0x000000000000000000000000000000000000006C", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbInfo", "address": "0x0000000000000000000000000000000000000065", "kind": "Predeploy", - "codeHash": "0xb85ab24294b1fe78ada85b084ae35f30c8d9696d43dae917df31c8c65e3b45b9", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "exists": false }, { "name": "ArbOwner", "address": "0x0000000000000000000000000000000000000070", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbOwnerPublic", "address": "0x000000000000000000000000000000000000006b", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbRetryableTx", "address": "0x000000000000000000000000000000000000006E", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbStatistics", "address": "0x000000000000000000000000000000000000006F", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "ArbSys", "address": "0x0000000000000000000000000000000000000064", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false }, { "name": "NodeInterface", "address": "0x00000000000000000000000000000000000000C8", "kind": "Predeploy", - "codeHash": "0xbcc90f2d6dada5b18e155c17a1c0a55920aae94f39857d39d0d8ed07ae8f228b", - "exists": true + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "exists": false } ] } diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json index a65839f7..c42b287b 100644 --- a/script/data/feature/metadata.json +++ b/script/data/feature/metadata.json @@ -81,6 +81,41 @@ "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", @@ -116,6 +151,21 @@ ], "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", @@ -147,5 +197,85 @@ "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 index 8190573b..033fd589 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -301,6 +301,157 @@ { "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 }, @@ -452,7 +603,7 @@ { "number": "0xfe", "name": "INVALID", "supported": true }, { "number": "0xff", "name": "SELFDESTRUCT", "supported": true } ], - "42161": [ + "34443": [ { "number": "0x00", "name": "STOP", "supported": true }, { "number": "0x01", "name": "ADD", "supported": true }, { "number": "0x02", "name": "MUL", "supported": true }, @@ -506,7 +657,7 @@ { "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": "0x4a", "name": "BLOBBASEFEE", "supported": true }, { "number": "0x50", "name": "POP", "supported": true }, { "number": "0x51", "name": "MLOAD", "supported": true }, { "number": "0x52", "name": "MSTORE", "supported": true }, @@ -602,5 +753,609 @@ { "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 index 8384e88b..2b833d9f 100644 --- a/script/data/feature/precompiles.json +++ b/script/data/feature/precompiles.json @@ -103,6 +103,58 @@ "implemented": true } ], + "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 + } + ], "8453": [ { "name": "ecRecover", @@ -155,6 +207,58 @@ "implemented": true } ], + "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 + } + ], "42161": [ { "name": "ecRecover", @@ -206,5 +310,161 @@ "address": "0x000000000000000000000000000000000000000a", "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 + } + ], + "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 + } + ], + "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 + } ] } diff --git a/script/index.ts b/script/index.ts index bc68534d..4a65eb91 100644 --- a/script/index.ts +++ b/script/index.ts @@ -124,6 +124,7 @@ function selectRpcUrls(rpcUrls: string[]): string[] { '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)), diff --git a/src/lib/chains.json b/src/lib/chains.json index 7b0d0bcf..f95d8502 100644 --- a/src/lib/chains.json +++ b/src/lib/chains.json @@ -1,6 +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" } ] From 4c2fb99761a5b859f34cbe311f5eca420347b9d3 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 17:18:02 -0700 Subject: [PATCH 57/75] cleanup --- script/checks/opcodes.ts | 2 +- src/components/diff/DiffOpcodes.tsx | 7 ++-- src/components/features/FeatureTable.tsx | 45 +++++++++++++----------- 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts index 9269edeb..d636d037 100644 --- a/script/checks/opcodes.ts +++ b/script/checks/opcodes.ts @@ -42,7 +42,7 @@ async function checkOpcode(opcode: Opcode, client: PublicClient): Promise = { +export const knownOpcodes: Record = { 0x00: 'STOP', 0x01: 'ADD', 0x02: 'MUL', diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 86c9afcd..0921b2e1 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -2,6 +2,7 @@ import type { Chain } from '@/../script/index'; import { RenderDiff } from '@/components/diff/utils/RenderDiff'; import { Copyable } from '@/components/ui/Copyable'; import { toUppercaseHex } from '@/lib/utils'; +import { knownOpcodes } from '@/../script/checks/opcodes'; type Opcodes = Chain['opcodes']; type Opcode = Opcodes[0]; @@ -21,7 +22,7 @@ const formatOpcode = (opcode: Opcode | undefined): JSX.Element => { export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element => { if (!Array.isArray(base) || !Array.isArray(target)) return <>; - const opcodeNumbers = Array.from(Array(0xff + 1).keys()); + const opcodeNumbers = Object.keys(knownOpcodes).map(Number); const diffContent = ( <> @@ -42,8 +43,8 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element className="grid grid-cols-12 items-center border-b border-zinc-500/10 py-2 dark:border-zinc-500/20" >
    - - + +
    {formatOpcode(baseOpcode)}
    {formatOpcode(targetOpcode)}
    diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 3de0e3ba..f4b01011 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -7,6 +7,7 @@ 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, type Address } from 'viem'; type Metadata = Chain['metadata']; @@ -147,27 +148,29 @@ const PrecompilesTable = ({ featureData }: { featureData: Record }) => { return ( - {featureData['1'].map((op) => ( - - - {op.name} -
    {toUppercaseHex(Number(op.number))}
    - - {Object.keys(featureData).map((chainId) => { - const opcode = featureData[chainId].find((opcode) => opcode.number === op.number); - const bgColor = opcode - ? opcode.supported - ? supportedClasses - : unsupportedClasses - : ''; - return ( - - {opcode ? (opcode.supported ? 'Yes' : 'No') : 'Unknown'} - - ); - })} - - ))} + {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'} + + ); + })} + + ))} ); }; From 6e4fef80323b3285cc4d6ee50f35e1bf969161b6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 17:26:51 -0700 Subject: [PATCH 58/75] refactor home page --- src/components/FeatureDiffSelector.tsx | 72 ++++++++++++++++++ src/pages/features.tsx | 100 +++++++------------------ src/pages/index.tsx | 33 +++++--- 3 files changed, 121 insertions(+), 84 deletions(-) create mode 100644 src/components/FeatureDiffSelector.tsx diff --git a/src/components/FeatureDiffSelector.tsx b/src/components/FeatureDiffSelector.tsx new file mode 100644 index 00000000..e7be475f --- /dev/null +++ b/src/components/FeatureDiffSelector.tsx @@ -0,0 +1,72 @@ +import { useState } from 'react'; +import { useRouter } from 'next/router'; +import { BaseCombobox } from '@/components/ui/BaseCombobox'; +import features from '@/lib/features.json'; + +interface Section { + title: string; + infoText?: string; +} + +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.', + }, +}; + +export const FeatureDiffSelector = () => { + // --- URL Parsing --- + const router = useRouter(); + + // --- Prepare options --- + const options = features.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/pages/features.tsx b/src/pages/features.tsx index f1b10a38..e7b8a782 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -1,10 +1,7 @@ -import { useState } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { FeatureTable } from '@/components/features/FeatureTable'; -import { BaseCombobox } from '@/components/ui/BaseCombobox'; -import features from '@/lib/features.json'; interface Section { title: string; @@ -37,87 +34,40 @@ const Features = () => { const router = useRouter(); const { feature } = router.query; - // --- Prepare options --- - const options = features.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 } }); - }; - const onBack = (e: React.MouseEvent) => { e.preventDefault(); router.push({ pathname: '/features' }); }; - // --- Selector Div --- - const SelectorDiv = () => ( -
    -
    -

    - Compare Support Across Chains -

    -

    - Choose a feature or property and check its support across chains. -

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

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

    - -
    -
    - + return ( +
    +

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

    - -
    +
    +
    + -

    - - 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 <>{feature ? : }; +

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

    +
    +
    + ); }; export default Features; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 5a4deb06..c9c3e7d1 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,19 +1,34 @@ 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 -

    -
    - +
    +
    +
    + Diff Two Chains +
    +

    + Compare all execution layer differences between chains in a friendly format +

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

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

    +
    + +
    +
    From 085a60706e136aa3ae907264f2cc8dc0dbe19cdc Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 18:30:45 -0700 Subject: [PATCH 59/75] tweaks --- src/lib/utils.ts | 2 ++ src/pages/diff.tsx | 12 ++++++++++++ src/pages/features.tsx | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 5fce11f9..274fca25 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -51,6 +51,8 @@ export const toUppercase = (str: string) => str.charAt(0).toUpperCase() + str.sl 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`; }; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 0c2df820..26650768 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -13,6 +13,7 @@ import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; import { chainLogoUrl } from '@/lib/utils'; import Image from 'next/image'; +import { ArrowLeftIcon } from '@heroicons/react/20/solid'; interface Props { base: T; @@ -144,9 +145,20 @@ const Diff = () => { // and remove the need for `?` and `!` operators. const DiffDiv = ({ baseChain, targetChain }: { baseChain: Chain; targetChain: Chain }) => { const sections = Object.keys(SECTION_MAP); + const onBack = (e: React.MouseEvent) => { + e.preventDefault(); + router.push({ pathname: '/' }); + }; + return ( <>
    +
    { const onBack = (e: React.MouseEvent) => { e.preventDefault(); - router.push({ pathname: '/features' }); + router.push({ pathname: '/' }); }; return ( From b4f9b9ac81c9aa72ded38832b2a4724fe3bfed71 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 18:51:14 -0700 Subject: [PATCH 60/75] remove old code --- src/chains/arbitrum/accountTypes.ts | 1 - src/chains/arbitrum/deployedContracts.ts | 246 ------- src/chains/arbitrum/index.ts | 24 - src/chains/arbitrum/nodes.ts | 14 - src/chains/arbitrum/signatureTypes.ts | 111 ---- .../arbitrum/vm/opcodes/block/blockhash.ts | 25 - .../arbitrum/vm/opcodes/block/coinbase.ts | 24 - .../arbitrum/vm/opcodes/block/number.ts | 20 - .../arbitrum/vm/opcodes/block/prevrandao.ts | 13 - .../arbitrum/vm/opcodes/environment/caller.ts | 11 - .../arbitrum/vm/opcodes/environment/origin.ts | 11 - src/chains/arbitrum/vm/opcodes/index.ts | 26 - src/chains/arbitrum/vm/opcodes/stack/push0.ts | 7 - src/chains/arbitrum/vm/precompiles.ts | 269 -------- src/chains/arbitrum/vm/predeploys.ts | 3 - src/chains/index.ts | 10 - src/chains/mainnet/accountTypes.ts | 34 - src/chains/mainnet/deployedContracts.ts | 151 ----- src/chains/mainnet/eips.ts | 554 ---------------- src/chains/mainnet/hardforks.ts | 44 -- src/chains/mainnet/index.ts | 27 - src/chains/mainnet/mempools.ts | 101 --- src/chains/mainnet/nodes/consensus.ts | 48 -- src/chains/mainnet/nodes/execution.ts | 66 -- src/chains/mainnet/signatureTypes.ts | 76 --- .../mainnet/vm/opcodes/arithmetic/add.ts | 50 -- .../mainnet/vm/opcodes/arithmetic/addmod.ts | 56 -- .../mainnet/vm/opcodes/arithmetic/div.ts | 51 -- .../mainnet/vm/opcodes/arithmetic/exp.ts | 65 -- .../mainnet/vm/opcodes/arithmetic/index.ts | 26 - .../mainnet/vm/opcodes/arithmetic/mod.ts | 51 -- .../mainnet/vm/opcodes/arithmetic/mul.ts | 50 -- .../mainnet/vm/opcodes/arithmetic/mulmod.ts | 60 -- .../mainnet/vm/opcodes/arithmetic/sdiv.ts | 57 -- .../vm/opcodes/arithmetic/signextend.ts | 50 -- .../mainnet/vm/opcodes/arithmetic/smod.ts | 57 -- .../mainnet/vm/opcodes/arithmetic/sub.ts | 50 -- src/chains/mainnet/vm/opcodes/bitwise/and.ts | 50 -- src/chains/mainnet/vm/opcodes/bitwise/byte.ts | 51 -- .../mainnet/vm/opcodes/bitwise/index.ts | 20 - src/chains/mainnet/vm/opcodes/bitwise/not.ts | 40 -- src/chains/mainnet/vm/opcodes/bitwise/or.ts | 50 -- src/chains/mainnet/vm/opcodes/bitwise/sar.ts | 53 -- src/chains/mainnet/vm/opcodes/bitwise/shl.ts | 53 -- src/chains/mainnet/vm/opcodes/bitwise/shr.ts | 53 -- src/chains/mainnet/vm/opcodes/bitwise/xor.ts | 50 -- .../mainnet/vm/opcodes/block/blockhash.ts | 36 -- .../mainnet/vm/opcodes/block/chainid.ts | 33 - .../mainnet/vm/opcodes/block/coinbase.ts | 27 - .../mainnet/vm/opcodes/block/gaslimit.ts | 27 - src/chains/mainnet/vm/opcodes/block/index.ts | 16 - src/chains/mainnet/vm/opcodes/block/number.ts | 27 - .../mainnet/vm/opcodes/block/prevrandao.ts | 33 - .../mainnet/vm/opcodes/block/timestamp.ts | 27 - .../mainnet/vm/opcodes/comparison/eq.ts | 51 -- .../mainnet/vm/opcodes/comparison/gt.ts | 51 -- .../mainnet/vm/opcodes/comparison/index.ts | 16 - .../mainnet/vm/opcodes/comparison/iszero.ts | 47 -- .../mainnet/vm/opcodes/comparison/lt.ts | 51 -- .../mainnet/vm/opcodes/comparison/sgt.ts | 51 -- .../mainnet/vm/opcodes/comparison/slt.ts | 52 -- .../mainnet/vm/opcodes/controlFlow/gas.ts | 31 - .../mainnet/vm/opcodes/controlFlow/index.ts | 16 - .../mainnet/vm/opcodes/controlFlow/jump.ts | 38 -- .../vm/opcodes/controlFlow/jumpdest.ts | 18 - .../mainnet/vm/opcodes/controlFlow/jumpi.ts | 43 -- .../mainnet/vm/opcodes/controlFlow/pc.ts | 34 - .../mainnet/vm/opcodes/controlFlow/stop.ts | 18 - .../mainnet/vm/opcodes/environment/address.ts | 33 - .../mainnet/vm/opcodes/environment/balance.ts | 51 -- .../mainnet/vm/opcodes/environment/basefee.ts | 33 - .../vm/opcodes/environment/calldatacopy.ts | 96 --- .../vm/opcodes/environment/calldataload.ts | 49 -- .../vm/opcodes/environment/calldatasize.ts | 34 - .../mainnet/vm/opcodes/environment/caller.ts | 34 - .../vm/opcodes/environment/callvalue.ts | 33 - .../vm/opcodes/environment/codecopy.ts | 97 --- .../vm/opcodes/environment/codesize.ts | 38 -- .../vm/opcodes/environment/extcodecopy.ts | 106 --- .../vm/opcodes/environment/extcodehash.ts | 51 -- .../vm/opcodes/environment/extcodesize.ts | 50 -- .../vm/opcodes/environment/gasprice.ts | 33 - .../mainnet/vm/opcodes/environment/index.ts | 40 -- .../mainnet/vm/opcodes/environment/origin.ts | 34 - .../vm/opcodes/environment/returndatacopy.ts | 102 --- .../vm/opcodes/environment/returndatasize.ts | 36 -- .../vm/opcodes/environment/selfbalance.ts | 36 -- src/chains/mainnet/vm/opcodes/index.ts | 28 - src/chains/mainnet/vm/opcodes/keccak/index.ts | 6 - .../mainnet/vm/opcodes/keccak/keccak.ts | 94 --- src/chains/mainnet/vm/opcodes/log/index.ts | 6 - src/chains/mainnet/vm/opcodes/log/log.ts | 97 --- src/chains/mainnet/vm/opcodes/memory/index.ts | 12 - src/chains/mainnet/vm/opcodes/memory/mload.ts | 85 --- src/chains/mainnet/vm/opcodes/memory/msize.ts | 33 - .../mainnet/vm/opcodes/memory/mstore.ts | 80 --- .../mainnet/vm/opcodes/memory/mstore8.ts | 80 --- src/chains/mainnet/vm/opcodes/stack/dup.ts | 88 --- src/chains/mainnet/vm/opcodes/stack/index.ts | 13 - src/chains/mainnet/vm/opcodes/stack/pop.ts | 34 - src/chains/mainnet/vm/opcodes/stack/push.ts | 81 --- src/chains/mainnet/vm/opcodes/stack/swap.ts | 92 --- .../mainnet/vm/opcodes/storage/index.ts | 8 - .../mainnet/vm/opcodes/storage/sload.ts | 71 -- .../mainnet/vm/opcodes/storage/sstore.ts | 124 ---- src/chains/mainnet/vm/opcodes/system/call.ts | 125 ---- .../mainnet/vm/opcodes/system/callcode.ts | 116 ---- .../mainnet/vm/opcodes/system/create.ts | 120 ---- .../mainnet/vm/opcodes/system/create2.ts | 111 ---- .../mainnet/vm/opcodes/system/delegatecall.ts | 111 ---- src/chains/mainnet/vm/opcodes/system/index.ts | 24 - .../mainnet/vm/opcodes/system/invalid.ts | 16 - .../mainnet/vm/opcodes/system/return.ts | 80 --- .../mainnet/vm/opcodes/system/revert.ts | 81 --- .../mainnet/vm/opcodes/system/selfdestruct.ts | 57 -- .../mainnet/vm/opcodes/system/staticcall.ts | 99 --- src/chains/mainnet/vm/precompiles.ts | 440 ------------- src/chains/mainnet/vm/predeploys.ts | 3 - src/chains/optimism/accountTypes.ts | 1 - src/chains/optimism/deployedContracts.ts | 31 - src/chains/optimism/eips.ts | 73 --- src/chains/optimism/hardforks.ts | 33 - src/chains/optimism/index.ts | 25 - src/chains/optimism/nodes.ts | 27 - src/chains/optimism/signatureTypes.ts | 25 - .../optimism/vm/opcodes/block/coinbase.ts | 23 - .../optimism/vm/opcodes/block/prevrandao.ts | 20 - .../optimism/vm/opcodes/environment/caller.ts | 20 - .../optimism/vm/opcodes/environment/origin.ts | 20 - src/chains/optimism/vm/opcodes/index.ts | 22 - src/chains/optimism/vm/opcodes/stack/push0.ts | 7 - src/chains/optimism/vm/precompiles.ts | 4 - src/chains/optimism/vm/predeploys.ts | 604 ------------------ src/components/diff/DiffAccountTypes.tsx | 77 --- src/components/diff/DiffNodes.tsx | 105 --- src/components/diff/utils/format.tsx | 35 - src/components/layout/Head.tsx | 6 +- src/lib/constants.ts | 2 - src/lib/opcodes.ts | 40 -- src/lib/utils.ts | 6 + src/pages/api/og.tsx | 112 +--- src/pages/diff.tsx | 4 - src/types/accountType.ts | 12 - src/types/chain.ts | 24 - src/types/deployedContract.ts | 30 - src/types/eip.ts | 34 - src/types/index.ts | 15 - src/types/mempool.ts | 20 - src/types/node.ts | 30 - src/types/opcode.ts | 51 -- src/types/precompile.ts | 29 - src/types/predeploy.ts | 21 - src/types/signatureType.ts | 10 - 153 files changed, 16 insertions(+), 8685 deletions(-) delete mode 100644 src/chains/arbitrum/accountTypes.ts delete mode 100644 src/chains/arbitrum/deployedContracts.ts delete mode 100644 src/chains/arbitrum/index.ts delete mode 100644 src/chains/arbitrum/nodes.ts delete mode 100644 src/chains/arbitrum/signatureTypes.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/block/blockhash.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/block/coinbase.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/block/number.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/block/prevrandao.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/environment/caller.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/environment/origin.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/index.ts delete mode 100644 src/chains/arbitrum/vm/opcodes/stack/push0.ts delete mode 100644 src/chains/arbitrum/vm/precompiles.ts delete mode 100644 src/chains/arbitrum/vm/predeploys.ts delete mode 100644 src/chains/index.ts delete mode 100644 src/chains/mainnet/accountTypes.ts delete mode 100644 src/chains/mainnet/deployedContracts.ts delete mode 100644 src/chains/mainnet/eips.ts delete mode 100644 src/chains/mainnet/hardforks.ts delete mode 100644 src/chains/mainnet/index.ts delete mode 100644 src/chains/mainnet/mempools.ts delete mode 100644 src/chains/mainnet/nodes/consensus.ts delete mode 100644 src/chains/mainnet/nodes/execution.ts delete mode 100644 src/chains/mainnet/signatureTypes.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/add.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/addmod.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/div.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/exp.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/mod.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/mul.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/mulmod.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/sdiv.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/signextend.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/smod.ts delete mode 100644 src/chains/mainnet/vm/opcodes/arithmetic/sub.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/and.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/byte.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/not.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/or.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/sar.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/shl.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/shr.ts delete mode 100644 src/chains/mainnet/vm/opcodes/bitwise/xor.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/blockhash.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/chainid.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/coinbase.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/gaslimit.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/number.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/prevrandao.ts delete mode 100644 src/chains/mainnet/vm/opcodes/block/timestamp.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/eq.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/gt.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/iszero.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/lt.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/sgt.ts delete mode 100644 src/chains/mainnet/vm/opcodes/comparison/slt.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/gas.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/jump.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/jumpdest.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/jumpi.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/pc.ts delete mode 100644 src/chains/mainnet/vm/opcodes/controlFlow/stop.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/address.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/balance.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/basefee.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/calldatacopy.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/calldataload.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/calldatasize.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/caller.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/callvalue.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/codecopy.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/codesize.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/extcodecopy.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/extcodehash.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/extcodesize.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/gasprice.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/origin.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/returndatacopy.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/returndatasize.ts delete mode 100644 src/chains/mainnet/vm/opcodes/environment/selfbalance.ts delete mode 100644 src/chains/mainnet/vm/opcodes/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/keccak/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/keccak/keccak.ts delete mode 100644 src/chains/mainnet/vm/opcodes/log/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/log/log.ts delete mode 100644 src/chains/mainnet/vm/opcodes/memory/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/memory/mload.ts delete mode 100644 src/chains/mainnet/vm/opcodes/memory/msize.ts delete mode 100644 src/chains/mainnet/vm/opcodes/memory/mstore.ts delete mode 100644 src/chains/mainnet/vm/opcodes/memory/mstore8.ts delete mode 100644 src/chains/mainnet/vm/opcodes/stack/dup.ts delete mode 100644 src/chains/mainnet/vm/opcodes/stack/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/stack/pop.ts delete mode 100644 src/chains/mainnet/vm/opcodes/stack/push.ts delete mode 100644 src/chains/mainnet/vm/opcodes/stack/swap.ts delete mode 100644 src/chains/mainnet/vm/opcodes/storage/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/storage/sload.ts delete mode 100644 src/chains/mainnet/vm/opcodes/storage/sstore.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/call.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/callcode.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/create.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/create2.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/delegatecall.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/index.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/invalid.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/return.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/revert.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/selfdestruct.ts delete mode 100644 src/chains/mainnet/vm/opcodes/system/staticcall.ts delete mode 100644 src/chains/mainnet/vm/precompiles.ts delete mode 100644 src/chains/mainnet/vm/predeploys.ts delete mode 100644 src/chains/optimism/accountTypes.ts delete mode 100644 src/chains/optimism/deployedContracts.ts delete mode 100644 src/chains/optimism/eips.ts delete mode 100644 src/chains/optimism/hardforks.ts delete mode 100644 src/chains/optimism/index.ts delete mode 100644 src/chains/optimism/nodes.ts delete mode 100644 src/chains/optimism/signatureTypes.ts delete mode 100644 src/chains/optimism/vm/opcodes/block/coinbase.ts delete mode 100644 src/chains/optimism/vm/opcodes/block/prevrandao.ts delete mode 100644 src/chains/optimism/vm/opcodes/environment/caller.ts delete mode 100644 src/chains/optimism/vm/opcodes/environment/origin.ts delete mode 100644 src/chains/optimism/vm/opcodes/index.ts delete mode 100644 src/chains/optimism/vm/opcodes/stack/push0.ts delete mode 100644 src/chains/optimism/vm/precompiles.ts delete mode 100644 src/chains/optimism/vm/predeploys.ts delete mode 100644 src/components/diff/DiffAccountTypes.tsx delete mode 100644 src/components/diff/DiffNodes.tsx delete mode 100644 src/components/diff/utils/format.tsx delete mode 100644 src/lib/opcodes.ts delete mode 100644 src/types/accountType.ts delete mode 100644 src/types/chain.ts delete mode 100644 src/types/deployedContract.ts delete mode 100644 src/types/eip.ts delete mode 100644 src/types/index.ts delete mode 100644 src/types/mempool.ts delete mode 100644 src/types/node.ts delete mode 100644 src/types/opcode.ts delete mode 100644 src/types/precompile.ts delete mode 100644 src/types/predeploy.ts delete mode 100644 src/types/signatureType.ts diff --git a/src/chains/arbitrum/accountTypes.ts b/src/chains/arbitrum/accountTypes.ts deleted file mode 100644 index e9bd46f9..00000000 --- a/src/chains/arbitrum/accountTypes.ts +++ /dev/null @@ -1 +0,0 @@ -export { accountTypes } from '@/chains/mainnet/accountTypes'; diff --git a/src/chains/arbitrum/deployedContracts.ts b/src/chains/arbitrum/deployedContracts.ts deleted file mode 100644 index 02e2bd73..00000000 --- a/src/chains/arbitrum/deployedContracts.ts +++ /dev/null @@ -1,246 +0,0 @@ -import { deployedContracts as mainnetDeployedContracts } from '@/chains/mainnet/deployedContracts'; -import { type DeployedContract, DeployedContractKind } from '@/types'; - -const ARBITRUM_SMART_CONTRACT_ADDRESSES = - '[Arbitrum Smart Contract Addresses](https://docs.arbitrum.io/for-devs/useful-addresses)'; - -const arbitrumDeployedContracts: Record = { - ...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 7282acf6..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 type { 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 85c291bc..00000000 --- a/src/chains/arbitrum/nodes.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Language, type 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 327f8953..00000000 --- a/src/chains/arbitrum/signatureTypes.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import type { 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 84d6b997..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 type { 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 379665a7..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 type { 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 1d9e17ce..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 type { 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 55521a45..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 type { 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 0fb03bec..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 type { 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 3d3fd9a3..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 type { 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 8dccaaca..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 type { 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 ce7f3fff..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 type { 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 17513d10..00000000 --- a/src/chains/arbitrum/vm/precompiles.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import type { 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 65fc05f8..00000000 --- a/src/chains/arbitrum/vm/predeploys.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { Predeploy } from '@/types'; - -export const predeploys: Predeploy[] = []; diff --git a/src/chains/index.ts b/src/chains/index.ts deleted file mode 100644 index 9965aee7..00000000 --- a/src/chains/index.ts +++ /dev/null @@ -1,10 +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; - return Object.values(chains).find((chain) => BigInt(chain.metadata.id) === BigInt(chainId)); -}; diff --git a/src/chains/mainnet/accountTypes.ts b/src/chains/mainnet/accountTypes.ts deleted file mode 100644 index 9d7ba826..00000000 --- a/src/chains/mainnet/accountTypes.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { 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 7ba2d21a..00000000 --- a/src/chains/mainnet/deployedContracts.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { type 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 468c0ff3..00000000 --- a/src/chains/mainnet/eips.ts +++ /dev/null @@ -1,554 +0,0 @@ -import { type 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 1ba9c932..00000000 --- a/src/chains/mainnet/hardforks.ts +++ /dev/null @@ -1,44 +0,0 @@ -export enum MainnetHardfork { - Frontier = 0, - Homestead = 1, - DaoFork = 2, - TangerineWhistle = 3, - SpuriousDragon = 4, - Byzantium = 5, - Constantinople = 6, - // The Petersburg hard fork doesn't exist in ethereum/execution-specs so we do not reference it. - Istanbul = 7, - MuirGlacier = 8, - Berlin = 9, - London = 10, - ArrowGlacier = 11, - GrayGlacier = 12, - Paris = 13, - Shanghai = 14, -} - -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 dfc76b8a..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 type { 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 ca336871..00000000 --- a/src/chains/mainnet/mempools.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { 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 d8dec980..00000000 --- a/src/chains/mainnet/nodes/consensus.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Language, type 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 1d808551..00000000 --- a/src/chains/mainnet/nodes/execution.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Language, type 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 b1d0a526..00000000 --- a/src/chains/mainnet/signatureTypes.ts +++ /dev/null @@ -1,76 +0,0 @@ -import type { 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 5d756874..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 type { 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 1b4a1439..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 type { 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 c3d9872e..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 type { 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 6206bc2c..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 type { 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 334ece06..00000000 --- a/src/chains/mainnet/vm/opcodes/arithmetic/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { 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 b8b25ce2..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 type { 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 b35d1aa2..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 type { 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 f00037df..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 type { 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 0c8f37e2..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 type { 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 08dedab8..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 type { 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 5b290a2e..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 type { 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 4009d344..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 type { 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 27b25754..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 type { 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 f1a0e3ea..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 type { 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 6ec2c98b..00000000 --- a/src/chains/mainnet/vm/opcodes/bitwise/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { 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 a368e4f3..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 type { 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 4229991a..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 type { 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 d68c1e00..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 type { 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 a177125f..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 type { 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 b4bac833..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 type { 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 93e11633..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 type { 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 1c2a474f..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 type { 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 d6121b8e..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 type { 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 56bce38c..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 type { 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 b2b1244e..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 type { 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 977c9b42..00000000 --- a/src/chains/mainnet/vm/opcodes/block/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { 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 abdf947f..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 type { 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 c3d4a161..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 type { 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 ab9c4eb5..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 type { 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 d56966cb..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 type { 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 b3a6579d..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 type { 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 4427b51c..00000000 --- a/src/chains/mainnet/vm/opcodes/comparison/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { 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 aab506c2..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 type { 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 cb2d48da..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 type { 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 e8c52650..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 type { 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 6af7c11e..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 type { 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 60efee63..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 type { 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 6649daec..00000000 --- a/src/chains/mainnet/vm/opcodes/controlFlow/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { 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 c3c26e3c..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 type { 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 7130c066..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 type { 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 a5e8f282..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 type { 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 b208c927..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 type { 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 34ca2feb..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 type { 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 80123c16..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 type { 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 04b0676d..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 type { 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 05eba41b..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 type { 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 cd4c42b7..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 type { 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 9a2dcad5..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 type { 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 9f87bca8..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 type { 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 318c68d8..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 type { 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 738b42df..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 type { 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 712a6ca2..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 type { 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 e90a965d..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 type { 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 fae565a4..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 type { 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 3f0d9e95..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 type { 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 77d0f20b..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 type { 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 f8b294ba..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 type { 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 beee8f61..00000000 --- a/src/chains/mainnet/vm/opcodes/environment/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { 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 18ca3163..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 type { 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 fef04d9f..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 type { 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 4e780a96..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 type { 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 392f34d1..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 type { 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 3776af1a..00000000 --- a/src/chains/mainnet/vm/opcodes/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { 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 c281a9d7..00000000 --- a/src/chains/mainnet/vm/opcodes/keccak/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { 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 05b01a03..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 type { 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 6ef055e9..00000000 --- a/src/chains/mainnet/vm/opcodes/log/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { 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 3bccf7ac..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 type { 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 55fc56b0..00000000 --- a/src/chains/mainnet/vm/opcodes/memory/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { 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 35e98fad..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 type { 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 859ec6af..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 type { 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 950dc707..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 type { 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 e7d38fcf..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 type { 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 c8f79b67..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 type { 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 7ae3050c..00000000 --- a/src/chains/mainnet/vm/opcodes/stack/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { 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 8223b8ca..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 type { 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 bb808fad..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 type { 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 ac4b5f84..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 type { 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 82323e53..00000000 --- a/src/chains/mainnet/vm/opcodes/storage/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { 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 1b9b9fbf..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 type { 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 6e497dcf..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 type { 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 58b9f81c..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 type { 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 83361cce..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 type { 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 a466cb0d..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 type { 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 1e8eff0f..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 type { 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 67d31607..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 type { 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 49e89992..00000000 --- a/src/chains/mainnet/vm/opcodes/system/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { 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 1cdca00e..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 type { 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 30c36fd2..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 type { 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 32d81526..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 type { 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 05bdd9a0..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 type { 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 0641cb5b..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 type { 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 5d2a26ba..00000000 --- a/src/chains/mainnet/vm/precompiles.ts +++ /dev/null @@ -1,440 +0,0 @@ -import type { 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 65fc05f8..00000000 --- a/src/chains/mainnet/vm/predeploys.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { 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 0d9a5dfe..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 383b25ab..00000000 --- a/src/chains/optimism/eips.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { type 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 8e2601f6..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 = 0, - Canyon = 1, -} - -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 00c5532a..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 type { 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 90918fc5..00000000 --- a/src/chains/optimism/nodes.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Language, type 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 5bd6a7f1..00000000 --- a/src/chains/optimism/signatureTypes.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { signatureTypes as mainnetSignatureTypes } from '@/chains/mainnet/signatureTypes'; -import type { 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 7e44c1af..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 type { 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 18517ed4..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 type { 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 d9d4dd48..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 type { 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 405e9b14..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 type { 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 868880b2..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 type { 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 ebf40ed4..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 type { 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 d3ce8f63..00000000 --- a/src/chains/optimism/vm/precompiles.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { precompiles as mainnetPrecompiles } from '@/chains/mainnet/vm/precompiles'; -import type { 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 2e38d2d8..00000000 --- a/src/chains/optimism/vm/predeploys.ts +++ /dev/null @@ -1,604 +0,0 @@ -import type { 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/diff/DiffAccountTypes.tsx b/src/components/diff/DiffAccountTypes.tsx deleted file mode 100644 index 3fef0be1..00000000 --- a/src/components/diff/DiffAccountTypes.tsx +++ /dev/null @@ -1,77 +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 type { 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 show = !isEqual || !onlyShowDiff; - - if (!show) return false; - return ( -
    -
    - -
    -
    {formatAccountType(baseAccountType)}
    -
    {formatAccountType(targetAccountType)}
    -
    - ); - })} - - ); - - return ; -}; diff --git a/src/components/diff/DiffNodes.tsx b/src/components/diff/DiffNodes.tsx deleted file mode 100644 index 9c160e7c..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, type 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/utils/format.tsx b/src/components/diff/utils/format.tsx deleted file mode 100644 index 14fe85d1..00000000 --- a/src/components/diff/utils/format.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { MainnetHardfork } from '@/chains/mainnet/hardforks'; -import { CURRENT_OPTIMISM_HARDFORK, OptimismHardfork } from '@/chains/optimism/hardforks'; -import { CURRENT_MAINNET_HARDFORK } from '@/lib/constants'; - -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} -

    - ); -}; diff --git a/src/components/layout/Head.tsx b/src/components/layout/Head.tsx index c9d5a5b2..aacc90a4 100644 --- a/src/components/layout/Head.tsx +++ b/src/components/layout/Head.tsx @@ -1,6 +1,6 @@ import NextHead from 'next/head'; import { type NextRouter, useRouter } from 'next/router'; -import { getChainById } from '@/chains'; +import { getChainById } from '@/lib/utils'; import { COMPANY_URL, OG_ENDPOINT, @@ -18,8 +18,8 @@ const getRouteData = (router: NextRouter) => { 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; + const baseTitle = getChainById(Number(base))?.name; + const targetTitle = getChainById(Number(target))?.name; if (!baseTitle || !targetTitle) return defaultRouteData; const title = `${baseTitle} vs ${targetTitle} | ${SITE_NAME}`; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index d8e7902d..ef1b0e05 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -10,8 +10,6 @@ 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'; - // 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'; diff --git a/src/lib/opcodes.ts b/src/lib/opcodes.ts deleted file mode 100644 index 20ea3de8..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 index 274fca25..5ae0dc2a 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,4 +1,5 @@ import { pad } 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(' '); @@ -56,3 +57,8 @@ export const chainLogoUrl = (chain: { name: string; chainId: number }) => { 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 getChainById = (chainId: number) => { + if (!chainId) return undefined; + return chains.find((chain) => chain.chainId === chainId); +}; diff --git a/src/pages/api/og.tsx b/src/pages/api/og.tsx index c7aa4d1e..099f13f1 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -1,72 +1,15 @@ import type { NextRequest } from 'next/server'; import { ImageResponse } from '@vercel/og'; -import { getAddress } from 'viem'; -import { getChainById } from '@/chains'; +import { getChainById } from '@/lib/utils'; import { SITE_DESCRIPTION } from '@/lib/constants'; -import type { Chain, Opcode, Precompile, Predeploy, SignatureType } from '@/types'; export const config = { 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); - } - if (typeof a === 'number' && typeof b === 'number') { - return a - b; - } - throw new Error('Invalid key types for sorting.'); - }); - const keys = [...new Set(sortedKeys)]; - - return keys.reduce((acc: number, key: string | number) => { - let count = acc; - 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(a) === JSON.stringify(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); +type Chain = { + chainId: number; + name: string; }; export default async function handler(request: NextRequest) { @@ -123,21 +66,9 @@ export default async function handler(request: NextRequest) { ); }; - const generateDiffImage = async (baseChain: Chain, targetChain: Chain) => { + 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(
    {/* 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, @@ -203,10 +105,10 @@ export default async function handler(request: NextRequest) { const target = searchParams.get('target')?.slice(0, 100); // ?target= if (!base || !target) return generateDefaultImage(); - const baseChain = getChainById(base as string); + const baseChain = getChainById(Number(base)); if (baseChain === undefined) return generateDefaultImage(); - const targetChain = getChainById(target as string); + const targetChain = getChainById(Number(target)); if (targetChain === undefined) return generateDefaultImage(); return await generateDiffImage(baseChain, targetChain); diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 26650768..82fae35d 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -52,10 +52,6 @@ const SECTION_MAP: Record = { '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.', }, // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, - // accountTypes: { title: 'Account Types', component: DiffAccountTypes }, - // 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 }; const Diff = () => { diff --git a/src/types/accountType.ts b/src/types/accountType.ts deleted file mode 100644 index b1906cd5..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 1e8b9ce6..00000000 --- a/src/types/chain.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Chain as Metadata } from '@wagmi/chains'; -import type { AccountType } from './accountType'; -import type { DeployedContract } from './deployedContract'; -import type { EIP } from './eip'; -import type { Mempool } from './mempool'; -import type { Node } from './node'; -import type { Opcode } from './opcode'; -import type { Precompile } from './precompile'; -import type { Predeploy } from './predeploy'; -import type { 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 3786180c..00000000 --- a/src/types/deployedContract.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { Address } from 'viem'; - -export enum DeployedContractKind { - WrappedNativeAsset = 0, - Utility = 1, -} - -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 bb581a2f..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 = 0, - Consensus = 1, -} - -export enum EIPState { - Draft = 0, - Review = 1, - LastCall = 2, - Final = 3, - Stagnant = 4, - Withdrawn = 5, - Living = 6, -} - -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 749eca71..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 92ccbe05..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 221e2a5d..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 = 0, - Consensus = 1, -} - -export enum Language { - Java = 0, - Go = 1, - CSharp = 2, - Rust = 3, - TypeScript = 4, - Nim = 5, -} - -export enum SyncStrategy { - Snap = 0, - Fast = 1, - Full = 2, -} diff --git a/src/types/opcode.ts b/src/types/opcode.ts deleted file mode 100644 index 605025c1..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 f9aad5d8..00000000 --- a/src/types/precompile.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { 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 9f410deb..00000000 --- a/src/types/predeploy.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { 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 5cc33b06..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[]; -}; From 2e30906c215ad46cb24ac03dec3edc97ba2963b9 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 19:31:43 -0700 Subject: [PATCH 61/75] fixes --- src/pages/diff.tsx | 14 ++++++++++---- src/pages/features.tsx | 41 ++++++++++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 82fae35d..4c302ae7 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; import { useRouter } from 'next/router'; -import { LinkIcon } from '@heroicons/react/20/solid'; +import { LinkIcon, ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import type { Chain } from '@/../script/index'; import { ChainDiffSelector } from '@/components/ChainDiffSelector'; import { DiffDeployedContracts } from '@/components/diff/DiffDeployedContracts'; @@ -13,7 +13,7 @@ import { Copyable } from '@/components/ui/Copyable'; import { Toggle } from '@/components/ui/Toggle'; import { chainLogoUrl } from '@/lib/utils'; import Image from 'next/image'; -import { ArrowLeftIcon } from '@heroicons/react/20/solid'; +import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; interface Props { base: T; @@ -115,7 +115,7 @@ const Diff = () => { const LoadingDiv = () => (
    -
    +

    Fetching Data...

    ); @@ -155,7 +155,7 @@ const Diff = () => { > Back -
    +
    { />
    +

    + + 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 */}
    diff --git a/src/pages/features.tsx b/src/pages/features.tsx index 51dbffee..c52391b3 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -1,7 +1,8 @@ -import Link from 'next/link'; import { useRouter } from 'next/router'; import { ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/solid'; import { FeatureTable } from '@/components/features/FeatureTable'; +import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; +import { FeatureDiffSelector } from '@/components/FeatureDiffSelector'; interface Section { title: string; @@ -29,8 +30,26 @@ const featureMap: Record = { }, }; +const LoadingDiv = () => ( +
    + +

    Fetching Data...

    +
    +); + +const ErrorDiv = () => ( +
    +

    Oops!

    +

    + Invalid feature provided, please try again below. +

    +
    + +
    +
    +); + const Features = () => { - // --- URL Parsing --- const router = useRouter(); const { feature } = router.query; @@ -39,6 +58,9 @@ const Features = () => { router.push({ pathname: '/' }); }; + if (!router.isReady) return ; + if (!((feature as string) in featureMap)) return ; + return (

    @@ -54,17 +76,14 @@ const Features = () => { Back +

    + + 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. +

    - -

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

    ); From df78ecf7e1a28381a3a9056c36c269c7f8fc96ee Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 20:38:24 -0700 Subject: [PATCH 62/75] add features to the comparison table --- src/components/features/FeatureTable.tsx | 35 ++++++++++++++++++------ src/pages/index.tsx | 4 +-- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index f4b01011..7030e5df 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import type { Chain } from '@/../script/index'; -import { classNames } from '@/lib/utils'; +import { chainLogoUrl, classNames } from '@/lib/utils'; import { ExternalLink } from '@/components/layout/ExternalLink'; import { toUppercaseHex } from '@/lib/utils'; import { deployedContracts } from '@/../script/checks/deployed-contracts'; @@ -9,6 +9,8 @@ import { Copyable } from '@/components/ui/Copyable'; import { evmStackAddresses, type EVMStackResult } from '@/../script/checks/evm-stack-addresses'; import { knownOpcodes } from '@/../script/checks/opcodes'; import { getAddress, type Address } from 'viem'; +import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; +import Image from 'next/image'; type Metadata = Chain['metadata']; type Opcodes = Chain['opcodes']; @@ -23,7 +25,7 @@ interface Section { 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'; +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'; @@ -279,14 +281,14 @@ export const FeatureTable = ({ return (
    -
    +
    ); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index c9c3e7d1..c2d36674 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -12,7 +12,7 @@ const Home = () => { Diff Two Chains

    - Compare all execution layer differences between chains in a friendly format + Compare all execution layer differences between chains in various formats

    @@ -23,7 +23,7 @@ const Home = () => { Compare Across Chains

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

    From 1a26ca1fdb970c4fb132b80a878a4ffd4062419c Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Wed, 15 May 2024 20:38:44 -0700 Subject: [PATCH 63/75] style: fmt --- src/components/features/FeatureTable.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 7030e5df..e4c8eea6 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -25,7 +25,8 @@ interface Section { 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 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'; @@ -288,7 +289,7 @@ export const FeatureTable = ({
    + className="text-primary text-center sticky top-0 left-0 z-20 py-3.5 px-2 text-sm font-semibold bg-white dark:bg-zinc-800" + >
    {feature === 'metadata' ? 'Property' : featureMap[feature].title.slice(0, -1)}
    @@ -296,10 +298,27 @@ export const FeatureTable = ({
    -
    - {metadata[chainId].name} +
    + +
    {metadata[chainId].name}
    + + +
    + >
    {feature === 'metadata' ? 'Property' : featureMap[feature].title.slice(0, -1)}
    From 20297a9338c314237e46515c4b718186ebcc2cf1 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Thu, 16 May 2024 22:46:47 +0200 Subject: [PATCH 64/75] Add precompile test for secp256r1 (#65) * Add precompile test for secp256r1 * update chain data --------- Co-authored-by: Matt Solomon --- script/checks/precompiles.ts | 10 +++++++ script/data/chain/1.json | 5 ++++ script/data/chain/10.json | 5 ++++ script/data/chain/137.json | 5 ++++ script/data/chain/34443.json | 5 ++++ script/data/chain/42161.json | 5 ++++ script/data/chain/43114.json | 5 ++++ script/data/chain/534352.json | 5 ++++ script/data/chain/59144.json | 5 ++++ script/data/chain/8453.json | 5 ++++ script/data/feature/precompiles.json | 45 ++++++++++++++++++++++++++++ 11 files changed, 100 insertions(+) diff --git a/script/checks/precompiles.ts b/script/checks/precompiles.ts index 19bed141..83508339 100644 --- a/script/checks/precompiles.ts +++ b/script/checks/precompiles.ts @@ -101,4 +101,14 @@ export const precompiles: { 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 index 8b549c18..f53416a2 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -292,6 +292,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/10.json b/script/data/chain/10.json index 2baf9731..a362ff67 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -278,6 +278,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/137.json b/script/data/chain/137.json index 5b9cafe1..4226dae2 100644 --- a/script/data/chain/137.json +++ b/script/data/chain/137.json @@ -279,6 +279,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": true } ], "evmStackAddresses": { diff --git a/script/data/chain/34443.json b/script/data/chain/34443.json index 3eddb24f..092c0861 100644 --- a/script/data/chain/34443.json +++ b/script/data/chain/34443.json @@ -259,6 +259,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index 36bf865a..30ce9599 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -276,6 +276,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/43114.json b/script/data/chain/43114.json index f9c5aca0..4f3bbc64 100644 --- a/script/data/chain/43114.json +++ b/script/data/chain/43114.json @@ -263,6 +263,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/534352.json b/script/data/chain/534352.json index 0021d68e..ae0b942b 100644 --- a/script/data/chain/534352.json +++ b/script/data/chain/534352.json @@ -266,6 +266,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/59144.json b/script/data/chain/59144.json index 3e13da1b..e6a43489 100644 --- a/script/data/chain/59144.json +++ b/script/data/chain/59144.json @@ -283,6 +283,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/chain/8453.json b/script/data/chain/8453.json index 26c66c67..c1ccc574 100644 --- a/script/data/chain/8453.json +++ b/script/data/chain/8453.json @@ -279,6 +279,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "evmStackAddresses": { diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json index 2b833d9f..3751afda 100644 --- a/script/data/feature/precompiles.json +++ b/script/data/feature/precompiles.json @@ -49,6 +49,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "10": [ @@ -101,6 +106,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "137": [ @@ -153,6 +163,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": true } ], "8453": [ @@ -205,6 +220,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "34443": [ @@ -257,6 +277,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": true + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "42161": [ @@ -309,6 +334,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "43114": [ @@ -361,6 +391,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "59144": [ @@ -413,6 +448,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ], "534352": [ @@ -465,6 +505,11 @@ "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", "implemented": false + }, + { + "name": "secp256r1", + "address": "0x0000000000000000000000000000000000000100", + "implemented": false } ] } From 9b253bb568990c118076129bac17c4c14fc88134 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 18 May 2024 06:21:07 -0700 Subject: [PATCH 65/75] doc: add API key note --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1063b5b3..0676f3a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,7 +30,8 @@ bun lint bun check ``` -Or, to fetch chain data: +To fetch chain data use the below commands. +It's recommend to have an `INFURA_API_KEY` set in your environment to improve performance. ```bash # Fetch all data for a single chain. From 531385f010a8dafbe428116dbb0dc4cc2bdfb04b Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 18 May 2024 06:49:28 -0700 Subject: [PATCH 66/75] chore: dynamic branch name --- package.json | 6 +++--- src/components/features/FeatureTable.tsx | 21 +++++++++++++-------- src/lib/constants.ts | 9 +++------ src/pages/diff.tsx | 5 +++-- 4 files changed, 22 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 1157a28e..7d2e5524 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "bun prepare-chain-data && next dev", - "build": "next build", - "start": "bun prepare-chain-data && next start", + "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", diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index e4c8eea6..80463ba4 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -11,6 +11,7 @@ import { knownOpcodes } from '@/../script/checks/opcodes'; import { getAddress, type Address } from 'viem'; import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; import Image from 'next/image'; +import { BASE_DATA_URL } from '@/lib/constants'; type Metadata = Chain['metadata']; type Opcodes = Chain['opcodes']; @@ -238,15 +239,19 @@ export const FeatureTable = ({ useEffect(() => { const fetchData = async () => { try { - const metadataUrl = - 'https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/metadata.json'; - const metadataRes = await fetch(metadataUrl); - const metadata = await metadataRes.json(); - setMetadata(metadata); + 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(); + }), + ); - const url = `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/feature/${feature}.json`; - const res = await fetch(url); - const featureData = await res.json(); + setMetadata(metadata); setFeatureData(featureData); } catch (error) { console.error('Error fetching data:', error); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ef1b0e05..4d87431a 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -9,9 +9,6 @@ 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 -------- -// 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'; +// -------- 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`; diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index 4c302ae7..1a0ef54e 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -14,6 +14,7 @@ import { Toggle } from '@/components/ui/Toggle'; import { chainLogoUrl } from '@/lib/utils'; import Image from 'next/image'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; +import { BASE_DATA_URL } from '@/lib/constants'; interface Props { base: T; @@ -78,8 +79,8 @@ const Diff = () => { const fetchData = async () => { try { const urls = [ - `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/chain/${base}.json`, - `https://raw.githubusercontent.com/mds1/evm-diff/refactor/automated/script/data/chain/${target}.json`, + `${BASE_DATA_URL}/chain/${base}.json`, + `${BASE_DATA_URL}/chain/${target}.json`, ]; const chainData = await Promise.all( From d31c0131aa758288007c9eb900a0750eec160419 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 18 May 2024 07:23:53 -0700 Subject: [PATCH 67/75] refactor: dedupe feature declarations --- src/components/FeatureDiffSelector.tsx | 37 ++++-------------- src/components/features/FeatureTable.tsx | 9 +---- src/lib/constants.ts | 29 ++++++++++++++ src/pages/diff.tsx | 50 +++++++----------------- src/pages/features.tsx | 27 +------------ 5 files changed, 53 insertions(+), 99 deletions(-) diff --git a/src/components/FeatureDiffSelector.tsx b/src/components/FeatureDiffSelector.tsx index e7be475f..003373e1 100644 --- a/src/components/FeatureDiffSelector.tsx +++ b/src/components/FeatureDiffSelector.tsx @@ -2,42 +2,19 @@ import { useState } from 'react'; import { useRouter } from 'next/router'; import { BaseCombobox } from '@/components/ui/BaseCombobox'; import features from '@/lib/features.json'; - -interface Section { - title: string; - infoText?: string; -} - -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.', - }, -}; +import { featureMap } from '@/lib/constants'; export const FeatureDiffSelector = () => { // --- URL Parsing --- const router = useRouter(); // --- Prepare options --- - const options = features.map(({ feature }) => ({ - key: feature, - name: featureMap[feature as keyof typeof featureMap].title, - })); + 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. diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 80463ba4..9ef23b59 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -11,7 +11,7 @@ import { knownOpcodes } from '@/../script/checks/opcodes'; import { getAddress, type Address } from 'viem'; import { ArrowTopRightOnSquareIcon } from '@heroicons/react/20/solid'; import Image from 'next/image'; -import { BASE_DATA_URL } from '@/lib/constants'; +import { BASE_DATA_URL, type Feature } from '@/lib/constants'; type Metadata = Chain['metadata']; type Opcodes = Chain['opcodes']; @@ -19,11 +19,6 @@ type DeployedContracts = Chain['deployedContracts']; type Precompiles = Chain['precompiles']; type EvmStackResults = Chain['evmStackAddresses']; -interface Section { - title: string; - infoText?: string; -} - const tbodyClasses = 'divide-y divide-zinc-200 dark:divide-zinc-600'; const trClasses = 'bg-secondary group'; const td1Classes = @@ -225,7 +220,7 @@ export const FeatureTable = ({ feature, featureMap, className, -}: { feature: string; featureMap: Record; className?: string }) => { +}: { feature: string; featureMap: Record; className?: string }) => { const [metadata, setMetadata] = useState | null>(null); const [featureData, setFeatureData] = useState< | Record diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 4d87431a..654dfb7f 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -12,3 +12,32 @@ export const TWITTER_URL = 'https://twitter.com/msolomon44'; // -------- 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`; + +// 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/pages/diff.tsx b/src/pages/diff.tsx index 1a0ef54e..e42d4038 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -14,7 +14,7 @@ import { Toggle } from '@/components/ui/Toggle'; import { chainLogoUrl } from '@/lib/utils'; import Image from 'next/image'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; -import { BASE_DATA_URL } from '@/lib/constants'; +import { BASE_DATA_URL, featureMap } from '@/lib/constants'; interface Props { base: T; @@ -22,37 +22,14 @@ interface Props { onlyShowDiff: boolean; } -interface Section { - title: string; - infoText?: string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - component: React.ComponentType>; -} - -const SECTION_MAP: Record = { - metadata: { title: 'Metadata', component: DiffMetadata }, - opcodes: { - title: 'Opcodes', - component: DiffOpcodes, - infoText: 'Whether or not standard opcodes are supported.', - }, - deployedContracts: { - title: 'Deployed Contracts', - component: DiffDeployedContracts, - infoText: 'Whether common utility contracts used by developers and users exist.', - }, - precompiles: { - title: 'Precompiles', - component: DiffPrecompiles, - infoText: 'Whether or not standard precompiles are supported.', - }, - evmStackAddresses: { - title: 'EVM Stack Addresses', - component: DiffEVMStackAddresses, - 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.', - }, - // signatureTypes: { title: 'Transaction and Signature Types', component: DiffSignatureTypes }, +// 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 = () => { @@ -134,14 +111,14 @@ const Diff = () => { onlyShowDiff: boolean; }) => { // if (!SECTION_MAP[section]) return <>; - const Component = SECTION_MAP[section].component; + 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(SECTION_MAP); + const sections = Object.keys(featureMap); const onBack = (e: React.MouseEvent) => { e.preventDefault(); router.push({ pathname: '/' }); @@ -223,6 +200,7 @@ const Diff = () => { {/* 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 ( @@ -230,12 +208,12 @@ const Diff = () => {
    -
    {SECTION_MAP[section].infoText}
    +
    {featureMap[section].infoText}
    diff --git a/src/pages/features.tsx b/src/pages/features.tsx index c52391b3..0acf0633 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -3,32 +3,7 @@ import { ArrowLeftIcon, ExclamationTriangleIcon } from '@heroicons/react/20/soli import { FeatureTable } from '@/components/features/FeatureTable'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; import { FeatureDiffSelector } from '@/components/FeatureDiffSelector'; - -interface Section { - title: string; - infoText?: string; -} - -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.', - }, -}; +import { featureMap } from '@/lib/constants'; const LoadingDiv = () => (
    From f04a9c0917dbc335ce2d6b42b13375bdb9be7907 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sat, 18 May 2024 07:55:13 -0700 Subject: [PATCH 68/75] refactor: more cleanup --- src/components/diff/DiffDeployedContracts.tsx | 25 +++++--- src/components/diff/DiffEVMStackAddresses.tsx | 10 +-- src/components/diff/DiffMetadata.tsx | 48 +++++++++----- src/components/diff/DiffOpcodes.tsx | 10 ++- src/components/diff/DiffPrecompiles.tsx | 21 +++--- src/components/diff/utils/Abi.tsx | 10 +-- src/components/features/FeatureTable.tsx | 15 ++--- src/components/layout/Head.tsx | 6 +- src/components/ui/Copyable.tsx | 9 ++- src/lib/utils.ts | 64 ------------------- src/lib/utils.tsx | 30 +++++++++ src/pages/api/og.tsx | 15 +++-- 12 files changed, 124 insertions(+), 139 deletions(-) delete mode 100644 src/lib/utils.ts create mode 100644 src/lib/utils.tsx diff --git a/src/components/diff/DiffDeployedContracts.tsx b/src/components/diff/DiffDeployedContracts.tsx index 872b3571..7c0f2c90 100644 --- a/src/components/diff/DiffDeployedContracts.tsx +++ b/src/components/diff/DiffDeployedContracts.tsx @@ -1,7 +1,8 @@ -import { type Address, getAddress } from 'viem'; +import { getAddress } from 'viem'; 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 DeployedContract = Chain['deployedContracts'][0]; type Props = { @@ -10,7 +11,9 @@ type Props = { onlyShowDiff: boolean; }; -const formatDeployedContract = (deployedContract: DeployedContract | undefined) => { +const FormattedDeployedContract = ({ + deployedContract, +}: { deployedContract: DeployedContract | undefined }) => { if (!deployedContract) return

    Not present

    ; const addr = getAddress(deployedContract.address); return ( @@ -18,7 +21,10 @@ const formatDeployedContract = (deployedContract: DeployedContract | undefined)
    Address
    - + } + textToCopy={getAddress(addr)} + />
    Deployed?
    @@ -35,11 +41,6 @@ export const convertToComparableContract = (contract: DeployedContract | undefin return slimmedContract; }; -const formatAddress = (addr: Address) => { - const a = getAddress(addr); - return {`${a.slice(0, 6)}...${a.slice(-4)}`}; -}; - 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), @@ -65,8 +66,12 @@ export const DiffDeployedContracts = ({ base, target, onlyShowDiff }: Props) => className="grid grid-cols-12 items-center border-b border-zinc-500/10 py-2 dark:border-zinc-500/20" >
    {name}
    -
    {formatDeployedContract(baseDeployedContract)}
    -
    {formatDeployedContract(targetDeployedContract)}
    +
    + +
    +
    + +
    ); })} diff --git a/src/components/diff/DiffEVMStackAddresses.tsx b/src/components/diff/DiffEVMStackAddresses.tsx index f08c6686..5b3909c7 100644 --- a/src/components/diff/DiffEVMStackAddresses.tsx +++ b/src/components/diff/DiffEVMStackAddresses.tsx @@ -1,8 +1,9 @@ -import { type Address, getAddress } from 'viem'; +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 = { @@ -11,11 +12,6 @@ type Props = { onlyShowDiff: boolean; }; -const formatAddress = (addr: Address) => { - const a = getAddress(addr); - return {`${a.slice(0, 6)}...${a.slice(-4)}`}; -}; - const formatStackHeader = (stack: keyof EvmStackResults) => { if (stack === 'OP') return 'OP Stack'; if (stack === 'Orbit') return 'Orbit'; @@ -70,7 +66,7 @@ export const DiffEVMStackAddresses = ({ base, target, onlyShowDiff }: Props) =>
    {name}
    } textToCopy={addr} />
    diff --git a/src/components/diff/DiffMetadata.tsx b/src/components/diff/DiffMetadata.tsx index d70b12e3..39aee2c6 100644 --- a/src/components/diff/DiffMetadata.tsx +++ b/src/components/diff/DiffMetadata.tsx @@ -37,15 +37,17 @@ const formatFieldDisplayName = (field: MetadataKey) => { return field; }; -const formatShortName = (shortName: string) => { +const FormattedShortName = ({ shortName }: { shortName: string }) => { return ; // Remove leading and trailing quotes. }; -const formatInfoURL = (infoURL: string) => { +const FormattedInfoURL = ({ infoURL }: { infoURL: string }) => { return ; }; -const formatNativeCurrency = (nativeCurrency: Metadata['nativeCurrency']) => { +const FormattedNativeCurrency = ({ + nativeCurrency, +}: { nativeCurrency: Metadata['nativeCurrency'] }) => { return ( <>
    @@ -56,13 +58,17 @@ const formatNativeCurrency = (nativeCurrency: Metadata['nativeCurrency']) => { ); }; -const formatRpcUrls = (rpcUrls: Metadata['rpc']) => { - return rpcUrls.map((url) => ( - - )); +const FormattedRpcUrls = ({ rpcUrls }: { rpcUrls: Metadata['rpc'] }) => { + return ( + <> + {rpcUrls.map((url) => ( + + ))} + + ); }; -const formatBlockExplorerUrls = (data: Metadata['explorers']) => { +const FormattedBlockExplorerUrls = ({ data }: { data: Metadata['explorers'] }) => { if (!data) return null; return (
    @@ -79,18 +85,22 @@ const formatBlockExplorerUrls = (data: Metadata['explorers']) => { ); }; -const formatFieldInfo = (field: MetadataKey, contents: Metadata[MetadataKey]) => { +const FormattedFieldInfo = ({ + field, + contents, +}: { field: MetadataKey; contents: Metadata[MetadataKey] }) => { if (field === 'chainId') return ; if (field === 'name') return ; - if (field === 'rpc') return formatRpcUrls(contents as Metadata['rpc']); - if (field === 'shortName') return formatShortName(contents as Metadata['shortName']); - if (field === 'infoURL') return formatInfoURL(contents as Metadata['infoURL']); + if (field === 'rpc') return ; + if (field === 'shortName') + return ; + if (field === 'infoURL') return ; if (field === 'nativeCurrency') - return formatNativeCurrency(contents as Metadata['nativeCurrency']); + return ; if (field === 'explorers') { - return formatBlockExplorerUrls(contents as Metadata['explorers']); + return ; } - return JSON.stringify(contents); + return <>JSON.stringify(contents); }; export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { @@ -109,8 +119,12 @@ export const DiffMetadata = ({ base, target, onlyShowDiff }: Props) => { className="grid grid-cols-12 border-b border-zinc-500/10 py-2 dark:border-zinc-500/20" >
    {formatFieldDisplayName(field)}
    -
    {formatFieldInfo(field, base[field])}
    -
    {formatFieldInfo(field, target[field])}
    +
    + +
    +
    + +
    ); })} diff --git a/src/components/diff/DiffOpcodes.tsx b/src/components/diff/DiffOpcodes.tsx index 0921b2e1..2ccf8f6e 100644 --- a/src/components/diff/DiffOpcodes.tsx +++ b/src/components/diff/DiffOpcodes.tsx @@ -13,7 +13,7 @@ type Props = { onlyShowDiff: boolean; }; -const formatOpcode = (opcode: Opcode | undefined): JSX.Element => { +const FormattedOpcode = ({ opcode }: { opcode: Opcode | undefined }): JSX.Element => { return (
    {opcode?.supported === 'unknown' ? 'Unknown' : opcode?.supported ? 'Yes' : 'No'}
    ); @@ -46,8 +46,12 @@ export const DiffOpcodes = ({ base, target, onlyShowDiff }: Props): JSX.Element
    -
    {formatOpcode(baseOpcode)}
    -
    {formatOpcode(targetOpcode)}
    +
    + +
    +
    + +
    ); })} diff --git a/src/components/diff/DiffPrecompiles.tsx b/src/components/diff/DiffPrecompiles.tsx index dc2718fc..62ed59fd 100644 --- a/src/components/diff/DiffPrecompiles.tsx +++ b/src/components/diff/DiffPrecompiles.tsx @@ -1,7 +1,8 @@ -import { type Address, getAddress } from 'viem'; +import { getAddress } from 'viem'; 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 Precompile = Chain['precompiles'][0]; type Props = { @@ -10,17 +11,11 @@ type Props = { onlyShowDiff: boolean; }; -const formatPrecompile = (precompile: Precompile | undefined) => { +const FormattedPrecompile = ({ precompile }: { precompile: Precompile | undefined }) => { if (!precompile) return
    Not present
    ; return
    {precompile.implemented ? 'Yes' : 'No'}
    ; }; -// TODO Dedupe this helper method -const formatAddress = (addr: Address) => { - const a = getAddress(addr); - return {`${a.slice(0, 6)}...${a.slice(-4)}`}; -}; - export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => { // Generate a sorted list of all precompiles from both base and target. const sortedAddrs = [ @@ -48,12 +43,16 @@ export const DiffPrecompiles = ({ base, target, onlyShowDiff }: Props) => {
    {basePrecompile?.name || targetPrecompile?.name}
    } textToCopy={addr} /> -
    {formatPrecompile(basePrecompile)}
    -
    {formatPrecompile(targetPrecompile)}
    +
    + +
    +
    + +
    ); })} diff --git a/src/components/diff/utils/Abi.tsx b/src/components/diff/utils/Abi.tsx index adad2951..7d36483b 100644 --- a/src/components/diff/utils/Abi.tsx +++ b/src/components/diff/utils/Abi.tsx @@ -1,11 +1,7 @@ -import { type 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) => { - const a = getAddress(addr); - return {`${a.slice(0, 6)}...${a.slice(-4)}`}; -}; +import { FormattedAddress } from '@/lib/utils'; type StandardContractAbi = { logicAbi: string[]; @@ -68,7 +64,7 @@ export const Abi = ({ contract }: { contract: ContractAbi }) => { Implementation at } textToCopy={contract.logicAddress} /> diff --git a/src/components/features/FeatureTable.tsx b/src/components/features/FeatureTable.tsx index 9ef23b59..b6de1323 100644 --- a/src/components/features/FeatureTable.tsx +++ b/src/components/features/FeatureTable.tsx @@ -8,10 +8,11 @@ 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, type Address } from 'viem'; +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']; @@ -27,12 +28,6 @@ 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 formatAddress = (addr: Address) => { - const a = getAddress(addr); - return {`${a.slice(0, 6)}...${a.slice(-4)}`}; -}; - // TODO Dedupe this helper method const formatStackHeader = (stack: keyof EvmStackResults) => { if (stack === 'OP') return 'OP Stack'; @@ -89,7 +84,7 @@ const DeployedContractsTable = ({
    {contract.name}
    } textToCopy={getAddress(contract.address)} /> @@ -121,7 +116,7 @@ const PrecompilesTable = ({ featureData }: { featureData: Record{precompile.name} } textToCopy={getAddress(precompile.address)} /> @@ -189,7 +184,7 @@ const EvmStackAddressesTable = ({
    {account.name}
    } textToCopy={getAddress(account.address)} /> diff --git a/src/components/layout/Head.tsx b/src/components/layout/Head.tsx index aacc90a4..0818a73f 100644 --- a/src/components/layout/Head.tsx +++ b/src/components/layout/Head.tsx @@ -1,6 +1,6 @@ import NextHead from 'next/head'; import { type NextRouter, useRouter } from 'next/router'; -import { getChainById } from '@/lib/utils'; +import { chainNameFromId } from '@/lib/utils'; import { COMPANY_URL, OG_ENDPOINT, @@ -18,8 +18,8 @@ const getRouteData = (router: NextRouter) => { const { base, target } = router.query; if (!base || !target) defaultRouteData; - const baseTitle = getChainById(Number(base))?.name; - const targetTitle = getChainById(Number(target))?.name; + const baseTitle = chainNameFromId(Number(base)); + const targetTitle = chainNameFromId(Number(target)); if (!baseTitle || !targetTitle) return defaultRouteData; const title = `${baseTitle} vs ${targetTitle} | ${SITE_NAME}`; diff --git a/src/components/ui/Copyable.tsx b/src/components/ui/Copyable.tsx index a949a744..7ec67816 100644 --- a/src/components/ui/Copyable.tsx +++ b/src/components/ui/Copyable.tsx @@ -1,6 +1,6 @@ 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. @@ -27,6 +27,13 @@ export const Copyable = ({ }: ContentStringProps | ContentElementProps) => { const [isShowing, setIsShowing] = useState(false); + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text).then( + () => {}, + (err) => console.error('Could not copy text to clipboard: ', err), + ); + }; + const onCopy = (text: string) => { setIsShowing(true); copyToClipboard(text); diff --git a/src/lib/utils.ts b/src/lib/utils.ts deleted file mode 100644 index 5ae0dc2a..00000000 --- a/src/lib/utils.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { pad } 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(' '); - -// 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 toUppercaseHex = (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: { 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 getChainById = (chainId: number) => { - if (!chainId) return undefined; - return chains.find((chain) => chain.chainId === chainId); -}; 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/api/og.tsx b/src/pages/api/og.tsx index 099f13f1..39839f5a 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -1,6 +1,6 @@ import type { NextRequest } from 'next/server'; import { ImageResponse } from '@vercel/og'; -import { getChainById } from '@/lib/utils'; +import { chainNameFromId } from '@/lib/utils'; import { SITE_DESCRIPTION } from '@/lib/constants'; export const config = { @@ -105,13 +105,16 @@ export default async function handler(request: NextRequest) { const target = searchParams.get('target')?.slice(0, 100); // ?target= if (!base || !target) return generateDefaultImage(); - const baseChain = getChainById(Number(base)); - if (baseChain === undefined) return generateDefaultImage(); + const baseChainName = chainNameFromId(Number(base)); + if (baseChainName === undefined) return generateDefaultImage(); - const targetChain = getChainById(Number(target)); - if (targetChain === undefined) return generateDefaultImage(); + const targetChainName = chainNameFromId(Number(target)); + if (targetChainName === undefined) return generateDefaultImage(); - return await generateDiffImage(baseChain, targetChain); + return await generateDiffImage( + { chainId: Number(base), name: baseChainName }, + { chainId: Number(target), name: targetChainName }, + ); // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { From cb10a9df8bfd35cf1ad3ed6fc023e69add003fa6 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 19:30:29 -0700 Subject: [PATCH 69/75] cleanup --- bun.lockb | Bin 222052 -> 232465 bytes package.json | 93 +++++++++++++++++---------------- src/components/layout/Head.tsx | 12 ++++- src/pages/api/og.tsx | 65 ++--------------------- src/pages/diff.tsx | 6 ++- src/pages/features.tsx | 2 +- 6 files changed, 67 insertions(+), 111 deletions(-) diff --git a/bun.lockb b/bun.lockb index 0a9abf36e29c6194fb757b571927fda13c3190cc..be908fb86894c56f57f746589f40f5e51320de8d 100755 GIT binary patch delta 49933 zcmeFacU)9g+ci9M1Z7ZEtf*M9f&x+$P+;s0L`6Zs4v2!%K?U1jSFCuV+un^WYV6%a z6C2S)V^3mBtV!&#w|A{ml;k#f-urpKf4<)@Ct0)hwRXRDIeX49&h^7~d2@=-aChlg zGXK$6#{-JY^A9T8X&e6gC*j7z{c2;IiOdV0-ZCA_hYVaArngLJZO^h3){mG`Jdg0=Odhp|!zK9h?E1 z<(!4>2<{2H9C!!pD&RJnJy*3YIo?`^5n6^m;L1qY3|tlL3TA`Kg3E(5;*ti(r5g;T ziyI6k*xAvEi3u5*23y1zg&mucn1X1739T*$yEhm~b2fn)9}cz!zlLaMuo!YW8`T8q zanZ4v$haQeW=2yfwStDwXvbz`WM-$v8OB2|3Hu0M=%K;=5)$K(W?g9(XvmocW(O`H zp83YXWu$={gLCFdI65{$AGSgEA^^Zqm;4fy3%gT&P?rSi_L?fX3(e!3`)grxk3v)(^~z15hg3mh&r^@#nxCisNARcoVo1I0oZIkA{GK7-)z9 z;&L(&%M9~juwV}`8?qP8rt4f$5$(&4az)9s`j>)h+!K1-+ zfQ0$Msj|sQE&eu`_7O1t&zXl8j_@dO1#o^%wcIse#!uDk!C<7b2-Q=P=^d6>3n~p}#hqQ%snt?rFEBmhkS_Zy(rSDtMS9?^nlLo#0}*Z17Gk{`5Q1j z)vpo!&q?K|RqTVFvuAZ1s~)Hbo0IY;Y!=YQU-ghHm_t?rL&u7fvC7!v>_Bx5^Z|47 zwFYx?x@&rQFem4m09C&p0RJ=LNeCQ*-C$0VO<*?cOjEUj!(cXS6?D3CQ8QIfP07f_ zmSQkBS9_Ekot%=;*I<~BbZl_Upp2N5Y=a@Fg=&x1^lYvCau)P}t|$g(!4q1lc1Cn& zN_qlZ-b!s)4!8v3UwaB0|< zwyGy%VxyDd5)+2THAMt_SP#ruS{_V~ylSToK|c(5W}Lw=7!Bkcd4)>I9>Hn_zrp5Q z`9ag|+H3njdwF-^DwgdX)Z$VT(osx?A!#Vm;hNY{&7K(_hYd8_FhaBYC#J+Oep@Fs zJ}DtNAvHQ9L%(5s2A%yo9IE=IQfIaK%Qbx~Y&K^V82+{7Ea{?V$N2br+j+)rCrqq==o$cgbg?t!46=X*`WjsIYZ(TVsU>kBxJ;8!Jme9k!lYd zqtua4jn0gB8yJ_p9v)*4XM@?Wh;Hgs4FGfQe*vam2h0I;($baep*955GA<()qYb?{ zw;6q|8X#~A=-b5J5VfMGV0xxRFSQ}JVHbzJ95(e-jt{O&&^e{P)8Y?l`Of!N%ZW*k zj>QNYI`mQVeFC`2bii@R>A#jS3*B^ zDn}=0Cq-vsvrFgw$6%O-`k8Gr!Ynrqr>EphgCTQ(+RkV&^$6V_sHRVh8=TDi5wPjF zmKt{evp;>~;!<(rvKZPTBOCbF$vh`X%@}}qcBDMG7I;90n=)uT!!R^eZ9u<-CuhQ>5m0N zG)JbyW~L`3$7%PcLbyT6LyOk76vsR*gLHpnsoQ)W^6}U@7|f+}b*Q?hCBkOCJ;3Z< z3vdN+EilusMZ0MC7@^j?8caWz1lxftgW12pk!pLM4_DZdb6O4Lw8Xk&M|Oc7z+T`| z;QlG8n41Q}O4w{@Fbd*8H5sMa4Plpq{S(Te-fXm5k+W8@5llzkMLZjjJWfrQ4=%yY zre6x~>(R0C{$teyW5=ik-WjiYq_>jLkn{Njb@OO8QSCt%(wk7ACv1A88kh|zuf?xK zdR7>M{Orgmq^C!GU~@C7N=B!0?6d@rk)R^%AHnp%VK8^A9bonVYd<}%e_Yn5uvt+; zMs#|5bhcqGY`SatfGp zU^g}uCU8MQ+Bvh-jF-V|aNF6c{R@~4X(iMi`D+YMWyEDFyJb>zs=@Fr(kY$A}7!7IjtFqaya;87k%wTm>`XQ84u-n1F2g{`u-Gp9C%kJ7A&O!^vQ#a{;r#mB8#k zbXJ@j7G#{AW)}j}^@EU~lliP=v6`?KYT#tzy*ml-?gnI}BsWB*ouPB=j%ew&f?0un z@^6HKD!~@eD}%#eJAqp)SMyB=(?i}GXGW(+$Kc&t8p`H!wcK1`Fw{gKQ`=|sx4qo1 zVz4)4Bt~bzIflLo>B^mFBfh z)~FrD4Luh3FpHtYTD3<9Bh-RZlH)QHlHv?W@I$OyzvM!Qrw5)PBl(_Iz%?-E&Ur9h z8lA2j6%4tkkm+82rcUPjU@pURVCt{et3!tyesp5ArElDQ2rTGFFvlc1CP8`ItGnp0 zJ=Hz--REk7`W;F4KqwkOPxx$Bds+odPuv2tp0nUmU?aG)>}FrdGH9!sa;L_1Q39J> zf16qZW|ER)4{T0bn9A&O+@TJ-5zI+&XS-U{X)tH!ZZHRVIhbQI8O)Xp0+$2tP0D)K zz0WE6h<&u>+?7?wr@fp1B6x@~DD?49B~w2&?;Jhsx5ZZvlzlt)Lj3iF<;#liELEyi z>&2JWE-Sz1xnrdllW%yJIOk+lV#$@TO+Vj{yfmwL(6;h@!a6(r9=4~$sPCjYUB*Zw z&TfvMv48#@^UKN2YK%NRchL3&%QpLzy0LQD?=cUGjajp-ZSsniZwFd=Ub;7N;!ieh z(ncRy_V#4=n>SW;w5n7&sp!Gz7TaH4I<^uyKK##KEEy>-EXk`pqhhU z{EOi^R!z3GS#YV^gwV~_pY66@y29$%s!c`8^e!{(PVVlPQQ@-hzPUUlqTP`>_*le+JYH4lqhFj=fC;3$EdUDemHg=B- z8w~CLtcIJ46~US9&mxjeh1&YBs`bxM&GLy_{!%p?**3&%*V)Ek2>Wv~f0GTwScpd1 zzMik0$z(7@{y9kv8&fn?Y)D#~qp<$cFr+Diwb1>2niN=_{-c~Pp!R;BrV6Iof2K)> z`XS8;SbwQ&sL2M)>3vnEOjtejLQSV&VR>s!^}@XWPj}@&?fj?4eYwhH1F-?bB64VZ zUy~!Ieq&gL<xn!eWgu)O4{-TX~uar0yOf*@I$lc72Nf?Z+d7-2E~Vul(9Y6wuCv+n5?eJ6 z;5miZOsPj1+13U5%E&=3X4AtW!08P3K|x z!m^d~TzpLxv2f`hNoiPza&mrMvuTuQ$XILP^~W>YXW4$caAxQCw&3_7cjZ13i4eI8aX zPH58*+$%YPaCco_>tnR!sSTSLBN=Nw0eey>+0Hw_1_9QJ-nsZn^&Dl}`erH4Q4Xqa zHZ62C7@8r@mMxN=I?DNodsSJs^)O2=RpcNKvvm~Cm+r~}novc~_b{7wL0}K9=>yXp zSgJ?hWK-p;21BymB-3PAeRRwEH(2rViO2w(YU*@W-LMH(uAa!`@1#yS_%hhfrnXEcQd~?s3M+C)@&TY8VUyblEf$R@e8|ZCKrO%lc+bG)M7V>skf#d=Be=srA+NHT9^ct~q7>O7rT;wvElwxq5O?W3zQ1G}&LCnjBzs zmGc{$P3K^@Ku)8K6=`bYrp^njRu5m(L|9D_r&!VvH#y(mEMZdE2AEBq-PQ3&OEDY9 z!)m9bL=UaMgB2{>1^7!d>dUr)=xcp-bk!j&j9Ju)8;aD`L(WI^G6)^i)?-B!_LPIn zW>co8!O%}>7&al(53tmYBNQDh=VdUoLL6q2pRcJqEOjb!c`bm|T*=3Udl{A)RuQfh zslB&si>+jYH+K}%4s10nQ<>0`R|7d8;&7D2p~gx_PcFmqlS8oR$~DyYG3*XfSVK9# znc1`%qSmUWzS6yha!_-#)Y(VQZH^`8qi%y(e!jk@Yq0!KEcPVyrUG^rP7k9TiZ&*| zVjD48Q1mKaIlqP3bO)kZH1;OzTFBc^4r%Uhnv76WC2^jsul03W%HCWP6HM(kHVab< zEbibavaYXb4J?ka6<53U@371)OA2f(+qO1KQyR-bt%V2#-`2<$z`?%Ja zY9CTAg!Q46N3eq5rwoJxI=;82z+zv~+S_!uZzoH$6fK zj^jNHMS9}Cr>?TRrhYasIK-HNn2(oWadzSu1jm$ZC);*5o4R8`cUDRbb@em0lXIb! z4^p>GrODEeAlbHy*|ZKKrx#k+-q-pbEcmmrzo`{Q?7h29V_b*kOo2roo0Pb-usC#>b8&t)@Dj!z73Q__Gj^73qs*qSpuGVxtt2rdjIb*$7Lm zj;sF;EUp1%3pCY25wz6mqG7QD<&0q32#aN+k2tyAg~e`Rtg*v;Vreq2u(JMBU}4VC zt=LgcFit*E*WXk$QcZ=fVV6jUh5Z*^;>NtygQa?qmP?fCF12q1VfpE$o0h|3 zZ>;3d-hRd?Ils4AO6?}w_QA61CI|H~n_RlTpEoYP))}x`%O|irc6FC+qs^u&J@oNm zGZJAnPzq)BQq=u20hWh66?^YogxC_L*QV33=t-o)@yxLo zr#;THrd|l~=7bx&tDg-FCQ{eg9atW);EPu>WFIw25oM+5()?@r^V5ptO!ZU4wMekv*2l<+AX$jRMX02E`DBdg$iIsEX&8D@nY6aNA zu$ZpGQt#NOaKrHIt4=$3CDhLb24@0_?B;8I7*-QG#Kqra9ft#`s^bpm4J$y|R#FgB zX9wS_Y||{bv;*espWkngjfwchpyM{uO5J4 z_4G6Lmva-%(t~(8KhbO&IY9LhPD2TPHZau96b_SY2FkffW>eZgbyc9guD;g0U}4?_ z`J3(_MDJoH)yBO%QRxZx=V*lJTDSr4Kjy>Yh!}Vhvpxk2v$(duseF>gGqo(n&ICx4b(|%a&vU*H;r=^6Oux$mR3*2JVjcPh9_7^EJ3%`M-u3`Iee#Ue; zXpq?yl%b|q?qSw5VR!N0VX=Npbj(WkOw~f3uD+&zu-H;%tx790W!oWU z(-lor-h`Pd4|?BVoDRFdYOPG7xtgxLGd6vvS(wqdt62|Ln~p_-n@+RAa(gs$&2e4^>ZK>Y-rz zP&t3N+4LG>sFDP8MG6_Ftc=ma)COZ|;XTAbSbQ&l$%vzR(c$VT0=F=n&a#HfK_ktk z_!0X0r{A~3YK07_$j{gM6)c<|n)+L}9;wWsn*P>f5yH{b5@5rCk`%r)J%4Y7VqHa8 zuq2fo;uJ!WYJnJXmz;t}ok6g;1uMNWt%QZ!KPU~@{oN-}=DJf6k zkn;>y5brUj_M`PlgN?wH3#+-33N11nht*oO@b;k87&&N+S+b0ibH|viFOK8f36TS= z#&fLfI`~Tw{SX45PPYE3Mo&;W|qfW3?cQQ*ZEc5%~j>2lMS{S1;x%wEL3imZd!Rq=x<;D*d_9E-a zdcM$lel{>Tqp)Gr@HMT6rH%_N>nVEcLpx#gV8I{o=t6`zJJm5c3yWg{3-|V_Q?dSd zcd!me2-C#F-y{&?)_@VkS>!aVFr}P2)AZe#+gb{&rfMoQaw9DI5!(qm{sfj<0xi$! zy8l_;I9Od}J3LtV5h3MVVX8kvU2NDW;KU4A?NOGx_P>CojtR%hK2Nu}O~=CGmZr|V zb+CG=R+gX5Ox-n17!9idqHx&4TZvgS<=kmz>+d0|Z&b?2`YhwD?Fvh+A6}J~$#U*= zv+1Um1Rd<{YaQ?jmpI?XE=H(>S}CT?U0CYQpEuoC@|-2-&oG;2&e8{vQ{)d=VQL0U zgKo3m$Kj6k7?#!_6xLCwUR3=s`Mt%tc?4Dil%mGH`jb_EjzM`(2(O^N(Xc*DtqZU? z`p5@wR-gNR-@^XX4OXPmGCsZA3`?D9oF~QSan#u1z6hzQaF3Pt&Xa9tnVpRb@EJL> zS{wd+-JY*Ly8miQ#rnhTTcpdW5fyBZmJYyu2s>W8g>wEZv$TAnY&#pf;X>V;oX|mw zbZ?%*gqsG-5BYGwg5wTrak#f3rS0N^w}jS<Kw?3T#+!ffilL|v20LC|_BEbQd* z{-%ovd7(UInoC8O%K3B5)~%MJN@ccBLWlzkPvL-d9u^a$kg>j!X_=fq7bP##pJMU2 zaSYY~CCRBQU#a7AId>jTh0FC3g}q#O~$VR4PBDc2RWtiw06`#iT!N2s-)O8R57 zoWII!s=q}Q@va5u$w9C>=}An7V9{Tt_(nh~vQ^GsZ8kOCs!k!?L9iQ-gazl~Q=J1_ z<=i!9=?PMS{I|)rYt7cfw<&Ms1N}|65DG$BXg<#8jknABh;FpQV2F}Wto65^iBPx_ zx`j|jCFHY{Pc0cc3ZYOrWLsf7aMi#i0BJ20uPF)Bz;G1uz12 z0bXR<^#I1ZXNP_sA?8qoUnK?f(bfn+(l!|F+~pt^D4;nLu1f=WeT=Q34+2=>5P$_`0lW$_%fZ=INrywIl5Qlp z2!PX?a_MZ*0|l7{kJl0wWHuldumNTQOeX`p3NjloTT%baZ1@~aCnKH3fLoPP5N=Nj z<5r}2VhOky@EO30v5uAaO<-RC#B3N=t&(p$m^Rjja*=881ng12;TQs}-~_;kZ#Di7 z%od;0_%ygA@C(3;%%0u^nEzLe?`ix9%=jk&%Y6#)BGZ0GgX7Nth35dTg3JP5De6Bn z)4c^)&O3l(U6{sS*cx_GO(%1yD*_`*Y7rk}Yq|2K@|L1VRZUCvPt4}y|fHu4p;-tCNrZSm<{m_jGGIjn{d>L?0qcZqP0OtQ2v%$T!3JWsz zXiX=x0ev;QuTk54J_u?L;eVL<~looov`Q?tpec(7)ZX=iCXRMUrs z>4AS>Ry0D3|0iYz%6Q7*TdFD@8;xAdI0i4A1{1(6Etle7xIFBo(79|@Yw-n{`PM;a z)Mpy6*V2(WZ#RS4imgU|@TLadGt+Lv3wb+VG-igKnoTYYdq0>J9so1yAYU}5eu%al zxUGCUTF10h`C2M6^%I)?F=nmbY4PMj^7?J+YB-~*A7hq!9`Ve5QA_tRX8ey@d_ksu z2|CNU3g)0(*V2L2*+_v2Z)y=_Cj1pl={HUP7&G5pEuPHaJ&o^c{D2~^|76t9xQAK- zGJ}us!r^_U>0}0<+8b$&8Nzb8_|2?4DruJQmE0%yfMkzGi=n8NUSabn&NP_H>oTt2JH&W`jNhv;5D&yvVe-YVkW1|3g4P z$*>#D0{4L3!FRx{@SdjM*Z2XL7n$iFYBre_JOMM`OD+DD#;-Mg1IGV`cl19CP-@qh zJu8gnQ!fIhZ3kw7rNH>#P*!6HjVpm!aaGN(4rT>4HQgD^i_CPcV3zM@(E{#T0x~1& zgIR#5#@=B3Z}7nj3uvs_fncULYj!h@TWZ`!;~+3MoX%jD8wTcOVSwQXjk{^w6U>UD zHM_57$7`GjX2nThdME>296Sn4PmKrj#ySi*4}h8fAlM#!TC>l9d8v%?XMhRMY7qsQ`Z?&Oz_-Dy z@OLd;L1wzUnoef$0bZy-)cBF6KLN9$ufY6*qQMHKGNCm~*O)FUqS<8jxEPo&Ee&RT zSuLK-0xM}YndLcZHks+GXf~O4H8AT}0?gn90gW=$1kB*e+oxp5ZsK%YaOc!Q_{@WoC z4S^S#84@(RAae+kp|hYAEuKs}70d$DH9JG&OfWAp;|FUtne~iR_Fo3Hi2s(6mEWaN zz#*ywup++2W5enKyvVfw`ZUK<@G%Y((x%J30A}z8c#+Ei?P%aC$V|s~Y2^R%X^!Rp zgU30j6;~+026WcAi^l)_Gza4!frNC~|N3zb^72Xs=(#i+xIV@lfZ-Ee}2$I7ybKyX8_z_ z3r}QfGls0(!ZiEe2R!PM|MvmUzYln@Z)>ZfAoCvk?*pEHAMpJ9fal)_JcfTC@Muqb zlm|WBEtlZDOaAu(&%Y0NKK5V-Q$u<1!$ar)e;@Gp@qH<-|MtPo$Sv95ePU&~SO3zE zxrN2c_6?cgEwnao@pVGv9nud(VkFf%f0@ z>Dcm@h)1QI_Aau2$p_t7V>UTx0iVw5m(?ZdcG{U!VY!EV>+Fh|P(l2hyK?mO7cX2V zhdIr;T5n91!}+BuHD7$r^4TZJ=l3t4f6#Noq?vb1)jWQ5O0}~+3!mIu2&EeF6d?yC zme5NDTRl57=~?*W&gF`vRJk{H{o6lwyn4R#fk)p89*sJ@?sy?=(TR-g^kQ8*R&;nU zX+n?fqn=v*e(u@zTO(Ih^jMcUCH<2Ac`MIR_`3`J?J){2oG@>971y4@W!ARq)ogV_ z=GpxH(?1^=KB8`!rz<@C!t!ztrcbGrHM9MI=*4a8)ZP`p^xW1KCD-@-Hm`U1mt9u3 zU#K+rZ3!04M+W+3mDF?FyYElV{kn?H!)ia3Jhc6F(L2Yhw?F3E=j@CYqian2x^~Qr zX7gqZ?6qio=9kVJX3Vtvq|e03G2%!_pR3)9yxyB|LSBE?L4=!(tt<6`|H}=y|{PAnhs7qBZ`WmM;ARQdD5_E?YEU}GF$Gr zQ+@W?>&w^l_6@s}ZQABmd7#p2wOs!FfPPtpP0wnv#;MxS36ZCl-rjs^{*OLw+%4XN z8&3Lifq+nA;i-KDhSg!OE%4vcEnZUb)W6nIq;u;K%t!JTqZ~ z%j%_qtrk^$a@6g>tZw;sjfSS)9XzUWgjX+{_GK$fy0x_2<2u_riSnLLlOK)0zph#R zeoY#$PF^{G__bN)9u-%XIF`L>R@2;=Td@nj zDLFOV-u!YzE1SK)6rX&|XUfl(y-n1ath(5tV8NxQHC#8ga>~6&dz^FZB6rof=Xd0Y z+w9$|9%j|F3#j+=@?$3wDpoZ-e|%x?&uL>ueY1I>W#SayK}92$rzV$)s&j4_|K)9&7Exww&KegKT<70h`7MZcT*uovBKC(;Nk&*fRghTTZY7Rb{I(^vT z0GFE+{f1RCUHW;DN5812F^#7m>KQUCU~c1=g`&Qn5$5&ge6N7tGd5&Z`fcTlZu}z; zBOXf7!b7l1FR*L$GWDpkO{-*DtGy+eYu-ydZKs_LbJts1>H-y1)BV6&em9?k8xc3#}}IT4mK4*NbgJe$1plZUU)mtRq{ z=RTX}u1Pjk4;TLOgja>=$)6s`3c8=--K}xLuW!q zlQ#9?kn4_$C)5Tz6)gArUXNPde6Y=L@5M!nk~;gC(@sCIG#%_)vd@b3QzkBps{nT-P38i4Q!PN^Eyein;XXU-&^8VN?<6K2{)|{37db}u|=UK1ktr)5F z?VU&NmuRaLtZwu*3}W73V^{h1k9OkCU}LaU%OHY=K$!EBoh7B%R*$${H#Y4&+ila4 zx*ay1Sy*w|gC38XjGW*x%10`5_)_O;O~2k5Xw&2H>2JI*uH7|-UG&T9+_uZRT2*%#@Mvb$(OKn_uTR+Hx1jn0=aR9lfBL;o-Vyh-u;KgX zjbB?~=FE4~R@6QDO{YdT9XBlXzV_))H{RH8>u~O>9C*pWvbo~ffmYVb8eRP2v-ZEV zUUejA#S-tgBj$U&5$j5RQ||48Et|@HJ$ru9*B;^Bckd|en7aE&NRO#Edd**IKi7Lp zes-w>t>b4w`ejwK#JfD33fuO~d7QofP?PmN=GLw~q_C%Fm*@4D{7^aX>F<5}%Iz`O$*#huKH@xyQpe!OI1GhY*WXQp8b=uzv?XCz2wk7J8XdMleoA&pZ_%A_-{k& zH>}Y#%P#2rnu={6or--o_^b90TP%JO8&GLhtCzRpclP=&^h@LN?&n8*v-0($E5+lb z-cbcwS5HJ2Ge*d(FWZS$m5sqhH`#b5LXNy*C&!%$HrAIn!Lqq(Czm}NZ1j|)&ql~Q zVI6|yE!&@qkmIk}$%D=X8ym_8U^)D3C)YY3Z1k1W&PT{cVV#B5NOrmqA!q$!Cy%=j zjDHj06fEcKc5=gu!Nx#&)Wrz-0<0Ubn#i6%M933w*vYeg2sSp8ufg)WX(zY(G1%Bb z&igS!z76XMtX6WfpCaTrx9sGVKLs1x$PZz)y=^ClUkb+e&6i$^ke|b{z8q`}mP0S2 zgLmxYZLmUQ;}!JpSM={nu(6}O36{-o=-<^~W2hW`75#&C2v!%_{u=uCJNkDm*cdJ! zfaP!({rfo>4omwP{eyKDR+Q}Y3;K5t{re@@*j+va%lSU~cRkqHQyz64{eyJ_R&Uw! z2Kx5^{ksutjFzv#@_UH>-3&Iy%6T`@KUhy-#mUWXp?{CizgxlhGU-EDZ6Bk5w}Xud z^3vPrA1v!T!N!4d=pFR$5A+XKl5G4H{d$;$ zA>03s{yjtgeh)Sdk`KUgc#i(v4K@yu)9#{wu+GBDmYwdQe=pF#d%?zG@+nx(FVVmI z!Nw8tsQc(2tQ)W_vgZTz?-ly@AlNucz6Q(hHTw53*f>Vcdx-wQdID>l-0Tth_XhoY z6l|OzKZMoxE&BI3*f>dE`WXF#W&KC6ak3ox2m1F8{ev}CHa>}%6=_8Oo&+1G%bT7= z2pc2JvQLAJd2;mA2(gpqA(*mk|184ziJXAfS@HqA&Xy}Yk1z^34X<-ckwuMmv*NHKH_qAw)25iwPLwsm-Xx+Kzmvit3R{G|WQ;Iw6$zwm z;s9y8s89&BL!^;*iesc*!pRD>TV#{=h*KcpToMH}v_?Vu#3*YB7bx7I@P+U!3}K=@ zgjt0l91zzi_?3dtstAOyL|zdHw<$cKa7Z+>fiR~ugq1cBj);d8+LnQ^-UQ*8cwvI@ zoI+1q2;Yb`wh&gAgU2}CrsF+giUz}hl)WsCG71W?4&Tr4#H`1 zfI_?jgj&TRoE2%sAvjckaF)V(;Zy>`Q3~TqK)5JQQOK$Yp7SeJ!xM}(Gz@SMUn3cm?sIS8w(L5M2{;jY+3A<_v#+42zXi|FzYY^ocJ zi^JuOLB@x|-T}hS>PRuj0Vy7f0~F$GK&Vv#!V{5J0fIwK2xlog6HXN&9HlU>B7_&> z6osr>5E@p3@JfuT1i`sBgc}sz2v0`{7bwhfgz!#WqcE`!goU_!NJgXhwX(6R@N|(2W1}>JEO3z4kgkRN>X(wC5&P>6&p7wm1{t;H;Mr@pzNe_f=X$ls8|z9ygQT; zHKCL>ihL>#^`W@cf>PcnhSq{|l*%P46^x>8Z75kDP^Q*~QpqTOpyKQaC9n>hQCUo? zL+?WCK< z+BSsHvmOK&v8En`=M?N*A=DF5t`JuHK-fpYO_F#2Oz6&nejXLI@U7z7SS7gRqZ6h%osl^j!|%E1;Nc9LWIcn$IDR)mncLD zmjDP^tszVefY4oBq~P2JLSP_-o?=oUgbNhzQs^xjnITMU3t^!dLbSL;!LJ>JkR}jf z#oQ(kZc}(eAx^Yw3SmwVg!N4!^cOEEv<-&Pvl)a0v8EY>=M?OkLl`KcnnPIK9>P8f zNy5|uLSzVpq!tiT#4ZXp9UxS02_a1+w1lve!U+l)qCzVO@f{(IXa!-AI7Y#t69l)` z5Qd2C))0`(|tDO{p3SGaVBkktdi)Xos*i;EPTdqN280%4(;)CIx? z3U?_i7LCFnOzZ_=VHkv^;tmDB-Vj2_G3R^^l?hxYRAdKh^VVgKc!J!`nw;m97i0mE^j#9WpVV7{}2_dULgsD9t>=73! zILAW>>;++;nA8ix1qyd5d?6b3hA=S!!ouDV4v0Gx{02Y>=>y>_F}Dwd+Z5hVI3(Id zLzpuV!un_kN5l&XZ4)8%jDc`Wtcii}oPu2}gl|MtEQHlb5cW|xAxwQCL?%N>>I>mJ zv5SID3WUmW5Kf7NI0!o_oS<-8ROkmGJ{7`Upa40*e zoTXA)64ggQi60MT+z2RTCGkBKhY3&`j)YQP5~D{#IZEXQl?syZvOvk22xXQ9U9Tjr zS?HWe5L)Fxs4Vhw=o|`9C{z{AM&YJhP0S@ZiHD@>qTOgv4Y8C|Q@kM65}{*2wZ$4z z9bp^`au!h}7qN*{SD40u@Zf;tDt3|Fg#CDsyGS6_7Y9flqQV4_r${4tiDM*h;WQD{ zKxC5|ic=&X;W7#2D@Kw0#6?mg;h76+EGCis#WhlZXfzoVDDp^Vafj4IG@AlyD&~@! z?RYrFILx@?%Z0`nM*NGwRw7`F(Z>3F{H3v-2;GL3BW5cjit0b46q}f^qj#S1tVDH3 zSe|jXmGvtR{9T`te)~q_Y9&T|HU|ay;~xu93t|-xN)@x`A!2HCe9WWdV8l)(Vu#}b z_)rS%Bsy#}x>LWZ=(drO>c4^=6RE_oO-Gf+9$$i@VtOD}DM~I`qm0rj$EC)$M(fyU zy;UFT5S>;a%P;W-n`Nc;e8x(|%)sBqerT84;2qaLHKrP^s|~^5mg}8-E}^H-B{rp# z(iHlwg5oy={`mqt#M1wr_&@pPy6T(Pn^0Bj5WU?Wx+=x25nZ<$pGsptV^_V(>Hn}d zyzV|AL;bt9*Xwu8-exQ;Nqe@5MLUcYtv&Hqr)taCp4B^M>@;R2DD7j(g(On|8-%ad zG!dn$OHC`keWza3Dj^EbxRh@`D7HweE|s=8LS`oZrKkR>SrsiQpWNynm{ip?{>3I9 zY%5naO)Csb|MPPvP2;x$nzI00)isTOeY8{ih`k0h1eIR{GVEgQxN1Yh|H>cv?a?%6 zHKFna3I|5wst4BlGKB$LuA0Wbou960Zkoo=8Ru%6yQZVIm)xT`n zT1!|1;yx{5TTQD8?Km`67Nljah44{mEQDVpWP!DTFA!iE?KO=L!TDofy!5XbIwQ<) zX!GhI^-(kPc{D#^VPr>S=19~9{Gc(8Um;{3epjKfrghOYS7`hyH`9k{+UHFWz-84= zw=%etusa!2fK(t1b~w-#hyWsiD4-kA z9q0k{1bP9@faYRhZK;yQ3Bl?>4WKfb!xhXG%N5EM$rV@=s0DE0aiO^Ybpb9gE+{S_ zE*P#4t_RM4&Ueml&Sy?lPEAflPCZUFPA$wNi-A)I|Gu$-zTlMM6ycO;3GgdXI{>cy z-2hknUSL1KFO(JqiUD>&aiAn%50nDR0A+!4KzV?>LIr?39KY9l1<2*fo{RvuhpE6c zfZM`MKn6YmW&yJSZVmH*`M?5zAIvWS_+j2yfZs^q$7I|E5&(XT8UzFb9e|ENCmz|j14j`!2IK?Z0{n7dGLQnK0%<@xum#u#3<0u$p};U;I4}Yj3GkbdIY2+)1-usy z?g~snBc}s1fINVI(D4p1a(A}^tbs=mo&diCw*Y>@{2Fi(_yJf7@Z;_kz)Ij#U==U{ z;2*y8?=BL7Bp?My1=0Zi>j-^;o*QD0jGfPfz!Yl;4E+sxBy%PegLijSAlE5&%iIh zb>IeY6SxK323`SU(U3a8288*C1x3KWg3oZ{I18Kuc!%Bqd=Bs~yc$>wi~vRgLxEwy zU|-2tcwR01jkRe-8MX}}Ixh9OxFtN>O5p8}Rucv%gs0oDOifT_SV zU^*}Zz?oaQ$5n!>-=Ls=Xnj{84tN0gqh|p?ao`c`KY%F+-$UB-z;<8<0D#dx3qxe&9>sAn-M?0oVvc0THO+3Gftn224j~dB99S0QXV&P5{RT z{zA%v| z&=Bwg8Uc*~o>}~XK)|CNT8YcKJI^cClXx%p1-t-H0&yN-o(*_zs1DF8yhYRfH-HvE z1>hFa-UNODeg>`r`M@!N-=5n9xC7j0vH&-cR$uCEse@o`paxJKa003URRJD8m4hmn zC*X1bkJda<@l?wbFi*NXT9*cRV&?h2IKbmOkLyg&e9T`FV0kQ;CwZRZ zKF7133&3+7!=XR}zz-M#3QFlbO*WtEQ{r^Lty|Hcq9-3gacgx zrm^5nvXYSo3+o9moDA^X6bJMLm@XQK1y~Uq%!*+88f*l=1RKCF zK<@zR)LsE^fj64%3g%gud6`cFtN|;{=F!*&D9)owF$8RZq5uz6Wq?wEJ-|a2!#s$U z1K4wVq~Mr4!sg+OI){P>G=}M+YG8Vawi8ers0Gvkcx-Xu+f^PvI0U>&^Z3D=wg#H5f}&z0N99lpg)kHg~`bP zJv#.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 delta 43686 zcmeFacYIXU_WwO|U?2mA-VI$^B!L7-0)e6TjsiiY1PCO7P!dY0i68<30v=#f6%-VM z2w1Tpc2K$Yf*r41A%cn(EcknW&N&0QUhv-U^ZcIgKhK>PpILi-_S$=|y>^|G30b|q z%oi_4u8M6k{DWn~-mJFr)d3aGmEODkk&j1A82Q?RZ!A4H?%KzGncR74&fBAl`SfbM zdT4DcqTcGL%+K3`2_BKa!!1-j}vjIMGwp;SZ8L}H(pKYdchxQw*1zG>N$ zr;ktf`Las61=Dh;rA->^^Nmi;m`MG;$Elz!1x;z6uOf0gdKKwNHN1(|Dj<8JD8Ci5 z67p&!RpysNUWt5$-d0B5=g5}6{52%x(VNt+0>4m^Dqe}?U;dReK%4o?kkZ?gw`&wj z$V;TL`pQN|A$JpvI>-m8Lw*#Z$03g)6@XOgtbr_tRQ26Gy&&9od98 z)f<6S{waKv{tgnmy!-=hB7YlF5g(g2dir<*m6fA#`Fw9vk^HSpDLHTiN7O%Oq+>F2 zX3`(&Sx5ya%%@WsvC1Fj<#$HP;hxMC)$@8S$vj_vEQBJuq_!KN`ADZCq#E8=$DLYt zd2%&Uky%T3@Fjl{Qd1%qsRkE%c1*O18FXTEJ$Ixg!E3~h6K>W25i*!Z;t&b-;1Q%M zz6+_L&rZvkJaI;v@1X`hAHL)lAXRWPQgb~$HD~h7Nj~4#4c&(O!)t_RrDjd^@w&5- z+tc+(mCJAJIy?rcNT+3IPtMDZNz0wy#4R|;GpG>l7O;@&*_iayi4&;s9J<$V%(#iE z5uVQHFUJ8za#)Nj`ydsmFJp+m#$pZz3gudQt_F6+x)GR# zuE{dKnOpD>QW4sX)R5I@=+y8eR+)PIOPsp~jv+PqUP5ZJ?(z8bNKMZ99-kIR{AD;0 zLPL;@)Fg>V%CW(%+y=TMtG9HS@P4< za$~Z`kM@N_9Stvsw_ljeiE8&liInV9g~`sHZfy% z+V?o19)E(=tbG}&2o;9hAsNR6n3m@AHGwY=|0|71*6!do@D;k|&Ica<8@xh4rK20+ z*Wu}?{bNzn81*Y|J>PCzR9Nj*J@u32c6?tGqsyb}E!QhX{>qgc+f>ow4Igt?oRlQ+iav&hhJhbQzm zoxBz3?IpX=)zERIBGmI5*OB+oRqkVS@l!NTyk3RZJUig!Kjf7wKiI8jbav_(M%uRo zJx>MyMnV~T41Gtwqa z%i(+(J2oSG%CYNQhwr-Ho%pGfW@V*LW2?*_@06cMc{%U^nig0ZOMVi&)cqsf4s1e- zUp;b^M<7*TV%m&Js$sRq&-dgKqdNA5q3t^v)?$jVNojJH^e`KG1YkC$$km%+T2J+s#dbeT+7*M2gM z3seO4s9R|{)2C(NPg>5@>1o-sd^3i-^`_-a$xg$^A4j=%Dp2A7u^L>h534Iav8YqQL`egJf$SNK`XQtcGXmmB4j8q^SA?3hMc2$)xK1V#8 z&bY}O{;6Zqr?X;Za3I&Mu>M>(A{!{63JTG+dCZyT_TT~R)sqS6ipX_HRXotk{}g-G zx0v!3kWXN*h)hARiX0}HN20rD5QD6NUKyzf_>gMw3L4)pG+VAvH&qA*&&C(z0fx5$5oX?d9RFV^4W<7gF_YK`Iifh7*5zK6$A-mTw_7 z2Y$H0H5h}T^p|dN3pQBh_G~3m6-6(19a)Z4j}~~6Nadt4Uyxa;Q*a($9XL-pb@Vh+ z5ga=?&s`P0X-GYYLuv?WAZ2KI{8lEQ8Vsyf0%Hh#S^)NLz zErtb|cCDxPLdwx6DX+;JmABS4+=0|&(ixtWkuxnbXY!<0G`a!)3ivXf-LGrh2Erc? z@~KEe@CkfPMG)viP7vPloFs!=VXTIHU{heY0X)!)B;e%_SL@4fogcV_RqHRjg+?!le) zx&-V~&DsW!27JC2v{}KP+9=VgR>IC~92y#f#ZfnTG88=Rk;UwNO%j83iGFj( zh($fE9~fmkaa_(otY2{6fn>O z?A^_hgTIh!ixG7^fuO5Vf-;SG>R2(Hm`N4mX8sN}V zThfVgZo_o2MWS^}IlCY!WIbQbE=&pqe*qLoY!D=iy^^p)YN(}ZubAv*JgLBa)U1+%wZB$qb^kRji+q;`22cIX^ z2i|gGR*ngNOV}#75v>gxqP6rC_B1iD0nryaXZMe_8G|O zHSGe(J&>A!#qFuB5(8(@+_}(^8ez*yLxHF3P~6UH$P`lwE5CgvHZjnObD^`H#nii-lqQBx zz6HNTYkxs&SkLW@&)yfCXpO9A7jz8;_d&MA1izUT$I*H^1?X=ew!Y8T+uq$Z+4`ow zUC@o5bDXpx+lgi%4UJAVPqrSu%FgT_3i=!PeErC#BP|oHv<7w|7HsK@dlr_>KDWZ`Zl#))(yBgUAJww(B~Yice$R4PYk|=rmE>YRo7~2XZ8&RGnr=E z3Ft&zV&HDHarWun$-ygPe7+8jaa=-TAWfPA8Qek2?KC?_@LM#6+lgl|I@aBKirZ&W zlZvB+RF!og)-LEDvLc(=h5bW;oMsepn)rZ}w^->_!{&CufKYHg8^DGB2M?pgQGcYp zkI8aXyw7*d1#KqU;0xNTXhSb(^;;CRoPovx=+*KP+C|G+jOWE#a?pBTusnd)|AH3T z%IzzgH13XSWfxu(vhHYQM_(HX{+&EUkr8f{80?i0?gKHhmL%APn7j(<25xHGq=-a! zA{DdG#3fn-677P)p`h_d=59=4@I5pQfV(eLO|mnGgseeHc65_a@Fs?s7QGHVhNhLq zlwr01fXUF1)xEWyiCEg&E*KgL4q=cq5!^L&H(EEh07ua&G<+kEk+$k3+nLQm!4Xub zfu;59lOj;$3e&!MV&I%K`*ee3t94sDb66;tLCM z>#!lYOD`@vDFQ`9?=HDl(KKn%h*$BD9esT$*o#>($gP#7x;bPQK$f7sQ4SfmJ;~qR zj=muj+z6)w5AQ}MMWDD*X4eU}#A|mlX|iUc(GrGCb!$%tJ9Bs_coln*JSpZZpS#d{ zUC_>2U*F!i^RZgv~D{8tnUZdg&Cnh3L6iD!`;c1cPxHJXsLThfv^hplBMM`csJq|{)2P&div0R2+;{<&@qzTJiV3lnzF!D#Ma z>pE+rxm{<~1y7^N2TrSNxf7?jmhSy?WQrXYF+R0T zVsHYQ<{d{oa|=at0YmO7y3)0`Psb+*+mniQo8tDKg(erB+f49YG;fZuQ-9-WxIZ*8 z*y#GAc_Yyj7^nBahtM=v*nwEV=VfWf#3ct4ZgATod~|s%8as~;6Ru!8Zm=__hpgxk zcER*eaQ{fx5B6FvLqDKtzBu#3>NLvEoDmA{8s#nz8X1`w_#TZ(bZv65e(Hsy?BXM( z*)d((Mv!Pj9rTQq@eZ28M*VC8rAIrnnPYz-DOs^ia@Aip+Ahcq1wVpRP}pdg1J%a3 zQDrZn6DerfPPOC(-bYK&A`O%ot4`}PNHtj| zVIIb(xj}SB)|#7UXU+*(Po>!fbNDDkp6Vo!^s&o0YH@BY3zUL)uB^d>Xc|7pDtH!6 zWe6hMRqOE=T1K0Rrme=^ArGUezgQCdKzfn&V6{%SqvvxnL#lvtlm%WzYi?&XPY(Ph zV`m#^p5Zpmj9_A>dm0mZWMXhDn%s1jt@TNUU6>aNR?l=vRwz*(ispICy>SIvH)jgH zyjcSxJJ~8Cq?!`{B!7EYr}~R@_iphbP+wi$cMKDehIy`LJRwp5iQu zCn4o8<%rO4XdGGE9vP*sQ{8I>J26lm6a>aS*6^93|{=Suy%%aSEFe$I$K1b^mKh@*1kW66epIdXMycO zYwl{Si%-!8I3J6e%?NJ|+5%Rf4REc-Bt@WH>nKx)BnIMUV(5Irx|x(aTXYUSkJiaP zeQVo@-0+6BuX&O`*N$G!HD$J)xjYoCI47JHHzi5Wpp)#Zp~=?jId=4lQ1CSfw;gq- z-Q4geVY$5lt()V+nR!XYQ3g4EyJ=oH0-DSRE@-OYESkF%q;;4dUbTAQaSNIoN6H1B zM`N85D=RM?D=mk9XzswA8Ic&U(fGKG)k&o;#ISunWgLDPsTk$KDk=5S z{q%ePrYxxpwZ$MG&kn7A2^OS!tt{6;&3eF*G{yS)WCI$4-6kIwlhsA zP<@HhO&$VW@1_XJ7E*4*-0ZEBOYF?`pqxb|(D64fXj&p=R=AyT zgVO1rv>9mExFL#93>-!yz{}f4+`}qOiKfjv6SBHOYd5vas%XiMU2ehsp0jD*_fkH%A z-DVfu9MD zcIMWQb?sWaU~4FN|5|sUx%>4AG;SPIlLK|uY3F7tTZ7iw1=~V_GW|N&66AJza zsg1)q$OFwbYmw@)L>j49@THwYd(ymR^&T!kht+=l{@ zTfq8t(xP~`N7Io*9{0(-JMHLQq2LdY+MD=%MU!pra^2yKXZGi!btI3;#s}r!@3N!s z3k9#=9*!afEPK0Ma9_xJce`DPXuQLY-p#Y59qyR3uP}bkqPbIDT9v!q_T0Q1&_>XL ztG$TU0gdCBeX_(oZV>q#$TH}FHspfkx}sX3!%lUd>s4?zDfPyw&-!$yUAQL{tZ}bP z@;M|aF*piMN2=T8UbIeVJT~P?<9GMkg?o8;Sl~_~c4!XN3^anvN4fh7?1FtE>$3v8 z5Ycd#9sNKkFn*WwnY~+b@J&*^s0;U7C0Y&cvkS?-YPZif%s%}J&>4tl>v3dPeoRKvIf#8K*u&8-EsK-a2grebKo#`| zdKHzbXAqDbQ^c_wj4TOm0D4`NZu>}M&R0~*fm9FyGJqV&1bP*fav;lL|5?hR z$sR8$yKJ?uigG+T4XF$+T>9CaZy`{_i-GKx0KNW7%5Eu8xfMYAtw1kH=_`STByTHk zGTaW7!NPJR%f<=ePEQsf%Yny%UXpV3DWLMtc=82L9!4tvRiJv00KFuo|4oX+-~N&J#3 zh@w(_e=mQam;awgHF&LO|5sA=4VP3wZlGpL3Ni+hf{8W*Dl2y@j;Y-?) zPu6y3*g`ZJ-sD+JYHBY<%8g|nUsQ@(&YR>4FJDsjD?MGZ1o~Q}yjhP_)&{+~GSA7_ z>=8w!s4cun-p-pU*yibXisU6Jeut-DO3I;oynIR77a&FL@@s`V375FfGrW{k!9C=w z!hN3IrKIv7^zw^J@ejkRp8ZIT)02HX!zYVK86NO-Nf|zi6!o0PUrJhb5 zeaN%ElvLJXFJDs0mwD5`zvl6hO1{pUWoJEAHBY|1dDVM zUQ+db?&(EkMfe}#8zXC4;SEXFF5%3t`kpSSWCPw*S3{5gD=E81Ub!Zo{iUSrqVWQ?avDnHhf%{Gs98%M!rQ$E56;dlJ8L5|~__m&2REi3D zyrk^fd-`8V*>&*jB;`O}XOEDSK^IS#RI;1LclTrukMHH_y^(rJYF_vE_yHdOR}u&E zeAjq}MP-nRZt!?XB}ee4D_SN}4NVg1Nloz_PrsB@elGcn@O-2?>PDXN&-aKMkqXI8 zNHwqosh6bmK4pntw{Dfg?y2eA6>{ z%ad<=@*O1qeD8Vs`%-vGs%M{g{HLCN9I5&Wk#h93C%^UN_sBdo{If^=g5;m?H{QfM zr93IUIJL<0fG10+R$h|gOCnW1=*iMZ{`t!Art%d$y)shvRf^Gn8C3T&qC8pKll73= zaH5f_xG7RENhOU=4xa3SRKs17idgSr#J>!QVGs({2&8VaX-G}B zsYq2g9VrK9BK5kIRK>aEOV0A-Y){TXs{VYW>buF4OY%s_lUtFx-EKgtf{jRhVA$p9 z_aXHvDrL9ZF23#20Ym6w0o%a^2`Jm1%D!uO4rA*qIb^mIu%^pmGcs-d%3u2!%!K&rP^e1%pn8E2Wq6^#4Svr{z8SqEb|4-sD3yFW-?` z|3wM)qy`3xKpmv?dR_rZXEh+@*wvnFij-X}G7_1L)JszKojtv%)X?;Rcdm;)Jp)Nq z+zY7+`*?a^PxeFVC8_)Yo-V0|Qat^CAl3hi1(mMpL1WYqsG-I{jx_;#NlK3f%5UmP zZNGXIl?wUgpODbLD(V6xy8^u=Rj`K?UYC;UY#$&8`T>>i5A-T3RnKLgkhuLX`iR6S z|G)NxByY0Yp7W?go@N8}dA=m#miJr zM)ZP-G9d_`5)A(NKGT~g6`Z1vO2kY5?;{fh>A#Om^eBY|_}@n+|9xcg-$y3@ zePrVM?;{iE(TR@D|35u4(W4a#=b6KFr8wX-{(8)~orI?~>8 zt~bAbbOx=*H<9+>UwZpH+S`5^YM(_5{My^!*&g^S{ri^wp>?(WztO)l^zXOc{F=@_ zw21HM-|xNsJ?+%r=^xq)Xua+7=jq?~^zVFce_#6SE|8(0`OZ+;l9CzW!XK*-;#Qq&XwK$1jm)Z~#5kYzv^DMGurfA7ciVK;QXm zq!JPx&pCnfo>Z6AzEDlG2PsF1;qOzj*FOS z;vylISP*L?A!eClB9e+hbS(oh$E+>`aYDq8BIcQnWg*rVhuBdTBF~%=(IWscxE#cd zW?MOkvmyfJAr_i}K!ZWV~!(h!TPK-lID2>%+>q$*;q zxlv-BIVxdHTs6dcvs7Y(IVQ2uw62cWWL6{0i8565V|6OpVmj7RDejU32~3vCnBPvpT+rU*OKSU zp69lHuL;(I-4AQBYGJm^JSHN&5=70~5W7uAZHQ`>A&!XHW2)DII3!|T9f*B)`4hyU z3i>U8x?V*^ zPnp$ML9DL<@uP^RO~(chJ+6e<(E#EZb4J8j5rZ2-JZH8wgxDDc5oiSQf*IHdBBdt8 z!y;ZX{>BgywII?OLmW2yMC=z)xe3H8CbbDfdTodoL>w{Yqamu*ftVf*@tS!?#32z4 zu7-HSOuZT+w=TpxBHl7}n?f|M2eGIr#5?8<5$}s=6$9~}xiJP}NqvapB95B4Scs&n zAlAl0d}xk|I3c2IGl-AP>Shq@8$kRh;#1SHIYf_!5IdSf95ZJ`oQ1HbpXhD<-Di5m z`G=UDjj-4q=kIMD_nBYBq%?*Z9uM=S&lJSNL^OekYyor9XRd1jvtP_pV!ra3QY~T9 zqhYdI!kqS*$Hi2;8m49|m~VV0vlYyttNmrn-&*;5S!aBvMgmN3Q*7oXVDr7tyey`1 z3`|TS%#S`ZI}zr6F&~Th*=M4YV3x$ftVn`6=QAIONooeut~JcBK66WJm=j`7i}~GW z+O&aL-yCL38<;9^lS^UGah1hTZn);CnBW<#PD_y zCC$C^Sfzlf(qls3Wk5b3QTvf4vLn#V*`OCVLV14LPq(E;L+h$AA( zo9Z1QauXrub%dyB4vT1<1QF8-qOzIQ3F3VbAB(7JnskO((i&n#XNc$q-w*Lew@VMf7M3(YG5!U9+JZ#90x)i>PmUc8A#64q|tA zhz91Ih?Ee-@E#D2%)LDzBHBYl_Jn9+hV_KlFXAZ?SDRoji1ZE+S-l`)%wr;|b%dzN zVe4;ZGITf|5^+RCoT=UiBDWL7ygm>u%wZ9YJ43|ug=l4F^@Vs}#K$5MO_P2QOS(X; z=m*i-92Jq&6{1~#h-9<0KbuNhb4;S0X+41K_1(zcGJx#%=A?)o-68r8gy?8C41_o< z;&&09P0v9PJ9|Lv9t6?VoD-4K6Jq!^5Z%qa*FZ${f{45pqNf>lEyR8iPl@Plf`cK_ zH7l|PL-aL|iKx~GqUI2Y{w8Ax#32z!L<}_5heG7`g_t)K;u>>UMB{!CF)0v(&8!rN z_eFdxVyI~{jJGBIAyy277-o)&NE!gq?mCF;&C=^2PKY=yVz_C2J;eHf5L>Q?7->$5 z=rIVQ?+p;CX2T5-XGQ!jVvOlI9Af7+5W9y%q?vOfQm%yMM9urY*C`8Rvh{+}+72=SHBO<1n>Z2iYQy}JzhR898 zMKm4;5ikB6Che%1DUe84!!j zy%`V@qaY$PA(on9nGpL$JSAe82~L1WPld>u0I|Y6CZgJCh?)~2R+@~75Qjt@5wY4- z&w|Ju12HcP!ZwFRG#(2PGYMj?nKcRGeGwmvFs8|5h$U$dD<(s1Fh@lsje}@61!9v~ zItAi{h|?mrnATGv){lqSG8N(ub5cZ)bcnv$5Zla#Y>2ZWeiw0<>6rtuGXr9G4#W;~ zPDDy3#PDel_n3R9K}1Y|h@1{_uNgKSV!w!|MC>xb84&3cA+lyb>^6^ysFnp$b0)+d zlQ9$GkccB9_L=Ir5V?~e=H)^>Xby{LJQ*Tp7R1A5)+~tkMSLvcQPX5L#F8lxD`rDH zW{!$TnhMcw4#X2?=^Tg?B2J5V%Cw#fu|6AO%Up=3%}EhGav=K7gLuYlm=@7&7AYL-}=0QZvfQZb8IBbUHL+lsvl!#YM@J5LAnGjhw zLL4!ViKwPac+CY6ubGSm5Qjt@5%Gqpz7QgJ7R0=T5O0~oA{x(zh`9;k9W(1Di1$T& zEaE-WWD&%YIS?xrK^!$lMI_CIXm>Njhi2)`5GO>O7V)uZy%=KsJcuoeAwD%HMf8{t z(RT^NF|%O_#90x)Ls)|P3U+;4snlakMMW%zNfB7VEzI5&|S(IfxC zMZ|9g-Gae>2=nkQ6#2?;tYt9i3t-Zg!JPJ+2gFoc2vd1E%r|~BdO6G?F)xTY<2Myn zz~tTpGkpcj_kQ!Nn8u4>8r%x=qu*rT3iH00cf|bcH}zJ+EV&tG(Mp(ee)Fc7q{T3; zR>A!0Hw#w5oDg$d%1adj zyai&14G}PBM5HW(7`z6eq}jFxB4Rm2U@b(@3|tGbU&O;AN*n(=i1ZZ@Y3m>&%{~#; zZY5ROK$JD92I7#27etgd<<~>xu7sGr9-^XoMnvOP5Dhj!R5nvLK)f&F9T8Pc-Hi}S zRzob>2vOa zspG1B{+s-P4qf@R4!4dA)koge*Zm*nHY3ZKfsgsWR|#|QVQStykUVkiom$F0;_u-P zY~i=4JWo{1R%Mk6|A(kGM?Bi^F@MN!y*x%fJZ=T9o5+`$E;@eDlKbhF)5zXC{SnnS zEq4FoI6X-V|DTJ0>g}s;Z@+yJpIUXor$_Orh2N;WwP~@MEajM3eeW=34*P!!Oup0W z&DCnC$}^}}`1sGSCuYQE^5qh>_2pfU_Iuf1!m1noujh(pj?S3O|I){Q8hRhzD*|sl z+T(~nH>1>mdMe9T+ZveXldTT5`JTcb?n|sirhZ&RTh7Zeb=z7M^NK;Mn0|m+*3Iz+ zJX3w!q>9It@HlM|93UJ}RjPbaN9;YvQjq|ul9;a_IPVuUj;1(^n((g+KNDN{_2d`k2Q> zxnH(*!~BldW4`_E^iIFNFq?+uR4tFIM!L|mtL<_8{_TZdXsF|HHQ;Whtm>%iaaWRF z;&nt*MaevkS!%+7UHJ& ze09NUk8A4L)q}Iczjvc=hs&@&SmPNs^SGX+W!8ze{vI&^KxHJ)rigr~{}2>VkTp0cZ#sfyST- zhz3`KrXU9BPdqdOor$u3|L;BUJ~#^A0`Z_F;J3Ja31)RCtC912uUcE0-gQ7-P#;_c zw8OLo?ZB((`f6|k(iK2OPzh*p`hf+Cf#M(lN`R6;-}2SZ$6v>-H$WfKeL+9aLnGaj zgnnCSC%6}MLGJ)Mg62TK$)QE7#ax;ED&P>%g4c$j4Wc2?4y7GQJIi|V^>yP{z}rAO z+k0RS*b5#3Pk;mZnz_Ewy$Re7?f_fCHgG4n8*~NTKzGms^aQ=YGOz;l2Lr$$a1FQ? z3=#b;B|r(gNy}ZadJFJ*Z!LU-o@khz)|oK_!#JSgpPpc!PDSL@EF(!9ss#u z7MKI(f_Y#*7y&whPM|aB0=j|jpa*CR^!2osAg>i~UGVH<@Co=7deVD36_IffeqH^*NoPZFkn5{0B#3&fNkJjPylv;`@n8+KiCWQfd{~&U_W>a zJPw`!PlBhw0q`_92;KrW;K(1yo52e>_o=?(_AIzho`UTG+zJ+e{$K#8uJc!i`U|6qfdLx;|0#uU5x5!XY(4`123`Z>X($6^g2~_|DqjgW;GJKxy%HG({-CTM zc?7AiDeqF3cayju>;n&g#X!Gak_~deG;k+{HiF_H07?KI>=8gW$}f@Mff?W`P>(wF zWqsYpbpQGc90MtHEtx4JZb-gAHI4*amI~TfsVDK)gsnMpuBcpd2Ua zoL71W-7@NB)JD}sQ8&`6pgegxgmpj%0jIcg(km*BfVS+0;5X>Q;1GBLJP)1)yMTs7 z!>?(eE3@{O6tktLH8L-bWF=4yXbaL-bPX5;27-9d09*y?0bT!e2dxa`nyS-{TX$L2 zqswvyp!%wVs-TLeD=l8o^^|*S-UTI`QJ0K5K!s}qouO*1K9IB82X!TsBVoN6>1d$a zo7PezASYF43}^~;!xLhG>QG({P1A70B3l4e95!f6dH`q-LLeEm0pW_&qn4mGNCJtV z6-WTGQR6D7wCZZ-rTZbdq58VgzH>^*up{UUR6ri9p-wj1)ysvo}4PG_eJjy6kW}k!5aT- zJ!KfOjF%pcya6br*8@#R<)r}amt(;wFcORaW58&T>gk$*(!=@MXSLt10Lwtwew4<4 zBE$rc2{J%Bkg*JNKo*z+CWA>}D#!-60PUGGz;rMT%mK4NE|>{sgLz;sSOn&Sa-O~b zd85W($Oj9-O<)PoUbz%32e*P%KozV6w}Egp?j?N>*a5bKZQu^D8EgU@!3MA%7_bhk z1#5r}^1KHLe<-x7^mecXYz5Nq0`mS&a5vZqROT7vZg3ws0G;d-! z+3f>+!6V>7@UZ&+5Q!(i<3NT7!PDS5pq{ERIr1Xd3Y3dD>w_}h{pY8@ICkrya6<(N5HG#74SM>7CXN| z^O~m@BHst^fVaS#;B7DcF7iF_0XPc&p|Sr2d;vZJe+M6eV?eyPkHKf)Qy~3wpirI! z{{Sj`9Gn1Odip8kSKtiz2Al?8gKxpl;79NS$ot7tenFlC>iut^=(zuZe%|9X96IS` zqbTVtRHUTq5Dy>TrAU_sI{I|%X&7`{&?gNYdpZIc4*ql!30)`k@k3Wq8F7Dct{3%@ zs!#>$0@-T(>VVonw}g5?oYIegm%xkQ1@Jt04m=8mfCoW5cmV7Jd;P?J4~c8k8>DWE zS)dV^2qu6`kO9VnaX>vt1^P6gF!uq&No)VO9+?7$0^KOD1=oOXpaal^41sn)pB8S` z_$QN4&)R_2AQ2>hrl1v&$8jJUX#ATX8-rNT95e$lK=xMy@zNz*08O}-$RyAnbOIeg zXOP#0x2~W&7z74@9-t@a5Bh<=Ku+`qy+9u?EjbVOJO z6p=JAR^vaK#2Anc6iPLu@G7k^DqK#e&=ncwD*|dr!!!-(1KN!s2jqh(AQwypy5!FV zy7)~3vX`A~CTskqWK(%IQU#`xo{0?eGMo-({fScpGk|PmBZSK-FKj=DwCuu;s$Myx z{2B6YJ`kyf<)PB|fnDHcpn?V9Ua%8{8&Oa10Xx8UAP4ROcY?5UMLVUowt+=pE4TyX zZQ$*8unepQTfk%>r#1tHZX;L^3|I%&f;GSfw}Dk)30MHa4&OvtPAmk9sv2Dk)R~n) z+)|DItt3`}o{0+gwOf(l5gkka9b)iXJ)N-x!LIR8>*#3{HAkF+ zq&0?@OKbiVty7Mx4voKtTX{<7O`*ccns{Et;Yfs?3HSU`y7C?Y4*|`UJ)mf#52J@2 zE?QoWXsEHxyU=TSsM)NgCTyv={+;fOzrrZP zGvHhBIrtEK4BiAUgNEQR(DB;{Dd>Xw22w-tB6uCV2L1+)0Nn*1MQR8hM7{#z!2@6) zP#t-%^41yyK^1)j9s;WH1MnP>Ge?0c(tIgPS{131_kqTJH+T!E()Yl-;2rR`CyPc! z_4cJ6WS&!@E)Ycx6v}W^bPjxmE(a=rPe9lSHTEX>6zI}=4EYWC8vGrotZby8_VklT zb>JW13yuGA5{EGS5_tlg0$%|&))rI*gRPo8=svIK_9Z}ZplA8Y*Ry@i1HHu%QP!KA^fMX zzx{6Lko9-2J}wKIpb-}j+U7-n_} zvvnLzcs;hhC~3YPN7JWEn%gJR!SLTIziIHw^dCz$d6w2%xDg1K@GLLX5RTowL zNb{L2!hbpa>-Mb<=LQ~5#iFGf7H_P=owL@IF|TJ+!u=cSzWjvlKi~Dq&x&HR7jEEncY!(+dd{XP2gd}@k!NAvPI;h3~5Z^lg^ zCSg5X_wMp$)nuz$Lii7#zgo9?hng>D^>BLbOs-?BMn*Kh+pYx@7w5kCf|KL;Us&E8 zoJ0@9f89Ojg#}+eu%}n?i#<%NUrr>M%FUkM(;v@Yh)IDFs*Kltx zKVIS9bgyE{C}!nY#8(oTtO>Kv%y@9Y?=by*Aav+Y= z(HVkx%X9HU=e_A*%1yCq{F%I99G)}betLSswrbA9%KU!4I!5RBdu8KA4-Sx16|Ym< z{L#JLd!HP+nB&DP>K)IbVd2eDkJc$s`l7|DYNq+re~qdYQQgdkk7`ogd3c+@ed^dw zk$G?Iyjb#2v5WeD6rpe@|2c^NI@tfy{L9qqM*eb{ZKhc@qAEwZi=%7ywYBd~NnT+2 z!~3hZ(4sE6YqMprYu7Z}r&;lrws4l->$S{xe{GRn+jN-DfXuILuA9#EUsBuLDm^P; zUS4h0sGK@x8au?QFW>*9`l{#Gl=IuQc|2gwEU+qHbrKe7&wu?|JK1nof+3ONwpb^PKyO*8ZaF_04%|Pk4md6`Ze5 zY}|NFv*-FaA>h2@-bhX*a&F!Bz~JBKy*8K}@2L2wzUh-omyg#s<8qk+m-a9|ww14c z1M?6T*5(H54q8=;H}@4ZFu(1i=tB)m)GRW-ZfFL~!i_nNoNH752ainHU3J#{yDv7j zoE)7RpFFaw?3h72wvy8#HeQim-^kofS?kV5X20qh)YzPo9Mjm;nN6MfjomtDe^|TR zt7BqjIbDm3P2jrQgi9fH{xoUbf=Z?Cu1`*Lw@xeCOroq+A=-Q^xiQ+@Ih!v2>lGy& z49_wl{AcU?HGB5X>MuX1dFc6hi9qTEZN*hN+Jxp%d-b1A#KnR^m6c;W7A8eN&GQzbDrz9m84$bL|dTK_R%cCo&L zH#{27Y2`cA%-k^78W;5oUaH;ucYeQk(8hg-Eq`2#*j9>iu{iU|Tr0j(6l0|kY;oI| z+0Sg*I?wW#jWbuxv+6`OCZ`lR*4^K}JT84dSHf1@2qAs(ac0y!JWEF5Fv`C@rOmt6 zb7N{1zfk)?ax^_}jC*HVrK|0fi#cg==6;o(k3|hEdfe>m)%2be`=Z5qa&(5gx1h?t z;9E_LU(DGPXMUq>)JtC3K1c7J)qRjvq}^k2rulpn4(?67vnLT+NsV_UEd@F|)c#o~>WPggdI-#gs$ zAAoUI4YD#h#}>u}=ihq&6Ykh+W_?eN_P&xmQfKVjaO?!*rYlKI3!lG@nV65?mD;#| zpBj7J;E&rL>_S;S0ch#fZezA$kr0iA#(wg$Pd2>PdV_9s-j%)uIc3QiTP$$vm~ZFD zIPE&Cwo@DPwQB#@-Y_ej?l9-;-N>p~pX}B?bkJts`EP!CS^Z_xrN7&f%@i!G)5&JL zEGM;dH?e2WmT%JH?T1S^emHZV*1nTPVaPq%f3Et$m&3Cv%=U628HrA{PD6J@@dF#YgL|rB;~VR%f^D zuwC^FBNxqhlAHuLr(9>#XAvFoM$^n+WVMW1gt?a0rpk{N)>!o91k5$0O!Up2&EFQ$ z|NO?rx|w+F=xheuOw$v)xbE-xDR=BOWnPSwb2LEL(`&kuebCZ(@2{28tJFoOW_B^R z-)u!+b&#@};+L;uL05B%R-$g}>IV2=jRqy27&+=Q>WarNwx~^AO`XLAX*(7Qot77es7ti&P0bH`n@?nk7oR+Jv4nM|k7;@f`fq(qw_BKt3;UYc zw^)4=hV*lzQ|jc86`LNFH3R z7bVnd&KY*CdbeWvP$x4)^7a&S%dJH4h*x6S*fsl}{NV7XmS3N4*`<6Vhq*I-amgmP z_r2?Zdz`xBVmW$t4Kr7)wE9GC^)|5EZ+@cl&fm*$@tg0hg=5#5X)9@kt!}3*FWFaT zH14|Ilv_nl!kgkHEt|)-RunQs4?8!pji_)+}x)+ zdk;4+uCn3>jG=@!$;v~H{Jm-Y=SMgth-0E}2024j-V2#AmqacMyxGygE*O*(q4R z=WO>QX`Dvm<>6-UYCLp5D@9xH4L3in<`(hAa8vCzE4tM0l&nMDBS)A%w^7r)5$;?) zw&cTU`}(~cfuAj7nNR%OYlO+iBH?Z<)RQWKVKw{JT*y_9PZ`cNbT2u2RM4*9lvyPD^gWKl_>~dnZS|ut+i;p zjVoaj7S5Tu`;D2W->a@um1U=3-tUzieDv7W6>9gM?SzW;zz@wvnH$#O>5@@ql{UZC zqfCMHO{2^w(%pPEl~Hc%N$X_jejB*&m&tT%%4$+;bita@{Vl)tbV9>IFt1}7wP%96DXm}A;rX}sr&OaYEeIm- z4tX_`u+ge;Rfmc0iTW;5=T_>obzkVdzWR@tw{+JJ6;9lUOP(~hZ{(51C5{N)rim|~ zrrzF&r|w*;TpOQaC%J9h)c)-&d%b?B$b+{YlT6!9bg#w~bIT?TLRWKOleN)W-pE|H z+0~sDdYOTyZaUNFMecAPY_=+tGE?0J5}9q9KY+_svQ4=y$VS=g9z?`vn{T%vle5j< zUC3V9X24d;uG+%0v7y=K_T7xp=xlepxO&iIcMNDayC;FrWr$IooNYd%wuD7klqXbs zOMj4+yXcX(u+UCRWY>|S%TQ#Mv)6sQ{4+jdIc2%xggpwo;5BW1o^9suDB_y;Njz$1 zjyoJRqkhj@UGOEd$Hdw!Y`+pVer;yrPiDRbAq))4NTHGi7Pzk_~#I?X-C-ibQ+ z(KQb}zul=ZPTO(VC$H^rNjEItPcwBCvv4z><59i5FrC`dZd;{?2kQo=$&Xsg;$mp>8-DX%Mbfol-2bhq0j8AWAFGTma^K(xHoz0 zJ?b+owBB=LuKsFnbd3{UyVQPW*1EfKOkcv(sP6nOcX7&wx_UgLyIN~la;lLtrNi7^ z2lJB4c#b9U^{LsWpUQT}q5>9g70!JB?=|}G@hqr(7&%qRsnoGmr|HkW_Mw+U$fnFT zn<*Q$*ee^TFm3tc-qw52>(4bG-HT*8*SR10>0Hy{UaN8dFT>krAwM@(3@YE6Tlf6YBcELC z$G~}}?M{5TZl3E)>Ccl3d)uqsPnph|2<3eY~&)-41&5I_mOM$?NK6BiHiMk^A=*dt1SO>PL9z@HV-> z@HlK4-WJ3A!+**3pR++Ac4D0J+Pc za%=Xp>le9uP*k@YXPkK7a(-g(Uc4?dV_72MkcE9fXO+b(q($TW7ki`^lJEuQuPy(> zI=w^8^WvYz$_?1XOsmV3@uyWBbd7nk3cZZREn$-4Yu7!I%Ntg|Y^i@w1!_u}Du zeZcd-cmI3%Y$s6O-R*Kcio4LGa0t8}M6IOC3LFrJx;*{bqbo!GoO$WoKiyl8GoiyP z@ANYB*`rL=%dB3usq<8)!!~w(-6n+{>**Gts~l6c@^TZqpVfMJmKlwVy8J;Gz1-~G z&!F#|ZC>8b1DOTO-CN1lm&cbo{dn<_)aiXrSnlPVAHH(vS8sNE&&%O-3y*BLyWt*$ zCz7X|S0DT5eJ&jQf4g*@1DCls;PL-xdj1D9_|jwd=TBSJ`5%?kX4Jq{?v-fBhA;BV zM%~V%6n;|0jVs=lvC4e=1QE{1LXSDpmRC%^?Ue^d6CFLyW8rODWkOF<$CFr8!lK0S z?i& z%_(H5C$VfpU2E%`GCXpM>UEntYCU#Ly8r#!B}!7a_aMo8Y-NQXPF;JOnei0g(Hcz& z-Akj+=9hlx>HBV^g!ePYDdbcn=VXb$eO0yM+&9V5tm66?ek?j>xH(H5)~eyA=>b|_ zND19WmtFlvjqR=a>*t3m!Bz4JfAi2cgIZ2&f_FUc)bk;_b;WbU$M8f{7tpx& z+Z)VXSiS}p{8&s+SZ-NwI$+_tP{~Ys&Pq!7^Mowtr!&s$U9Y8DExM(in7y{17l-Ej z_C_o7(Q|b1#|@_3^R!rbqq{Ixf7sLiz#F3$>&LJO&LgXsji$@hOFoT{7CR9*BQ z4qmi^VnZ6Q$xQ8;JZYBevI+FFujp;5Zkx^7mY;7eg9 z-6XOH-BzKMWw+K#L1lCytcPwyM+~$w%W}JI&|hJ8F)MXlHq3|RWtjhbbLPy*LW6ia1ZUkAEMRnce2_Q3h+M`Vp+iaF%?~Z(3z+ zX6~nlfeglld`Ze}}yA zTJF%OWA0DnVpwsE7wd&Ln&6Gebw6g4SNzTJX06QdAyQ$=J}%blTQ%8AFoIJ?t<$CS zj36Xc%WId*Ee^G!1Lte;#t)^nVjxGV3jebqp?<5*P&E(%d3ACpK*xsLp|cTHbV;Pp zsNgoF7_3YO(@<_3OokocP>A9Mjra*i3wgnB9^j}5bCl2y8E&1We5C(!hI*vM0xH+3 zyA1t~0ekj(-}cJ=NoM8;Kd@&x`lnAE^AX-XS?=h8bMi&BBT{p-F?N21udK43<~e*V zVbklW94%tI^T;kzSw0oH9V|>SyB_-x8fwJFC2wQ%;8ULpsfrtO8ZNPrFCHcExOwl^ zQ+5Z2x(kKG&{vl=CK|gGRv;GOY6TSeKfOxM4wf+5o8GP-5tMXJm_4slMNSsR>~&P` zM93ij0-bb151pZ7xhdX@*xI55%u4yDpV~wR@CgHjJrq^Tv%OSh^H3teYca^#WIi~ zvx^%>_%=cf}3Pxf-9GA=?IWCuNwfEDLJ^k3irv zzqgtcL$z!Eq!*VOtoq`@G1pr*1)f+QVU0%+T;N~jY&)~IVOo?1c~Rf4Njbs4!nIT0 zq~V89_LhZttJBLCJ)d<=7Sypps(Qjy3OYQ@#!Bn@*^ZgCxsPQ?LF0HX3o=+t7Hgux zVlFGRme7|d9!-0cJWk>HPp7`IY4o|5jipz8EK=%Kaz`Nje94k%X9!nF_6T0dM(H{! zQ^iXIlqPFwqCs!iSSa0zYTEIj30yQ3i adB&zw!VDfsLA@-OT>0EzTDO(onD`q%=PGRg diff --git a/package.json b/package.json index 7d2e5524..204befa1 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,49 @@ { - "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", - "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" - } + "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/src/components/layout/Head.tsx b/src/components/layout/Head.tsx index 0818a73f..3ce3ed9a 100644 --- a/src/components/layout/Head.tsx +++ b/src/components/layout/Head.tsx @@ -1,6 +1,7 @@ import NextHead from 'next/head'; import { type NextRouter, useRouter } from 'next/router'; import { chainNameFromId } from '@/lib/utils'; +import { featureMap } from '@/lib/constants'; import { COMPANY_URL, OG_ENDPOINT, @@ -22,10 +23,19 @@ const getRouteData = (router: NextRouter) => { const targetTitle = chainNameFromId(Number(target)); if (!baseTitle || !targetTitle) return defaultRouteData; - const title = `${baseTitle} vs ${targetTitle} | ${SITE_NAME}`; + 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; }; diff --git a/src/pages/api/og.tsx b/src/pages/api/og.tsx index 39839f5a..43361410 100644 --- a/src/pages/api/og.tsx +++ b/src/pages/api/og.tsx @@ -1,23 +1,18 @@ import type { NextRequest } from 'next/server'; import { ImageResponse } from '@vercel/og'; -import { chainNameFromId } from '@/lib/utils'; import { SITE_DESCRIPTION } from '@/lib/constants'; export const config = { runtime: 'edge', }; -type Chain = { - chainId: number; - name: string; -}; - -export default async function handler(request: NextRequest) { +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( @@ -66,59 +61,5 @@ export default async function handler(request: NextRequest) { ); }; - const generateDiffImage = async (_baseChain: Chain, _targetChain: Chain) => { - 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 */} -
    , - { - 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 baseChainName = chainNameFromId(Number(base)); - if (baseChainName === undefined) return generateDefaultImage(); - - const targetChainName = chainNameFromId(Number(target)); - if (targetChainName === undefined) return generateDefaultImage(); - - return await generateDiffImage( - { chainId: Number(base), name: baseChainName }, - { chainId: Number(target), name: targetChainName }, - ); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - } catch (e: any) { - console.log(`OG image generation failed with error: ${e.message}`); - return generateDefaultImage(); - } + return generateDefaultImage(); } diff --git a/src/pages/diff.tsx b/src/pages/diff.tsx index e42d4038..822e3b0b 100644 --- a/src/pages/diff.tsx +++ b/src/pages/diff.tsx @@ -49,7 +49,11 @@ const Diff = () => { const [showPrettyDiff, setShowPrettyDiff] = useState(true); useEffect(() => { - if (!base || !target) return; + if (!base || !target) { + setLoading(false); + return; + } + if (onlyShowDiffParam !== undefined) setOnlyShowDiff(onlyShowDiffParam === 'true'); if (showPrettyDiffParam !== undefined) setShowPrettyDiff(showPrettyDiffParam === 'true'); diff --git a/src/pages/features.tsx b/src/pages/features.tsx index 0acf0633..ca26eb0b 100644 --- a/src/pages/features.tsx +++ b/src/pages/features.tsx @@ -39,7 +39,7 @@ const Features = () => { return (

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

    From c7e9252aaa6644767f356b56ce256c32435c9b82 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 19:43:30 -0700 Subject: [PATCH 70/75] style: fmt --- package.json | 94 ++++++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/package.json b/package.json index 204befa1..f36bd3cc 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,49 @@ { - "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" - } + "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" + } } From 8cc2d10dac62ba07b8d84d9c91ec8c48b73151a9 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 19:57:25 -0700 Subject: [PATCH 71/75] ci: add hourly job to check data --- .github/workflows/ci.yml | 2 +- .github/workflows/fetch-data.yml | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/fetch-data.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 89def825..0a5d09cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,5 +45,5 @@ jobs: run: bun prepare-chain-data # When this fails, run `bun prepare-chain-data` locally and commit the changes - - name: Ensure there was no diff + - name: Ensure no diff run: git diff --exit-code diff --git a/.github/workflows/fetch-data.yml b/.github/workflows/fetch-data.yml new file mode 100644 index 00000000..5f3da401 --- /dev/null +++ b/.github/workflows/fetch-data.yml @@ -0,0 +1,54 @@ +name: Fetch Chain Data + +on: + 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 update" --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 update" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 46ac93ed5b864e9e09bdd1da366b62e03b3ab113 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 20:01:26 -0700 Subject: [PATCH 72/75] ci: add workflow dispatch --- .github/workflows/fetch-data.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/fetch-data.yml b/.github/workflows/fetch-data.yml index 5f3da401..44eb9c5a 100644 --- a/.github/workflows/fetch-data.yml +++ b/.github/workflows/fetch-data.yml @@ -1,6 +1,7 @@ name: Fetch Chain Data on: + workflow_dispatch: schedule: - cron: '0 * * * *' From 9020e9bd167506da9edef4daacb206bee7774621 Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 20:02:08 -0700 Subject: [PATCH 73/75] ci: limit diff to script/data --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a5d09cd..9c742cb4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -46,4 +46,4 @@ jobs: # When this fails, run `bun prepare-chain-data` locally and commit the changes - name: Ensure no diff - run: git diff --exit-code + run: git diff --exit-code script/data From ff00feef42dd495d895a93b0e04097a33132335b Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Sun, 19 May 2024 20:23:28 -0700 Subject: [PATCH 74/75] ci: tweak label --- .github/workflows/fetch-data.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/fetch-data.yml b/.github/workflows/fetch-data.yml index 44eb9c5a..aea98c27 100644 --- a/.github/workflows/fetch-data.yml +++ b/.github/workflows/fetch-data.yml @@ -33,7 +33,7 @@ jobs: id: existing_issue run: | issue_title="Chain Data Updated" - issue_search=$(gh issue list --state open --label "data update" --limit 1 --json title --jq '.[].title') + 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 @@ -50,6 +50,6 @@ jobs: Triggered by GitHub Actions run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" - gh issue create --title "$title" --body "$body" --label "data update" + gh issue create --title "$title" --body "$body" --label "data mismatch" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3c4eed79e7177333d437322eeeee7005d77983cf Mon Sep 17 00:00:00 2001 From: Matt Solomon Date: Tue, 21 May 2024 05:46:28 -0700 Subject: [PATCH 75/75] funding.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml 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]