The explorer indexes zoo and hanzo, whose nodes now answer

The backend's values were deleted as a copy while it was paused for the lux
mainnet import; it kept running from a live config with one chain, because on
09-09 only lux answered. Zoo (200200) and hanzo (36963) answer in-cluster now,
so they get rows: zoo's venue contracts and 2T genesis are read on its chain,
hanzo's new chain has no venue yet.

The frontends' wallet RPC pointed at api.zoo.ngo (served by cloud, not the
chain) and /v1/chain/hanzo (a 404); both now name the chain endpoint.


Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-09-22 23:31:40 -07:00
co-authored by Hanzo Dev
parent aab4e7346a
commit bf7c9b6f9d
3 changed files with 214 additions and 2 deletions
+1 -1
View File
@@ -92,7 +92,7 @@ configMaps:
# presenting none. None of these four answer yet -- the chains are not up --
# so the page shows nothing, which is the truth, and starts working the day
# the chain does without another edit here.
NEXT_PUBLIC_NETWORK_RPC_URL: https://api.hanzo.network/v1/chain/hanzo
NEXT_PUBLIC_NETWORK_RPC_URL: https://api.hanzo.network/v1/chain/c/rpc
NEXT_PUBLIC_API_HOST: api-explore.lux.network
NEXT_PUBLIC_API_PROTOCOL: https
# The Blockscout-shaped API this UI reads is mounted per chain at
+1 -1
View File
@@ -92,7 +92,7 @@ configMaps:
# presenting none. None of these four answer yet -- the chains are not up --
# so the page shows nothing, which is the truth, and starts working the day
# the chain does without another edit here.
NEXT_PUBLIC_NETWORK_RPC_URL: https://api.zoo.ngo/v1/chain/c/rpc
NEXT_PUBLIC_NETWORK_RPC_URL: https://api.zoo.network/v1/chain/c/rpc
NEXT_PUBLIC_API_HOST: api-explore.lux.network
NEXT_PUBLIC_API_PROTOCOL: https
# The Blockscout-shaped API this UI reads is mounted per chain at
+212
View File
@@ -0,0 +1,212 @@
# The explorer backend: indexes each chain in chains.yaml and serves
# /v1/indexer/<slug> and /v1/graph/<slug>, which the explore-fe-* frontends read
# through api-explore.lux.network.
cd:
automated: false
replicas: 1
selectorLabels:
app: explorer
network: mainnet
labels:
network: mainnet
# No registry holds a 1.5.x build of this image; the data node runs it from its
# image cache, so it carries no pull secret.
image:
repository: ghcr.io/luxfi/explorer
tag: 1.5.49
digest: sha256:b23eccfdc705ad0a772dfa49d189e097a582076c8fc7b5dc1cd4f81a8cbda06e
pullPolicy: IfNotPresent
imagePullSecrets: []
args:
- --config=/etc/explorer/chains.yaml
env:
- name: DATA_DIR
value: /data
- name: HTTP_ADDR
value: :8090
resources:
limits: {cpu: '2', memory: 4Gi}
requests: {cpu: 250m, memory: 512Mi}
volumeMounts:
- {mountPath: /etc/explorer, name: config, readOnly: true}
- {mountPath: /data, name: data}
livenessProbe:
httpGet: {path: /health, port: api, scheme: HTTP}
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 5
readinessProbe:
httpGet: {path: /health, port: api, scheme: HTTP}
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 6
startupProbe:
httpGet: {path: /health, port: api, scheme: HTTP}
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 30
securityContext:
runAsNonRoot: true
runAsUser: 65532
fsGroup: 65532
ports:
- name: api
containerPort: 8090
expose: false
service:
extraPorts:
- {name: http, port: 80, targetPort: 8090}
- {name: http-v2, port: 8090, targetPort: 8090}
volumes:
- name: config
configMap: {name: explorer-chains}
- name: data
persistentVolumeClaim: {claimName: explorer-data}
# explorer-data is a local volume on this node.
nodeSelector:
kubernetes.io/hostname: ip-10-64-1-20
strategy: Recreate
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 60
configMaps:
- name: explorer-chains
data:
chains.yaml: |
data_dir: /data
http_addr: :8090
brand_default:
name: Lux Explorer
coin: LUX
accent_color: "#5cf"
icon_url: /icon.svg
logo_url: /logo.svg
networks:
- { label: Mainnet, domain: explore.lux.network, chain_id: 96369 }
# A chain is listed while its node answers. A row for a chain that is not
# there polls a 404 forever and gets plain text back where a JSON-RPC reply
# belongs -- noise that buries the one line a real indexing failure prints.
# Pars, Osage and SPC have no node, so they have no row.
chains:
- slug: cchain
name: Lux C-Chain
chain_id: 96369
type: evm
# The door in front of the archive node: it forwards eth_, net_ and web3_
# calls and rewrites Host to localhost, which this node accepts.
rpc: http://rpc.lux-mainnet.svc.cluster.local/v1/chain/C/rpc
# What the BROWSER is told to dial, and it is not optional. `rpc`
# above is the address this PROCESS dials — a cluster-internal name
# that resolves nowhere outside the mesh. Without public_rpc the
# binary's browserRPC() falls through to browserReachable(rpc), which
# is false for a .svc.cluster.local name, and hands the SPA "" — so
# every RPC-backed control disappears from the explorer.
public_rpc: https://api.lux.network/v1/chain/C/rpc
coin: LUX
enabled: true
default: true
# Wrapped LUX, asked directly on this chain: symbol() = WLUX,
# name() = Wrapped LUX, 2874 bytes of code. The address this file
# carried before, 0x4888E4a2…8B3E, holds none here — it was the
# wrapped native of the chain this network replaced, and a pricing
# base that is not a contract prices everything at nothing.
native: "0x66dbed9572eb9be45ef05526c65beddf8d60a672"
# 2T minted at block 0 — eth_getBalance at height 0 on this chain,
# not a spec sheet.
genesis_supply: "2000000000000"
# Holds what has not been distributed. Read live, because it falls as
# tokens reach holders, and what it still holds is not circulating.
treasury: "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714"
indexer: { poll_interval: 30s }
# The two contracts whose PairCreated / PoolCreated this subgraph
# trusts, and the periphery a quote and a swap are addressed to.
# Deployed on this chain 2026-09-09 by luxfi/standard script/venue.ts
# and recorded in that repo at deployments/venue/96369.json, which is
# where these came from. The addresses this file used to carry belong
# to the deployment on the network this one replaced and hold no code
# here; a subgraph pointed at those trusts a root that is not there,
# which is why they were unset rather than guessed at.
#
# Changing either factory changes the store's source fingerprint, so
# the indexer drops its derived rows and re-reads this chain from
# block 0 — which is what puts the venue's whole history in the graph
# rather than only what it sees after this lands.
factory_v2: "0x41f76735F33fdb2C81478bF4B7654c5d9ba719c1"
factory_v3: "0x6E5884084814F4785e21f6f9C11D3C299Ef5d7f1"
# A quote off the indexed book is exact for a constant-product pair
# and an estimate for a concentrated one, where the answer depends on
# which ticks the trade crosses. With the quoter set, the chain prices
# that route itself.
quoter_v2: "0x6EA2F79f743C809D1152657Ef5d5907f47a34cfc"
# SwapRouter02: the one contract a swap is addressed to and an
# approval is granted, over both generations.
router: "0xbbD8d9A1E6bf5627A2F6D2aF38664bbe1cEF63Bb"
graph:
enabled: true
subgraphs:
- { name: amm, schema: amm, enabled: true }
brand:
name: Lux C-Chain
coin: LUX
accent_color: "#5cf"
- slug: zoo
name: Zoo
chain_id: 200200
type: evm
rpc: http://luxd-archive.zoo-mainnet.svc.cluster.local:9630/v1/chain/C/rpc
public_rpc: https://api.zoo.network/v1/chain/c/rpc
coin: ZOO
enabled: true
# Each holds code on this chain. The wrapped native answers symbol() = WLUX,
# a name carried over from the genesis Zoo was cut from.
native: "0x4888E4a2Ee0F03051c72D2BD3ACf755eD3498B3E"
factory_v2: "0xD173926A10A0C4eCd3A51B1422270b65Df0551c1"
factory_v3: "0x80bBc7C4C7a59C899D1B37BC14539A22D5830a84"
quoter_v2: "0x15C729fdd833Ba675edd466Dfc63E1B737925A4c"
router: "0x939bC0Bca6F9B9c52E6e3AD8A3C590b5d9B9D10E"
# eth_getBalance(treasury, 0) on this chain.
genesis_supply: "2000000000000"
treasury: "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714"
indexer: { poll_interval: 30s }
graph:
enabled: true
subgraphs:
- { name: amm, schema: amm, enabled: true }
brand:
name: Zoo
coin: ZOO
accent_color: "#7c3aed"
- slug: hanzo
name: Hanzo
chain_id: 36963
type: evm
# Selects only validators within MAX_LAG_BLOCKS of the leader.
rpc: http://hanzod-rpc.hanzo-mainnet.svc.cluster.local:9630/v1/chain/c/rpc
public_rpc: https://api.hanzo.network/v1/chain/c/rpc
coin: AI
enabled: true
indexer: { poll_interval: 30s }
brand:
name: Hanzo
coin: AI
accent_color: "#0b1220"
routes:
- name: api-explore
spec:
entryPoints: [websecure]
routes:
- match: Host(`api-explore.lux.cloud`) || Host(`api-explore.lux.network`)
kind: Rule
services:
- name: explorer
port: 8090
tls: {}