rpc: /ext/ -> /v1/ on our own hosts

luxd serves /v1/*; /ext/* 404s. Third-party chains keep their own paths.

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-08-03 21:02:21 -07:00
co-authored by Hanzo Dev
parent 12297f9022
commit 5c1a638589
24 changed files with 60 additions and 60 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ equals per-env EVM chainID (sovereign-L1 rule).
| mainnet | 200200 | 9700 | https://api.zoo.network |
| testnet | 200201 | 9710 | https://api.zoo-test.network |
| devnet | 200202 | 9720 | https://api.zoo-dev.network |
| localnet | 200203 | 9730 | http://127.0.0.1:9730/ext/bc/C/rpc |
| localnet | 200203 | 9730 | http://127.0.0.1:9730/v1/bc/C/rpc |
Ports are explicit (`httpPort` + `stakingPort` in chain.yaml). No
port+1 implicit rule. No collisions across envs.
+5 -5
View File
@@ -71,7 +71,7 @@ networks:
httpPort: 9730
stakingPort: 9731
genesisFile: ./configs/genesis/localnet/genesis.json
rpcUrl: http://127.0.0.1:9730/ext/bc/C/rpc
rpcUrl: http://127.0.0.1:9730/v1/bc/C/rpc
cluster: colima
namespace: zoo-local
imageTag: v1.30.6
@@ -83,18 +83,18 @@ chains:
slug: zoo-evm
vmType: evm
description: "Zoo EVM — DeAI / DeSci primary chain"
rpcPath: /ext/bc/C/rpc
wsPath: /ext/bc/C/ws
rpcPath: /v1/bc/C/rpc
wsPath: /v1/bc/C/ws
- name: P
slug: zoo-platform
vmType: platform
description: "Zoo P-chain — sovereign validator set"
rpcPath: /ext/bc/P
rpcPath: /v1/bc/P
- name: X
slug: zoo-exchange
vmType: avm
description: "Zoo X-chain — UTXO fee asset (ZOO)"
rpcPath: /ext/bc/X
rpcPath: /v1/bc/X
token:
name: "Zoo"
+1 -1
View File
@@ -34,4 +34,4 @@ services:
ports: ["4001:4001"]
environment:
- ZOO_RPC=http://node:9550
- LUX_RPC=https://api.lux.network/ext/bc/C/rpc
- LUX_RPC=https://api.lux.network/v1/bc/C/rpc
+4 -4
View File
@@ -22,18 +22,18 @@ env:
key: bridge-url
name: zoo-db-credentials
- name: ZOO_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo/rpc
value: http://zoo-rpc:9650/v1/bc/zoo/rpc
- name: LUX_RPC_URL
valueFrom:
configMapKeyRef:
key: lux-rpc-url
name: zoo-config-487tfkdgm6
- name: THRESHOLD_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-threshold/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-threshold/rpc
- name: IDENTITY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-identity/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-identity/rpc
- name: KEY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-keys/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-keys/rpc
resources:
limits:
cpu: 500m
+4 -4
View File
@@ -19,18 +19,18 @@ env:
- name: DATABASE_URL
value: sqlite:///app/data/data.db
- name: ZOO_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo/rpc
value: http://zoo-rpc:9650/v1/bc/zoo/rpc
- name: LUX_RPC_URL
valueFrom:
configMapKeyRef:
key: lux-rpc-url
name: zoo-config
- name: THRESHOLD_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-threshold/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-threshold/rpc
- name: IDENTITY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-identity/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-identity/rpc
- name: KEY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-keys/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-keys/rpc
resources:
limits:
cpu: 500m
+1 -1
View File
@@ -17,7 +17,7 @@ env:
- name: ETHEREUM_JSONRPC_VARIANT
value: geth
- name: ETHEREUM_JSONRPC_HTTP_URL
value: http://zoo-rpc:9650/ext/bc/zoo/rpc
value: http://zoo-rpc:9650/v1/bc/zoo/rpc
- name: DATABASE_URL
valueFrom:
secretKeyRef:
+4 -4
View File
@@ -22,18 +22,18 @@ env:
key: bridge-url
name: zoo-db-credentials
- name: ZOO_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo/rpc
value: http://zoo-rpc:9650/v1/bc/zoo/rpc
- name: LUX_RPC_URL
valueFrom:
configMapKeyRef:
key: lux-rpc-url
name: zoo-config-dhmbk98hkm
- name: THRESHOLD_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-threshold/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-threshold/rpc
- name: IDENTITY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-identity/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-identity/rpc
- name: KEY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-keys/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-keys/rpc
resources:
limits:
cpu: 500m
+10 -10
View File
@@ -36,11 +36,11 @@ function productionUrls(): ZooUrls {
const luxApi = LUX_API[NETWORK] || LUX_API.mainnet
const ep = EXPLORE_PREFIX[NETWORK] || ''
return {
rpcZoo: `${luxApi}/${NETWORK}/ext/bc/zoo/rpc`,
rpcLux: `${luxApi}/${NETWORK}/ext/bc/C/rpc`,
rpcInfo: `${luxApi}/${NETWORK}/ext/info`,
rpcHealth: `${luxApi}/${NETWORK}/ext/health`,
rpcPlatform: `${luxApi}/${NETWORK}/ext/bc/P`,
rpcZoo: `${luxApi}/${NETWORK}/v1/bc/zoo/rpc`,
rpcLux: `${luxApi}/${NETWORK}/v1/bc/C/rpc`,
rpcInfo: `${luxApi}/${NETWORK}/v1/info`,
rpcHealth: `${luxApi}/${NETWORK}/v1/health`,
rpcPlatform: `${luxApi}/${NETWORK}/v1/bc/P`,
exploreZoo: `https://${ep}explore-zoo.lux.network`,
apiExploreZoo: `https://api-${ep}explore-zoo.lux.network`,
exchange: 'https://zoo.exchange',
@@ -50,11 +50,11 @@ function productionUrls(): ZooUrls {
function localUrls(): ZooUrls {
return {
rpcZoo: 'http://127.0.0.1:9630/ext/bc/zoo/rpc',
rpcLux: 'http://127.0.0.1:9630/ext/bc/C/rpc',
rpcInfo: 'http://127.0.0.1:9630/ext/info',
rpcHealth: 'http://127.0.0.1:9630/ext/health',
rpcPlatform: 'http://127.0.0.1:9630/ext/bc/P',
rpcZoo: 'http://127.0.0.1:9630/v1/bc/zoo/rpc',
rpcLux: 'http://127.0.0.1:9630/v1/bc/C/rpc',
rpcInfo: 'http://127.0.0.1:9630/v1/info',
rpcHealth: 'http://127.0.0.1:9630/v1/health',
rpcPlatform: 'http://127.0.0.1:9630/v1/bc/P',
exploreZoo: 'http://localhost:4011',
apiExploreZoo: 'http://localhost:4011',
exchange: 'http://localhost:3001',
+1 -1
View File
@@ -2,7 +2,7 @@
Zoo is a brand L2 on Lux primary network (shares validators via primary-network
staking; see `~/work/zoo/universe/chain.yaml`). The Zoo L2 EVM lives on
`api.lux.network/ext/bc/zoo/rpc` (chainId 200200 mainnet, 200201 testnet,
`api.lux.network/v1/bc/zoo/rpc` (chainId 200200 mainnet, 200201 testnet,
200202 devnet). The manifests in this directory describe Zoo's *brand*
services — bridge, explorer, gateway, marketing sites — that run alongside
the L2 in a `do-sfo3-zoo-k8s` cluster. Validators themselves run on Lux
+4 -4
View File
@@ -85,7 +85,7 @@ spec:
- name: DATABASE_URL
value: sqlite:///app/data/data.db
- name: ZOO_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo/rpc
value: http://zoo-rpc:9650/v1/bc/zoo/rpc
- name: LUX_RPC_URL
valueFrom:
configMapKeyRef:
@@ -93,13 +93,13 @@ spec:
key: lux-rpc-url
# Chain-native signing via T-Chain RPC (replaces MPC StatefulSet)
- name: THRESHOLD_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-threshold/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-threshold/rpc
# Chain-native identity via I-Chain RPC (replaces external IAM)
- name: IDENTITY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-identity/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-identity/rpc
# Chain-native key management via K-Chain RPC (replaces external KMS)
- name: KEY_RPC_URL
value: http://zoo-rpc:9650/ext/bc/zoo-keys/rpc
value: http://zoo-rpc:9650/v1/bc/zoo-keys/rpc
volumeMounts:
- name: data
mountPath: /app/data
+2 -2
View File
@@ -82,10 +82,10 @@ spec:
# platform.getBlockchains on that validator returns only the Lux
# primary-network chains, and ZooChain zoo-evm carries no blockchainId, i.e.
# the Zoo devnet EVM has never been created. Do NOT repoint this at
# /ext/bc/C/rpc to make it respond — C-Chain is Lux's primary EVM and no
# /v1/bc/C/rpc to make it respond — C-Chain is Lux's primary EVM and no
# other network uses it. zoo-testnet/zoo-mainnet override with their own
# tracked blockchainID, which is what this becomes once devnet has one.
rpcEndpoint: http://zoo-chain-rpc:9630/ext/bc/zoo/rpc
rpcEndpoint: http://zoo-chain-rpc:9630/v1/bc/zoo/rpc
chainName: zoo
coinSymbol: ZOO
service:
+1 -1
View File
@@ -19,7 +19,7 @@ configMapGenerator:
- LUX_NETWORK_ID=3
# Zoo EVM chainID — per-env, baked into the L2 genesis blob.
- ZOO_EVM_CHAIN_ID=200202
- lux-rpc-url=https://api.lux-dev.network/ext/bc/C/rpc
- lux-rpc-url=https://api.lux-dev.network/v1/bc/C/rpc
# Mainnet hosts in base/ingress.yaml don't apply to devnet — remove
# them so the devnet-specific ingressroute.yaml is canonical.
@@ -25,7 +25,7 @@ metadata:
spec:
replacePathRegex:
regex: "^/(.*)$"
replacement: "/ext/bc/zoo/rpc/$1"
replacement: "/v1/bc/zoo/rpc/$1"
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
+1 -1
View File
@@ -1,7 +1,7 @@
# Node flag injection for the operator-rendered zoo-chain StatefulSet.
# See k8s/zoo-mainnet/statefulset-patch.yaml for the full rationale: the node
# ignores ZOO_* env for these settings, so --http-host=0.0.0.0 (etc.) must be
# passed as CLI flags or the kubelet liveness probe can't reach /ext/health and
# passed as CLI flags or the kubelet liveness probe can't reach /v1/health and
# the node restart-loops. devnet = Lux primary networkId 3, 1 validator, sybil
# protection off (networkId 3 convention).
#
+1 -1
View File
@@ -19,7 +19,7 @@ configMapGenerator:
- LUX_NETWORK_ID=1
# Zoo EVM chainID — per-env, baked into the L2 genesis blob.
- ZOO_EVM_CHAIN_ID=200200
- lux-rpc-url=https://api.lux.network/ext/bc/C/rpc
- lux-rpc-url=https://api.lux.network/v1/bc/C/rpc
patches:
- path: network-patch.yaml
- target:
+2 -2
View File
@@ -1,7 +1,7 @@
# Zoo mainnet — 5 validators that join Lux mainnet primary network (networkId 1)
# and track the Zoo EVM chain (chainID 200200, blockchainID
# 4HBM17czc7zFQMPrd9CVZ6YbABm1jecf99iwvFw8Gbo6gFaU3 — looked up live
# 2026-06-10 from api.lux.network/ext/bc/P platform.getBlockchains).
# 2026-06-10 from api.lux.network/v1/bc/P platform.getBlockchains).
#
# Bootstrap IPs and NodeIDs are the public addresses of the Lux mainnet
# validators (do-sfo3-lux-k8s, namespace lux-mainnet, LB IPs 2026-06-10).
@@ -65,7 +65,7 @@ metadata:
spec:
chainRef: zoo-evm
image: ghcr.io/luxfi/explorer:1.2.18
rpcEndpoint: http://zoo-chain-rpc.zoo-mainnet.svc.cluster.local:9630/ext/bc/4HBM17czc7zFQMPrd9CVZ6YbABm1jecf99iwvFw8Gbo6gFaU3/rpc
rpcEndpoint: http://zoo-chain-rpc.zoo-mainnet.svc.cluster.local:9630/v1/bc/4HBM17czc7zFQMPrd9CVZ6YbABm1jecf99iwvFw8Gbo6gFaU3/rpc
chainName: zoo
coinSymbol: ZOO
service:
+1 -1
View File
@@ -125,7 +125,7 @@ spec:
containerPort: 9631
livenessProbe:
httpGet:
path: /ext/health/liveness
path: /v1/health/liveness
port: 9630
initialDelaySeconds: 300
periodSeconds: 30
@@ -30,7 +30,7 @@ metadata:
spec:
replacePathRegex:
regex: "^/(.*)$"
replacement: "/ext/bc/zoo/rpc/$1"
replacement: "/v1/bc/zoo/rpc/$1"
---
# This middleware strips a leading slash from blank paths (root POST).
apiVersion: traefik.io/v1alpha1
+1 -1
View File
@@ -4,7 +4,7 @@
# config as ZOO_* env vars. The node binary does NOT read its http-host /
# bootstrap / track-chains settings from ZOO_* env — only from real CLI flags.
# Without --http-host=0.0.0.0 it binds the HTTP / health API to 127.0.0.1, so the
# kubelet liveness probe (which hits the pod IP) can never reach /ext/health: the
# kubelet liveness probe (which hits the pod IP) can never reach /v1/health: the
# node boots, passes its internal check, then gets SIGTERM'd ~90s in when the
# probe fails 3x — an endless restart loop.
#
+1 -1
View File
@@ -19,7 +19,7 @@ configMapGenerator:
- LUX_NETWORK_ID=2
# Zoo EVM chainID — per-env, baked into the L2 genesis blob.
- ZOO_EVM_CHAIN_ID=200201
- lux-rpc-url=https://api.lux-test.network/ext/bc/C/rpc
- lux-rpc-url=https://api.lux-test.network/v1/bc/C/rpc
# Mainnet hosts in base/ingress.yaml don't apply to testnet — remove
# them via kustomize so only the testnet-specific ingressroute.yaml
+1 -1
View File
@@ -52,7 +52,7 @@ metadata:
spec:
chainRef: zoo-evm
image: ghcr.io/luxfi/explorer:1.2.18
rpcEndpoint: http://zoo-chain-rpc.zoo-testnet.svc.cluster.local:9630/ext/bc/c3PrgGAAoJXz8RgNAw3j7dSUjUiHVk3mtTneYfr7GvZRxmTPH/rpc
rpcEndpoint: http://zoo-chain-rpc.zoo-testnet.svc.cluster.local:9630/v1/bc/c3PrgGAAoJXz8RgNAw3j7dSUjUiHVk3mtTneYfr7GvZRxmTPH/rpc
chainName: zoo
coinSymbol: tZOO
service:
@@ -24,7 +24,7 @@ metadata:
spec:
replacePathRegex:
regex: "^/(.*)$"
replacement: "/ext/bc/zoo/rpc/$1"
replacement: "/v1/bc/zoo/rpc/$1"
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
+1 -1
View File
@@ -1,7 +1,7 @@
# Node flag injection for the operator-rendered zoo-chain StatefulSet.
# See k8s/zoo-mainnet/statefulset-patch.yaml for the full rationale: the node
# ignores ZOO_* env for these settings, so --http-host=0.0.0.0 (etc.) must be
# passed as CLI flags or the kubelet liveness probe can't reach /ext/health and
# passed as CLI flags or the kubelet liveness probe can't reach /v1/health and
# the node restart-loops. testnet = Lux primary networkId 2, 3 validators, Zoo
# testnet EVM chain c3PrgGAAoJXz8RgNAw3j7dSUjUiHVk3mtTneYfr7GvZRxmTPH.
# command is `zood` (zooai/node), not `./luxd` — same luxfi/node flag set,
+10 -10
View File
@@ -30,12 +30,12 @@ const ep = EXPLORE_PREFIX[NETWORK] || ''
const urls: Record<string, Record<string, string>> = {
production: {
// Zoo chain RPC (subnet of Lux)
rpcZoo: `${luxApi}/${NETWORK}/ext/bc/zoo/rpc`,
rpcZoo: `${luxApi}/${NETWORK}/v1/bc/zoo/rpc`,
// Parent Lux chain RPCs
rpcLux: `${luxApi}/${NETWORK}/ext/bc/C/rpc`,
rpcInfo: `${luxApi}/${NETWORK}/ext/info`,
rpcHealth: `${luxApi}/${NETWORK}/ext/health`,
rpcPlatform: `${luxApi}/${NETWORK}/ext/bc/P`,
rpcLux: `${luxApi}/${NETWORK}/v1/bc/C/rpc`,
rpcInfo: `${luxApi}/${NETWORK}/v1/info`,
rpcHealth: `${luxApi}/${NETWORK}/v1/health`,
rpcPlatform: `${luxApi}/${NETWORK}/v1/bc/P`,
// Zoo explorer (hosted under lux.network)
exploreZoo: `https://${ep}explore-zoo.lux.network`,
apiExploreZoo: `https://api-${ep}explore-zoo.lux.network`,
@@ -44,11 +44,11 @@ const urls: Record<string, Record<string, string>> = {
website: 'https://zoo.network',
},
local: {
rpcZoo: 'http://127.0.0.1:9630/ext/bc/zoo/rpc',
rpcLux: 'http://127.0.0.1:9630/ext/bc/C/rpc',
rpcInfo: 'http://127.0.0.1:9630/ext/info',
rpcHealth: 'http://127.0.0.1:9630/ext/health',
rpcPlatform: 'http://127.0.0.1:9630/ext/bc/P',
rpcZoo: 'http://127.0.0.1:9630/v1/bc/zoo/rpc',
rpcLux: 'http://127.0.0.1:9630/v1/bc/C/rpc',
rpcInfo: 'http://127.0.0.1:9630/v1/info',
rpcHealth: 'http://127.0.0.1:9630/v1/health',
rpcPlatform: 'http://127.0.0.1:9630/v1/bc/P',
exploreZoo: 'http://localhost:4011',
apiExploreZoo: 'http://localhost:4011',
exchange: 'http://localhost:3001',