From 8a77cc1280d5a123b1a72af43332468082d1e04b Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 3 Feb 2026 10:05:12 +0000 Subject: [PATCH 01/10] Use only private RPC URLs --- script/index.ts | 33 +++++++++------------------------ script/input.json | 10 +++++++--- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/script/index.ts b/script/index.ts index ad91ca4..823e0bc 100644 --- a/script/index.ts +++ b/script/index.ts @@ -126,37 +126,22 @@ function selectRpcUrls(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. - 'matic-mainnet-full-rpc.bwarelabs.com', // "This endpoint is deprecated". - 'publicnode.com', // Transaction creation failed. - 'cloudflare', // Requested resource not found. - 'api.avax.network', // Unrecognized token '<', 429's easily. - 'rpc.linea.build', // All error messages are identical so can't distinguish opcode support. - ]; - 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. + // Use only URLs with placeholders and replace with API key if available. In this case, we + // return this URL as the selected RPC URL. const replacedUrls: string[] = []; - const normalUrls: string[] = []; - for (const url of filteredRpcUrls) { + for (const url of rpcUrls) { if (hasPlaceholder(url)) { const replacedUrl = replacePlaceholder(url); if (replacedUrl !== url) replacedUrls.push(replacedUrl); - } else { - normalUrls.push(url); } } - return [...replacedUrls, ...normalUrls]; // Prefer URLs with API keys. + if (replacedUrls.length === 0) { + console.error('No RPC URLs with API keys found for this chain'); + process.exit(1); + } + + return replacedUrls; } main().catch((error) => { diff --git a/script/input.json b/script/input.json index 922c9bb..eea1e8a 100644 --- a/script/input.json +++ b/script/input.json @@ -22,11 +22,14 @@ }, { "chainId": 8453, - "rpcUrls": ["https://base-mainnet.infura.io/v3/${INFURA_API_KEY}"] + "rpcUrls": [ + "https://base-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" + ] }, { "chainId": 34443, - "rpcUrls": [] + "rpcUrls": ["https://mode-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"] }, { "chainId": 42161, @@ -41,7 +44,8 @@ "https://avalanche-c-chain-rpc.publicnode.com", "https://rpc.ankr.com/avalanche", "https://ava-mainnet.public.blastapi.io/ext/bc/C/rpc", - "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}" + "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://avax-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" ] }, { From d51855649d61ed26aae794c6d918188687fd5de6 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 3 Feb 2026 10:07:20 +0000 Subject: [PATCH 02/10] Improve opcode support detection --- script/checks/opcodes.ts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts index e5f04cd..821e14f 100644 --- a/script/checks/opcodes.ts +++ b/script/checks/opcodes.ts @@ -1,7 +1,6 @@ import { type Hex, type PublicClient, toHex } from 'viem'; type Opcode = number; -type CallError = { details: string }; export async function checkOpcodes( client: PublicClient, @@ -29,15 +28,29 @@ async function checkOpcode(opcode: Opcode, client: PublicClient): Promise Date: Tue, 3 Feb 2026 10:07:36 +0000 Subject: [PATCH 03/10] Add CLZ opcode --- script/checks/opcodes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts index 821e14f..a78e850 100644 --- a/script/checks/opcodes.ts +++ b/script/checks/opcodes.ts @@ -86,6 +86,7 @@ export const knownOpcodes: Record = { 0x1b: 'SHL', 0x1c: 'SHR', 0x1d: 'SAR', + 0x1e: 'CLZ', 0x20: 'KECCAK256', 0x30: 'ADDRESS', 0x31: 'BALANCE', From 863d28366c201064c6e7ffb4c5dfbc92fa5ec5d0 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 3 Feb 2026 10:08:37 +0000 Subject: [PATCH 04/10] Avoid sending parallel requests --- script/archive/precompile-check.ts | 9 ++++++--- script/checks/deployed-contracts.ts | 9 +++++---- script/checks/evm-stack-addresses.ts | 8 ++++---- script/checks/opcodes.ts | 5 ++++- script/checks/precompiles.ts | 12 +++++++----- script/index.ts | 12 ++++++------ 6 files changed, 32 insertions(+), 23 deletions(-) diff --git a/script/archive/precompile-check.ts b/script/archive/precompile-check.ts index 283eaa4..6dcd862 100644 --- a/script/archive/precompile-check.ts +++ b/script/archive/precompile-check.ts @@ -4,7 +4,7 @@ // they are precompiles or predeploys, and prints the result. // Example usage: // bun script/precompile-check.ts optimism -import { http, type Address, createPublicClient, getAddress } from 'viem'; +import { http, type Address, createPublicClient, getAddress, type GetBytecodeReturnType } from 'viem'; import { type Chain, arbitrum, optimism } from 'viem/chains'; type ChainConfig = { @@ -74,8 +74,11 @@ async function main() { 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 codes: GetBytecodeReturnType[] = [] + for (const address of addresses) { + const code = await client.getBytecode({ address }); + codes.push(code); + } const kinds = codes.map((code) => code === '0x' || code === '0xfe' ? 'precompile' : 'predeploy', ); diff --git a/script/checks/deployed-contracts.ts b/script/checks/deployed-contracts.ts index 91e4f47..46d2f26 100644 --- a/script/checks/deployed-contracts.ts +++ b/script/checks/deployed-contracts.ts @@ -5,12 +5,13 @@ 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 result = []; + for (const { name, address } of deployedContracts) { const code = await client.getBytecode({ address }); const codeHash = (code && keccak256(code)) || NO_CODE_HASH; - return { name, address, codeHash, hasCode: codeHash !== NO_CODE_HASH }; - }); - return await Promise.all(result); + result.push({ name, address, codeHash, hasCode: codeHash !== NO_CODE_HASH }); + } + return result; } export const deployedContracts: { name: string; address: Address }[] = [ diff --git a/script/checks/evm-stack-addresses.ts b/script/checks/evm-stack-addresses.ts index b4f0b6d..f661751 100644 --- a/script/checks/evm-stack-addresses.ts +++ b/script/checks/evm-stack-addresses.ts @@ -26,13 +26,13 @@ export async function checkEvmStackAddresses( for (const stack of Object.keys(evmStackAddresses)) { const stackPredploys = evmStackAddresses[stack as EVMStack]; - const res = stackPredploys.map(async ({ name, address, kind }) => { + result[stack as EVMStack] = []; + for (const { name, address, kind } of stackPredploys) { 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); + result[stack as EVMStack].push({ name, address, kind, codeHash, exists }); + } } return result; diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts index a78e850..2ca9823 100644 --- a/script/checks/opcodes.ts +++ b/script/checks/opcodes.ts @@ -6,7 +6,10 @@ export async function checkOpcodes( client: PublicClient, ): Promise<{ number: Hex; name: string; supported: boolean | string }[]> { const opcodes = Array.from(Array(0xff + 1).keys()); - const supported = await Promise.all(opcodes.map(async (opcode) => checkOpcode(opcode, client))); + const supported: Array = []; + for (const opcode of opcodes) { + supported.push(await checkOpcode(opcode, client)); + } const result: { number: Hex; name: string; supported: boolean | string }[] = []; opcodes.forEach((opcode, index) => { diff --git a/script/checks/precompiles.ts b/script/checks/precompiles.ts index 8350833..3b86d76 100644 --- a/script/checks/precompiles.ts +++ b/script/checks/precompiles.ts @@ -3,17 +3,19 @@ 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 result = []; + + for (const { name, address, testCalldata, expectedResponse } of precompiles) { try { const res = await client.call({ to: address, data: testCalldata }); const implemented = res.data === expectedResponse; - return { name, address, implemented }; + result.push({ name, address, implemented }); } catch (e) { // If the call fails, the precompile is not implemented. - return { name, address, implemented: false }; + result.push({ name, address, implemented: false }); } - }); - return await Promise.all(result); + } + return result; } // By default a call to an EOA succeeds and returns no data, therefore we cannot simply use a diff --git a/script/index.ts b/script/index.ts index 823e0bc..32dd956 100644 --- a/script/index.ts +++ b/script/index.ts @@ -40,12 +40,12 @@ async function main() { const client = initClient(rpcUrls); // Fetch data. - const [opcodes, deployedContracts, precompiles, evmStackAddresses] = await Promise.all([ - checkOpcodes(client), - checkDeployedContracts(client), - checkPrecompiles(client), - checkEvmStackAddresses(client), - ]); + const [opcodes, deployedContracts, precompiles, evmStackAddresses] = [ + await checkOpcodes(client), + await checkDeployedContracts(client), + await checkPrecompiles(client), + await checkEvmStackAddresses(client), + ]; // Format and save the output. const chain: Chain = { From ea03d44501e56dc98db534616e05bdb89e5388cb Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 3 Feb 2026 10:14:21 +0000 Subject: [PATCH 05/10] Format --- script/checks/opcodes.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/script/checks/opcodes.ts b/script/checks/opcodes.ts index 2ca9823..fe19718 100644 --- a/script/checks/opcodes.ts +++ b/script/checks/opcodes.ts @@ -32,7 +32,12 @@ async function checkOpcode(opcode: Opcode, client: PublicClient): Promise Date: Tue, 3 Feb 2026 10:15:13 +0000 Subject: [PATCH 06/10] Fetch data --- script/data/chain/1.json | 3 ++- script/data/chain/10.json | 1 + script/data/chain/137.json | 3 ++- script/data/chain/34443.json | 8 +++++++- script/data/chain/42161.json | 1 + script/data/chain/43114.json | 6 ++++-- script/data/chain/534352.json | 3 ++- script/data/chain/59144.json | 17 +++++++++-------- script/data/chain/8453.json | 1 + script/data/feature/metadata.json | 10 ++++++++-- script/data/feature/opcodes.json | 21 +++++++++++++++------ script/data/feature/precompiles.json | 12 ++++++------ src/lib/chains.json | 2 +- 13 files changed, 59 insertions(+), 29 deletions(-) diff --git a/script/data/chain/1.json b/script/data/chain/1.json index 7ad7e8f..f48d3fd 100644 --- a/script/data/chain/1.json +++ b/script/data/chain/1.json @@ -77,6 +77,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -299,7 +300,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "evmStackAddresses": { diff --git a/script/data/chain/10.json b/script/data/chain/10.json index 3314ff4..325cfca 100644 --- a/script/data/chain/10.json +++ b/script/data/chain/10.json @@ -63,6 +63,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, diff --git a/script/data/chain/137.json b/script/data/chain/137.json index 0bd2cbc..969710f 100644 --- a/script/data/chain/137.json +++ b/script/data/chain/137.json @@ -63,6 +63,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -280,7 +281,7 @@ { "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", - "implemented": false + "implemented": true }, { "name": "secp256r1", diff --git a/script/data/chain/34443.json b/script/data/chain/34443.json index a58d412..4e36d45 100644 --- a/script/data/chain/34443.json +++ b/script/data/chain/34443.json @@ -13,7 +13,12 @@ ], "faucets": [], "icon": "mode", - "rpc": ["https://mainnet.mode.network", "https://mode.drpc.org", "wss://mode.drpc.org"] + "rpc": [ + "https://mainnet.mode.network", + "https://mode.drpc.org", + "wss://mode.drpc.org", + "https://mode-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" + ] }, "opcodes": [ { "number": "0x00", "name": "STOP", "supported": true }, @@ -42,6 +47,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, diff --git a/script/data/chain/42161.json b/script/data/chain/42161.json index c3e73ca..be543af 100644 --- a/script/data/chain/42161.json +++ b/script/data/chain/42161.json @@ -58,6 +58,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, diff --git a/script/data/chain/43114.json b/script/data/chain/43114.json index d743627..6d07881 100644 --- a/script/data/chain/43114.json +++ b/script/data/chain/43114.json @@ -21,7 +21,8 @@ "wss://avalanche-c-chain-rpc.publicnode.com", "https://rpc.ankr.com/avalanche", "https://ava-mainnet.public.blastapi.io/ext/bc/C/rpc", - "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}" + "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://avax-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" ], "slip44": 9005 }, @@ -52,6 +53,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -274,7 +276,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "evmStackAddresses": { diff --git a/script/data/chain/534352.json b/script/data/chain/534352.json index 71ba0d6..5f29fe5 100644 --- a/script/data/chain/534352.json +++ b/script/data/chain/534352.json @@ -52,6 +52,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -274,7 +275,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "evmStackAddresses": { diff --git a/script/data/chain/59144.json b/script/data/chain/59144.json index 6c679d9..5d2238d 100644 --- a/script/data/chain/59144.json +++ b/script/data/chain/59144.json @@ -68,6 +68,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -94,8 +95,8 @@ { "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": "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 }, @@ -108,10 +109,10 @@ { "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": "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 }, @@ -285,12 +286,12 @@ { "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", - "implemented": false + "implemented": true }, { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "evmStackAddresses": { diff --git a/script/data/chain/8453.json b/script/data/chain/8453.json index 6e1ed59..40b8e8b 100644 --- a/script/data/chain/8453.json +++ b/script/data/chain/8453.json @@ -64,6 +64,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, diff --git a/script/data/feature/metadata.json b/script/data/feature/metadata.json index d3a1c0f..e3f657d 100644 --- a/script/data/feature/metadata.json +++ b/script/data/feature/metadata.json @@ -176,7 +176,12 @@ ], "faucets": [], "icon": "mode", - "rpc": ["https://mainnet.mode.network", "https://mode.drpc.org", "wss://mode.drpc.org"] + "rpc": [ + "https://mainnet.mode.network", + "https://mode.drpc.org", + "wss://mode.drpc.org", + "https://mode-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" + ] }, "42161": { "name": "Arbitrum One", @@ -232,7 +237,8 @@ "wss://avalanche-c-chain-rpc.publicnode.com", "https://rpc.ankr.com/avalanche", "https://ava-mainnet.public.blastapi.io/ext/bc/C/rpc", - "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}" + "https://avalanche-mainnet.infura.io/v3/${INFURA_API_KEY}", + "https://avax-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" ], "slip44": 9005 }, diff --git a/script/data/feature/opcodes.json b/script/data/feature/opcodes.json index a883d76..44ebf39 100644 --- a/script/data/feature/opcodes.json +++ b/script/data/feature/opcodes.json @@ -26,6 +26,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -177,6 +178,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -328,6 +330,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -479,6 +482,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -630,6 +634,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -781,6 +786,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -932,6 +938,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": false }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -1083,6 +1090,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, @@ -1109,8 +1117,8 @@ { "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": "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 }, @@ -1123,10 +1131,10 @@ { "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": "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 }, @@ -1234,6 +1242,7 @@ { "number": "0x1b", "name": "SHL", "supported": true }, { "number": "0x1c", "name": "SHR", "supported": true }, { "number": "0x1d", "name": "SAR", "supported": true }, + { "number": "0x1e", "name": "CLZ", "supported": true }, { "number": "0x20", "name": "KECCAK256", "supported": true }, { "number": "0x30", "name": "ADDRESS", "supported": true }, { "number": "0x31", "name": "BALANCE", "supported": true }, diff --git a/script/data/feature/precompiles.json b/script/data/feature/precompiles.json index 8485c68..25b9280 100644 --- a/script/data/feature/precompiles.json +++ b/script/data/feature/precompiles.json @@ -53,7 +53,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "10": [ @@ -162,7 +162,7 @@ { "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", - "implemented": false + "implemented": true }, { "name": "secp256r1", @@ -395,7 +395,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "59144": [ @@ -447,12 +447,12 @@ { "name": "point evaluation", "address": "0x000000000000000000000000000000000000000a", - "implemented": false + "implemented": true }, { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ], "534352": [ @@ -509,7 +509,7 @@ { "name": "secp256r1", "address": "0x0000000000000000000000000000000000000100", - "implemented": false + "implemented": true } ] } diff --git a/src/lib/chains.json b/src/lib/chains.json index f95d850..5d806c0 100644 --- a/src/lib/chains.json +++ b/src/lib/chains.json @@ -1,7 +1,7 @@ [ - { "chainId": 1, "name": "Ethereum Mainnet" }, { "chainId": 10, "name": "OP Mainnet" }, { "chainId": 137, "name": "Polygon Mainnet" }, + { "chainId": 1, "name": "Ethereum Mainnet" }, { "chainId": 34443, "name": "Mode" }, { "chainId": 42161, "name": "Arbitrum One" }, { "chainId": 43114, "name": "Avalanche C-Chain" }, From b4a30fc7b4d5469259d196eca6a6d60edc857786 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 10 Feb 2026 14:45:38 +0000 Subject: [PATCH 07/10] Upgrade setup-bun action and use latest bun version Also add a step to print the bun and node versions to make it easier to debug if there are issues in the future. --- .github/workflows/ci.yml | 8 ++++++-- .github/workflows/fetch-data.yml | 9 ++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e73c79..bb67b4c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - name: Install dependencies run: bun install @@ -24,7 +26,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest - name: Install dependencies run: bun install diff --git a/.github/workflows/fetch-data.yml b/.github/workflows/fetch-data.yml index f82a2c3..19bb0dd 100644 --- a/.github/workflows/fetch-data.yml +++ b/.github/workflows/fetch-data.yml @@ -13,7 +13,14 @@ jobs: ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }} steps: - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Print versions + run: | + bun --version + bun -p process.version - name: Install dependencies run: bun install From 33d115231b7cb36eee42f14fc59ec21e764547b6 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 10 Feb 2026 15:04:11 +0000 Subject: [PATCH 08/10] Update lockfile --- bun.lockb | Bin 236001 -> 240729 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 0260b756fa2b3ddd9d7acf1d626b82dc2b17722c..20e64bb3dc4e3cd88a053c32a8b9970b739738f9 100755 GIT binary patch delta 7948 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 delta 6966 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 pHeplqx-HEc`;|{XZz*yMh1! From bc24b8cdbd1cfb9c9dbdb1feb15f626ffad2e02c Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 10 Feb 2026 15:05:06 +0000 Subject: [PATCH 09/10] Set LC_ALL=C to in prepare-chain-data.sh --- script/prepare-chain-data.sh | 3 +++ src/lib/chains.json | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/script/prepare-chain-data.sh b/script/prepare-chain-data.sh index bb68ad6..8ae31a9 100644 --- a/script/prepare-chain-data.sh +++ b/script/prepare-chain-data.sh @@ -1,6 +1,9 @@ #!/bin/bash set -euo pipefail +# Ensure deterministic glob ordering across environments +export LC_ALL=C + # First we get list of all chains. CHAIN_DIR="./script/data/chain" OUTPUT_FILE="./src/lib/chains.json" diff --git a/src/lib/chains.json b/src/lib/chains.json index 5d806c0..f95d850 100644 --- a/src/lib/chains.json +++ b/src/lib/chains.json @@ -1,7 +1,7 @@ [ + { "chainId": 1, "name": "Ethereum Mainnet" }, { "chainId": 10, "name": "OP Mainnet" }, { "chainId": 137, "name": "Polygon Mainnet" }, - { "chainId": 1, "name": "Ethereum Mainnet" }, { "chainId": 34443, "name": "Mode" }, { "chainId": 42161, "name": "Arbitrum One" }, { "chainId": 43114, "name": "Avalanche C-Chain" }, From 3942f196b607c36766a572128806580562f5f8b6 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 11 Feb 2026 09:48:21 +0000 Subject: [PATCH 10/10] Trigger CI