Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .env.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
INFURA_API_KEY=
ALCHEMY_API_KEY=
2 changes: 1 addition & 1 deletion .github/workflows/fetch-data.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ name: Fetch Chain Data
on:
workflow_dispatch:
schedule:
- cron: '0 */4 * * *'
- cron: '0 */6 * * *'

jobs:
fetch-data:
Expand Down
1 change: 0 additions & 1 deletion script/.env.example

This file was deleted.

14 changes: 9 additions & 5 deletions script/checks/opcodes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,17 @@ async function checkOpcode(opcode: Opcode, client: PublicClient): Promise<boolea
return true; // Call succeeded so opcode is supported.
} catch (e: unknown) {
const err = e as CallError;
const details = err.details.toLowerCase();
// TODO These might be specific to the node implementation, can this be more robust?
if (opcode === 0xfe && err.details === 'invalid opcode: INVALID') return true; // Designated invalid opcode.
if (err.details.includes('stack underflow')) return true; // Implies opcode is supported.
if (err.details.includes('not defined')) return false;
if (err.details.includes('not supported')) return false;
if (err.details.includes('invalid opcode')) return false;
if (opcode === 0xfe && details.includes('invalid opcode: invalid')) return true; // Designated invalid opcode.
if (details.includes('stack underflow')) return true; // Implies opcode is supported.
if (details.includes('not defined')) return false;
if (details.includes('not supported')) return false;
if (details.includes('invalid opcode')) return false;

console.log(`\n======== Opcode ${opcode} ========`);
console.log('err.details:', err.details);
console.log(JSON.stringify(err, null, 2));
throw new Error(`Unexpected error: ${err}`);
}
}
Expand Down
4 changes: 3 additions & 1 deletion script/data/chain/1.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
"https://rpc.mevblocker.io/noreverts",
"https://rpc.mevblocker.io/fullprivacy",
"https://eth.drpc.org",
"wss://eth.drpc.org"
"wss://eth.drpc.org",
"https://api.securerpc.com/v1",
"https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"slip44": 60
},
Expand Down
4 changes: 3 additions & 1 deletion script/data/chain/10.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
"https://optimism.gateway.tenderly.co",
"wss://optimism.gateway.tenderly.co",
"https://optimism.drpc.org",
"wss://optimism.drpc.org"
"wss://optimism.drpc.org",
"https://optimism-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
"opcodes": [
Expand Down
4 changes: 3 additions & 1 deletion script/data/chain/137.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
"https://polygon.gateway.tenderly.co",
"wss://polygon.gateway.tenderly.co",
"https://polygon.drpc.org",
"wss://polygon.drpc.org"
"wss://polygon.drpc.org",
"https://polygon-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"slip44": 966
},
Expand Down
4 changes: 2 additions & 2 deletions script/data/chain/42161.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
"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"
"https://arbitrum-one-rpc.publicnode.com",
"wss://arbitrum-one-rpc.publicnode.com"
]
},
"opcodes": [
Expand Down
17 changes: 10 additions & 7 deletions script/data/chain/43114.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@
"rpc": [
"https://api.avax.network/ext/bc/C/rpc",
"https://avalanche-c-chain-rpc.publicnode.com",
"wss://avalanche-c-chain-rpc.publicnode.com"
"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}"
],
"slip44": 9005
},
Expand Down Expand Up @@ -75,8 +78,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 },
Expand All @@ -89,9 +92,9 @@
{ "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": "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 },
Expand Down Expand Up @@ -266,7 +269,7 @@
{
"name": "point evaluation",
"address": "0x000000000000000000000000000000000000000a",
"implemented": false
"implemented": true
},
{
"name": "secp256r1",
Expand Down
4 changes: 3 additions & 1 deletion script/data/chain/534352.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
"https://rpc.ankr.com/scroll",
"https://scroll-mainnet.chainstacklabs.com",
"https://scroll-rpc.publicnode.com",
"wss://scroll-rpc.publicnode.com"
"wss://scroll-rpc.publicnode.com",
"https://scroll-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://scroll-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active"
},
Expand Down
3 changes: 2 additions & 1 deletion script/data/chain/59144.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
"https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
"wss://linea-mainnet.infura.io/ws/v3/${INFURA_API_KEY}",
"https://linea-rpc.publicnode.com",
"wss://linea-rpc.publicnode.com"
"wss://linea-rpc.publicnode.com",
"https://linea-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active",
"title": "Linea Mainnet"
Expand Down
4 changes: 3 additions & 1 deletion script/data/chain/8453.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
"https://base.gateway.tenderly.co",
"wss://base.gateway.tenderly.co",
"https://base-rpc.publicnode.com",
"wss://base-rpc.publicnode.com"
"wss://base-rpc.publicnode.com",
"https://base-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active"
},
Expand Down
32 changes: 23 additions & 9 deletions script/data/feature/metadata.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@
"https://rpc.mevblocker.io/noreverts",
"https://rpc.mevblocker.io/fullprivacy",
"https://eth.drpc.org",
"wss://eth.drpc.org"
"wss://eth.drpc.org",
"https://api.securerpc.com/v1",
"https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"slip44": 60
},
Expand Down Expand Up @@ -80,7 +82,9 @@
"https://optimism.gateway.tenderly.co",
"wss://optimism.gateway.tenderly.co",
"https://optimism.drpc.org",
"wss://optimism.drpc.org"
"wss://optimism.drpc.org",
"https://optimism-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
"137": {
Expand Down Expand Up @@ -114,7 +118,9 @@
"https://polygon.gateway.tenderly.co",
"wss://polygon.gateway.tenderly.co",
"https://polygon.drpc.org",
"wss://polygon.drpc.org"
"wss://polygon.drpc.org",
"https://polygon-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"slip44": 966
},
Expand Down Expand Up @@ -150,7 +156,9 @@
"https://base.gateway.tenderly.co",
"wss://base.gateway.tenderly.co",
"https://base-rpc.publicnode.com",
"wss://base-rpc.publicnode.com"
"wss://base-rpc.publicnode.com",
"https://base-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active"
},
Expand Down Expand Up @@ -198,8 +206,8 @@
"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"
"https://arbitrum-one-rpc.publicnode.com",
"wss://arbitrum-one-rpc.publicnode.com"
]
},
"43114": {
Expand All @@ -221,7 +229,10 @@
"rpc": [
"https://api.avax.network/ext/bc/C/rpc",
"https://avalanche-c-chain-rpc.publicnode.com",
"wss://avalanche-c-chain-rpc.publicnode.com"
"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}"
],
"slip44": 9005
},
Expand Down Expand Up @@ -261,7 +272,8 @@
"https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
"wss://linea-mainnet.infura.io/ws/v3/${INFURA_API_KEY}",
"https://linea-rpc.publicnode.com",
"wss://linea-rpc.publicnode.com"
"wss://linea-rpc.publicnode.com",
"https://linea-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active",
"title": "Linea Mainnet"
Expand All @@ -286,7 +298,9 @@
"https://rpc.ankr.com/scroll",
"https://scroll-mainnet.chainstacklabs.com",
"https://scroll-rpc.publicnode.com",
"wss://scroll-rpc.publicnode.com"
"wss://scroll-rpc.publicnode.com",
"https://scroll-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://scroll-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
],
"status": "active"
}
Expand Down
10 changes: 5 additions & 5 deletions script/data/feature/opcodes.json
Original file line number Diff line number Diff line change
Expand Up @@ -958,8 +958,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 },
Expand All @@ -972,9 +972,9 @@
{ "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": "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 },
Expand Down
2 changes: 1 addition & 1 deletion script/data/feature/precompiles.json
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@
{
"name": "point evaluation",
"address": "0x000000000000000000000000000000000000000a",
"implemented": false
"implemented": true
},
{
"name": "secp256r1",
Expand Down
9 changes: 9 additions & 0 deletions script/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,13 @@ async function getMetadata(chainId: number): Promise<Metadata> {
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.`);

// Add in the custom RPC URLs from input.json.
const chains = await Bun.file('script/input.json').json();
const chain = chains.find((chain: Metadata) => chain.chainId === chainId);
if (chain?.rpcUrls) metadata.rpc.push(...chain.rpcUrls);
metadata.rpc = [...new Set(metadata.rpc)]; // Deduplicate RPC URLs.

return metadata;
}

Expand Down Expand Up @@ -128,6 +135,8 @@ function selectRpcUrls(rpcUrls: string[]): string[] {
'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)),
Expand Down
71 changes: 62 additions & 9 deletions script/input.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,64 @@
[
{ "chainId": 1 },
{ "chainId": 10 },
{ "chainId": 137 },
{ "chainId": 8453 },
{ "chainId": 34443 },
{ "chainId": 42161 },
{ "chainId": 43114 },
{ "chainId": 59144 },
{ "chainId": 534352 }
{
"chainId": 1,
"rpcUrls": [
"https://mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 10,
"rpcUrls": [
"https://optimism-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 137,
"rpcUrls": [
"https://polygon-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 8453,
"rpcUrls": [
"https://base-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 34443,
"rpcUrls": []
},
{
"chainId": 42161,
"rpcUrls": [
"https://arbitrum-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 43114,
"rpcUrls": [
"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}"
]
},
{
"chainId": 59144,
"rpcUrls": [
"https://linea-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://linea-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
},
{
"chainId": 534352,
"rpcUrls": [
"https://scroll-mainnet.infura.io/v3/${INFURA_API_KEY}",
"https://scroll-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]
}
]
6 changes: 5 additions & 1 deletion script/main.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#!/bin/bash
set -euo pipefail

# Load API keys from the repo root.
repoRoot=$(git rev-parse --show-toplevel)
# shellcheck disable=SC1091
source "$repoRoot"/.env

# Function to handle final preparation steps.
final_preparation() {
local exitStatus=$?
Expand All @@ -19,7 +24,6 @@ final_preparation() {
# Set up a trap to run final preparation steps on script exit.
trap final_preparation EXIT


if [ $# -eq 0 ]; then
# No input provided, read from `input.json`.
chainIds=$(jq -r '.[].chainId' script/input.json)
Expand Down