Own the Lux services, and only those

Zoo's cloud and its exchange services were declared here as well as in Zoo's own
repo, and the files had drifted apart. The copy here rendered a pod from a
cluster that is gone; Zoo's serves the site from files and is the one that syncs
clean. Zoo's wins because Zoo's is Zoo's.

Hanzo's operator and zen-gateway were declared here against Hanzo's own
declarations of both. Hanzo's are the ones running.

cert-manager was a third copy of one cluster-scoped install.

liquid-docs put a white-label site on a Lux host. It does not run and does not
belong in this repo. The pre-phase-a backup went with it: a snapshot of a
cluster that no longer exists, carrying the same aliases. The e2e annotation
that named that app says the same thing without it.

deploy/hanzo and deploy/hanzo-zt stay. lux-admin, lux-blog, lux-invest,
lux-safe-cgw and lux-zt-router are Lux services that sit in a namespace someone
named hanzo. The namespace is the thing worth renaming, not the owner.
This commit is contained in:
2026-09-04 22:54:51 -07:00
parent 232c6fdce7
commit 13925e5e02
22 changed files with 1 additions and 2168 deletions
@@ -1,47 +0,0 @@
# Generated from the live cert-manager/cert-manager-cainjector Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 1
selectorLabels:
app.kubernetes.io/component: cainjector
app.kubernetes.io/instance: cert-manager
app.kubernetes.io/name: cainjector
image:
repository: quay.io/jetstack/cert-manager-cainjector
tag: v1.13.3
pullPolicy: IfNotPresent
component: cainjector
args:
- --v=2
- --leader-election-namespace=kube-system
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
resources: {}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: cert-manager-cainjector
enableServiceLinks: false
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
defaultReadinessProbe: false
imagePullSecrets: []
# Enforcement switch, read by the lux-fleet ApplicationSet's templatePatch --
# not by the chart. selfHeal returns a hand-edited object to what is written
# here; prune stays off, so nothing is ever deleted.
cd:
automated: false
@@ -1,79 +0,0 @@
# Generated from the live cert-manager/cert-manager-webhook Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 1
selectorLabels:
app.kubernetes.io/component: webhook
app.kubernetes.io/instance: cert-manager
app.kubernetes.io/name: webhook
image:
repository: quay.io/jetstack/cert-manager-webhook
tag: v1.13.3
pullPolicy: IfNotPresent
component: webhook
args:
- --v=2
- --secure-port=10250
- --dynamic-serving-ca-secret-namespace=$(POD_NAMESPACE)
- --dynamic-serving-ca-secret-name=cert-manager-webhook-ca
- --dynamic-serving-dns-names=cert-manager-webhook
- --dynamic-serving-dns-names=cert-manager-webhook.$(POD_NAMESPACE)
- --dynamic-serving-dns-names=cert-manager-webhook.$(POD_NAMESPACE).svc
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
resources: {}
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: 6080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 6080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
ports:
- containerPort: 10250
name: https
servicePort: 443
targetPort: https
- containerPort: 6080
name: healthcheck
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: cert-manager-webhook
enableServiceLinks: false
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
imagePullSecrets: []
# Live runs this pod with these settings and the chart renders only fsGroup
# unless podSecurityContext is set, so omitting them is a silent drop to uid 0
# (or to seccomp Unconfined) on the first server-side sync.
podSecurityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
-66
View File
@@ -1,66 +0,0 @@
# Generated from the live cert-manager/cert-manager Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 1
selectorLabels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: cert-manager
app.kubernetes.io/name: cert-manager
containerName: cert-manager-controller
image:
repository: quay.io/jetstack/cert-manager-controller
tag: v1.13.3
pullPolicy: IfNotPresent
component: controller
args:
- --v=2
- --cluster-resource-namespace=$(POD_NAMESPACE)
- --leader-election-namespace=kube-system
- --acme-http01-solver-image=quay.io/jetstack/cert-manager-acmesolver:v1.13.3
- --max-concurrent-challenges=60
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
resources: {}
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
# The port name was `tcp-prometheus-servicemonitor`, 29 characters, and this file
# could not render at all: the chart's values.schema.json caps a port name at 15,
# which is correct — a CONTAINER port name is validated as an IANA_SVC_NAME (<=15),
# while a SERVICE port name is a DNS-1123 label (<=63). One values entry feeds
# both, so the longest legal name is 15. Live proved the asymmetry: the Service
# port carried the 29-char name while the container port next to it was
# `http-metrics`. Using the container's own name is therefore the only expressible
# answer, and it is free: there is no ServiceMonitor CRD on either cluster and
# nothing anywhere references the long name.
ports:
- containerPort: 9402
name: http-metrics
- containerPort: 9403
name: http-healthz
nodeSelector:
kubernetes.io/os: linux
serviceAccountName: cert-manager
enableServiceLinks: false
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
defaultReadinessProbe: false
imagePullSecrets: []
# Live runs this pod with these settings and the chart renders only fsGroup
# unless podSecurityContext is set, so omitting them is a silent drop to uid 0
# (or to seccomp Unconfined) on the first server-side sync.
podSecurityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
@@ -1,77 +0,0 @@
# Generated from the live hanzo-operator-system/hanzo-operator-controller-manager Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 0
selectorLabels:
app.kubernetes.io/name: hanzo-operator
control-plane: controller-manager
containerName: manager
image:
repository: ghcr.io/hanzoai/operator
tag: sha-81a43b0
pullPolicy: Always
partOf: hanzo-universe
component: hanzo-operator
labels:
control-plane: controller-manager
command:
- /hanzo-operator
args:
- --leader-elect
- --health-probe-bind-address=:8081
- --metrics-bind-address=:8443
- --metrics-secure=true
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 10m
memory: 64Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8081
scheme: HTTP
initialDelaySeconds: 15
periodSeconds: 20
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: 8081
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
ports:
- containerPort: 8081
name: health
- containerPort: 8443
name: metrics
serviceAccountName: hanzo-operator-controller-manager
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 10
imagePullSecrets: []
# Live runs this pod with these settings and the chart renders only fsGroup
# unless podSecurityContext is set, so omitting them is a silent drop to uid 0
# (or to seccomp Unconfined) on the first server-side sync.
podSecurityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
-64
View File
@@ -1,64 +0,0 @@
# Generated from the live liquid-docs/liquid-docs Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 2
selectorLabels:
app: liquid-docs
containerName: spa
image:
repository: ghcr.io/hanzoai/liquid-docs
digest: sha256:175b4e05fbe324aee176e520a41c75c4caaf82c1c175944c6648eb829afba48b
pullPolicy: Always
env:
- name: PORT
value: '3000'
- name: SPA_ENV
value: prod
- name: SPA_API_HOST
value: https://api.lux.network
resources:
limits:
cpu: 200m
memory: 128Mi
requests:
cpu: 20m
memory: 32Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: http
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: http
scheme: HTTP
initialDelaySeconds: 2
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 3000
name: http
servicePort: 80
targetPort: http
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
imagePullSecrets: []
ingress:
enabled: true
hosts:
- liquid.lux.network
tls: true
className: ingress
-83
View File
@@ -1,83 +0,0 @@
# Generated from the live zen/zen-gateway Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 1
selectorLabels:
app.kubernetes.io/name: zen-gateway
image:
repository: ghcr.io/hanzoai/llm
tag: latest
digest: sha256:c73d6366de0647a16a4b9cdf84192d922bf8d50896a467f321a3d9afc1ae51da
pullPolicy: IfNotPresent
partOf: hanzo
component: llm-proxy
args:
- --config
- /app/config.yaml
- --port
- '4100'
- --num_workers
- '4'
env:
- name: REDIS_HOST
value: hanzo-kv.hanzo.svc.cluster.local
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://otel-collector.hanzo.svc:4318
- name: OTEL_SERVICE_NAME
value: zen-gateway
envFrom:
- secretRef:
name: zen-secrets
resources:
limits:
cpu: '2'
memory: 2Gi
requests:
cpu: 250m
memory: 1Gi
volumeMounts:
- mountPath: /app/config.yaml
name: config
readOnly: true
subPath: config.yaml
- mountPath: /app/zen_identity.py
name: config
readOnly: true
subPath: zen_identity.py
livenessProbe:
failureThreshold: 3
httpGet:
path: /health/liveliness
port: http
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /health/readiness
port: http
scheme: HTTP
initialDelaySeconds: 15
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
ports:
- containerPort: 4100
name: http
targetPort: http
volumes:
- configMap:
name: zen-gateway-config
name: config
imagePullSecrets:
- name: ghcr-secret
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
-66
View File
@@ -1,66 +0,0 @@
# Generated from the live zoo-cloud/cloud Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 2
selectorLabels:
app: cloud
image:
repository: ghcr.io/luxfi/cloud-web
tag: v1.5.5
pullPolicy: IfNotPresent
labels:
brand: zoo
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 50m
memory: 64Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 3000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 3000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 3000
name: http
servicePort: 80
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
imagePullSecrets: []
ingress:
enabled: true
hosts:
- zoo.cloud
- www.zoo.cloud
tls: true
# The live certificate lives in this Secret. The chart would default to
# <release>-tls, and cert-manager would then issue into a NEW empty Secret
# while the host serves no cert at all until it succeeds.
secretName: cloud-zoo-tls
className: ingress
# Enforcement switch, read by the lux-fleet ApplicationSet's templatePatch --
# not by the chart. selfHeal returns a hand-edited object to what is written
# here; prune stays off, so nothing is ever deleted.
cd:
automated: false
-99
View File
@@ -1,99 +0,0 @@
# zoo.exchange's own market data.
#
# Zoo's brand.json pointed api.graphql at api-exchange.lux.network — LUX's
# exchange-api — so a Zoo-branded site read Lux's factory and printed Lux's
# number under a ZOO label: "Total ZOO TVL $125,998.38" against the Lux
# factory's $125,998.82, to the cent. One deployment per chain is the fix, and
# it is the shape the image was built for.
#
# NETWORK is the whole configuration. exchange-api's networks.ts is the one
# table of "which chain + which contracts + which graph + which tokens", and it
# now carries zoo: chainId 200200, the explorer's zoo/amm graph,
# api.zoo.network for RPC, ZOO as the native coin, ZOO_TOKENS as the curated
# registry. Restating any of that here would be a second copy free to drift from
# the first.
#
# 2.3.15 is the floor for dropping them. graphql.ts defaulted its AMM graph to a
# hardcoded cchain URL where subgraph.ts used the network's, so with the
# override gone the shaped responses came from Zoo's graph and every raw query
# went to Lux's — $126.0K of PROTOCOL TVL over a table of WLUX and LZOO.
#
# Before the zoo entry existed this ran NETWORK=mainnet with the URLs overridden by
# hand, which declared chainId 96369 over a chain answering 200200: the markets
# gate's chainId assertion fired on every poll and the router quoted against
# Lux's V3 addresses. A rollback below 2.3.13 brings that back AND silently
# resolves to Lux's graph, since an unknown NETWORK falls through to mainnet —
# which is what the digest pin is for.
#
# The digest is not decoration for a second reason: ghcr.io/luxfi/exchange-api
# carries TWO unrelated programs. This one (luxfi/exchange-api, TypeScript,
# /v1/graphql with amm/dex routing, versions 2.x) and the older express
# server.js that luxfi/exchange's release matrix pushes to the same package
# under the SPA's 5.149.x versions. That one has no /v1/graphql route at all.
cd:
automated: false
replicas: 2
image:
repository: ghcr.io/luxfi/exchange-api
tag: 2.3.34
digest: sha256:3eae48ac6f4be340d94751d6b52c8fab0aeaddaff2a5b6c52e5c1305af3b3538
pullPolicy: IfNotPresent
env:
- name: PORT
value: '4000'
- name: NETWORK
value: zoo
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 4000
scheme: HTTP
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 4000
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 4000
# Only the two that exist in this namespace. lux-ns/exchange-api also names
# ghcr-luxfi; there is no such Secret in zoo, and a named-but-absent pull secret
# is a FailedToRetrieveImagePullSecret warning on every pod for nothing.
imagePullSecrets:
- name: ghcr-luxfi-fresh
- name: ghcr-secret
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
topologySpread:
enabled: false
# exchange.zoo.cloud mirrors exchange.lux.cloud: a centralized service answers on
# .cloud, and .network stays the chain's own decentralized surface. No CORS
# annotation — the image already sends Access-Control-Allow-Origin itself, and an
# edge that writes the header a second time is how a page renders empty with no
# failed request to point at.
#
# The A record for this host is in k8s/dns/zoo-cloud.yaml. Nothing here creates
# one: no external-dns runs on this cluster and the zone has no wildcard, so an
# Ingress alone gets a valid certificate for a name that resolves to nothing.
ingress:
enabled: true
hosts:
- exchange.zoo.cloud
tls: true
className: ingress
-103
View File
@@ -1,103 +0,0 @@
# Generated from the live zoo/status Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 1
selectorLabels:
app: status
image:
repository: ghcr.io/hanzoai/status
# v1.1.17 reads `brand` from status-config and derives every mark from
# /brands/<brand>/. Before it, the icons a browser fetches on its own —
# /favicon.ico, /apple-touch-icon.png, the manifest icons — were files at the
# web root of an image built for all five brands, so this page served the
# Hanzo mark byte for byte while its own logo and title were Zoo's.
#
# status-config carries `brand: zoo` alongside the older logo/favicon keys, so
# it is valid on both images: 1.1.6 has no brand field and v1.1.17 has no
# logo/favicon field, and neither parser rejects a key it does not know.
tag: v1.1.17
pullPolicy: Always
# One manifest under that tag, linux/amd64. A property of the image, so it lives
# beside it: no effect on an all-amd64 cluster, and on a mixed one it stops the
# pod binding to a node that has no manifest to run.
nodeSelector:
kubernetes.io/arch: amd64
env:
- name: GATUS_CONFIG_PATH
value: /config/config.yaml
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 50m
memory: 128Mi
volumeMounts:
- mountPath: /config
name: config
readOnly: true
- mountPath: /data
name: data
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 8080
name: http
servicePort: 80
# Gatus writes its uptime history here, and the claim was the object
# live2values.py could not reach: it reads the Deployment, and a claim a
# Deployment only MOUNTS is not part of one. So the values named a volume nothing
# declared, and the scheduler answered that no node is available — indefinitely,
# without ever attempting a pull. 2Gi RWO matches the claim this page already has
# wherever it runs; a request below an existing volume's capacity is refused.
#
# storageClass is deliberately absent: naming one would pin this file to a single
# cluster's provisioner, while the default resolves to the block class in the
# cloud and to local-path on k3s. One text, either place.
claims:
- name: status-data
size: 2Gi
accessModes:
- ReadWriteOnce
volumes:
- configMap:
name: status-config
name: config
- name: data
persistentVolumeClaim:
claimName: status-data
imagePullSecrets:
- name: ghcr-secret
strategy: Recreate
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
ingress:
enabled: true
hosts:
- status.zoo.network
tls: true
# The live certificate lives in this Secret. The chart would default to
# <release>-tls, and cert-manager would then issue into a NEW empty Secret
# while the host serves no cert at all until it succeeds.
secretName: status-zoo-tls
className: ingress
-102
View File
@@ -1,102 +0,0 @@
# Generated from the live zoo/zoo-exchange-testnet Deployment on do-sfo3-lux-k8s
# by hack/live2values.py. Live is the source: a repo of hand-applied
# manifests has unknown currency, the running fleet does not.
replicas: 2
selectorLabels:
app: zoo-exchange-testnet
containerName: spa
# The same brand-neutral SPA every other exchange runs, configured for Zoo's
# testnet by the SPA_* values below — one image, one build, one lineage.
#
# This pointed at ghcr.io/zooai/exchange:latest, which is a separately built
# copy that has not been rebuilt since June and carries no version at all: that
# package holds `sha-e9dc558` and `cache`, and no `latest` among them. A
# floating tag names nothing a deployment can be held to.
image:
repository: ghcr.io/luxfi/exchange
tag: 5.149.66
pullPolicy: IfNotPresent
labels:
brand: zoo
env: testnet
env:
- name: PORT
value: '3000'
- name: ROOT
value: /public
- name: SPA_BRAND_NAME
value: Zoo Exchange (Testnet)
- name: SPA_DEFAULT_CHAIN
value: '200201'
- name: SPA_RPC_HOST
value: https://api.zoo-test.network
- name: SPA_API_HOST
value: https://api.zoo-test.network
- name: SPA_GATEWAY_HOST
value: https://api.zoo-test.network
- name: SPA_IAM_HOST
value: https://zoolabs.id
- name: SPA_ID_HOST
value: https://zoolabs.id
- name: SPA_KMS_HOST
value: https://kms.zoo.network
- name: SPA_INSIGHTS_HOST
value: https://insights.hanzo.ai
envFrom:
- secretRef:
name: zoo-exchange-secrets
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 50m
memory: 64Mi
livenessProbe:
failureThreshold: 3
httpGet:
path: /health
port: http
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /health
port: http
scheme: HTTP
initialDelaySeconds: 2
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
ports:
- containerPort: 3000
name: http
targetPort: http
imagePullSecrets:
- name: ghcr-luxfi-fresh
- name: ghcr-zoo
- name: ghcr-secret
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
topologySpread:
enabled: false
lifecycle: null
terminationGracePeriodSeconds: 30
ingress:
enabled: true
hosts:
- exchange.zoo-test.network
- exchange-test.zoo.network
tls: true
className: ingress
# Enforcement switch, read by the lux-fleet ApplicationSet's templatePatch --
# not by the chart. selfHeal returns a hand-edited object to what is written
# here; prune stays off, so nothing is ever deleted.
cd:
automated: false
-37
View File
@@ -1,37 +0,0 @@
# zoo.exchange is files: one Middleware that serves them, one route that names it,
# and the endpoint-less Service the route schema requires. No image, so the
# chart renders no Deployment -- a static site is not a pod.
#
# The bundle at s3://hanzo-sites/lux/zoo-exchange is Zoo's own build, not a
# re-skin of lux-exchange: its brand.json names Zoo Exchange, Zoo Labs Foundation
# and zoo.exchange, so the brand travels as a file in the prefix rather than as a
# mounted ConfigMap the pod had to remount at a subPath.
cd:
automated: true
ports:
- name: http
containerPort: 80
middlewares:
- name: exchange
spec:
staticFiles:
root: s3://hanzo-sites/lux/zoo-exchange
spaMode: true
spaIndex: index.html
indexFiles:
- index.html
routes:
- name: exchange
spec:
entryPoints:
- websecure
routes:
- match: Host(`zoo.exchange`) || Host(`www.zoo.exchange`) || Host(`exchange.zoo.network`) || Host(`trade.zoo.exchange`)
kind: Rule
priority: 100
middlewares:
- name: exchange
services:
- name: zoo-exchange
port: 80
tls: {}
+1 -1
View File
@@ -168,7 +168,7 @@ test.describe('Lux — security-token swap flow', () => {
test.info().annotations.push({
type: 'pending',
description:
'OnboardingGate not yet deployed on lux.exchange; idHost not configured in LiquidApp.spec.config',
'OnboardingGate not yet deployed on lux.exchange; idHost not configured',
})
return
}
@@ -1 +0,0 @@
customresourcedefinition.apiextensions.k8s.io/luxmpcs.lux.network
@@ -1,12 +0,0 @@
customresourcedefinition.apiextensions.k8s.io/clustergenerators.secrets.lux.network
customresourcedefinition.apiextensions.k8s.io/kmsdynamicsecrets.secrets.lux.network
customresourcedefinition.apiextensions.k8s.io/kmspushsecrets.secrets.lux.network
customresourcedefinition.apiextensions.k8s.io/kmssecrets.secrets.lux.network
customresourcedefinition.apiextensions.k8s.io/luxchains.lux.network
customresourcedefinition.apiextensions.k8s.io/luxexplorers.lux.network
customresourcedefinition.apiextensions.k8s.io/luxgateways.lux.network
customresourcedefinition.apiextensions.k8s.io/luxindexers.lux.network
customresourcedefinition.apiextensions.k8s.io/luxmpcs.lux.network
customresourcedefinition.apiextensions.k8s.io/luxnetworks.lux.network
customresourcedefinition.apiextensions.k8s.io/passwords.secrets.lux.network
customresourcedefinition.apiextensions.k8s.io/uuids.secrets.lux.network
@@ -1,302 +0,0 @@
apiVersion: v1
items:
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"a-chain","lux.network/network":"mainnet"},"name":"a-chain","namespace":"lux-mainnet"},"spec":{"alias":"A","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/aivm:v0.1.0","chainConfig":{"cgo":false},"vmType":"aivm"}}}
creationTimestamp: "2026-04-30T19:53:35Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: a-chain
lux.network/network: mainnet
name: a-chain
namespace: lux-mainnet
resourceVersion: "62906643"
uid: 54b30375-2210-45a6-9fb7-b6bdaaba4e51
spec:
alias: A
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/aivm:v0.1.0
chainConfig:
cgo: false
vmType: aivm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"b-chain","lux.network/network":"mainnet"},"name":"b-chain","namespace":"lux-mainnet"},"spec":{"alias":"B","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/bridgevm:v0.1.0","chainConfig":{"cgo":false},"vmType":"bridgevm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: b-chain
lux.network/network: mainnet
name: b-chain
namespace: lux-mainnet
resourceVersion: "62906646"
uid: d1c5972b-326c-486f-a2d9-0b9f2cb7baa8
spec:
alias: B
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/bridgevm:v0.1.0
chainConfig:
cgo: false
vmType: bridgevm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"d-chain","lux.network/network":"mainnet"},"name":"d-chain","namespace":"lux-mainnet"},"spec":{"alias":"D","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/dexvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"dexvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: d-chain
lux.network/network: mainnet
name: d-chain
namespace: lux-mainnet
resourceVersion: "62906650"
uid: 26629e55-b50a-4dec-9a9e-fa66655450ef
spec:
alias: D
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/dexvm:v0.1.0
chainConfig:
cgo: false
vmType: dexvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"g-chain","lux.network/network":"mainnet"},"name":"g-chain","namespace":"lux-mainnet"},"spec":{"alias":"G","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/graphvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"graphvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: g-chain
lux.network/network: mainnet
name: g-chain
namespace: lux-mainnet
resourceVersion: "62906652"
uid: d7a7f3b1-d71f-4ab0-a833-421a346aa6d5
spec:
alias: G
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/graphvm:v0.1.0
chainConfig:
cgo: false
vmType: graphvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"i-chain","lux.network/network":"mainnet"},"name":"i-chain","namespace":"lux-mainnet"},"spec":{"alias":"I","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/identityvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"identityvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: i-chain
lux.network/network: mainnet
name: i-chain
namespace: lux-mainnet
resourceVersion: "62906654"
uid: 3837654f-9b3b-48ae-a464-c41fb47bb2d6
spec:
alias: I
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/identityvm:v0.1.0
chainConfig:
cgo: false
vmType: identityvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"k-chain","lux.network/network":"mainnet"},"name":"k-chain","namespace":"lux-mainnet"},"spec":{"alias":"K","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/keyvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"keyvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: k-chain
lux.network/network: mainnet
name: k-chain
namespace: lux-mainnet
resourceVersion: "62906657"
uid: 5827070c-b133-4238-898b-0baae5d63442
spec:
alias: K
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/keyvm:v0.1.0
chainConfig:
cgo: false
vmType: keyvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"m-chain","lux.network/network":"mainnet"},"name":"m-chain","namespace":"lux-mainnet"},"spec":{"alias":"M","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/thresholdvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"thresholdvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: m-chain
lux.network/network: mainnet
name: m-chain
namespace: lux-mainnet
resourceVersion: "62906660"
uid: 1cf075b0-84fe-4aea-abfa-c2ea07634694
spec:
alias: M
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/thresholdvm:v0.1.0
chainConfig:
cgo: false
vmType: thresholdvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"o-chain","lux.network/network":"mainnet"},"name":"o-chain","namespace":"lux-mainnet"},"spec":{"alias":"O","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/oraclevm:v0.1.0","chainConfig":{"cgo":false},"vmType":"oraclevm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: o-chain
lux.network/network: mainnet
name: o-chain
namespace: lux-mainnet
resourceVersion: "62906663"
uid: fb8a8b1b-9958-4ce2-b57a-26fda4f2f371
spec:
alias: O
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/oraclevm:v0.1.0
chainConfig:
cgo: false
vmType: oraclevm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"q-chain","lux.network/network":"mainnet"},"name":"q-chain","namespace":"lux-mainnet"},"spec":{"alias":"Q","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/quantumvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"quantumvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: q-chain
lux.network/network: mainnet
name: q-chain
namespace: lux-mainnet
resourceVersion: "62906665"
uid: d3dcf9de-8790-4923-8b56-9e4e760353fc
spec:
alias: Q
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/quantumvm:v0.1.0
chainConfig:
cgo: false
vmType: quantumvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"r-chain","lux.network/network":"mainnet"},"name":"r-chain","namespace":"lux-mainnet"},"spec":{"alias":"R","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/relayvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"relayvm"}}}
creationTimestamp: "2026-04-30T19:53:36Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: r-chain
lux.network/network: mainnet
name: r-chain
namespace: lux-mainnet
resourceVersion: "62906670"
uid: 283e3e3e-473b-4eac-90be-602a15f92edb
spec:
alias: R
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/relayvm:v0.1.0
chainConfig:
cgo: false
vmType: relayvm
status:
conditions: []
phase: Pending
- apiVersion: lux.network/v1alpha1
kind: LuxChain
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxChain","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/chain":"z-chain","lux.network/network":"mainnet"},"name":"z-chain","namespace":"lux-mainnet"},"spec":{"alias":"Z","networkRef":"luxd","vm":{"binaryUrl":"ghcr.io/luxfi/zkvm:v0.1.0","chainConfig":{"cgo":false},"vmType":"zkvm"}}}
creationTimestamp: "2026-04-30T19:53:37Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/chain: z-chain
lux.network/network: mainnet
name: z-chain
namespace: lux-mainnet
resourceVersion: "62906673"
uid: 019862ce-1682-4d0c-9006-5fe51fbe544c
spec:
alias: Z
networkRef: luxd
vm:
binaryUrl: ghcr.io/luxfi/zkvm:v0.1.0
chainConfig:
cgo: false
vmType: zkvm
status:
conditions: []
phase: Pending
kind: List
metadata:
resourceVersion: ""
@@ -1,5 +0,0 @@
apiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
@@ -1,270 +0,0 @@
apiVersion: v1
items:
- apiVersion: lux.network/v1alpha1
kind: LuxGateway
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxGateway","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/network":"devnet"},"name":"api-gateway","namespace":"lux-devnet"},"spec":{"autoRoutes":true,"cors":{"allowedHeaders":["Content-Type","Authorization"],"allowedMethods":["GET","POST","OPTIONS"],"allowedOrigins":["*"]},"customRoutes":[{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/2caKCdNop9C4oAPR1kYihN53HeSRDXD3JyMKS7ntfcpQYucmii/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/zoo/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/tecXMucYDxwN65mebPE6cvQ9GynG6Y5WEvwGFsY3xVDWHxiqT/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/hanzo/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/213ZsFLRCBSmrii4huQqa6S3SxYPP8ec6dPEn6ad4CtLk3RdXp/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/spc/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/MEGAgimfcodi7QaqCruFpTkNM6fqu7ZduLmWJJjGQwUg8uDPJ/rpc","timeout":30},{"backend":"http://luxd-headless.lux-devnet.svc:9650","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/pars/rpc","timeout":30}],"host":"api.devnet.lux.network","indexerRefs":["indexer-c","indexer-zoo","indexer-hanzo","indexer-spc","indexer-pars"],"networkRef":"luxd","port":8080,"rateLimit":{"burst":200,"requestsPerSecond":100},"replicas":1}}
reconcile-at: "2026-03-02T06:44:35Z"
creationTimestamp: "2026-03-02T06:26:33Z"
generation: 2
labels:
app.kubernetes.io/part-of: lux-network
lux.network/network: devnet
name: api-gateway
namespace: lux-devnet
resourceVersion: "74762068"
uid: 7fbadf67-928a-4605-8f56-97f9e17c756e
spec:
autoRoutes: true
cors:
allowedHeaders:
- Content-Type
- Authorization
allowedMethods:
- GET
- POST
- OPTIONS
allowedOrigins:
- '*'
customRoutes:
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/2caKCdNop9C4oAPR1kYihN53HeSRDXD3JyMKS7ntfcpQYucmii/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/zoo/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/tecXMucYDxwN65mebPE6cvQ9GynG6Y5WEvwGFsY3xVDWHxiqT/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/hanzo/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/213ZsFLRCBSmrii4huQqa6S3SxYPP8ec6dPEn6ad4CtLk3RdXp/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/spc/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/MEGAgimfcodi7QaqCruFpTkNM6fqu7ZduLmWJJjGQwUg8uDPJ/rpc
timeout: 30
- backend: http://luxd-headless.lux-devnet.svc:9650
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/pars/rpc
timeout: 30
host: api.devnet.lux.network
indexerRefs:
- indexer-c
- indexer-zoo
- indexer-hanzo
- indexer-spc
- indexer-pars
networkRef: luxd
port: 8080
rateLimit:
burst: 200
requestsPerSecond: 100
replicas: 1
status:
chainRoutes: {}
conditions: []
externalEndpoint: https://api.devnet.lux.network
phase: Ready
readyReplicas: 2
routeCount: 15
- apiVersion: lux.network/v1alpha1
kind: LuxGateway
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxGateway","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/network":"mainnet"},"name":"api-gateway","namespace":"lux-mainnet"},"spec":{"autoRoutes":true,"cors":{"allowedHeaders":["Content-Type","Authorization"],"allowedMethods":["GET","POST","OPTIONS"],"allowedOrigins":["https://lux.network","https://explorer.lux.network","https://lux.exchange"]},"explorerRefs":["explorer"],"host":"api.lux.network","image":{"repository":"ghcr.io/luxfi/gateway","tag":"v0.1.0"},"indexerRefs":["lux-mainnet-indexer"],"networkRef":"luxd","port":8080,"rateLimit":{"burst":400,"requestsPerSecond":200},"replicas":3,"tls":{"certManager":true,"issuer":"letsencrypt-prod","secretName":"api-lux-network-tls"}}}
reconcile-at: "2026-03-02T06:44:34Z"
creationTimestamp: "2026-03-02T06:26:22Z"
generation: 3
labels:
app.kubernetes.io/part-of: lux-network
lux.network/network: mainnet
name: api-gateway
namespace: lux-mainnet
resourceVersion: "74762061"
uid: f692fcd3-e1d4-4c13-bd94-cda4f6300b68
spec:
autoRoutes: true
cors:
allowedHeaders:
- Content-Type
- Authorization
allowedMethods:
- GET
- POST
- OPTIONS
allowedOrigins:
- https://lux.network
- https://explorer.lux.network
- https://lux.exchange
explorerRefs:
- explorer
host: api.lux.network
image:
repository: ghcr.io/luxfi/gateway
tag: v0.1.0
indexerRefs:
- lux-mainnet-indexer
networkRef: luxd
port: 8080
rateLimit:
burst: 400
requestsPerSecond: 200
replicas: 3
tls:
certManager: true
issuer: letsencrypt-prod
secretName: api-lux-network-tls
status:
chainRoutes: {}
conditions: []
externalEndpoint: https://api.lux.network
phase: Ready
readyReplicas: 2
routeCount: 7
- apiVersion: lux.network/v1alpha1
kind: LuxGateway
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxGateway","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/network":"testnet"},"name":"api-gateway","namespace":"lux-testnet"},"spec":{"autoRoutes":true,"cors":{"allowedHeaders":["Content-Type","Authorization"],"allowedMethods":["GET","POST","OPTIONS"],"allowedOrigins":["*"]},"customRoutes":[{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/2Uw1b5tf63vamHsWVeSW9uHcGBVbF5CYHS9JiLWttusY4Vvjsn/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/zoo/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/2wbYEFh7ELuovqXhyYeCLvweZrcEgNUoZVJUAtw145qTVAUJxE/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/hanzo/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/u4pC2tT61o83pbQ8qwAyfXXGF6nyGFNSwCYHEFcUeESGiNKfu/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/spc/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/is5GUzsKHk3Z4Q5JXTjF4Ld9p4TnEs81tJFdaBiEBJVkaFrrs/rpc","timeout":30},{"backend":"http://luxd-headless.lux-testnet.svc:9640","methods":["GET","POST","OPTIONS"],"path":"/v1/chain/pars/rpc","timeout":30}],"host":"api.testnet.lux.network","indexerRefs":["indexer-c","indexer-zoo","indexer-hanzo","indexer-spc","indexer-pars"],"networkRef":"luxd","port":8080,"rateLimit":{"burst":200,"requestsPerSecond":100},"replicas":1}}
reconcile-at: "2026-03-02T06:44:34Z"
creationTimestamp: "2026-03-02T06:26:33Z"
generation: 2
labels:
app.kubernetes.io/part-of: lux-network
lux.network/network: testnet
name: api-gateway
namespace: lux-testnet
resourceVersion: "69666567"
uid: 83959cd0-af38-4167-9ba4-f19f2aa844d4
spec:
autoRoutes: true
cors:
allowedHeaders:
- Content-Type
- Authorization
allowedMethods:
- GET
- POST
- OPTIONS
allowedOrigins:
- '*'
customRoutes:
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/2Uw1b5tf63vamHsWVeSW9uHcGBVbF5CYHS9JiLWttusY4Vvjsn/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/zoo/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/2wbYEFh7ELuovqXhyYeCLvweZrcEgNUoZVJUAtw145qTVAUJxE/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/hanzo/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/u4pC2tT61o83pbQ8qwAyfXXGF6nyGFNSwCYHEFcUeESGiNKfu/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/spc/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/is5GUzsKHk3Z4Q5JXTjF4Ld9p4TnEs81tJFdaBiEBJVkaFrrs/rpc
timeout: 30
- backend: http://luxd-headless.lux-testnet.svc:9640
methods:
- GET
- POST
- OPTIONS
path: /v1/chain/pars/rpc
timeout: 30
host: api.testnet.lux.network
indexerRefs:
- indexer-c
- indexer-zoo
- indexer-hanzo
- indexer-spc
- indexer-pars
networkRef: luxd
port: 8080
rateLimit:
burst: 200
requestsPerSecond: 100
replicas: 1
status:
chainRoutes: {}
conditions: []
externalEndpoint: https://api.testnet.lux.network
phase: Ready
readyReplicas: 2
routeCount: 15
kind: List
metadata:
resourceVersion: ""
@@ -1,5 +0,0 @@
apiVersion: v1
items: []
kind: List
metadata:
resourceVersion: ""
@@ -1,47 +0,0 @@
apiVersion: v1
items:
- apiVersion: lux.network/v1alpha1
kind: LuxMPC
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxMPC","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/network":"mainnet"},"name":"lux-mpc","namespace":"lux-mainnet"},"spec":{"apiPort":8081,"backup":{"bucket":"lux-mpc-keyset-backup","credentialsSecret":"hanzo-s3-secret","endpoint":"https://s3.lux.network","intervalSeconds":3600,"region":"us-east-1"},"clusterIssuer":"letsencrypt-prod","cpuLimit":"2000m","cpuRequest":"500m","dashboardApiUrl":"https://mpc.lux.network/v1","dashboardImage":"ghcr.io/luxfi/mpc-dashboard:v0.1.0","hostname":"mpc.lux.network","iamClientId":"lux-mpc","iamUrl":"https://lux.id","image":"ghcr.io/luxfi/mpc-api:v0.1.0","imagePullPolicy":"IfNotPresent","memoryLimit":"4Gi","memoryRequest":"1Gi","nodes":5,"p2pPort":9999,"secretName":"lux-mpc-keyset","storage":"50Gi","storageClass":"do-block-storage","threshold":3,"tlsSecret":"mpc-lux-network-tls"}}
creationTimestamp: "2026-04-30T19:55:33Z"
generation: 1
labels:
app.kubernetes.io/part-of: lux-network
lux.network/network: mainnet
name: lux-mpc
namespace: lux-mainnet
resourceVersion: "62908702"
uid: 5f3c0f50-7f7d-4180-b0f8-6e5f1244b588
spec:
apiPort: 8081
backup:
bucket: lux-mpc-keyset-backup
credentialsSecret: hanzo-s3-secret
endpoint: https://s3.lux.network
intervalSeconds: 3600
region: us-east-1
clusterIssuer: letsencrypt-prod
cpuLimit: 2000m
cpuRequest: 500m
dashboardApiUrl: https://mpc.lux.network/v1
dashboardImage: ghcr.io/luxfi/mpc-dashboard:v0.1.0
hostname: mpc.lux.network
iamClientId: lux-mpc
iamUrl: https://lux.id
image: ghcr.io/luxfi/mpc-api:v0.1.0
imagePullPolicy: IfNotPresent
memoryLimit: 4Gi
memoryRequest: 1Gi
nodes: 5
p2pPort: 9999
secretName: lux-mpc-keyset
storage: 50Gi
storageClass: do-block-storage
threshold: 3
tlsSecret: mpc-lux-network-tls
kind: List
metadata:
resourceVersion: ""
@@ -1,589 +0,0 @@
apiVersion: v1
items:
- apiVersion: lux.network/v1alpha1
kind: LuxNetwork
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxNetwork","metadata":{"annotations":{},"name":"luxd","namespace":"lux-devnet"},"spec":{"adoptExisting":true,"chainTracking":{"trackAllChains":true},"consensus":{"sybilProtectionEnabled":true},"image":{"pullPolicy":"IfNotPresent","repository":"ghcr.io/luxfi/node","tag":"v1.27.23"},"networkId":3,"ports":{"http":9650,"staking":9651},"seedRestore":{"enabled":true,"objectStoreUrl":"http://s3.lux-system.svc.cluster.local:9000/lux-snapshots/devnet/devnet-node0-full.tar.gz","sourceType":"ObjectStore"},"snapshotSchedule":{"accessKey":"hanzo","bucket":"lux-snapshots","enabled":true,"includeRlpExports":true,"intervalSeconds":3600,"maxRetained":5,"objectStoreEndpoint":"http://s3.lux-system.svc.cluster.local:9000","prefix":"devnet","secretKeyRef":"hanzo-s3-secret","sourceNodeIndex":0},"staking":{"kms":{"auth":{"credentialsNamespace":"lux-system","credentialsSecret":"universal-auth-credentials"},"envSlug":"devnet","hostApi":"https://kms.lux.network/api","projectSlug":"lux-infra","resyncInterval":300,"secretsPath":"/staking"},"secretName":"luxd-staking"},"validators":5}}
creationTimestamp: "2026-03-21T17:55:34Z"
generation: 27
name: luxd
namespace: lux-devnet
resourceVersion: "77700420"
uid: 089770ea-416e-4349-b087-ce36d0e6640c
spec:
adoptExisting: true
allowValidatorRemoval: true
chainTracking:
trackAllChains: true
consensus:
sybilProtectionEnabled: true
genesisConfigMap: luxd-genesis
image:
pullPolicy: IfNotPresent
repository: ghcr.io/luxfi/node
tag: v1.28.0
networkId: 3
ports:
http: 9650
staking: 9651
resources:
cpuLimit: "2"
cpuRequest: 500m
memoryLimit: 8Gi
memoryRequest: 2Gi
seedRestore:
enabled: false
objectStoreUrl: http://s3.lux-system.svc.cluster.local:9000/lux-snapshots/devnet/devnet-node0-full.tar.gz
sourceType: ObjectStore
snapshotSchedule:
accessKey: hanzo
bucket: lux-snapshots
enabled: true
includeRlpExports: true
intervalSeconds: 3600
maxRetained: 5
objectStoreEndpoint: http://s3.lux-system.svc.cluster.local:9000
prefix: devnet
secretKeyRef: hanzo-s3-secret
sourceNodeIndex: 0
staking:
kms:
auth:
credentialsNamespace: lux-system
credentialsSecret: universal-auth-credentials
envSlug: devnet
hostApi: https://kms.lux.network/api
projectSlug: lux-infra
resyncInterval: 300
secretsPath: /staking
secretName: luxd-staking
validators: 5
status:
bootstrapEndpoints:
- http://luxd-0.luxd-headless.lux-devnet.svc:9650
- http://luxd-1.luxd-headless.lux-devnet.svc:9650
- http://luxd-2.luxd-headless.lux-devnet.svc:9650
- http://luxd-3.luxd-headless.lux-devnet.svc:9650
- http://luxd-4.luxd-headless.lux-devnet.svc:9650
chainStatuses:
2uf4pnDukwqQisYJNFNPXD21R3vJho7CPpLWGBvN9cqfe1Gjxu:
alias: liquiddex
healthy: false
C:
alias: C
blockHeight: 35
healthy: true
P:
alias: P
blockHeight: 10
healthy: true
komoGqc3zoGfYDShmNvWzwx2FnYZHJUkjAYYSYPhymrFi4bi2:
alias: liquidevm
blockHeight: 0
healthy: true
conditions: []
degradedReasons: []
externalIps:
luxd-0: 164.90.247.220
luxd-1: 146.190.14.112
luxd-2: 24.199.68.130
luxd-3: 134.199.184.181
luxd-4: 209.38.172.213
networkId: 3
networkMetrics:
bootstrappedChains: 0
heightSkew: 0
maxPHeight: 0
minPHeight: 0
totalPeers: 0
nodeStatuses:
luxd-0:
bootstrapped: true
cChainHeight: 35
chainsCount: 2
connectedPeers: 4
externalIp: 164.90.247.220
healthy: true
inboundPeers: 0
nodeId: NodeID-Mf3JfSY91oDwfBqf7rCLmhg4NDtDghw1f
outboundPeers: 4
pChainHeight: 10
startTime: "2026-03-21T20:20:39+00:00"
luxd-1:
bootstrapped: true
cChainHeight: 35
chainsCount: 2
connectedPeers: 4
externalIp: 146.190.14.112
healthy: true
inboundPeers: 0
nodeId: NodeID-2TwSZ2oyeBK2mv7JiseEQ8m74rotDj4QR
outboundPeers: 4
pChainHeight: 10
startTime: "2026-03-21T20:20:39+00:00"
luxd-2:
bootstrapped: true
cChainHeight: 35
chainsCount: 2
connectedPeers: 4
externalIp: 24.199.68.130
healthy: true
inboundPeers: 0
nodeId: NodeID-Ld9VFBQ9zGbd79z2vzaAqkQ3jHuqbtRpo
outboundPeers: 4
pChainHeight: 10
startTime: "2026-03-23T05:16:36+00:00"
luxd-3:
bootstrapped: true
cChainHeight: 35
chainsCount: 2
connectedPeers: 4
externalIp: 134.199.184.181
healthy: true
inboundPeers: 0
nodeId: NodeID-8mY2fhUehN27v3LCU84BnnKEoeRfd2weC
outboundPeers: 4
pChainHeight: 10
startTime: "2026-03-21T20:20:40+00:00"
luxd-4:
bootstrapped: true
cChainHeight: 35
chainsCount: 2
connectedPeers: 4
externalIp: 209.38.172.213
healthy: true
inboundPeers: 0
nodeId: NodeID-4smuFz5Z9cm8BEyQU1oPQ9nwgXyMgaNqu
outboundPeers: 4
pChainHeight: 10
startTime: "2026-03-23T04:40:55+00:00"
phase: Degraded
readyValidators: 0
snapshotCount: 0
totalValidators: 5
- apiVersion: lux.network/v1alpha1
kind: LuxNetwork
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxNetwork","metadata":{"annotations":{},"labels":{"app.kubernetes.io/part-of":"lux-network","lux.network/network":"mainnet"},"name":"luxd","namespace":"lux-mainnet"},"spec":{"adoptExisting":false,"chainTracking":{"trackAllChains":true},"consensus":{"pqLayers":["bls","corona","mldsa"],"sybilProtectionEnabled":true,"type":"quasar","zapPort":9999},"genesisConfigMap":"luxd-genesis","image":{"repository":"ghcr.io/luxfi/node","tag":"1.27.4"},"networkId":1,"pluginSource":{"bucket":"s3://lux-plugins/v1.1.0/","credentialsSecret":"hanzo-s3-secret","endpoint":"https://s3.lux.network","kmsConfigPath":"lux/mainnet/plugins","vmPlugins":[{"objectKey":"aivm-linux-amd64","vmId":"aivm"},{"objectKey":"bridgevm-linux-amd64","vmId":"bridgevm"},{"objectKey":"dexvm-linux-amd64","vmId":"dexvm"},{"objectKey":"graphvm-linux-amd64","vmId":"graphvm"},{"objectKey":"identityvm-linux-amd64","vmId":"identityvm"},{"objectKey":"keyvm-linux-amd64","vmId":"keyvm"},{"objectKey":"thresholdvm-linux-amd64","vmId":"thresholdvm"},{"objectKey":"oraclevm-linux-amd64","vmId":"oraclevm"},{"objectKey":"quantumvm-linux-amd64","vmId":"quantumvm"},{"objectKey":"relayvm-linux-amd64","vmId":"relayvm"},{"objectKey":"zkvm-linux-amd64","vmId":"zkvm"}]},"podAntiAffinity":true,"ports":{"http":9630,"staking":9631},"seedRestore":{"enabled":true,"objectStoreUrl":"https://s3.lux.network/lux-snapshots/mainnet/mainnet-node0-full.tar.gz","sourceType":"ObjectStore"},"snapshotSchedule":{"accessKey":"hanzo","bucket":"lux-snapshots","enabled":true,"includeRlpExports":true,"intervalSeconds":3600,"maxRetained":5,"objectStoreEndpoint":"https://s3.lux.network","prefix":"mainnet","secretKeyRef":"hanzo-s3-secret","sourceNodeIndex":0},"staking":{"keyDerivation":{"bip44Path":"m/9000'/96369'","mnemonicSecret":"lux-master-mnemonic"},"kms":{"auth":{"credentialsNamespace":"lux-system","credentialsSecret":"universal-auth-credentials"},"envSlug":"mainnet","hostApi":"http://kms.lux-system.svc.cluster.local/api","projectSlug":"lux-infra","resyncInterval":300,"secretsPath":"/staking"},"secretName":"luxd-staking"},"startupGate":{"onTimeout":"StartAnyway","timeoutSeconds":30},"upgradeConfig":{"durangoTimestamp":0,"etnaTimestamp":0,"fortunaTimestamp":0,"graniteTimestamp":0},"upgradeStrategy":{"healthCheckBetweenRestarts":true,"maxUnavailable":1,"stabilizationSeconds":60,"strategyType":"RollingCanary"},"validators":5}}
reconcile.lux.network/touch: "1779223282"
creationTimestamp: "2026-02-25T05:43:28Z"
generation: 25
labels:
app.kubernetes.io/part-of: lux-network
lux.network/network: mainnet
name: luxd
namespace: lux-mainnet
resourceVersion: "79342696"
uid: 555ccdc5-b452-4fbe-ac94-552e89a9cef0
spec:
adoptExisting: false
chainTracking:
trackAllChains: true
consensus:
pqLayers:
- bls
- corona
- mldsa
sybilProtectionEnabled: true
type: quasar
zapPort: 9999
genesisConfigMap: luxd-genesis
image:
repository: ghcr.io/luxfi/node
tag: 1.27.4
networkId: 1
pluginSource:
bucket: s3://lux-plugins/v1.1.0/
credentialsSecret: hanzo-s3-secret
endpoint: https://s3.lux.network
kmsConfigPath: lux/mainnet/plugins
vmPlugins:
- objectKey: aivm-linux-amd64
vmId: aivm
- objectKey: bridgevm-linux-amd64
vmId: bridgevm
- objectKey: dexvm-linux-amd64
vmId: dexvm
- objectKey: graphvm-linux-amd64
vmId: graphvm
- objectKey: identityvm-linux-amd64
vmId: identityvm
- objectKey: keyvm-linux-amd64
vmId: keyvm
- objectKey: thresholdvm-linux-amd64
vmId: thresholdvm
- objectKey: oraclevm-linux-amd64
vmId: oraclevm
- objectKey: quantumvm-linux-amd64
vmId: quantumvm
- objectKey: relayvm-linux-amd64
vmId: relayvm
- objectKey: zkvm-linux-amd64
vmId: zkvm
podAntiAffinity: true
ports:
http: 9630
staking: 9631
seedRestore:
enabled: true
objectStoreUrl: https://s3.lux.network/lux-snapshots/mainnet/mainnet-node0-full.tar.gz
sourceType: ObjectStore
snapshotSchedule:
accessKey: hanzo
bucket: lux-snapshots
enabled: true
includeRlpExports: true
intervalSeconds: 3600
maxRetained: 5
objectStoreEndpoint: https://s3.lux.network
prefix: mainnet
secretKeyRef: hanzo-s3-secret
sourceNodeIndex: 0
staking:
keyDerivation:
bip44Path: m/9000'/96369'
mnemonicSecret: lux-master-mnemonic
kms:
auth:
credentialsNamespace: lux-system
credentialsSecret: universal-auth-credentials
envSlug: mainnet
hostApi: http://kms.lux-system.svc.cluster.local/api
projectSlug: lux-infra
resyncInterval: 300
secretsPath: /staking
secretName: luxd-staking
startupGate:
onTimeout: StartAnyway
timeoutSeconds: 30
upgradeConfig:
durangoTimestamp: 0
etnaTimestamp: 0
fortunaTimestamp: 0
graniteTimestamp: 0
upgradeStrategy:
healthCheckBetweenRestarts: true
maxUnavailable: 1
stabilizationSeconds: 60
strategyType: RollingCanary
validators: 5
status:
bootstrapEndpoints:
- http://luxd-0.luxd-headless.lux-mainnet.svc:9630
- http://luxd-1.luxd-headless.lux-mainnet.svc:9630
- http://luxd-2.luxd-headless.lux-mainnet.svc:9630
- http://luxd-3.luxd-headless.lux-mainnet.svc:9630
- http://luxd-4.luxd-headless.lux-mainnet.svc:9630
chainStatuses:
2GiQb73CeJESjc4omFv2YtQHZrRgJf25NXPzAr5J6UNHRcDV2F:
alias: hanzo
blockHeight: 30
healthy: true
2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp:
alias: zoo
blockHeight: 832
healthy: true
2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F:
alias: pars
blockHeight: 28
healthy: true
C:
alias: C
blockHeight: 0
healthy: true
P:
alias: P
blockHeight: 260
healthy: true
rtjwvtE1tEvrokmpeYdTq7b2zqZgmybKwR5MLjKMGAR1W78dQ:
alias: spc
blockHeight: 10
healthy: true
conditions: []
degradedReasons: []
externalIps:
luxd-0: 209.38.118.46
luxd-1: 209.38.174.69
luxd-2: 24.144.69.101
luxd-3: 134.199.187.56
luxd-4: 143.198.246.173
luxd-5: 134.199.137.189
networkId: 1
networkMetrics:
bootstrappedChains: 1
heightSkew: 166
maxPHeight: 260
minPHeight: 94
totalPeers: 20
nodeStatuses:
luxd-0:
bootstrapped: true
cChainHeight: 0
chainsCount: 0
connectedPeers: 4
externalIp: 209.38.118.46
healthy: true
inboundPeers: 0
nodeId: NodeID-Mf3JfSY91oDwfBqf7rCLmhg4NDtDghw1f
outboundPeers: 4
pChainHeight: 260
startTime: "2026-06-02T01:27:47+00:00"
luxd-1:
bootstrapped: true
cChainHeight: 1083590
chainsCount: 0
connectedPeers: 4
externalIp: 209.38.174.69
healthy: true
inboundPeers: 0
nodeId: NodeID-2TwSZ2oyeBK2mv7JiseEQ8m74rotDj4QR
outboundPeers: 4
pChainHeight: 94
startTime: "2026-06-01T20:23:06+00:00"
luxd-2:
bootstrapped: true
cChainHeight: 1083590
chainsCount: 0
connectedPeers: 4
externalIp: 24.144.69.101
healthy: true
inboundPeers: 0
nodeId: NodeID-Ld9VFBQ9zGbd79z2vzaAqkQ3jHuqbtRpo
outboundPeers: 4
pChainHeight: 260
startTime: "2026-06-01T20:21:18+00:00"
luxd-3:
bootstrapped: true
cChainHeight: 1083590
chainsCount: 0
connectedPeers: 4
externalIp: 134.199.187.56
healthy: true
inboundPeers: 0
nodeId: NodeID-8mY2fhUehN27v3LCU84BnnKEoeRfd2weC
outboundPeers: 4
pChainHeight: 260
startTime: "2026-06-01T20:19:32+00:00"
luxd-4:
bootstrapped: true
cChainHeight: 1083542
chainsCount: 0
connectedPeers: 4
externalIp: 143.198.246.173
healthy: true
inboundPeers: 0
nodeId: NodeID-DwsrqSkPoE3pXWrUt9nkJ5yBycwRQ246X
outboundPeers: 4
pChainHeight: 260
startTime: "2026-06-01T20:17:46+00:00"
luxd-5:
bootstrapped: false
cChainHeight: 0
chainsCount: 0
connectedPeers: 0
externalIp: 134.199.137.189
healthy: false
inboundPeers: 0
nodeId: NodeID-GVQ8rMhHZcyGnm5okcn34yq2cdcvF6aG
outboundPeers: 0
pChainHeight: 0
startTime: "2026-03-17T06:49:55+00:00"
luxd-6:
bootstrapped: false
chainsCount: 0
connectedPeers: 0
healthy: false
inboundPeers: 0
outboundPeers: 0
startTime: "2026-03-17T06:50:05+00:00"
luxd-7:
bootstrapped: false
chainsCount: 0
connectedPeers: 0
healthy: false
inboundPeers: 0
outboundPeers: 0
startTime: "2026-03-17T06:49:49+00:00"
phase: Running
readyValidators: 5
snapshotCount: 0
totalValidators: 5
- apiVersion: lux.network/v1alpha1
kind: LuxNetwork
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"lux.network/v1alpha1","kind":"LuxNetwork","metadata":{"annotations":{},"name":"luxd","namespace":"lux-testnet"},"spec":{"adoptExisting":true,"chainTracking":{"trackAllChains":true},"chainUpgradeConfig":{"precompileUpgrades":[{"dexConfig":{"blockTimestamp":0,"enableFlashLoans":true,"enableHooks":true,"maxPools":10000}},{"routerConfig":{"blockTimestamp":0}}]},"consensus":{"sybilProtectionEnabled":true},"image":{"pullPolicy":"IfNotPresent","repository":"ghcr.io/luxfi/node","tag":"v1.23.31"},"networkId":2,"ports":{"http":9640,"staking":9641},"seedRestore":{"enabled":true,"objectStoreUrl":"http://s3.lux-system.svc.cluster.local:9000/lux-snapshots/testnet/testnet-node0-full.tar.gz","sourceType":"ObjectStore"},"snapshotSchedule":{"accessKey":"hanzo","bucket":"lux-snapshots","enabled":true,"includeRlpExports":true,"intervalSeconds":3600,"maxRetained":5,"objectStoreEndpoint":"http://s3.lux-system.svc.cluster.local:9000","prefix":"testnet","secretKeyRef":"hanzo-s3-secret","sourceNodeIndex":0},"staking":{"kms":{"auth":{"credentialsNamespace":"lux-system","credentialsSecret":"universal-auth-credentials"},"envSlug":"testnet","hostApi":"https://kms.lux.network/api","projectSlug":"lux-infra","resyncInterval":300,"secretsPath":"/staking"},"secretName":"luxd-staking"},"validators":8}}
creationTimestamp: "2026-02-25T05:43:28Z"
generation: 20
name: luxd
namespace: lux-testnet
resourceVersion: "78932442"
uid: cc7032e2-555b-4b03-9e99-9dfc6aa01b6c
spec:
adoptExisting: true
chainTracking:
trackAllChains: true
consensus:
sybilProtectionEnabled: true
image:
pullPolicy: IfNotPresent
repository: ghcr.io/luxfi/node
tag: v1.23.31
networkId: 2
ports:
http: 9640
staking: 9641
seedRestore:
enabled: true
objectStoreUrl: http://s3.lux-system.svc.cluster.local:9000/lux-snapshots/testnet/testnet-node0-full.tar.gz
sourceType: ObjectStore
snapshotSchedule:
accessKey: hanzo
bucket: lux-snapshots
enabled: true
includeRlpExports: true
intervalSeconds: 3600
maxRetained: 5
objectStoreEndpoint: http://s3.lux-system.svc.cluster.local:9000
prefix: testnet
secretKeyRef: hanzo-s3-secret
sourceNodeIndex: 0
staking:
kms:
auth:
credentialsNamespace: lux-system
credentialsSecret: universal-auth-credentials
envSlug: testnet
hostApi: https://kms.lux.network/api
projectSlug: lux-infra
resyncInterval: 300
secretsPath: /staking
secretName: luxd-staking
validators: 5
status:
bootstrapEndpoints:
- http://luxd-0.luxd-headless.lux-testnet.svc:9640
- http://luxd-1.luxd-headless.lux-testnet.svc:9640
- http://luxd-2.luxd-headless.lux-testnet.svc:9640
- http://luxd-3.luxd-headless.lux-testnet.svc:9640
- http://luxd-4.luxd-headless.lux-testnet.svc:9640
chainStatuses:
2Uw1b5tf63vamHsWVeSW9uHcGBVbF5CYHS9JiLWttusY4Vvjsn:
alias: zoo
healthy: false
2wbYEFh7ELuovqXhyYeCLvweZrcEgNUoZVJUAtw145qTVAUJxE:
alias: hanzo
healthy: false
C:
alias: C
blockHeight: 975
healthy: true
P:
alias: P
blockHeight: 112
healthy: true
is5GUzsKHk3Z4Q5JXTjF4Ld9p4TnEs81tJFdaBiEBJVkaFrrs:
alias: pars
healthy: false
u4pC2tT61o83pbQ8qwAyfXXGF6nyGFNSwCYHEFcUeESGiNKfu:
alias: spc
healthy: false
conditions: []
degradedReasons: []
externalIps:
luxd-0: 134.199.187.16
luxd-1: 209.38.174.84
luxd-2: 209.38.173.80
luxd-3: 134.199.187.62
luxd-4: 164.90.247.204
networkId: 2
networkMetrics:
bootstrappedChains: 2
heightSkew: 0
maxPHeight: 112
minPHeight: 112
totalPeers: 20
nodeStatuses:
luxd-0:
bootstrapped: true
cChainHeight: 975
chainsCount: 1
connectedPeers: 4
externalIp: 134.199.187.16
healthy: true
inboundPeers: 0
nodeId: NodeID-Mf3JfSY91oDwfBqf7rCLmhg4NDtDghw1f
outboundPeers: 4
pChainHeight: 112
startTime: "2026-06-01T20:15:57+00:00"
luxd-1:
bootstrapped: true
cChainHeight: 975
chainsCount: 1
connectedPeers: 4
externalIp: 209.38.174.84
healthy: true
inboundPeers: 0
nodeId: NodeID-2TwSZ2oyeBK2mv7JiseEQ8m74rotDj4QR
outboundPeers: 4
pChainHeight: 112
startTime: "2026-06-01T20:14:15+00:00"
luxd-2:
bootstrapped: true
cChainHeight: 975
chainsCount: 1
connectedPeers: 4
externalIp: 209.38.173.80
healthy: true
inboundPeers: 0
nodeId: NodeID-Ld9VFBQ9zGbd79z2vzaAqkQ3jHuqbtRpo
outboundPeers: 4
pChainHeight: 112
startTime: "2026-06-01T20:12:32+00:00"
luxd-3:
bootstrapped: true
cChainHeight: 757
chainsCount: 1
connectedPeers: 4
externalIp: 134.199.187.62
healthy: true
inboundPeers: 0
nodeId: NodeID-8mY2fhUehN27v3LCU84BnnKEoeRfd2weC
outboundPeers: 4
pChainHeight: 112
startTime: "2026-06-01T20:10:43+00:00"
luxd-4:
bootstrapped: true
cChainHeight: 975
chainsCount: 1
connectedPeers: 4
externalIp: 164.90.247.204
healthy: true
inboundPeers: 0
nodeId: NodeID-4smuFz5Z9cm8BEyQU1oPQ9nwgXyMgaNqu
outboundPeers: 4
pChainHeight: 112
startTime: "2026-06-01T20:09:01+00:00"
luxd-5:
bootstrapped: true
cChainHeight: 0
chainsCount: 1
connectedPeers: 0
healthy: false
inboundPeers: 0
nodeId: NodeID-7h6LpGqSHKUydyH4Y7xpzRY4NqYf29q1V
outboundPeers: 0
pChainHeight: 0
startTime: "2026-03-19T06:37:13+00:00"
phase: Running
readyValidators: 5
snapshotCount: 0
totalValidators: 5
kind: List
metadata:
resourceVersion: ""
@@ -1,112 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "12"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"lux-operator"},"name":"lux-operator","namespace":"lux-system"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"lux-operator"}},"template":{"metadata":{"labels":{"app":"lux-operator"}},"spec":{"containers":[{"args":["--namespace","","--log-level","info","--metrics-port","8080","--health-port","8081","--leader-election"],"image":"ghcr.io/luxfi/operator:v0.3.11","imagePullPolicy":"Always","livenessProbe":{"failureThreshold":5,"httpGet":{"path":"/healthz","port":8081},"initialDelaySeconds":10,"periodSeconds":30,"timeoutSeconds":3},"name":"operator","ports":[{"containerPort":8080,"name":"metrics"},{"containerPort":8081,"name":"health"}],"readinessProbe":{"failureThreshold":3,"httpGet":{"path":"/healthz","port":8081},"initialDelaySeconds":3,"periodSeconds":10,"timeoutSeconds":3},"resources":{"limits":{"cpu":"1","memory":"512Mi"},"requests":{"cpu":"100m","memory":"128Mi"}}}],"imagePullSecrets":[{"name":"ghcr-luxfi"}],"serviceAccountName":"lux-operator"}}}}
creationTimestamp: "2026-02-25T05:42:55Z"
generation: 19
labels:
app: lux-operator
name: lux-operator
namespace: lux-system
resourceVersion: "64798812"
uid: 400d0a65-534a-4762-bf4c-7433b1dcd37e
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: lux-operator
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
kubectl.kubernetes.io/restartedAt: "2026-03-21T10:52:02-07:00"
labels:
app: lux-operator
spec:
containers:
- args:
- --namespace
- ""
- --log-level
- info
- --metrics-port
- "8080"
- --health-port
- "8081"
- --leader-election
image: ghcr.io/luxfi/operator:v0.3.12
imagePullPolicy: Always
livenessProbe:
failureThreshold: 5
httpGet:
path: /healthz
port: 8081
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 3
name: operator
ports:
- containerPort: 8080
name: metrics
protocol: TCP
- containerPort: 8081
name: health
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8081
scheme: HTTP
initialDelaySeconds: 3
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 3
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: ghcr-luxfi
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: lux-operator
serviceAccountName: lux-operator
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2026-02-25T05:42:55Z"
lastUpdateTime: "2026-03-21T17:52:15Z"
message: ReplicaSet "lux-operator-55b598dc94" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
- lastTransitionTime: "2026-05-03T05:02:16Z"
lastUpdateTime: "2026-05-03T05:02:16Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
observedGeneration: 19
readyReplicas: 1
replicas: 1
updatedReplicas: 1
@@ -1 +0,0 @@
customresourcedefinition.apiextensions.k8s.io/luxmpcs.lux.network