Files
zeekay 51460827d4 Merge the forge's lux/universe into GitHub's, the one main from here
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
2026-09-23 20:20:03 -07:00

257 lines
8.0 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 — Devnet
#
# Single Go binary `ghcr.io/luxfi/explorer:1.2.11` 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-devnet-v2 Deployment. Postgres-free indexer.
#
# zoo app chain EVM is not bootstrapped on devnet luxd-* nodes (verified
# 2026-05-24: /v1/chain/zoo/rpc returns 404). Declared with enabled:false
# until the zoo app chain EVM is tracked on devnet validators.
###############################################################################
apiVersion: v1
kind: ConfigMap
metadata:
name: explorer-chains
namespace: lux-devnet
labels:
app: explorer
network: devnet
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: 96367 }
# 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: 96367
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc
coin: LUX
enabled: true
default: true
indexer: { poll_interval: 30s }
# DEX settlement precompile (0x9999): logs indexed into the `dex` (CLOB) subgraph as Order/Market/Fill.
pool_manager: "0x0000000000000000000000000000000000009999"
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: 36964
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/hanzo/rpc
coin: AI
enabled: false
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: 200202
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/zoo/rpc
coin: ZOO
enabled: false
indexer: { poll_interval: 30s }
graph:
enabled: true
subgraphs:
- { name: amm, schema: amm, enabled: true }
brand:
name: Zoo
coin: ZOO
accent_color: "#FCF006"
icon_file: /etc/explorer/static/icon-zoo.svg
logo_file: /etc/explorer/static/logo-zoo.svg
- slug: pars
name: Pars
chain_id: 7072
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/pars/rpc
coin: PARS
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: 36912
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/spc/rpc
coin: SPC
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: 1873
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/osage/rpc
coin: OSG
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-devnet
labels:
app: explorer
network: devnet
spec:
accessModes: [ReadWriteOnce]
storageClassName: do-block-storage-retain
resources:
requests:
storage: 50Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: explorer
namespace: lux-devnet
labels:
app: explorer
network: devnet
spec:
replicas: 1
strategy: { type: Recreate }
selector:
matchLabels:
app: explorer
network: devnet
template:
metadata:
labels:
app: explorer
network: devnet
spec:
securityContext:
runAsUser: 65532
runAsNonRoot: true
fsGroup: 65532
imagePullSecrets:
- name: ghcr-luxfi
terminationGracePeriodSeconds: 60
containers:
- name: explorer
image: ghcr.io/luxfi/explorer:1.2.11
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-devnet
labels:
app: explorer
network: devnet
spec:
type: ClusterIP
selector:
app: explorer
network: devnet
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 }