fix(chains): drop node URLs that embed Nova's provider keys (#72)

* fix(chains): drop node URLs that embed Nova's Infura keys

Nova's configs carry Nova's own Infura project keys inside node URLs, and
every sync copied them into ours: Ethereum had four keyed Infura nodes and
Base one, across 43 published files. Our Android build already fills
`{INFURA_API_KEY}` from our own secret; the keyed URLs used another
organisation's quota and would break for every user when Nova rotates them.

- sync_from_nova.py strips nodes whose URL embeds an Infura key, and drops a
  chain left with no node (only Ethereum - Goerli, a retired testnet, in the
  dev files); merge-chains.py applies the same filter
- the published chain files are rewritten with that filter; nothing else in
  them changes (each file round-trips byte for byte through json.dump)
- check_pezkuwi_integrity.py refuses a keyed Infura URL under chains/

* fix(chains): strip every keyed provider URL, and make the gate fail closed

The first pass matched only `infura.io/.../v3/<lowercase hex>`, so it missed
`https://...infura.io/v3/<key>`, upper-case keys and hosts, and Nova's
OnFinality `?apikey=` URLs (Moonriver, and the Hades testnet in v20/v21
preConfigured). preConfigured was copied from Nova without the filter, and the
integrity check passed if grep itself failed.

- one predicate, is_keyed(), in sync_from_nova.py: Infura /v3/ ids and
  apikey/api_key/key/token query values, case-insensitive; {PLACEHOLDER}
  values are allowed
- preConfigured details are filtered after the copy; a chain left with no
  node loses its details file and its index entry (Hades, v20/v21 only)
- rewritten files keep their own indent, so the diff is the data change only
- check 5 imports is_keyed() and checks every string in every JSON file
  under chains/; an unreadable file or an empty tree is an error
- check 3 reports a grep error instead of passing on it
This commit is contained in:
SatoshiQaziMuhammed authored and GitHub committed 2026-10-17 20:55:00 +04:00
1 parent 8bd31ac686
commit 5ca2661eb2
59 files changed
+113 -1365

No files matched your search

-16
View File
@@ -1626,25 +1626,9 @@
"url": "https://1rpc.io/eth",
"name": "One rpc node"
},
{
"url": "wss://mainnet.infura.io/ws/v3/32a2be59297444c9bcb2b61bb700c6fe",
"name": "Infura node 5"
},
{
"url": "wss://mainnet.infura.io/ws/v3/{INFURA_API_KEY}",
"name": "Infura node"
},
{
"url": "wss://mainnet.infura.io/ws/v3/1e69544301064ef19edb194a14fb75f3",
"name": "Infura node 2"
},
{
"url": "wss://mainnet.infura.io/ws/v3/9dddd77ac74043dc9a8dc48f82822c7d",
"name": "Infura node 4"
},
{
"url": "wss://mainnet.infura.io/ws/v3/82fd5b2925e341719f10b7ed4376a646",
"name": "Infura node 6"
}
],
"explorers": [
-16
View File
@@ -1626,25 +1626,9 @@
"url": "https://1rpc.io/eth",
"name": "One rpc node"
},
{
"url": "wss://mainnet.infura.io/ws/v3/32a2be59297444c9bcb2b61bb700c6fe",
"name": "Infura node 5"
},
{
"url": "wss://mainnet.infura.io/ws/v3/{INFURA_API_KEY}",
"name": "Infura node"
},
{
"url": "wss://mainnet.infura.io/ws/v3/1e69544301064ef19edb194a14fb75f3",
"name": "Infura node 2"
},
{
"url": "wss://mainnet.infura.io/ws/v3/9dddd77ac74043dc9a8dc48f82822c7d",
"name": "Infura node 4"
},
{
"url": "wss://mainnet.infura.io/ws/v3/82fd5b2925e341719f10b7ed4376a646",
"name": "Infura node 6"
}
],
"explorers": [
-53
View File
@@ -3196,14 +3196,6 @@
"url": "https://1rpc.io/eth",
"name": "One rpc node"
},
{
"url": "wss://mainnet.infura.io/ws/v3/25bd0a6e359240529b237e5dd8b19e1f",
"name": "Infura node 3"
},
{
"url": "wss://mainnet.infura.io/ws/v3/1e69544301064ef19edb194a14fb75f3",
"name": "Infura node 2"
},
{
"url": "wss://mainnet.infura.io/ws/v3/{INFURA_API_KEY}",
"name": "Infura test node"
@@ -3279,51 +3271,6 @@
"noSubstrateRuntime"
]
},
{
"chainId": "eip155:5",
"name": "Ethereum - Goerli",
"assets": [
{
"assetId": 0,
"symbol": "ETH",
"priceId": "ethereum",
"type": "evmNative",
"icon": "ETH.svg",
"precision": 18
}
],
"nodes": [
{
"url": "wss://goerli.infura.io/ws/v3/25bd0a6e359240529b237e5dd8b19e1f",
"name": "Infura test node"
}
],
"explorers": [
{
"name": "Etherscan",
"extrinsic": "https://goerli.etherscan.io/tx/{hash}",
"account": "https://goerli.etherscan.io/address/{address}"
}
],
"externalApi": {
"history": [
{
"type": "etherscan",
"url": "https://api-goerli.etherscan.io/api",
"parameters": {
"assetType": "evm"
}
}
]
},
"icon": "https://raw.githubusercontent.com/novasamatech/nova-utils/master/icons/chains/gradient/Ethereum_Goerli.svg",
"addressPrefix": 5,
"options": [
"testnet",
"ethereumBased",
"noSubstrateRuntime"
]
},
{
"chainId": "9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6",
"parentId": "91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3",