fix(lux-explorer): wire all chains across mainnet/testnet/devnet

Audit found the unified explorer + lux-indexer ConfigMaps drifting from
the canonical post-rebootstrap blockchain IDs, plus testnet/devnet
ingress-chains.yaml still pointing at dead Blockscout services.

Changes (manifest-only, no luxd touching):

  - lux-mainnet/lux-indexer.yaml: zoo + hanzo rpc URLs now point at the
    current blockchain IDs (2wbPWcyu... for zoo, y5HBrn6E... for hanzo).
    Old IDs (2Y625Kvdd... / 2GiQb73Ce...) were 404ing.

  - lux-mainnet/explorer.yaml: switched per-chain rpc URLs from slug
    aliases (/ext/bc/{slug}/rpc) to literal blockchain IDs, since the
    chain-aliases ConfigMap is declarative state luxd has not yet
    loaded (verified: /ext/bc/pars/rpc → 404, /ext/bc/2wYWjBHziTjf.../rpc → 200).

  - lux-testnet/lux-indexer.yaml + explorer.yaml: added hanzo, zoo
    (zoofix LXuiihyi...), pars (26a3qkQ5...), and spc (Sd9bKzGu...) chains.
    Testnet zoo now backed by the 2026-05-27 zoofix re-bootstrap.

  - lux-devnet/lux-indexer.yaml + explorer.yaml: added hanzo (2XSToxn...),
    zoo (2jhVoHB5...), pars (SbgsF19z...), spc (2YmQ1abS...) chains.
    Chain IDs use the on-chain values from chain-aliases annotations.

  - lux-testnet/ingress-chains.yaml + lux-devnet/ingress-chains.yaml:
    rewrote per-chain IngressRoute backends from dead
    explorer-{chain}-{net}:4000 Blockscout services to the unified
    explorer:8090 service with blockscout-prefix-{slug} middlewares
    mirroring the mainnet pattern. Added explore-{chain}-{net}.lux.network
    SPA routes (will work once DNS records are created; existing
    explorer.{net}.lux.network already covers all chains via path
    /v1/indexer/{slug}).

Verified end-to-end (heights from /v1/indexer/{slug}/blocks):
  mainnet/cchain=1083589, hanzo=0, zoo=799, pars=0, spc=0
  testnet/cchain=923, hanzo=682, zoo=0, pars=377, spc=389
  devnet/cchain=163, hanzo=5, zoo=0, pars=88, spc=164
This commit is contained in:
Hanzo AI
2026-05-27 04:52:32 -07:00
parent b1c58fad24
commit 5f2a22ee3e
8 changed files with 624 additions and 126 deletions
+13 -10
View File
@@ -41,9 +41,12 @@ data:
- { label: Devnet, domain: devnet.explore.lux.network, chain_id: 96369 }
chains:
# Per-chain blockchain IDs match the devnet chain-aliases ConfigMap;
# using literal IDs instead of slug aliases because luxd alias
# resolution is not yet active on devnet validators.
- slug: cchain
name: Lux C-Chain
chain_id: 96369
chain_id: 96370
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/C/rpc
coin: LUX
@@ -54,9 +57,9 @@ data:
- slug: hanzo
name: Hanzo
chain_id: 36963
chain_id: 36964
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/hanzo/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2XSToxnvSMsmrXQhAKzbiqTquveDK8PdvJP9166hcLSC1hhr3E/rpc
coin: AI
enabled: true
indexer: { poll_interval: 30s }
@@ -64,19 +67,19 @@ data:
- slug: zoo
name: Zoo
chain_id: 200200
chain_id: 200202
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/zoo/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2jhVoHB5z97hSGssR8GtiFaFVuaFBH5TJeVMVjiw2uGg3gbqpu/rpc
coin: ZOO
enabled: false
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Zoo (Devnet), coin: ZOO, accent_color: "#7c3aed" }
- slug: pars
name: Pars
chain_id: 7070
chain_id: 494951
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/pars/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/SbgsF19zEPXnUgrShZHLSXv2bDw9xB3Hq2GnBnHLt5CcWnc8a/rpc
coin: PARS
enabled: true
indexer: { poll_interval: 30s }
@@ -84,9 +87,9 @@ data:
- slug: spc
name: SPC
chain_id: 36911
chain_id: 36912
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/spc/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2YmQ1abSAp2WVGzqrSW3GZ8ADXdLevLAdEnJQq6s1ZUc28AS52/rpc
coin: SPC
enabled: true
indexer: { poll_interval: 30s }
+169 -31
View File
@@ -1,46 +1,124 @@
---
###############################################################################
# IngressRoutes: L2 EVM chain explorers (Devnet)
# Each chain gets API backend routing rules.
#
# Domain convention mirrors mainnet:
# explore-{chain}-dev.lux.network -> unified explorer SPA (explorer:80)
# api-explore-{chain}-dev.lux.network -> unified explorer API (explorer:8090)
#
# The unified explorer (ghcr.io/luxfi/explorer:1.2.11) serves both the SPA
# and the per-chain indexer API from the same Go binary.
#
# TLS via hanzoai/ingress ACME certResolver with Cloudflare DNS challenge.
#
# NOTE: Must use hanzo.ai/v1alpha1 IngressRoute CRD (NOT standard K8s Ingress).
#
# DNS: *.lux.network wildcard A record -> 134.199.138.27 (lux-k8s hanzoai/ingress LB)
#
# Domains per chain:
# Zoo: api-explore-zoo-dev.lux.network
# Hanzo: api-explore-hanzo-dev.lux.network
# SPC: api-explore-spc-dev.lux.network
# Pars: api-explore-pars-dev.lux.network
# DNS: *.lux.network wildcard A record -> 134.199.138.27 (lux-k8s hanzoai/ingress LB).
###############################################################################
###############################################################################
# Zoo Explorer Devnet
# Middlewares
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: mainpage-rewrite
namespace: lux-devnet
spec:
replacePathRegex:
regex: ^/main-page/(.*)
replacement: /homepage/$1
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: cors-allow-all
namespace: lux-devnet
spec:
headers:
accessControlAllowOriginList: ["*"]
accessControlAllowMethods: [GET, POST, PUT, DELETE, OPTIONS]
accessControlAllowHeaders: ["*"]
accessControlMaxAge: 100
addVaryHeader: true
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-cchain
namespace: lux-devnet
spec:
addPrefix:
prefix: /v1/indexer/cchain
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-hanzo
namespace: lux-devnet
spec:
addPrefix:
prefix: /v1/indexer/hanzo
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-zoo
namespace: lux-devnet
spec:
addPrefix:
prefix: /v1/indexer/zoo
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-pars
namespace: lux-devnet
spec:
addPrefix:
prefix: /v1/indexer/pars
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-spc
namespace: lux-devnet
spec:
addPrefix:
prefix: /v1/indexer/spc
---
###############################################################################
# C-Chain explorer (devnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-zoo-devnet
name: lux-explorer-cchain-devnet
namespace: lux-devnet
labels:
app: lux-explorer
chain: zoo
chain: cchain
network: devnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-zoo-dev.lux.network`)
match: Host(`explore-cchain-dev.lux.network`) || Host(`explore-c-dev.lux.network`)
services:
- name: explorer-zoo-devnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-cchain-dev.lux.network`) || Host(`api-explore-c-dev.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-cchain
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# Hanzo Explorer Devnet
# Hanzo explorer (devnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
@@ -56,39 +134,57 @@ spec:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-hanzo-dev.lux.network`)
match: Host(`explore-hanzo-dev.lux.network`)
services:
- name: explorer-hanzo-devnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-hanzo-dev.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-hanzo
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# SPC Explorer Devnet
# Zoo explorer (devnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-spc-devnet
name: lux-explorer-zoo-devnet
namespace: lux-devnet
labels:
app: lux-explorer
chain: spc
chain: zoo
network: devnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-spc-dev.lux.network`)
match: Host(`explore-zoo-dev.lux.network`)
services:
- name: explorer-spc-devnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-zoo-dev.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-zoo
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# Pars Explorer Devnet
# Pars explorer (devnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
@@ -104,9 +200,51 @@ spec:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-pars-dev.lux.network`)
match: Host(`explore-pars-dev.lux.network`)
services:
- name: explorer-pars-devnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-pars-dev.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-pars
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# SPC explorer (devnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-spc-devnet
namespace: lux-devnet
labels:
app: lux-explorer
chain: spc
network: devnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`explore-spc-dev.lux.network`)
services:
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-spc-dev.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-spc
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
+58 -8
View File
@@ -14,10 +14,16 @@ metadata:
app: lux-indexer
network: devnet
data:
# Per-chain blockchain IDs match the devnet chain-aliases ConfigMap
# (~/work/lux/universe/k8s/lux-devnet/configmap.yaml chain-aliases):
# hanzo: 2XSToxnvSMsmrXQhAKzbiqTquveDK8PdvJP9166hcLSC1hhr3E (chainId 36964)
# zoo: 2jhVoHB5z97hSGssR8GtiFaFVuaFBH5TJeVMVjiw2uGg3gbqpu (chainId 200202)
# pars: SbgsF19zEPXnUgrShZHLSXv2bDw9xB3Hq2GnBnHLt5CcWnc8a (chainId 494951)
# spc: 2YmQ1abSAp2WVGzqrSW3GZ8ADXdLevLAdEnJQq6s1ZUc28AS52 (chainId 36912)
chains.yaml: |
data_dir: /data
http_addr: :8091
chains:
- slug: cchain
name: 'Lux C-Chain (devnet)'
@@ -30,49 +36,93 @@ data:
graph:
enabled: true
schema: amm
- slug: pchain
name: 'P-Chain (devnet)'
type: linear
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/P
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/X
coin: LUX
enabled: true
- slug: achain
name: 'A-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/A
coin: LUX
enabled: true
- slug: qchain
name: 'Q-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/Q
coin: LUX
enabled: true
- slug: tchain
name: 'T-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/T
coin: LUX
enabled: true
- slug: zchain
name: 'Z-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/Z
coin: LUX
enabled: true
- slug: hanzo
name: 'Hanzo (devnet)'
type: evm
chain_id: 36964
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2XSToxnvSMsmrXQhAKzbiqTquveDK8PdvJP9166hcLSC1hhr3E/rpc
coin: AI
enabled: true
graph:
enabled: true
schema: amm
- slug: zoo
name: 'Zoo (devnet)'
type: evm
chain_id: 200202
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2jhVoHB5z97hSGssR8GtiFaFVuaFBH5TJeVMVjiw2uGg3gbqpu/rpc
coin: ZOO
enabled: true
graph:
enabled: true
schema: amm
- slug: pars
name: 'Pars (devnet)'
type: evm
chain_id: 494951
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/SbgsF19zEPXnUgrShZHLSXv2bDw9xB3Hq2GnBnHLt5CcWnc8a/rpc
coin: PARS
enabled: true
graph:
enabled: true
schema: amm
- slug: spc
name: 'SPC (devnet)'
type: evm
chain_id: 36912
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/ext/bc/2YmQ1abSAp2WVGzqrSW3GZ8ADXdLevLAdEnJQq6s1ZUc28AS52/rpc
coin: SPC
enabled: true
graph:
enabled: true
schema: amm
---
apiVersion: v1
kind: PersistentVolumeClaim
+11 -4
View File
@@ -54,41 +54,48 @@ data:
indexer: { poll_interval: 30s }
brand: { name: Lux C-Chain, coin: LUX, accent_color: "#5cf" }
# Per-chain blockchain IDs match the mainnet chain-aliases ConfigMap;
# using literal IDs because luxd alias resolution is not yet active
# on mainnet validators (verified 2026-05-27: /ext/bc/{slug}/rpc
# returns 404, literal IDs work).
- slug: hanzo
name: Hanzo
chain_id: 36963
type: evm
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/hanzo/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/y5HBrn6EWRMysSmH4nHA2sgpwgcjChJjQ7upSjWSwsrPeg4Cc/rpc
coin: AI
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Hanzo, coin: AI, accent_color: "#0b1220" }
# zoo mainnet — RLP-imported chain (799 historic blocks, 2026-05-25).
- slug: zoo
name: Zoo
chain_id: 200200
type: evm
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/zoo/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2wbPWcyuNUimWW7YMq3gymTTpHjP9Lsm7GpmcyWimEs9kyTAAH/rpc
coin: ZOO
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Zoo, coin: ZOO, accent_color: "#7c3aed" }
# pars mainnet — rebootstrapped as parsv4 (chainId 7070, 7B PARS).
- slug: pars
name: Pars
chain_id: 7070
type: evm
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/pars/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2wYWjBHziTjfMJmUPZwsDdWhm96cWHo4vov1HPBmCYLXdbAZfM/rpc
coin: PARS
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Pars, coin: PARS, accent_color: "#15803d" }
# spc mainnet — rebootstrapped as spcv4 (chainId 36911, 11B SPC).
- slug: spc
name: SPC
chain_id: 36911
type: evm
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/spc/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2YTuJW9b1k7gDGgqZC58Wj6cT1qTzobx6SV8hiN22zT1L5qfHF/rpc
coin: SPC
enabled: true
indexer: { poll_interval: 30s }
+133 -32
View File
@@ -7,38 +7,139 @@ metadata:
app: lux-indexer
network: mainnet
data:
chains.yaml: "data_dir: /data\nhttp_addr: :8091\n\nchains:\n - slug: cchain\n \
\ name: 'Lux C-Chain'\n type: evm\n chain_id: 96369\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/C/rpc\n\
\ coin: LUX\n enabled: true\n default: true\n graph:\n enabled:\
\ true\n schema: amm\n\n - slug: pchain\n name: 'P-Chain'\n type:\
\ linear\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/P\n\
\ coin: LUX\n enabled: true\n\n - slug: xchain\n name: 'X-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/X\n\
\ coin: LUX\n enabled: true\n\n - slug: achain\n name: 'A-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/A\n\
\ coin: LUX\n enabled: true\n\n - slug: bchain\n name: 'B-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/B\n\
\ coin: LUX\n enabled: true\n\n - slug: qchain\n name: 'Q-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/Q\n\
\ coin: LUX\n enabled: true\n\n - slug: tchain\n name: 'T-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/T\n\
\ coin: LUX\n enabled: true\n\n - slug: zchain\n name: 'Z-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/Z\n\
\ coin: LUX\n enabled: true\n\n - slug: kchain\n name: 'K-Chain'\n \
\ type: dag\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/K\n\
\ coin: LUX\n enabled: true\n\n - slug: zoo\n name: 'Zoo'\n type:\
\ evm\n chain_id: 200200\n rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp/rpc\n\
\ coin: ZOO\n enabled: true\n graph:\n enabled: true\n schema:\
\ amm\n\n - slug: hanzo\n name: 'Hanzo'\n type: evm\n chain_id: 36963\n\
\ rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2GiQb73CeJESjc4omFv2YtQHZrRgJf25NXPzAr5J6UNHRcDV2F/rpc\n\
\ coin: AI\n enabled: true\n graph:\n enabled: true\n schema:\
\ amm\n\n - slug: spc\n name: 'SPC'\n type: evm\n chain_id: 36911\n\
\ rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2YTuJW9b1k7gDGgqZC58Wj6cT1qTzobx6SV8hiN22zT1L5qfHF/rpc\n\
\ coin: SPC\n enabled: true\n graph:\n enabled: true\n schema:\
\ amm\n\n - slug: pars\n name: 'Pars'\n type: evm\n chain_id: 7070\n\
\ rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2wYWjBHziTjfMJmUPZwsDdWhm96cWHo4vov1HPBmCYLXdbAZfM/rpc\n\
\ coin: PARS\n enabled: true\n graph:\n enabled: true\n schema:\
\ amm\n"
# Per-chain blockchain IDs are pinned to the current bootstrap. When a
# chain is re-bootstrapped (e.g. parsv4, spcv4, zoofix), update the
# corresponding rpc URL here AND keep chain-aliases.yaml in sync. luxd
# exposes chains both by literal blockchain ID and by alias once the
# chain-aliases ConfigMap is loaded; we use literal IDs here because the
# alias resolution is not yet active on the running luxd nodes.
chains.yaml: |
data_dir: /data
http_addr: :8091
chains:
- slug: cchain
name: 'Lux C-Chain'
type: evm
chain_id: 96369
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/C/rpc
coin: LUX
enabled: true
default: true
graph:
enabled: true
schema: amm
- slug: pchain
name: 'P-Chain'
type: linear
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/P
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/X
coin: LUX
enabled: true
- slug: achain
name: 'A-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/A
coin: LUX
enabled: true
- slug: bchain
name: 'B-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/B
coin: LUX
enabled: true
- slug: qchain
name: 'Q-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/Q
coin: LUX
enabled: true
- slug: tchain
name: 'T-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/T
coin: LUX
enabled: true
- slug: zchain
name: 'Z-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/Z
coin: LUX
enabled: true
- slug: kchain
name: 'K-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/K
coin: LUX
enabled: true
# zoo mainnet — RLP-imported chain at blockchain ID
# 2wbPWcyuNUimWW7YMq3gymTTpHjP9Lsm7GpmcyWimEs9kyTAAH (chainId 200200,
# 799 historic blocks imported 2026-05-25).
- slug: zoo
name: 'Zoo'
type: evm
chain_id: 200200
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2wbPWcyuNUimWW7YMq3gymTTpHjP9Lsm7GpmcyWimEs9kyTAAH/rpc
coin: ZOO
enabled: true
graph:
enabled: true
schema: amm
# hanzo mainnet — chain at blockchain ID
# y5HBrn6EWRMysSmH4nHA2sgpwgcjChJjQ7upSjWSwsrPeg4Cc (chainId 36963).
- slug: hanzo
name: 'Hanzo'
type: evm
chain_id: 36963
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/y5HBrn6EWRMysSmH4nHA2sgpwgcjChJjQ7upSjWSwsrPeg4Cc/rpc
coin: AI
enabled: true
graph:
enabled: true
schema: amm
# spc mainnet — rebootstrapped as spcv4 at blockchain ID
# 2YTuJW9b1k7gDGgqZC58Wj6cT1qTzobx6SV8hiN22zT1L5qfHF (chainId 36911,
# 11B SPC treasury).
- slug: spc
name: 'SPC'
type: evm
chain_id: 36911
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2YTuJW9b1k7gDGgqZC58Wj6cT1qTzobx6SV8hiN22zT1L5qfHF/rpc
coin: SPC
enabled: true
graph:
enabled: true
schema: amm
# pars mainnet — rebootstrapped as parsv4 at blockchain ID
# 2wYWjBHziTjfMJmUPZwsDdWhm96cWHo4vov1HPBmCYLXdbAZfM (chainId 7070,
# 7B PARS treasury).
- slug: pars
name: 'Pars'
type: evm
chain_id: 7070
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/ext/bc/2wYWjBHziTjfMJmUPZwsDdWhm96cWHo4vov1HPBmCYLXdbAZfM/rpc
coin: PARS
enabled: true
graph:
enabled: true
schema: amm
---
apiVersion: v1
kind: PersistentVolumeClaim
+11 -6
View File
@@ -53,23 +53,28 @@ data:
indexer: { poll_interval: 30s }
brand: { name: Lux C-Chain (Testnet), coin: LUX, accent_color: "#5cf" }
# Per-chain blockchain IDs match the testnet chain-aliases ConfigMap;
# using literal IDs instead of slug aliases because luxd alias
# resolution is not yet active on testnet validators (verified
# 2026-05-27: /ext/bc/{slug}/rpc returns 404, literal IDs work).
- slug: hanzo
name: Hanzo
chain_id: 36963
type: evm
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/hanzo/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3/rpc
coin: AI
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Hanzo (Testnet), coin: AI, accent_color: "#0b1220" }
# zoo testnet — re-bootstrapped as zoofix 2026-05-27 (chainId 200201).
- slug: zoo
name: Zoo
chain_id: 200200
chain_id: 200201
type: evm
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/zoo/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/LXuiihyiND2NyegTCZkZiraJs9jtngu6akaLyZMBYZ3MsLgWA/rpc
coin: ZOO
enabled: false
enabled: true
indexer: { poll_interval: 30s }
brand: { name: Zoo (Testnet), coin: ZOO, accent_color: "#7c3aed" }
@@ -77,7 +82,7 @@ data:
name: Pars
chain_id: 7070
type: evm
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/pars/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9/rpc
coin: PARS
enabled: true
indexer: { poll_interval: 30s }
@@ -87,7 +92,7 @@ data:
name: SPC
chain_id: 36911
type: evm
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/spc/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh/rpc
coin: SPC
enabled: true
indexer: { poll_interval: 30s }
+172 -31
View File
@@ -1,46 +1,127 @@
---
###############################################################################
# IngressRoutes: L2 EVM chain explorers (Testnet)
# Each chain gets API backend routing rules.
#
# Domain convention mirrors mainnet:
# explore-{chain}-test.lux.network -> unified explorer SPA (explorer:80)
# api-explore-{chain}-test.lux.network -> unified explorer API (explorer:8090)
#
# The unified explorer (ghcr.io/luxfi/explorer:1.2.11) serves both the SPA
# and the per-chain indexer API from the same Go binary. The blockscout-prefix-*
# middlewares (defined below in this file) add the /v1/indexer/{slug} prefix
# to API requests so the explorer's slug dispatcher routes to the right
# per-chain SQLite database.
#
# TLS via hanzoai/ingress ACME certResolver with Cloudflare DNS challenge.
#
# NOTE: Must use hanzo.ai/v1alpha1 IngressRoute CRD (NOT standard K8s Ingress).
#
# DNS: *.lux.network wildcard A record -> 134.199.138.27 (lux-k8s hanzoai/ingress LB)
#
# Domains per chain:
# Zoo: api-explore-zoo-test.lux.network
# Hanzo: api-explore-hanzo-test.lux.network
# SPC: api-explore-spc-test.lux.network
# Pars: api-explore-pars-test.lux.network
# DNS: *.lux.network wildcard A record -> 134.199.138.27 (lux-k8s hanzoai/ingress LB).
###############################################################################
###############################################################################
# Zoo Explorer Testnet
# Middlewares
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: mainpage-rewrite
namespace: lux-testnet
spec:
replacePathRegex:
regex: ^/main-page/(.*)
replacement: /homepage/$1
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: cors-allow-all
namespace: lux-testnet
spec:
headers:
accessControlAllowOriginList: ["*"]
accessControlAllowMethods: [GET, POST, PUT, DELETE, OPTIONS]
accessControlAllowHeaders: ["*"]
accessControlMaxAge: 100
addVaryHeader: true
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-cchain
namespace: lux-testnet
spec:
addPrefix:
prefix: /v1/indexer/cchain
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-hanzo
namespace: lux-testnet
spec:
addPrefix:
prefix: /v1/indexer/hanzo
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-zoo
namespace: lux-testnet
spec:
addPrefix:
prefix: /v1/indexer/zoo
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-pars
namespace: lux-testnet
spec:
addPrefix:
prefix: /v1/indexer/pars
---
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: blockscout-prefix-spc
namespace: lux-testnet
spec:
addPrefix:
prefix: /v1/indexer/spc
---
###############################################################################
# C-Chain explorer (testnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-zoo-testnet
name: lux-explorer-cchain-testnet
namespace: lux-testnet
labels:
app: lux-explorer
chain: zoo
chain: cchain
network: testnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-zoo-test.lux.network`)
match: Host(`explore-cchain-test.lux.network`) || Host(`explore-c-test.lux.network`)
services:
- name: explorer-zoo-testnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-cchain-test.lux.network`) || Host(`api-explore-c-test.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-cchain
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# Hanzo Explorer Testnet
# Hanzo explorer (testnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
@@ -56,39 +137,57 @@ spec:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-hanzo-test.lux.network`)
match: Host(`explore-hanzo-test.lux.network`)
services:
- name: explorer-hanzo-testnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-hanzo-test.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-hanzo
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# SPC Explorer Testnet
# Zoo explorer (testnet) — backed by zoofix chain (re-bootstrapped 2026-05-27)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-spc-testnet
name: lux-explorer-zoo-testnet
namespace: lux-testnet
labels:
app: lux-explorer
chain: spc
chain: zoo
network: testnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-spc-test.lux.network`)
match: Host(`explore-zoo-test.lux.network`)
services:
- name: explorer-spc-testnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-zoo-test.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-zoo
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# Pars Explorer Testnet
# Pars explorer (testnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
@@ -104,9 +203,51 @@ spec:
- websecure
routes:
- kind: Rule
match: Host(`api-explore-pars-test.lux.network`)
match: Host(`explore-pars-test.lux.network`)
services:
- name: explorer-pars-testnet
port: 4000
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-pars-test.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-pars
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
---
###############################################################################
# SPC explorer (testnet)
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: lux-explorer-spc-testnet
namespace: lux-testnet
labels:
app: lux-explorer
chain: spc
network: testnet
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`explore-spc-test.lux.network`)
services:
- name: explorer
port: 80
- kind: Rule
match: Host(`api-explore-spc-test.lux.network`)
middlewares:
- name: mainpage-rewrite
- name: blockscout-prefix-spc
- name: cors-allow-all
services:
- name: explorer
port: 8090
tls:
certResolver: letsencrypt
+57 -4
View File
@@ -14,10 +14,16 @@ metadata:
app: lux-indexer
network: testnet
data:
# Per-chain blockchain IDs match the testnet chain-aliases ConfigMap
# (~/work/lux/universe/k8s/lux-testnet/configmap.yaml chain-aliases):
# hanzo: 2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3
# zoo: LXuiihyiND2NyegTCZkZiraJs9jtngu6akaLyZMBYZ3MsLgWA (zoofix, re-bootstrapped 2026-05-27)
# pars: 26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9
# spc: Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh
chains.yaml: |
data_dir: /data
http_addr: :8091
chains:
- slug: cchain
name: 'Lux C-Chain (testnet)'
@@ -30,21 +36,68 @@ data:
graph:
enabled: true
schema: amm
- slug: pchain
name: 'P-Chain (testnet)'
type: linear
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/P
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain (testnet)'
type: dag
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/X
coin: LUX
enabled: true
- slug: hanzo
name: 'Hanzo (testnet)'
type: evm
chain_id: 36963
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3/rpc
coin: AI
enabled: true
graph:
enabled: true
schema: amm
# zoo testnet — re-bootstrapped as zoofix 2026-05-27 at blockchain ID
# LXuiihyiND2NyegTCZkZiraJs9jtngu6akaLyZMBYZ3MsLgWA (chainId 200201).
# Old "zoo" was broken (parsing genesis: hex string of odd length).
- slug: zoo
name: 'Zoo (testnet)'
type: evm
chain_id: 200201
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/LXuiihyiND2NyegTCZkZiraJs9jtngu6akaLyZMBYZ3MsLgWA/rpc
coin: ZOO
enabled: true
graph:
enabled: true
schema: amm
- slug: pars
name: 'Pars (testnet)'
type: evm
chain_id: 7070
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9/rpc
coin: PARS
enabled: true
graph:
enabled: true
schema: amm
- slug: spc
name: 'SPC (testnet)'
type: evm
chain_id: 36911
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/ext/bc/Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh/rpc
coin: SPC
enabled: true
graph:
enabled: true
schema: amm
---
apiVersion: v1
kind: PersistentVolumeClaim