The two mains shared no history, so this is a per-file three-way merge:
for each file the 65 forge-only commits touched (by patch-id), the base is
the newest version both histories held. 105 files merged or took one side
cleanly, 48 were already identical, and the 45 true conflicts and 31
modify/delete pairs were resolved by what runs on the cluster:
- The forge wins where it is live: explorer 1.5.56 (digest 45db11ff) and
its archive readers, explore-fe-hanzo's ConfigMap env (AI coin,
/v1/indexer/hanzo, /v1/chain/hanzo/rpc), exchange-api reading
luxd-archive, and explore-fe-{lux,zoo}-testnet, pinned to what they run
(v2.8.5-lux / v2.8.4-lux).
- GitHub wins where it is live: explore-fe-lux v2.8.5-lux, explore-fe-zoo
v2.8.4-lux, bankd v1.0.18, lux-build's routes.
- The forge's retirement of workloads that run nowhere stands: lux-mainnet
dex, lux-hb2, lux-market, traffic, wallet-web; the lux-testnet frontends,
indexer, exchange and gateways; lux-operator. deploy/lux-testnet/luxd.yaml
stays, since roll_luxd.sh reads it.
- GitHub's deletions stand: lux-finance and lux-financial (static sites
now), the k8s/ operator manifests, .hanzo/workflows/cicd.yml.
- Paths are /v1/chain/C/rpc where the forge had written /v1/chain/c. All
four spellings answer; this one is the documented form. The forge's
/{network}/v1 doc lines are dropped: a network is a host, and the prefix
404s.
Dry-run against the running objects (server-side, as CD applies), the
merged explorer shows no change where GitHub's showed 152 lines, and no
other live workload moves further from what runs. Every deploy/*/*.yaml
renders with charts/app; price.yaml, which failed on GitHub, now renders.
Claude-Session: https://claude.ai/code/session_01TzirYkGmD88w4GipqivUtV
283 lines
9.8 KiB
YAML
283 lines
9.8 KiB
YAML
# Regenerated from the LIVE explorer-chains ConfigMap on lux-k8s.
|
|
# Live is the source here: nothing reconciles k8s/, so this file drifts BEHIND
|
|
# the cluster as often as ahead, and it had drifted badly -- it was missing the
|
|
# osage chain entirely, missing every graph: block, carrying a pars chain_id
|
|
# (494950) the chain does not use, and holding a luxd-headless URL for hanzo
|
|
# where the cluster runs the one that works. Applying it would have been a
|
|
# downgrade, not a fix.
|
|
---
|
|
###############################################################################
|
|
# Unified Lux Explorer — Testnet
|
|
#
|
|
# Single Go binary `ghcr.io/luxfi/explorer:1.5.16` that indexes every EVM
|
|
# non-primary chain on this network into per-chain SQLite databases under /data/{slug}
|
|
# and serves the embedded SPA + /v1/indexer/{slug}/* + /v1/graph/* +
|
|
# /v1/explorer/admin/* + /v1/explorer/realtime on :8090.
|
|
#
|
|
# Replaces Blockscout (indexer-{slug}-indexer Deployments) + their
|
|
# per-chain PostgreSQL StatefulSets (indexer-{slug}-pg) + the
|
|
# lux-explorer/explorer-testnet-v2 Deployment. Postgres-free indexer.
|
|
#
|
|
# Zoo testnet is not a chain on this luxd -- it is a sovereign L1 reached at
|
|
# its own host, api.zoo-test.network, which answers eth_chainId 0x30e09.
|
|
###############################################################################
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: explorer-chains
|
|
namespace: lux-testnet
|
|
labels:
|
|
app: explorer
|
|
network: testnet
|
|
data:
|
|
chains.yaml: |
|
|
data_dir: /data
|
|
http_addr: :8090
|
|
static_dir: /etc/explorer/static
|
|
|
|
brand_default:
|
|
name: Lux Explorer
|
|
coin: LUX
|
|
accent_color: "#5cf"
|
|
icon_file: /etc/explorer/static/icon-lux.svg
|
|
logo_file: /etc/explorer/static/logo-lux.svg
|
|
icon_url: /icon.svg
|
|
logo_url: /logo.svg
|
|
|
|
networks:
|
|
- { label: Mainnet, domain: explore.lux.network, chain_id: 96369 }
|
|
- { label: Testnet, domain: testnet.explore.lux.network, chain_id: 96368 }
|
|
- { label: Devnet, domain: devnet.explore.lux.network, chain_id: 96370 }
|
|
|
|
# Per-chain RPC URLs use luxd's chain.name aliases (hanzo/zoo/pars/spc/osage)
|
|
# registered by chain manager at VM init (see node/chains/manager.go:752).
|
|
# No literal blockchain IDs anywhere — survives re-bootstraps without edits.
|
|
chains:
|
|
- slug: cchain
|
|
name: Lux C-Chain
|
|
chain_id: 96368
|
|
type: evm
|
|
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc
|
|
coin: LUX
|
|
enabled: true
|
|
default: true
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
- { name: dex , schema: dex, enabled: true }
|
|
brand:
|
|
name: Lux C-Chain
|
|
coin: LUX
|
|
accent_color: "#5cf"
|
|
icon_file: /etc/explorer/static/icon-lux.svg
|
|
logo_file: /etc/explorer/static/logo-lux.svg
|
|
|
|
- slug: hanzo
|
|
name: Hanzo
|
|
chain_id: 36962
|
|
type: evm
|
|
rpc: http://10.124.0.63:9630/v1/chain/C/rpc
|
|
coin: AI
|
|
enabled: true
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
brand: { name: Hanzo, coin: AI, accent_color: "#0b1220" }
|
|
|
|
- slug: zoo
|
|
name: Zoo
|
|
chain_id: 200201
|
|
type: evm
|
|
# Zoo testnet is a sovereign L1 on its own network, so it is reached at
|
|
# its own host, not through this luxd. api.zoo.ngo is zoo MAINNET
|
|
# (eth_chainId 0x30e08); the host below answers 0x30e09 = 200201, which
|
|
# is the chain declared above.
|
|
rpc: https://api.zoo-test.network/v1/chain/C/rpc
|
|
coin: ZOO
|
|
enabled: true
|
|
# Same addresses as zoo mainnet: both were deployed in the same order
|
|
# from the same account at nonce 0. V3 only — Zoo has no V2 AMM.
|
|
factory_v3: "0x9378b62fC172d2A4f715d7ecF49DE0362f1BB702"
|
|
native: "0xc65ea8882020Af7CDa7854d590C6Fcd34BF364ec"
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
brand:
|
|
name: Zoo
|
|
coin: ZOO
|
|
accent_color: \"#0b1220\"
|
|
icon_file: /etc/explorer/static/icon-zoo.svg
|
|
logo_file: /etc/explorer/static/logo-zoo.svg
|
|
|
|
- slug: pars
|
|
name: Pars
|
|
chain_id: 7071
|
|
type: evm
|
|
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/pars/rpc
|
|
coin: PARS
|
|
# DISABLED: pars testnet is a sovereign L1 on its own network, not a chain here.
|
|
# api.pars.network answers 0x78d65, a different chain entirely, not the
|
|
# 7071 declared above. No pars testnet endpoint exists yet.
|
|
#
|
|
# Left enabled it polls a chain this luxd does not host, which answers
|
|
# `404 page not found` as PLAIN TEXT, so the JSON decoder reads 404 as a
|
|
# number and dies on the 'p' of 'page'. That is the bulk of this pod's log.
|
|
enabled: false
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
brand: { name: Pars, coin: PARS, accent_color: "#15803d" }
|
|
|
|
- slug: spc
|
|
name: SPC
|
|
chain_id: 36910
|
|
type: evm
|
|
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/spc/rpc
|
|
coin: SPC
|
|
# DISABLED: no spc chain exists anywhere -- not on any luxd, no namespace on any
|
|
# cluster, and api.spc.network is NXDOMAIN. Same as lux-mainnet.
|
|
#
|
|
# Left enabled it polls a chain this luxd does not host, which answers
|
|
# `404 page not found` as PLAIN TEXT, so the JSON decoder reads 404 as a
|
|
# number and dies on the 'p' of 'page'. That is the bulk of this pod's log.
|
|
enabled: false
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
brand: { name: SPC, coin: SPC, accent_color: "#0ea5e9" }
|
|
|
|
- slug: osage
|
|
name: Osage
|
|
chain_id: 1871
|
|
type: evm
|
|
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/osage/rpc
|
|
coin: OSG
|
|
# DISABLED: osage testnet is a sovereign L1 on its own network, not a chain here.
|
|
# api.osage.network answers 0x750 = 1872, which is osage MAINNET, one off
|
|
# from the 1871 declared above -- close enough to look right and wrong
|
|
# enough to poison the index. No osage testnet endpoint exists yet.
|
|
#
|
|
# Left enabled it polls a chain this luxd does not host, which answers
|
|
# `404 page not found` as PLAIN TEXT, so the JSON decoder reads 404 as a
|
|
# number and dies on the 'p' of 'page'. That is the bulk of this pod's log.
|
|
enabled: false
|
|
indexer: { poll_interval: 30s }
|
|
graph:
|
|
enabled: true
|
|
subgraphs:
|
|
- { name: amm, schema: amm, enabled: true }
|
|
brand: { name: Osage, coin: OSG, accent_color: "#dc2626" }
|
|
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: explorer-data
|
|
namespace: lux-testnet
|
|
labels:
|
|
app: explorer
|
|
network: testnet
|
|
spec:
|
|
accessModes: [ReadWriteOnce]
|
|
storageClassName: do-block-storage-retain
|
|
resources:
|
|
requests:
|
|
storage: 50Gi
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: explorer
|
|
namespace: lux-testnet
|
|
labels:
|
|
app: explorer
|
|
network: testnet
|
|
spec:
|
|
replicas: 1
|
|
strategy: { type: Recreate }
|
|
selector:
|
|
matchLabels:
|
|
app: explorer
|
|
network: testnet
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: explorer
|
|
network: testnet
|
|
spec:
|
|
securityContext:
|
|
runAsUser: 65532
|
|
runAsNonRoot: true
|
|
fsGroup: 65532
|
|
imagePullSecrets:
|
|
- name: ghcr-luxfi
|
|
terminationGracePeriodSeconds: 60
|
|
containers:
|
|
- name: explorer
|
|
image: ghcr.io/luxfi/explorer:1.5.16
|
|
imagePullPolicy: IfNotPresent
|
|
args: [--config=/etc/explorer/chains.yaml]
|
|
ports:
|
|
- { name: http, containerPort: 8090 }
|
|
env:
|
|
- { name: DATA_DIR, value: /data }
|
|
- { name: HTTP_ADDR, value: ":8090" }
|
|
volumeMounts:
|
|
- { name: config, mountPath: /etc/explorer, readOnly: true }
|
|
- { name: data, mountPath: /data }
|
|
resources:
|
|
requests: { cpu: 250m, memory: 512Mi }
|
|
limits: { cpu: "2", memory: 4Gi }
|
|
readinessProbe:
|
|
httpGet: { path: /health, port: http }
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
livenessProbe:
|
|
httpGet: { path: /health, port: http }
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 30
|
|
timeoutSeconds: 10
|
|
failureThreshold: 5
|
|
startupProbe:
|
|
httpGet: { path: /health, port: http }
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 5
|
|
timeoutSeconds: 5
|
|
failureThreshold: 30
|
|
volumes:
|
|
- name: config
|
|
configMap: { name: explorer-chains }
|
|
- name: data
|
|
persistentVolumeClaim: { claimName: explorer-data }
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: explorer
|
|
namespace: lux-testnet
|
|
labels:
|
|
app: explorer
|
|
network: testnet
|
|
spec:
|
|
type: ClusterIP
|
|
selector:
|
|
app: explorer
|
|
network: testnet
|
|
ports:
|
|
# gateway routes hit :80 (api-gateway-gateway gateway.json); legacy
|
|
# explorer-{env}-v2 ExternalName aliases in lux-explorer hit :8090.
|
|
- { name: http, port: 80, targetPort: 8090, protocol: TCP }
|
|
- { name: http-v2, port: 8090, targetPort: 8090, protocol: TCP }
|