chain letters are lowercase
CI/CD / render (push) Waiting to run

The primary-network chains answer to either case; one spelling beats two.
/v1/chain/c/rpc, /v1/chain/p, /v1/chain/x across the estate.

Co-authored-by: Hanzo AI <[email protected]>
This commit is contained in:
2026-09-08 15:23:20 -07:00
co-authored by Hanzo AI
parent 23ed1dc3dd
commit 15131f6af4
88 changed files with 280 additions and 280 deletions
+7 -7
View File
@@ -180,7 +180,7 @@ Five security fixes applied across all gateway configs:
2. **Response headers stripped** -- `modifier/response-headers-blacklist` blocks `X-Gateway`, `X-Gateway-Completed`, `node-id`, `Node-Id`, `Server` in all configs. Was already correct.
3. **Per-endpoint rate limiting** -- Every endpoint now has `qos/ratelimit/router`: 100 req/s for RPC, 50 for WS, 30 for health, 10 for info. K8s gateway.yaml previously had zero per-endpoint limits.
4. **CORS wildcard removed** -- IngressRoute `cors-allow-all` middleware replaced with `gateway-cors` (regex-based origin allowlist: `*.lux.network`, `*.lux.exchange`, `lux.market`). LuxGateway CRDs also updated from `["*"]` to explicit origin list.
5. **XVM (exchangevm) routes added** -- `/v1/chain/exchange` alias routes map to `/v1/chain/X` on all networks (mainnet/testnet/devnet) in both K8s gateway and standalone configs. Follows same pattern as `/v1/chain/dex/rpc` -> `/v1/chain/D/rpc`.
5. **XVM (exchangevm) routes added** -- `/v1/chain/exchange` alias routes map to `/v1/chain/x` on all networks (mainnet/testnet/devnet) in both K8s gateway and standalone configs. Follows same pattern as `/v1/chain/dex/rpc` -> `/v1/chain/D/rpc`.
Files changed: `configs/gateway/gateway.json`, `configs/gateway/gateway-mainnet.json`, `configs/gateway/gateway-testnet.json`, `configs/gateway/gateway-devnet.json`, `k8s/lux-gateway/gateway.yaml`, `k8s/lux-k8s/validators/crd-resources.yaml`.
@@ -266,17 +266,17 @@ lux network stop --testnet --force
# Write genesis state spec first
curl -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"admin_writeGenesisStateSpec","params":["/Users/z/work/lux/genesis/configs/mainnet/cchain.json"],"id":1}' \
http://127.0.0.1:9630/v1/chain/C/rpc
http://127.0.0.1:9630/v1/chain/c/rpc
# Import blocks (mainnet C-Chain: 1,082,780 blocks)
curl -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"admin_importChain","params":["/Users/z/work/lux/state/rlp/lux-mainnet/lux-mainnet-96369.rlp"],"id":1}' \
http://127.0.0.1:9630/v1/chain/C/rpc
http://127.0.0.1:9630/v1/chain/c/rpc
# Verify import
curl -s -X POST -H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
http://127.0.0.1:9630/v1/chain/C/rpc
http://127.0.0.1:9630/v1/chain/c/rpc
```
#### RLP Block Data Available
@@ -336,8 +336,8 @@ psql -h localhost -p 5432 -U postgres -d explorer_lux # legacy DB; new Lux Expl
### RPC Endpoints (Port 9630)
- **Info API**: http://localhost:9630/v1/info
- **C-Chain RPC**: http://localhost:9630/v1/chain/C/rpc
- **C-Chain WebSocket**: ws://localhost:9630/v1/chain/C/ws
- **C-Chain RPC**: http://localhost:9630/v1/chain/c/rpc
- **C-Chain WebSocket**: ws://localhost:9630/v1/chain/c/ws
- **Health API**: http://localhost:9630/v1/health
- **Metrics**: http://localhost:9630/v1/metrics
@@ -347,7 +347,7 @@ Mainnet uses `/mainnet/v1/chain/{chain}/rpc`, testnet uses `/testnet/v1/...`, de
| Chain | Mainnet RPC | Testnet RPC |
|-------|-------------|-------------|
| C-Chain | `https://api.lux.network/mainnet/v1/chain/C/rpc` | `https://api.lux.network/testnet/v1/chain/C/rpc` |
| C-Chain | `https://api.lux.network/mainnet/v1/chain/c/rpc` | `https://api.lux.network/testnet/v1/chain/c/rpc` |
| Zoo | `https://api.lux.network/mainnet/v1/chain/{zoo_blockchain_id}/rpc` | flat: `https://api.zoo.network/rpc` |
| Hanzo | `https://api.lux.network/mainnet/v1/chain/{hanzo_blockchain_id}/rpc` | -- |
| SPC | `https://api.lux.network/mainnet/v1/chain/{spc_blockchain_id}/rpc` | -- |
+1 -1
View File
@@ -113,7 +113,7 @@ kubectl -n lux-<net> get pods -l app=luxd
# 3. GATE — port-forward the validators and assert (read-only)
for i in 0 1 2 3 4; do kubectl -n lux-<net> port-forward pod/luxd-$i $((19650+i)):9650 & done # 9640 for testnet, 9630 for mainnet
cd e2e/dex
LUX_RPC=http://127.0.0.1:19650/v1/chain/C/rpc,...,http://127.0.0.1:19654/v1/chain/C/rpc \
LUX_RPC=http://127.0.0.1:19650/v1/chain/c/rpc,...,http://127.0.0.1:19654/v1/chain/c/rpc \
LUX_CHAIN_ID=<chainId> LUX_REQUIRE_FILL=1 ./verify.sh
```
+3 -3
View File
@@ -90,7 +90,7 @@ networks:
httpPort: 9660
stakingPort: 9661
genesisFile: ../genesis/configs/localnet/genesis.json
rpcUrl: http://127.0.0.1:9660/v1/chain/C/rpc
rpcUrl: http://127.0.0.1:9660/v1/chain/c/rpc
imageTag: latest
# Runtime template — what the `lux` CLI expands to derive every path
@@ -127,8 +127,8 @@ chains:
mainnet: 96369
testnet: 96368
devnet: 96367
rpcPath: "/v1/chain/C/rpc"
wsPath: "/v1/chain/C/ws"
rpcPath: "/v1/chain/c/rpc"
wsPath: "/v1/chain/c/ws"
genesisFile: "./genesis/configs/{env}/cchain.json"
- name: Q
+1 -1
View File
@@ -221,7 +221,7 @@ services:
ports:
- "8082:8080"
environment:
LUX_RPC_URL: http://devnet-node-1:9630/v1/chain/C/rpc
LUX_RPC_URL: http://devnet-node-1:9630/v1/chain/c/rpc
ZOO_RPC_URL: http://devnet-node-1:9630/v1/chain/zoo/rpc
LOG_LEVEL: debug
networks:
+2 -2
View File
@@ -109,7 +109,7 @@ services:
ports:
- "8083:8080"
environment:
LUX_RPC_URL: http://local-node:9630/v1/chain/C/rpc
LUX_RPC_URL: http://local-node:9630/v1/chain/c/rpc
ZOO_RPC_URL: http://local-node:9630/v1/chain/zoo/rpc
LOG_LEVEL: debug
# Dev mode - faster timeouts
@@ -136,7 +136,7 @@ services:
command: sh -c "bin/blockscout eval 'Elixir.Explorer.ReleaseTasks.create_and_migrate()' && bin/blockscout start"
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: http://local-node:9630/v1/chain/C/rpc
ETHEREUM_JSONRPC_HTTP_URL: http://local-node:9630/v1/chain/c/rpc
DATABASE_URL: postgresql://postgres:postgres@local-postgres:5432/local
NETWORK: Local
SUBNETWORK: C-Chain
+3 -3
View File
@@ -238,7 +238,7 @@ services:
ports:
- "8080:8080"
environment:
LUX_RPC_URL: http://mainnet-node-1:9630/v1/chain/C/rpc
LUX_RPC_URL: http://mainnet-node-1:9630/v1/chain/c/rpc
ZOO_RPC_URL: http://mainnet-node-1:9630/v1/chain/zoo/rpc
LOG_LEVEL: info
networks:
@@ -275,8 +275,8 @@ services:
container_name: mainnet-explorer-lux
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: http://mainnet-node-1:9630/v1/chain/C/rpc
ETHEREUM_JSONRPC_WS_URL: ws://mainnet-node-1:9630/v1/chain/C/ws
ETHEREUM_JSONRPC_HTTP_URL: http://mainnet-node-1:9630/v1/chain/c/rpc
ETHEREUM_JSONRPC_WS_URL: ws://mainnet-node-1:9630/v1/chain/c/ws
DATABASE_URL: postgresql://postgres:postgres@mainnet-postgres:5432/explorer_lux
NETWORK: LUX
SUBNETWORK: Mainnet
+11 -11
View File
@@ -88,9 +88,9 @@ services:
command: sh -c "bin/blockscout eval 'Elixir.Explorer.ReleaseTasks.create_and_migrate()' && bin/blockscout start"
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: ${MAINNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${MAINNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_WS_URL: ${MAINNET_WS:-ws://137.184.247.245:9630}/v1/chain/C/ws
ETHEREUM_JSONRPC_HTTP_URL: ${MAINNET_RPC}/v1/chain/c/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${MAINNET_RPC}/v1/chain/c/rpc
ETHEREUM_JSONRPC_WS_URL: ${MAINNET_WS:-ws://137.184.247.245:9630}/v1/chain/c/ws
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_lux
NETWORK: LUX
SUBNETWORK: C-Chain
@@ -346,8 +346,8 @@ services:
command: sh -c "bin/blockscout eval 'Elixir.Explorer.ReleaseTasks.create_and_migrate()' && bin/blockscout start"
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: ${TESTNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${TESTNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_HTTP_URL: ${TESTNET_RPC}/v1/chain/c/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${TESTNET_RPC}/v1/chain/c/rpc
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_lux_testnet
NETWORK: LUX
SUBNETWORK: Testnet C-Chain
@@ -470,8 +470,8 @@ services:
command: sh -c "bin/blockscout eval 'Elixir.Explorer.ReleaseTasks.create_and_migrate()' && bin/blockscout start"
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: ${DEVNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${DEVNET_RPC}/v1/chain/C/rpc
ETHEREUM_JSONRPC_HTTP_URL: ${DEVNET_RPC}/v1/chain/c/rpc
ETHEREUM_JSONRPC_TRACE_URL: ${DEVNET_RPC}/v1/chain/c/rpc
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_lux_devnet
NETWORK: LUX
SUBNETWORK: Devnet C-Chain
@@ -615,7 +615,7 @@ services:
postgres_pass: ${POSTGRES_PASSWORD:-postgres}
postgres_db: graph_node
ipfs: ipfs:5001
ethereum: "lux:${MAINNET_RPC}/v1/chain/C/rpc"
ethereum: "lux:${MAINNET_RPC}/v1/chain/c/rpc"
GRAPH_LOG: info
ports:
- "8000:8000"
@@ -641,7 +641,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: "96369"
NEXT_PUBLIC_NETWORK_URL: ${MAINNET_RPC}/v1/chain/C/rpc
NEXT_PUBLIC_NETWORK_URL: ${MAINNET_RPC}/v1/chain/c/rpc
NEXT_PUBLIC_EXPLORER_URL: https://explorer.lux.network
networks:
- services
@@ -656,7 +656,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: "96369"
NEXT_PUBLIC_RPC_URL: ${MAINNET_RPC}/v1/chain/C/rpc
NEXT_PUBLIC_RPC_URL: ${MAINNET_RPC}/v1/chain/c/rpc
NEXT_PUBLIC_EXPLORER_URL: https://explorer.lux.network
networks:
- services
@@ -671,7 +671,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: "96369"
NEXT_PUBLIC_RPC_URL: ${MAINNET_RPC}/v1/chain/C/rpc
NEXT_PUBLIC_RPC_URL: ${MAINNET_RPC}/v1/chain/c/rpc
networks:
- services
+3 -3
View File
@@ -236,7 +236,7 @@ services:
ports:
- "8081:8080"
environment:
LUX_RPC_URL: http://testnet-node-1:9630/v1/chain/C/rpc
LUX_RPC_URL: http://testnet-node-1:9630/v1/chain/c/rpc
ZOO_RPC_URL: http://testnet-node-1:9630/v1/chain/zoo/rpc
LOG_LEVEL: info
networks:
@@ -273,8 +273,8 @@ services:
container_name: testnet-explorer-lux
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: http://testnet-node-1:9630/v1/chain/C/rpc
ETHEREUM_JSONRPC_WS_URL: ws://testnet-node-1:9630/v1/chain/C/ws
ETHEREUM_JSONRPC_HTTP_URL: http://testnet-node-1:9630/v1/chain/c/rpc
ETHEREUM_JSONRPC_WS_URL: ws://testnet-node-1:9630/v1/chain/c/ws
DATABASE_URL: postgresql://postgres:postgres@testnet-postgres:5432/explorer_lux
NETWORK: LUX
SUBNETWORK: Testnet
+10 -10
View File
@@ -377,9 +377,9 @@ services:
command: sh -c "bin/blockscout eval 'Elixir.Explorer.ReleaseTasks.create_and_migrate()' && bin/blockscout start"
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: http://lux-node-1:9630/v1/chain/C/rpc
ETHEREUM_JSONRPC_TRACE_URL: http://lux-node-1:9630/v1/chain/C/rpc
ETHEREUM_JSONRPC_WS_URL: ws://lux-node-1:9630/v1/chain/C/ws
ETHEREUM_JSONRPC_HTTP_URL: http://lux-node-1:9630/v1/chain/c/rpc
ETHEREUM_JSONRPC_TRACE_URL: http://lux-node-1:9630/v1/chain/c/rpc
ETHEREUM_JSONRPC_WS_URL: ws://lux-node-1:9630/v1/chain/c/ws
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_lux
NETWORK: LUX
SUBNETWORK: C-Chain
@@ -495,7 +495,7 @@ services:
postgres_pass: ${POSTGRES_PASSWORD:-postgres}
postgres_db: graph_node
ipfs: ipfs:5001
ethereum: "lux:http://lux-node-1:9630/v1/chain/C/rpc"
ethereum: "lux:http://lux-node-1:9630/v1/chain/c/rpc"
GRAPH_LOG: ${GRAPH_LOG:-info}
GRAPH_ETHEREUM_CLEANUP_BLOCKS: "true"
ports:
@@ -528,7 +528,7 @@ services:
- indexers
command: ["-chain", "pchain", "-port", "4000"]
environment:
RPC_ENDPOINT: http://lux-node-1:9630/v1/chain/P
RPC_ENDPOINT: http://lux-node-1:9630/v1/chain/p
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_pchain?sslmode=disable
HTTP_PORT: 4000
ports:
@@ -557,7 +557,7 @@ services:
- indexers
command: ["-chain", "xchain", "-port", "4000"]
environment:
RPC_ENDPOINT: http://lux-node-1:9630/v1/chain/X
RPC_ENDPOINT: http://lux-node-1:9630/v1/chain/x
DATABASE_URL: postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@postgres:5432/explorer_xchain?sslmode=disable
HTTP_PORT: 4000
ports:
@@ -690,7 +690,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: ${LUX_CHAIN_ID:-96369}
NEXT_PUBLIC_NETWORK_URL: http://lux-node-1:9630/v1/chain/C/rpc
NEXT_PUBLIC_NETWORK_URL: http://lux-node-1:9630/v1/chain/c/rpc
NEXT_PUBLIC_EXPLORER_URL: http://localhost:${LUX_EXPLORER_PORT:-4010}
networks:
- lux-network
@@ -711,7 +711,7 @@ services:
ports:
- "${LXD_GATEWAY_PORT:-8080}:8080"
environment:
LUX_RPC_URL: http://lux-node-1:9630/v1/chain/C/rpc
LUX_RPC_URL: http://lux-node-1:9630/v1/chain/c/rpc
ZOO_RPC_URL: http://lux-node-1:9630/v1/chain/Zoo/rpc
LOG_LEVEL: info
networks:
@@ -737,7 +737,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: ${LUX_CHAIN_ID:-96369}
NEXT_PUBLIC_RPC_URL: http://localhost:${NODE1_HTTP_PORT:-9630}/v1/chain/C/rpc
NEXT_PUBLIC_RPC_URL: http://localhost:${NODE1_HTTP_PORT:-9630}/v1/chain/c/rpc
NEXT_PUBLIC_EXPLORER_URL: http://localhost:${LUX_EXPLORER_PORT:-4010}
networks:
- lux-network
@@ -757,7 +757,7 @@ services:
environment:
NODE_ENV: production
NEXT_PUBLIC_CHAIN_ID: ${LUX_CHAIN_ID:-96369}
NEXT_PUBLIC_RPC_URL: http://localhost:${NODE1_HTTP_PORT:-9630}/v1/chain/C/rpc
NEXT_PUBLIC_RPC_URL: http://localhost:${NODE1_HTTP_PORT:-9630}/v1/chain/c/rpc
networks:
- lux-network
depends_on:
+8 -8
View File
@@ -59,7 +59,7 @@
},
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"endpoint": "/v1/chain/c/rpc",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -68,7 +68,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -85,7 +85,7 @@
}
},
{
"endpoint": "/v1/chain/C/ws",
"endpoint": "/v1/chain/c/ws",
"method": "GET",
"input_headers": [
"Content-Type",
@@ -94,7 +94,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -110,7 +110,7 @@
}
},
{
"endpoint": "/v1/chain/X",
"endpoint": "/v1/chain/x",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -119,7 +119,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -136,7 +136,7 @@
}
},
{
"endpoint": "/v1/chain/P",
"endpoint": "/v1/chain/p",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -145,7 +145,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
+10 -10
View File
@@ -2,7 +2,7 @@
"cache_ttl": "0s",
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"endpoint": "/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"extra_config": {
@@ -19,12 +19,12 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/C/rpc"
"url_pattern": "/v1/chain/c/rpc"
}
]
},
{
"endpoint": "/v1/chain/C/ws",
"endpoint": "/v1/chain/c/ws",
"output_encoding": "no-op",
"extra_config": {
"qos/ratelimit/router": {
@@ -39,12 +39,12 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/C/ws"
"url_pattern": "/v1/chain/c/ws"
}
]
},
{
"endpoint": "/v1/chain/X",
"endpoint": "/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"extra_config": {
@@ -61,12 +61,12 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/X"
"url_pattern": "/v1/chain/x"
}
]
},
{
"endpoint": "/v1/chain/P",
"endpoint": "/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"extra_config": {
@@ -83,7 +83,7 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/P"
"url_pattern": "/v1/chain/p"
}
]
},
@@ -105,7 +105,7 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/P"
"url_pattern": "/v1/chain/p"
}
]
},
@@ -127,7 +127,7 @@
"host": [
"http://luxd-headless.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/X"
"url_pattern": "/v1/chain/x"
}
]
},
+8 -8
View File
@@ -59,7 +59,7 @@
},
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"endpoint": "/v1/chain/c/rpc",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -68,7 +68,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -85,7 +85,7 @@
}
},
{
"endpoint": "/v1/chain/C/ws",
"endpoint": "/v1/chain/c/ws",
"method": "GET",
"input_headers": [
"Content-Type",
@@ -94,7 +94,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -110,7 +110,7 @@
}
},
{
"endpoint": "/v1/chain/X",
"endpoint": "/v1/chain/x",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -119,7 +119,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -136,7 +136,7 @@
}
},
{
"endpoint": "/v1/chain/P",
"endpoint": "/v1/chain/p",
"method": "POST",
"input_headers": [
"Content-Type",
@@ -145,7 +145,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
+36 -36
View File
@@ -60,12 +60,12 @@
},
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"endpoint": "/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -82,11 +82,11 @@
}
},
{
"endpoint": "/v1/chain/C/ws",
"endpoint": "/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -102,12 +102,12 @@
}
},
{
"endpoint": "/v1/chain/P",
"endpoint": "/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -124,12 +124,12 @@
}
},
{
"endpoint": "/v1/chain/X",
"endpoint": "/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -151,7 +151,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -257,12 +257,12 @@
}
},
{
"endpoint": "/mainnet/v1/chain/C/rpc",
"endpoint": "/mainnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -279,11 +279,11 @@
}
},
{
"endpoint": "/mainnet/v1/chain/C/ws",
"endpoint": "/mainnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -299,12 +299,12 @@
}
},
{
"endpoint": "/mainnet/v1/chain/P",
"endpoint": "/mainnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -321,12 +321,12 @@
}
},
{
"endpoint": "/mainnet/v1/chain/X",
"endpoint": "/mainnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -348,7 +348,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
@@ -476,12 +476,12 @@
}
},
{
"endpoint": "/testnet/v1/chain/C/rpc",
"endpoint": "/testnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -498,11 +498,11 @@
}
},
{
"endpoint": "/testnet/v1/chain/C/ws",
"endpoint": "/testnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -518,12 +518,12 @@
}
},
{
"endpoint": "/testnet/v1/chain/P",
"endpoint": "/testnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -540,12 +540,12 @@
}
},
{
"endpoint": "/testnet/v1/chain/X",
"endpoint": "/testnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -567,7 +567,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-testnet.svc.cluster.local:9640"
],
@@ -668,12 +668,12 @@
}
},
{
"endpoint": "/devnet/v1/chain/C/rpc",
"endpoint": "/devnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -690,11 +690,11 @@
}
},
{
"endpoint": "/devnet/v1/chain/C/ws",
"endpoint": "/devnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -710,12 +710,12 @@
}
},
{
"endpoint": "/devnet/v1/chain/P",
"endpoint": "/devnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -732,12 +732,12 @@
}
},
{
"endpoint": "/devnet/v1/chain/X",
"endpoint": "/devnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
@@ -759,7 +759,7 @@
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-devnet.svc.cluster.local:9650"
],
+1 -1
View File
@@ -17,7 +17,7 @@ env:
- name: NETWORK
value: devnet
- name: LUX_RPC_URL
value: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc
value: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc
- name: SUBGRAPH_URL
value: http://explorer.lux-devnet.svc.cluster.local:8090/v1/graph/cchain/amm/graphql
- name: DEX_SUBGRAPH_URL
+1 -1
View File
@@ -258,7 +258,7 @@ readinessProbe:
- /bin/sh
- -c
- 'B=$(curl -sf -m 4 -X POST http://127.0.0.1:9650/v1/info -H ''Content-Type: application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"info.isBootstrapped","params":{"chain":"C"}}''
| grep -c ''"isBootstrapped":true''); [ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9650/v1/chain/C/rpc
| grep -c ''"isBootstrapped":true''); [ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9650/v1/chain/c/rpc
-H ''Content-Type: application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'' | grep
-q ''"result":"0x'' || exit 1'
failureThreshold: 4
+1 -1
View File
@@ -19,7 +19,7 @@ containerName: gateway
# DONE 2026-08-07, in the required order: the config was applied first, then
# this tag moved. Verified after: info.peers and info.getNodeID are refused on
# api.lux.network while info.getNetworkID and info.getNetworkName still answer
# 200, and /v1/chain/C/rpc is unaffected. The pod logs
# 200, and /v1/chain/c/rpc is unaffected. The pod logs
# "1 preEvaluator(s) loaded" with no compile error.
#
# ⚠ A refusal surfaces as a bare 500 with an empty body, not as the rule's own
+3 -3
View File
@@ -321,7 +321,7 @@ configMaps:
name: Lux C-Chain
chain_id: 96369
type: evm
rpc: http://luxd-rpc.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc
rpc: http://luxd-rpc.lux-mainnet.svc.cluster.local:9630/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 service name that
# resolves nowhere outside the mesh. Without public_rpc the binary's
@@ -391,7 +391,7 @@ configMaps:
chain_id: 200200
type: evm
# zood-rpc:9630 is routed by zoo-ingress on host api.zoo.ngo.
rpc: https://api.zoo.ngo/v1/chain/C/rpc
rpc: https://api.zoo.ngo/v1/chain/c/rpc
coin: ZOO
enabled: true
# Zoo's AMM sits at the SAME addresses as Lux's: one deployer replayed
@@ -482,7 +482,7 @@ configMaps:
# /v1/chain/osage/rpc on lux's luxd, which answers `404 page not found` as
# PLAIN TEXT -- so the decoder read 404 as a number and died on the 'p'
# of 'page', 214 times an hour.
rpc: https://api.osage.network/v1/chain/C/rpc
rpc: https://api.osage.network/v1/chain/c/rpc
coin: OSG
enabled: true
indexer: { poll_interval: 30s }
+1 -1
View File
@@ -20,7 +20,7 @@ args:
\ as e:\n print(\"hb2 err:\",str(e)[:70],flush=True)\n try: n=w3.eth.get_transaction_count(acct.address)\n except: pass\n time.sleep(3)\nPY\n"
env:
- name: RPC
value: http://luxd-0.luxd-headless.lux-mainnet:9630/v1/chain/C/rpc
value: http://luxd-0.luxd-headless.lux-mainnet:9630/v1/chain/c/rpc
- name: LUX_MNEMONIC
valueFrom:
secretKeyRef:
+3 -3
View File
@@ -432,7 +432,7 @@ configMaps:
\ while frozen (lux-skipbootstrap-frontier-wedge-rootcause).\n# Never-consumed => every reboot re-runs\
\ state-sync and a crash mid-sync\n# drops back into the wedge. Backgrounded so it never blocks\
\ PID 1's path to\n# the guarded double-wait; renamed marker (.done) is idempotent + auditable.\n\
if [ -f /data/db/.allow-bootstrap ]; then\n (\n LOCAL_RPC=\"http://127.0.0.1:9630/v1/chain/C/rpc\"\
if [ -f /data/db/.allow-bootstrap ]; then\n (\n LOCAL_RPC=\"http://127.0.0.1:9630/v1/chain/c/rpc\"\
\n # RED #7 frontier-floor: never consume the marker on a REF below a known-good\n # frontier.\
\ Defeats the all-peers-stale edge \u2014 if EVERY peer we can reach is\n # itself wedged/behind\
\ (e.g. a whole-fleet sub-quorum halt), REF (=max peer\n # height) can be LOWER than the true\
@@ -452,7 +452,7 @@ configMaps:
\ 0\n if curl -sf -m 2 http://127.0.0.1:9630/v1/health/liveness >/dev/null 2>&1; then\n \
\ LOCAL=$(evm_height \"$LOCAL_RPC\")\n REF=\"\"\n for HOST in $(printf '%s' \"\
$BOOTSTRAP_NODES\" | tr ',' ' '); do\n PEER_HP=${HOST%%:*}\n PH=$(evm_height \"\
http://${PEER_HP}:9630/v1/chain/C/rpc\")\n [ -n \"$PH\" ] && { [ -z \"$REF\" ] && REF=\"$PH\"\
http://${PEER_HP}:9630/v1/chain/c/rpc\")\n [ -n \"$PH\" ] && { [ -z \"$REF\" ] && REF=\"$PH\"\
\ || { [ \"$PH\" -gt \"$REF\" ] && REF=\"$PH\"; }; }\n done\n if [ -n \"$LOCAL\" ]\
\ && [ -n \"$REF\" ] && [ \"$LOCAL\" -ge \"$REF\" ] && [ \"$REF\" -ge \"$FRONTIER_FLOOR\" ]; then\n\
\ mv /data/db/.allow-bootstrap /data/db/.allow-bootstrap.done 2>/dev/null \\\n \
@@ -698,7 +698,7 @@ readinessProbe:
- -c
- 'B=$(curl -sf -m 4 -X POST http://127.0.0.1:9630/v1/info -H ''Content-Type: application/json'' -d
''{"jsonrpc":"2.0","id":1,"method":"info.isBootstrapped","params":{"chain":"C"}}'' | grep -c ''"isBootstrapped":true'');
[ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9630/v1/chain/C/rpc -H ''Content-Type:
[ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9630/v1/chain/c/rpc -H ''Content-Type:
application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'' | grep
-q ''"result":"0x'' || exit 1'
failureThreshold: 4
+1 -1
View File
@@ -32,7 +32,7 @@ env:
- name: RPC_PORT
value: '9630'
- name: RPC_PATH
value: /v1/chain/C/rpc
value: /v1/chain/c/rpc
- name: LABEL_KEY
value: lux.network/rpc
- name: LABEL_VALUE
+1 -1
View File
@@ -22,7 +22,7 @@ env:
- name: NETWORK
value: mainnet
- name: LUX_RPC_URL
value: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc
value: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc
resources:
limits:
cpu: 500m
+2 -2
View File
@@ -7,7 +7,7 @@ it work. That is what these two objects do together:
Host(`api.<brand>.network`) && Path(`/`) priority 10000
-> middleware rpc-rewrite-<brand> -> svc api-gateway-gateway
Middleware lux-system/rpc-rewrite-lux replacePath: /v1/chain/C/rpc
Middleware lux-system/rpc-rewrite-lux replacePath: /v1/chain/c/rpc
Middleware lux-system/rpc-rewrite-hanzo replacePath: /v1/chain/hanzo/rpc
Middleware lux-mainnet/zoo-rpc-rewrite replacePath: /v1/chain/zoo/rpc
@@ -17,7 +17,7 @@ All three rewrote to the RETIRED `/v1/chain/...` prefix. luxd serves `/v1/chain/
now, so the root route rewrote every request onto a path the gateway does not
have and answered `404 page not found` — Traefik's default body, which reads
like "no such host/route" rather than "your rewrite target is wrong". Meanwhile
the explicit `/v1/chain/C/rpc` kept working, so nothing looked broken unless you
the explicit `/v1/chain/c/rpc` kept working, so nothing looked broken unless you
tried the bare hostname the way a wallet does.
Verified after the fix (2026-08-06), bare hosts, no path:
+1 -1
View File
@@ -17,7 +17,7 @@ env:
- name: NETWORK
value: testnet
- name: LUX_RPC_URL
value: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc
value: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc
- name: SUBGRAPH_URL
value: http://explorer.lux-testnet.svc.cluster.local:8090/v1/graph/cchain/amm/graphql
- name: DEX_SUBGRAPH_URL
+2 -2
View File
@@ -151,7 +151,7 @@ readinessProbe:
- -c
- 'B=$(curl -sf -m 4 -X POST http://127.0.0.1:9640/v1/info -H ''Content-Type: application/json'' -d
''{"jsonrpc":"2.0","id":1,"method":"info.isBootstrapped","params":{"chain":"C"}}'' | grep -c ''"isBootstrapped":true'');
[ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9640/v1/chain/C/rpc -H ''Content-Type:
[ "$B" = "1" ] || exit 1; curl -sf -m 4 -X POST http://127.0.0.1:9640/v1/chain/c/rpc -H ''Content-Type:
application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'' | grep
-q ''"result":"0x'' || exit 1'
failureThreshold: 4
@@ -201,7 +201,7 @@ initContainers:
\ '{\"tenant\":\"c-chain\",\"chainAlias\":\"C\",\"contentHash\":\"%s\",\"rlpPath\":\"%s\",\"sentinelPath\"\
:\"%s\",\"blockchainID\":\"%s\"}' \"$H\" \"$RLP\" \"$SENTINEL\" \"$CBID\" > \"$MARKER.tmp\"\nmv \"\
$MARKER.tmp\" \"$MARKER\"\nrm -f \"$ARM\"\necho \"[rlp-import-init] wipe done; marker=$MARKER; startup.sh\
\ will admin_importChain on /v1/chain/C/rpc\"\n"
\ will admin_importChain on /v1/chain/c/rpc\"\n"
command:
- /bin/sh
- -c
+2 -2
View File
@@ -166,8 +166,8 @@ services:
restart: always
environment:
ETHEREUM_JSONRPC_VARIANT: geth
ETHEREUM_JSONRPC_HTTP_URL: http://lux-node-1:9650/v1/chain/C/rpc
ETHEREUM_JSONRPC_WS_URL: ws://lux-node-1:9650/v1/chain/C/ws
ETHEREUM_JSONRPC_HTTP_URL: http://lux-node-1:9650/v1/chain/c/rpc
ETHEREUM_JSONRPC_WS_URL: ws://lux-node-1:9650/v1/chain/c/ws
POOL_SIZE: 50
ECTO_USE_SSL: "false"
HEART_BEAT_TIMEOUT: 30
+4 -4
View File
@@ -30,7 +30,7 @@ check_chain() {
# Try to get chain ID
CHAIN_ID=$(curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' \
-H 'content-type:application/json' http://localhost:$port/v1/chain/C/rpc 2>/dev/null | jq -r .result 2>/dev/null)
-H 'content-type:application/json' http://localhost:$port/v1/chain/c/rpc 2>/dev/null | jq -r .result 2>/dev/null)
if [ ! -z "$CHAIN_ID" ] && [ "$CHAIN_ID" != "null" ]; then
CHAIN_DEC=$(printf "%d" $CHAIN_ID 2>/dev/null)
@@ -38,11 +38,11 @@ check_chain() {
echo " Chain ID: $CHAIN_ID ($CHAIN_DEC)"
echo " Expected: $expected_id"
echo " Token: $token"
echo " RPC: http://localhost:$port/v1/chain/C/rpc"
echo " RPC: http://localhost:$port/v1/chain/c/rpc"
# Check luxdefi.eth balance
BALANCE=$(curl -s -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getBalance\",\"params\":[\"$LUXDEFI\",\"latest\"],\"id\":1}" \
-H 'content-type:application/json' http://localhost:$port/v1/chain/C/rpc 2>/dev/null | jq -r .result 2>/dev/null)
-H 'content-type:application/json' http://localhost:$port/v1/chain/c/rpc 2>/dev/null | jq -r .result 2>/dev/null)
if [ ! -z "$BALANCE" ] && [ "$BALANCE" != "null" ]; then
# Convert hex to decimal (roughly)
@@ -59,7 +59,7 @@ check_chain() {
# Check block number
BLOCK=$(curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
-H 'content-type:application/json' http://localhost:$port/v1/chain/C/rpc 2>/dev/null | jq -r .result 2>/dev/null)
-H 'content-type:application/json' http://localhost:$port/v1/chain/c/rpc 2>/dev/null | jq -r .result 2>/dev/null)
if [ ! -z "$BLOCK" ] && [ "$BLOCK" != "null" ]; then
BLOCK_DEC=$(printf "%d" $BLOCK 2>/dev/null)
echo " Block Height: $BLOCK_DEC"
+1 -1
View File
@@ -235,7 +235,7 @@ done
# Check P-chain height
curl -sf -X POST -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"platform.getHeight","params":{},"id":1}' \
http://localhost:9630/v1/chain/P | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['height'])"
http://localhost:9630/v1/chain/p | python3 -c "import sys,json; print(json.load(sys.stdin)['result']['height'])"
# Check peers
curl -sf -X POST -H "Content-Type: application/json" \
+4 -4
View File
@@ -35,7 +35,7 @@ chains:
name: Lux C-Chain
chain_id: 96369
type: evm
rpc: http://127.0.0.1:9630/v1/chain/C/rpc
rpc: http://127.0.0.1:9630/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -53,7 +53,7 @@ chains:
name: Lux C-Chain Testnet
chain_id: 96368
type: evm
rpc: http://127.0.0.1:9640/v1/chain/C/rpc
rpc: http://127.0.0.1:9640/v1/chain/c/rpc
coin: LUX
enabled: true
indexer: { poll_interval: 30s }
@@ -66,7 +66,7 @@ chains:
name: Zoo
chain_id: 200200
type: evm
rpc: http://127.0.0.1:9650/v1/chain/C/rpc
rpc: http://127.0.0.1:9650/v1/chain/c/rpc
coin: ZOO
enabled: true
indexer: { poll_interval: 10s }
@@ -83,7 +83,7 @@ chains:
name: Zoo Testnet
chain_id: 200201
type: evm
rpc: http://127.0.0.1:9660/v1/chain/C/rpc
rpc: http://127.0.0.1:9660/v1/chain/c/rpc
coin: ZOO
enabled: true
indexer: { poll_interval: 30s }
+4 -4
View File
@@ -5,13 +5,13 @@ import { ethChainId, API_DOMAINS, CHAIN_IDS } from './helpers'
// distinct EVM chainId over the canonical flat /v1 public RPC surface. A deploy
// to one network must never change another's chainId.
//
// mainnet api.lux.network /v1/chain/C/rpc -> 96369 (0x17871)
// testnet api.lux-test.network /v1/chain/C/rpc -> 96368 (0x17870)
// devnet api.lux-dev.network /v1/chain/C/rpc -> 96367 (0x1786f)
// mainnet api.lux.network /v1/chain/c/rpc -> 96369 (0x17871)
// testnet api.lux-test.network /v1/chain/c/rpc -> 96368 (0x17870)
// devnet api.lux-dev.network /v1/chain/c/rpc -> 96367 (0x1786f)
const NETWORKS = (['mainnet', 'testnet', 'devnet'] as const).map(net => ({
net,
rpc: `${API_DOMAINS[net]}/v1/chain/C/rpc`,
rpc: `${API_DOMAINS[net]}/v1/chain/c/rpc`,
expected: CHAIN_IDS[net].lux,
}))
+1 -1
View File
@@ -87,7 +87,7 @@ test.describe(`Operator console — ${env.network} (${BASE})`, () => {
// em-dash fails this — which is the correct outcome when the RPC is down.
await expect(page.getByText(/^[1-9][0-9,]{3,}$/).first()).toBeVisible({ timeout: 30_000 })
// And the receipt must name the endpoint that produced it.
await expect(page.locator('.receipt').first()).toContainText('/v1/chain/C/rpc')
await expect(page.locator('.receipt').first()).toContainText('/v1/chain/c/rpc')
})
test('every value-moving control is behind the owner gate', async ({ page }) => {
+1 -1
View File
@@ -35,7 +35,7 @@ Skipped (not failed) when `LUX_RPC` is unset, so it is CI-safe.
LUX_RPC=https://api.lux-test.network/v1/chain/c LUX_CHAIN_ID=96368 ./verify.sh
# multi-validator convergence (e.g. 3 port-forwarded devnet pods)
LUX_RPC=http://127.0.0.1:19651/v1/chain/C/rpc,http://127.0.0.1:19652/v1/chain/C/rpc,http://127.0.0.1:19653/v1/chain/C/rpc \
LUX_RPC=http://127.0.0.1:19651/v1/chain/c/rpc,http://127.0.0.1:19652/v1/chain/c/rpc,http://127.0.0.1:19653/v1/chain/c/rpc \
LUX_CHAIN_ID=96367 LUX_REQUIRE_FILL=1 ./verify.sh
```
+1 -1
View File
@@ -47,7 +47,7 @@ EPS=""
n=0
p="$RPC_BASE"
while [ "$n" -lt "$N" ] && [ "$p" -lt $((RPC_BASE + 50)) ]; do
url="http://127.0.0.1:$p/v1/chain/C/rpc"
url="http://127.0.0.1:$p/v1/chain/c/rpc"
if curl -s -m 3 -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' "$url" 2>/dev/null | grep -q result; then
EPS="${EPS:+$EPS,}$url"; n=$((n + 1))
+1 -1
View File
@@ -48,7 +48,7 @@ echo "[upgrade] recovered on TO version after ${i}s"
# 3) Re-discover endpoints and re-assert the gate (DEX still fills + converges).
EPS=""; n=0; p="$RPC_BASE"
while [ "$n" -lt "$N" ] && [ "$p" -lt $((RPC_BASE + 50)) ]; do
url="http://127.0.0.1:$p/v1/chain/C/rpc"
url="http://127.0.0.1:$p/v1/chain/c/rpc"
curl -s -m 3 -X POST -H 'content-type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' "$url" 2>/dev/null | grep -q result \
&& { EPS="${EPS:+$EPS,}$url"; n=$((n + 1)); }
+1 -1
View File
@@ -5,7 +5,7 @@
# reset.sh and upgrade.sh all end by calling it. It is also runnable standalone
# against a live net for spec verification (non-destructive — read path only).
#
# LUX_RPC=http://127.0.0.1:9650/v1/chain/C/rpc ./verify.sh
# LUX_RPC=http://127.0.0.1:9650/v1/chain/c/rpc ./verify.sh
# LUX_RPC=ep1,ep2,ep3 LUX_CHAIN_ID=96367 LUX_REQUIRE_FILL=1 ./verify.sh
#
# Env (read by dex_e2e_test.go):
+8 -8
View File
@@ -190,12 +190,12 @@ const LOCAL_IAM = 'http://127.0.0.1:8899'
function remoteUrls(net: NetworkKey): Urls {
const lux = apiBase('lux', net)
return {
rpc: `${lux}/v1/chain/C/rpc`,
rpc: `${lux}/v1/chain/c/rpc`,
rpcInfo: `${lux}/v1/info`,
rpcHealth: `${lux}/v1/health`,
rpcPlatform: `${lux}/v1/chain/P`,
rpcXChain: `${lux}/v1/chain/X`,
rpcZoo: `${apiBase('zoo', net)}/v1/chain/C/rpc`,
rpcPlatform: `${lux}/v1/chain/p`,
rpcXChain: `${lux}/v1/chain/x`,
rpcZoo: `${apiBase('zoo', net)}/v1/chain/c/rpc`,
exploreLux: `https://${exploreHost('lux', net)}`,
exploreZoo: `https://${exploreHost('zoo', net)}`,
exploreHanzo: `https://${exploreHost('hanzo', net)}`,
@@ -222,11 +222,11 @@ function remoteUrls(net: NetworkKey): Urls {
function localUrls(): Urls {
return {
rpc: `${LOCAL_RPC}/v1/chain/C/rpc`,
rpc: `${LOCAL_RPC}/v1/chain/c/rpc`,
rpcInfo: `${LOCAL_RPC}/v1/info`,
rpcHealth: `${LOCAL_RPC}/v1/health`,
rpcPlatform: `${LOCAL_RPC}/v1/chain/P`,
rpcXChain: `${LOCAL_RPC}/v1/chain/X`,
rpcPlatform: `${LOCAL_RPC}/v1/chain/p`,
rpcXChain: `${LOCAL_RPC}/v1/chain/x`,
rpcZoo: `${LOCAL_RPC}/v1/chain/zoo/rpc`,
exploreLux: 'http://localhost:4010',
exploreZoo: 'http://localhost:4011',
@@ -416,7 +416,7 @@ export function orgRpc(org: Org, network: NetworkKey = env.network): string {
if (env.isLocal && network === env.network) {
return org === 'lux' ? env.urls.rpc : `${LOCAL_RPC}/v1/chain/${org}/rpc`
}
return `${apiBase(org, network)}/v1/chain/C/rpc`
return `${apiBase(org, network)}/v1/chain/c/rpc`
}
// ── Viewports ──────────────────────────────────────────────────────────────
+1 -1
View File
@@ -24,7 +24,7 @@ export type LuxUrls = typeof env.urls
// Lux's API host per network, computed from the one derivation in env.ts, for
// the specs that deliberately reach across networks at once (14-network-
// independence). Other orgs need no table of their own: every org is a sovereign
// L1 serving its own C-Chain from api.<org>.network on the flat /v1/chain/C/rpc
// L1 serving its own C-Chain from api.<org>.network on the flat /v1/chain/c/rpc
// path, which is exactly what orgRpc(org, network) returns. The four hand-kept
// per-org domain tables this file used to carry are gone.
export const API_DOMAINS: Record<string, string> =
+1 -1
View File
@@ -32,7 +32,7 @@
# affinity/selector … 1 max node group size reached
# for 13h. Consequence: luxfi/cloud queued four Docker builds for 5-10h and
# lux.cloud served a bundle six commits stale, still calling the retired
# /v1/chain/C/rpc — so the console reported a live trillion-LUX treasury as
# /v1/chain/c/rpc — so the console reported a live trillion-LUX treasury as
# 0 LUX and every Lux chain's height as an em-dash.
#
# The selector was also WRONG independently of the missing pool: `arch:
+1 -1
View File
@@ -80,7 +80,7 @@ that hosts:
┌──────────────────────────────────────────────────────────┐
│ luxd validators (StatefulSet, 5 replicas) │
│ Primary network + all app chain EVMs (Zoo, Hanzo, Pars, SPC) │
│ /v1/chain/C/rpc → Lux C-Chain (96369) │
│ /v1/chain/c/rpc → Lux C-Chain (96369) │
│ /v1/chain/zoo/rpc → Zoo (200200) │
│ /v1/chain/hanzo/rpc → Hanzo (36963) │
│ /v1/chain/pars/rpc → Pars (494949) │
@@ -13,7 +13,7 @@ data:
PORT: "3000"
NEXT_TELEMETRY_DISABLED: "1"
# Env-specific gateway: NO /devnet infix (that path 404s). The lux-dev
# Gateway serves the C-Chain (96367) directly at /v1/chain/C/rpc. Verified live.
# Gateway serves the C-Chain (96367) directly at /v1/chain/c/rpc. Verified live.
NEXT_PUBLIC_LXD_GATEWAY_URL: "https://api.lux-dev.network/v1/chain/c"
REACT_APP_LXD_GATEWAY_URL: "https://api.lux-dev.network/v1/chain/c"
REACT_APP_AWS_API_ENDPOINT: "/api"
@@ -13,7 +13,7 @@ data:
PORT: "3000"
NEXT_TELEMETRY_DISABLED: "1"
# Unified gateway: NO /mainnet infix (that path now 404s; gateway simplified).
# api.lux.network serves the C-Chain (96369) directly at /v1/chain/C/rpc. Verified live.
# api.lux.network serves the C-Chain (96369) directly at /v1/chain/c/rpc. Verified live.
NEXT_PUBLIC_LXD_GATEWAY_URL: "https://api.lux.network/v1/chain/c"
REACT_APP_LXD_GATEWAY_URL: "https://api.lux.network/v1/chain/c"
REACT_APP_AWS_API_ENDPOINT: "/api"
@@ -13,7 +13,7 @@ data:
PORT: "3000"
NEXT_TELEMETRY_DISABLED: "1"
# Env-specific gateway: NO /testnet infix (that path 404s). The lux-test
# Gateway serves the C-Chain (96368) directly at /v1/chain/C/rpc. Verified live.
# Gateway serves the C-Chain (96368) directly at /v1/chain/c/rpc. Verified live.
NEXT_PUBLIC_LXD_GATEWAY_URL: "https://api.lux-test.network/v1/chain/c"
REACT_APP_LXD_GATEWAY_URL: "https://api.lux-test.network/v1/chain/c"
REACT_APP_AWS_API_ENDPOINT: "/api"
@@ -57,10 +57,10 @@ spec:
for f in /patched/assets/*.js; do
sed -i 's|if(!r){const [a-z]=new Error(`Feature|if(!r){return"__unmapped_gate_"+e}if(false){const x=new Error(`Feature|g' "$f"
sed -i 's|http://127\.0\.0\.1:8545/v1/chain/C/rpc|https://api.lux.network/mainnet/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc|g' "$f"
sed -i 's|http://127\.0\.0\.1:8545/v1/chain/c/rpc|https://api.lux.network/mainnet/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc|g' "$f"
sed -i 's|http://127\.0\.0\.1:8545|https://api.lux.network/mainnet/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc|g' "$f"
sed -i 's|http://127\.0\.0\.1:8546|https://api.lux.network/mainnet/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc|g' "$f"
sed -i 's|http://localhost:8545/v1/chain/C/explorer/|https://explore.pars.network/|g' "$f"
sed -i 's|http://localhost:8545/v1/chain/c/explorer/|https://explore.pars.network/|g' "$f"
sed -i 's|http://localhost:9630/v1/chain/G/graphql|https://api.pars.market/v1/graphql|g' "$f"
sed -i 's|http://localhost:9650/v1/chain/G/graphql|https://api.pars.market/v1/graphql|g' "$f"
sed -i 's|http://localhost:8080|https://gw.pars.market|g' "$f"
@@ -40,7 +40,7 @@ spec:
- { name: SPA_BRAND_NAME, value: "Zoo Exchange" }
- { name: SPA_DEFAULT_CHAIN, value: "200200" }
- { name: SPA_RPC_HOST, value: "https://api.zoo.network" }
# Cross-chain RPC: each org answers on its OWN gateway at /v1/chain/C/rpc.
# Cross-chain RPC: each org answers on its OWN gateway at /v1/chain/c/rpc.
# Not api.zoo.exchange/<anything> — that host is a zoo-branded alias of
# the Lux mainnet gateway, it serves no org chain and sends no CORS
# headers, so a browser on zoo.exchange cannot read its responses.
+2 -2
View File
@@ -19,12 +19,12 @@ metadata:
name: pulse-chains
namespace: hanzo-mainnet
data:
# In-cluster RPC: hanzod-rpc:9630 serves /v1/chain/C/rpc (verified tip 17206).
# In-cluster RPC: hanzod-rpc:9630 serves /v1/chain/c/rpc (verified tip 17206).
# NOTE 127.0.0.1:9630 inside a hanzod-mv pod 404s on that path — the SERVICE
# is the correct target, not pod-local.
chains.json: |
[
{"name":"hanzo-evm","rpc":"http://hanzod-rpc.hanzo-mainnet.svc.cluster.local:9630/v1/chain/C/rpc","key":"$TRAFFIC_KEY","weight":1,"dex":0}
{"name":"hanzo-evm","rpc":"http://hanzod-rpc.hanzo-mainnet.svc.cluster.local:9630/v1/chain/c/rpc","key":"$TRAFFIC_KEY","weight":1,"dex":0}
]
---
apiVersion: v1
@@ -1,6 +1,6 @@
# Gateway config for api.lux-dev.network (hanzoai/gateway / KrakenD) in lux-devnet.
#
# The public surface is /v1 only (/v1/chain/C/rpc, /v1/chain/P, /v1/chain/X, /v1/info,
# The public surface is /v1 only (/v1/chain/c/rpc, /v1/chain/p, /v1/chain/x, /v1/info,
# /v1/health, per-L1 /v1/chain/<chain>/rpc). The legacy /ext/* aliases are gone:
# each was a duplicate of the /v1 route it sat next to, and /v1/info — the one
# with no /v1 twin — was renamed rather than dropped, so no surface was lost.
@@ -476,7 +476,7 @@ data:
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"timeout": "300s"
}
]
@@ -491,7 +491,7 @@ data:
"host": [
"http://luxd.lux-devnet.svc:9650"
],
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"timeout": "300s"
}
]
+1 -1
View File
@@ -312,7 +312,7 @@ spec:
command: ["/bin/sh", "/app/chain-traffic.sh"]
env:
- name: RPC_URLS
value: "http://luxd-0.luxd-headless.lux-devnet:9650/v1/chain/C/rpc,http://luxd-1.luxd-headless.lux-devnet:9650/v1/chain/C/rpc,http://luxd-2.luxd-headless.lux-devnet:9650/v1/chain/C/rpc,http://luxd-3.luxd-headless.lux-devnet:9650/v1/chain/C/rpc,http://luxd-4.luxd-headless.lux-devnet:9650/v1/chain/C/rpc"
value: "http://luxd-0.luxd-headless.lux-devnet:9650/v1/chain/c/rpc,http://luxd-1.luxd-headless.lux-devnet:9650/v1/chain/c/rpc,http://luxd-2.luxd-headless.lux-devnet:9650/v1/chain/c/rpc,http://luxd-3.luxd-headless.lux-devnet:9650/v1/chain/c/rpc,http://luxd-4.luxd-headless.lux-devnet:9650/v1/chain/c/rpc"
- name: TX_PER_BURST
value: "2"
- name: BURST_SECS
+1 -1
View File
@@ -42,7 +42,7 @@ data:
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "LUX"
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
NEXT_PUBLIC_IS_TESTNET: "true"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.devnet.lux.network/v1/chain/C/rpc"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.devnet.lux.network/v1/chain/c/rpc"
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE: "mining"
# Theme
NEXT_PUBLIC_COLOR_THEME_DEFAULT: "dark"
+1 -1
View File
@@ -58,7 +58,7 @@ spec:
# fails verification and the surface is correctly EMPTY ("No active
# markets") — no per-network special-casing.
- name: LUX_RPC_URL
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc"
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc"
# AMM (uniswap-v2/v3-shaped) — devnet explorer amm subgraph.
- name: SUBGRAPH_URL
value: "http://explorer.lux-devnet.svc.cluster.local:8090/v1/graph/cchain/amm/graphql"
+3 -3
View File
@@ -72,11 +72,11 @@ spec:
- name: ETHEREUM_JSONRPC_VARIANT
value: geth
- name: ETHEREUM_JSONRPC_HTTP_URL
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc"
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_TRACE_URL
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc"
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_WS_URL
value: "ws://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/ws"
value: "ws://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/ws"
# Chain identity
- name: CHAIN_ID
value: "96367"
+1 -1
View File
@@ -58,7 +58,7 @@ data:
name: Lux C-Chain
chain_id: 96367
type: evm
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
+3 -3
View File
@@ -29,7 +29,7 @@ data:
name: 'Lux C-Chain (devnet)'
type: evm
chain_id: 96367
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -40,14 +40,14 @@ data:
- slug: pchain
name: 'P-Chain (devnet)'
type: linear
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/P
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/p
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain (devnet)'
type: dag
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/X
rpc: http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/x
coin: LUX
enabled: true
+1 -1
View File
@@ -158,7 +158,7 @@ spec:
command:
- /bin/sh
- -c
- 'TS=$(curl -sf -m 4 -X POST http://127.0.0.1:9650/v1/chain/C/rpc -H ''Content-Type: application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["latest",false]}'' | sed -n ''s/.*"timestamp":"0x\([0-9a-f]*\)".*/\1/p''); [ -n "$TS" ] && [ $(( $(date +%s) - 0x$TS )) -le 300 ]'
- 'TS=$(curl -sf -m 4 -X POST http://127.0.0.1:9650/v1/chain/c/rpc -H ''Content-Type: application/json'' -d ''{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["latest",false]}'' | sed -n ''s/.*"timestamp":"0x\([0-9a-f]*\)".*/\1/p''); [ -n "$TS" ] && [ $(( $(date +%s) - 0x$TS )) -le 300 ]'
failureThreshold: 3
periodSeconds: 10
successThreshold: 1
+2 -2
View File
@@ -125,7 +125,7 @@ data:
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "LUX"
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
NEXT_PUBLIC_IS_TESTNET: "true"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.testnet.lux.network/v1/chain/C/rpc"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.testnet.lux.network/v1/chain/c/rpc"
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE: "mining"
# Theme
NEXT_PUBLIC_COLOR_THEME_DEFAULT: "dark"
@@ -170,7 +170,7 @@ data:
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "LUX"
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
NEXT_PUBLIC_IS_TESTNET: "true"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.devnet.lux.network/v1/chain/C/rpc"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.devnet.lux.network/v1/chain/c/rpc"
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE: "mining"
# Theme
NEXT_PUBLIC_COLOR_THEME_DEFAULT: "dark"
+3 -3
View File
@@ -22,7 +22,7 @@ data:
name: Lux C-Chain (Devnet)
chain_id: 96367
type: evm
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/C/rpc
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -57,13 +57,13 @@ data:
- slug: xchain
name: X-Chain (Devnet)
type: dag
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/X
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/x
coin: LUX
enabled: true
- slug: pchain
name: P-Chain (Devnet)
type: linear
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/P
rpc: http://luxd-0.luxd-headless.lux-devnet.svc:9650/v1/chain/p
coin: LUX
enabled: true
---
+3 -3
View File
@@ -25,7 +25,7 @@ data:
name: Lux C-Chain
chain_id: 96369
type: evm
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/C/rpc
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -60,13 +60,13 @@ data:
- slug: xchain
name: X-Chain
type: dag
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/X
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/x
coin: LUX
enabled: true
- slug: pchain
name: P-Chain
type: linear
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/P
rpc: http://luxd-0.luxd-headless.lux-mainnet.svc:9630/v1/chain/p
coin: LUX
enabled: true
---
+3 -3
View File
@@ -81,11 +81,11 @@ spec:
- name: ETHEREUM_JSONRPC_VARIANT
value: geth
- name: ETHEREUM_JSONRPC_HTTP_URL
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_TRACE_URL
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_WS_URL
value: "ws://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/ws"
value: "ws://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/ws"
# Chain identity
- name: CHAIN_ID
value: "96369"
+3 -3
View File
@@ -22,7 +22,7 @@ data:
name: Lux C-Chain (Testnet)
chain_id: 96368
type: evm
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/C/rpc
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -57,13 +57,13 @@ data:
- slug: xchain
name: X-Chain (Testnet)
type: dag
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/X
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/x
coin: LUX
enabled: true
- slug: pchain
name: P-Chain (Testnet)
type: linear
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/P
rpc: http://luxd-0.luxd-headless.lux-testnet.svc:9640/v1/chain/p
coin: LUX
enabled: true
---
+1 -1
View File
@@ -18,7 +18,7 @@ data:
NODE_ENV: "production"
NEXT_TELEMETRY_DISABLED: "1"
NETWORK: "testnet"
RPC_URL: "https://api.lux.network/testnet/v1/chain/C/rpc"
RPC_URL: "https://api.lux.network/testnet/v1/chain/c/rpc"
CHAIN_ID: "96368"
---
apiVersion: apps/v1
+3 -3
View File
@@ -152,7 +152,7 @@ spec:
imagePullPolicy: Always
args:
- "-chain=cchain"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- "-port=4000"
- "-poll=15s"
env:
@@ -222,7 +222,7 @@ spec:
imagePullPolicy: Always
args:
- "-chain=pchain"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/P"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/p"
- "-port=4100"
- "-poll=30s"
env:
@@ -288,7 +288,7 @@ spec:
imagePullPolicy: Always
args:
- "-chain=xchain"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/X"
- "-rpc=http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/x"
- "-port=4200"
- "-poll=30s"
env:
+1 -1
View File
@@ -43,7 +43,7 @@ spec:
- "--poll=15s"
env:
- name: RPC_ENDPOINT
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/C/rpc"
value: "http://luxd-headless.lux-devnet.svc.cluster.local:9650/v1/chain/c/rpc"
# SECURITY: Database credentials must come from KMS-backed Secret,
# not hardcoded in manifests. Using secretKeyRef for now; create
# the Secret via: kubectl create secret generic indexer-secrets-devnet \
+1 -1
View File
@@ -43,7 +43,7 @@ spec:
- "--poll=15s"
env:
- name: RPC_ENDPOINT
value: "http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
value: "http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- name: DATABASE_URL
value: "postgresql://explorer:[email protected]:5432/indexer?sslmode=disable"
- name: HTTP_PORT
+1 -1
View File
@@ -43,7 +43,7 @@ spec:
- "--poll=15s"
env:
- name: RPC_ENDPOINT
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc"
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc"
# SECURITY: Database credentials must come from KMS-backed Secret,
# not hardcoded in manifests. Using secretKeyRef for now; create
# the Secret via: kubectl create secret generic indexer-secrets-testnet \
+36 -36
View File
@@ -68,12 +68,12 @@ data:
},
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"endpoint": "/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -107,11 +107,11 @@ data:
}
},
{
"endpoint": "/v1/chain/C/ws",
"endpoint": "/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -145,12 +145,12 @@ data:
}
},
{
"endpoint": "/v1/chain/P",
"endpoint": "/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -184,12 +184,12 @@ data:
}
},
{
"endpoint": "/v1/chain/X",
"endpoint": "/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -228,7 +228,7 @@ data:
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -420,12 +420,12 @@ data:
}
},
{
"endpoint": "/mainnet/v1/chain/C/rpc",
"endpoint": "/mainnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -459,11 +459,11 @@ data:
}
},
{
"endpoint": "/mainnet/v1/chain/C/ws",
"endpoint": "/mainnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -497,12 +497,12 @@ data:
}
},
{
"endpoint": "/mainnet/v1/chain/P",
"endpoint": "/mainnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -536,12 +536,12 @@ data:
}
},
{
"endpoint": "/mainnet/v1/chain/X",
"endpoint": "/mainnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -580,7 +580,7 @@ data:
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
@@ -811,12 +811,12 @@ data:
}
},
{
"endpoint": "/testnet/v1/chain/C/rpc",
"endpoint": "/testnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
@@ -853,11 +853,11 @@ data:
}
},
{
"endpoint": "/testnet/v1/chain/C/ws",
"endpoint": "/testnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
@@ -894,12 +894,12 @@ data:
}
},
{
"endpoint": "/testnet/v1/chain/P",
"endpoint": "/testnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
@@ -936,12 +936,12 @@ data:
}
},
{
"endpoint": "/testnet/v1/chain/X",
"endpoint": "/testnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
@@ -983,7 +983,7 @@ data:
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
@@ -1186,12 +1186,12 @@ data:
}
},
{
"endpoint": "/devnet/v1/chain/C/rpc",
"endpoint": "/devnet/v1/chain/c/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"url_pattern": "/v1/chain/c/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
@@ -1228,11 +1228,11 @@ data:
}
},
{
"endpoint": "/devnet/v1/chain/C/ws",
"endpoint": "/devnet/v1/chain/c/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"url_pattern": "/v1/chain/c/ws",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
@@ -1269,12 +1269,12 @@ data:
}
},
{
"endpoint": "/devnet/v1/chain/P",
"endpoint": "/devnet/v1/chain/p",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"url_pattern": "/v1/chain/p",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
@@ -1311,12 +1311,12 @@ data:
}
},
{
"endpoint": "/devnet/v1/chain/X",
"endpoint": "/devnet/v1/chain/x",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
@@ -1358,7 +1358,7 @@ data:
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"url_pattern": "/v1/chain/x",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
+2 -2
View File
@@ -11,8 +11,8 @@
# api.lux-dev.network → lux-devnet/api-gateway-gateway
#
# Endpoints exposed per network (no `/mainnet/...` prefix — host implies env):
# /v1/chain/C/rpc, /v1/chain/C/ws — primary-network EVM
# /v1/chain/P, /v1/chain/X — P-Chain, X-Chain
# /v1/chain/c/rpc, /v1/chain/c/ws — primary-network EVM
# /v1/chain/p, /v1/chain/x — P-Chain, X-Chain
# /v1/info, /v1/health — node info / liveness
# /v1/chain/hanzo/rpc — Hanzo app chain EVM (chainID 36963/36964)
# /v1/chain/zoo/rpc — Zoo app chain EVM
+1 -1
View File
@@ -50,7 +50,7 @@ data:
# SPC and Osage deliberately have no public_rpc — api.lux.network 404s on
# /v1/chain/{spc,osage}/rpc, so the binary emits "" for them rather than a
# URL that always fails.
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc
public_rpc: https://api.lux.network/v1/chain/c
coin: LUX
enabled: true
+1 -1
View File
@@ -88,7 +88,7 @@ own TLS cert and DNS record.
```
# Chain RPCs (40+ endpoints across 12 chains × 3 envs each)
POST /v1/chain/C/rpc # Lux C-Chain (96369)
POST /v1/chain/c/rpc # Lux C-Chain (96369)
POST /v1/chain/zoo/rpc # Zoo (200200)
POST /v1/chain/hanzo/rpc # Hanzo (36963)
POST /v1/chain/pars/rpc # Pars (494949)
@@ -8,7 +8,7 @@
# /ext/ IS GONE. Not deprecated, not redirected — removed.
#
# luxd already serves /v1/ only. Measured against the mainnet pod:
# POST luxd-1:9630/v1/chain/C/rpc -> 200 /v1/chain/C/rpc -> 404
# POST luxd-1:9630/v1/chain/c/rpc -> 200 /v1/chain/c/rpc -> 404
# POST luxd-1:9630/v1/info -> 200 /v1/info -> 404
# GET luxd-1:9630/v1/health -> 200 /v1/health -> 404
#
@@ -18,7 +18,7 @@
# that tag is stale metadata. Read the pod image, not the CR. Devnet runs
# v1.36.25 and behaves identically. The node dropped /ext/ some releases ago;
# the only thing still resurrecting it was this gateway, which accepted
# /v1/chain/C/rpc externally and rewrote it to /v1/chain/C/rpc on the way to the
# /v1/chain/c/rpc externally and rewrote it to /v1/chain/c/rpc on the way to the
# node. That rewrite is what made mainnet look like it still spoke /ext/.
#
# Two changes, both forward-only:
@@ -336,7 +336,7 @@ data:
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/P"
"url_pattern": "/v1/chain/p"
}
]
},
@@ -350,7 +350,7 @@ data:
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/X"
"url_pattern": "/v1/chain/x"
}
]
},
+1 -1
View File
@@ -100,7 +100,7 @@ data:
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "AI"
NEXT_PUBLIC_NETWORK_ID: "36963"
NEXT_PUBLIC_NETWORK_NAME: "Hanzo"
# NOTE: live data backend issue — explorer appends /v1/chain/C/rpc to this
# NOTE: live data backend issue — explorer appends /v1/chain/c/rpc to this
# base, yielding a doubled path. Fix the indexer/API + this RPC base in a
# separate data-layer task; it does not affect branding/chrome.
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.lux.network/v1/chain/hanzo/rpc"
+3 -3
View File
@@ -75,11 +75,11 @@ spec:
- name: ETHEREUM_JSONRPC_VARIANT
value: geth
- name: ETHEREUM_JSONRPC_HTTP_URL
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_TRACE_URL
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc"
value: "http://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_WS_URL
value: "ws://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/ws"
value: "ws://luxd-1.luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/ws"
# Chain identity
- name: CHAIN_ID
value: "96369"
+3 -3
View File
@@ -24,7 +24,7 @@ data:
name: 'Lux C-Chain'
type: evm
chain_id: 96369
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/C/rpc
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -35,14 +35,14 @@ data:
- slug: pchain
name: 'P-Chain'
type: linear
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/P
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/p
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain'
type: dag
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/X
rpc: http://luxd-headless.lux-mainnet.svc.cluster.local:9630/v1/chain/x
coin: LUX
enabled: true
+1 -1
View File
@@ -148,7 +148,7 @@ spec:
dnsPolicy: ClusterFirst
initContainers:
- args:
- "set -eu\n# \u2500\u2500 Lux MAINNET C-Chain RLP recovery init \u2500\u2500\n# NO CHAIN ID IS NAMED HERE. The previous version hardcoded\n# CBID=<a now-dead chain ID> and ran `rm -rf /data/chainData/$NET/$CBID`. That ID\n# stopped existing at the re-genesis (the live C-Chain is\n# 2T11SNJM9KYqSenoPb5yv6qahmj8HLefCjxt4gTD2iQWTHwdRu), so the wipe was a SILENT\n# NO-OP \u2014 the same drift that made `.wipe-cchain` useless and forced the\n# snapshot-clones that corrupted luxd-0 and luxd-2.\n#\n# There is now ONE wipe implementation, in the startup script, keyed off\n# `.wipe-state`. This container no longer wipes anything itself: it verifies the\n# artifact and drops the markers. An RLP import replays from genesis and rebuilds\n# every index, so discarding ALL chain state is both correct and simpler than\n# targeting one directory \u2014 and it cannot drift.\n#\n# Order: [arm-gate] -> [sentinel-skip] -> [SHA-verify] -> [markers].\n# SHA-verify MUST precede the wipe request; a mismatch aborts before anything\n# destructive is scheduled.\nDB=/data/db\nRLP=/data/lux-mainnet-96369.rlp\nEXPECTED_SHA=dd6b71f510fca48080c383bf44fccbfda4849e2cde06710ffe4a24fa1d9bec79\nH=dd6b71f510fc\nARM=\"$DB/.rlp-import-arm\"\nSENTINEL=\"$DB/.tenant-import-c-chain-$H\"\nMARKER=\"$DB/.tenant-import-request-c-chain-$H.json\"\nif [ ! -f \"$ARM\" ]; then\n echo \"[rlp-import-init] node NOT armed (no $ARM); skipping\"\n exit 0\nfi\nif [ -f \"$SENTINEL\" ]; then\n echo \"[rlp-import-init] sentinel present; already imported; clearing arm\"\n rm -f \"$ARM\"\n exit 0\nfi\nif [ ! -f \"$RLP\" ]; then\n echo \"[rlp-import-init] ERROR: RLP not found at $RLP\" >&2\n exit 1\nfi\nGOT=$(sha256sum \"$RLP\" | awk '{print $1}')\nif [ \"$GOT\" != \"$EXPECTED_SHA\" ]; then\n echo \"[rlp-import-init] SHA MISMATCH want=$EXPECTED_SHA got=$GOT -- ABORT, nothing wiped\" >&2\n exit 1\nfi\necho \"[rlp-import-init] SHA OK ($GOT)\"\n# Request the canonical full-state wipe. The startup script consumes .wipe-state\n# and clears /data/chainData + every /data/db DATABASE, while preserving\n# /data/staking (identity) and every FILE at /data/db root (this RLP included).\ntouch \"$DB/.wipe-state\"\necho \"[rlp-import-init] requested canonical wipe via .wipe-state (no chain ID named)\"\nprintf '{\"tenant\":\"c-chain\",\"chainAlias\":\"C\",\"contentHash\":\"%s\",\"rlpPath\":\"%s\",\"sentinelPath\":\"%s\"}' \"$H\" \"$RLP\" \"$SENTINEL\" > \"$MARKER.tmp\"\nmv \"$MARKER.tmp\" \"$MARKER\"\nrm -f \"$ARM\"\necho \"[rlp-import-init] marker=$MARKER; import driven on /v1/chain/C/rpc\"\n"
- "set -eu\n# \u2500\u2500 Lux MAINNET C-Chain RLP recovery init \u2500\u2500\n# NO CHAIN ID IS NAMED HERE. The previous version hardcoded\n# CBID=<a now-dead chain ID> and ran `rm -rf /data/chainData/$NET/$CBID`. That ID\n# stopped existing at the re-genesis (the live C-Chain is\n# 2T11SNJM9KYqSenoPb5yv6qahmj8HLefCjxt4gTD2iQWTHwdRu), so the wipe was a SILENT\n# NO-OP \u2014 the same drift that made `.wipe-cchain` useless and forced the\n# snapshot-clones that corrupted luxd-0 and luxd-2.\n#\n# There is now ONE wipe implementation, in the startup script, keyed off\n# `.wipe-state`. This container no longer wipes anything itself: it verifies the\n# artifact and drops the markers. An RLP import replays from genesis and rebuilds\n# every index, so discarding ALL chain state is both correct and simpler than\n# targeting one directory \u2014 and it cannot drift.\n#\n# Order: [arm-gate] -> [sentinel-skip] -> [SHA-verify] -> [markers].\n# SHA-verify MUST precede the wipe request; a mismatch aborts before anything\n# destructive is scheduled.\nDB=/data/db\nRLP=/data/lux-mainnet-96369.rlp\nEXPECTED_SHA=dd6b71f510fca48080c383bf44fccbfda4849e2cde06710ffe4a24fa1d9bec79\nH=dd6b71f510fc\nARM=\"$DB/.rlp-import-arm\"\nSENTINEL=\"$DB/.tenant-import-c-chain-$H\"\nMARKER=\"$DB/.tenant-import-request-c-chain-$H.json\"\nif [ ! -f \"$ARM\" ]; then\n echo \"[rlp-import-init] node NOT armed (no $ARM); skipping\"\n exit 0\nfi\nif [ -f \"$SENTINEL\" ]; then\n echo \"[rlp-import-init] sentinel present; already imported; clearing arm\"\n rm -f \"$ARM\"\n exit 0\nfi\nif [ ! -f \"$RLP\" ]; then\n echo \"[rlp-import-init] ERROR: RLP not found at $RLP\" >&2\n exit 1\nfi\nGOT=$(sha256sum \"$RLP\" | awk '{print $1}')\nif [ \"$GOT\" != \"$EXPECTED_SHA\" ]; then\n echo \"[rlp-import-init] SHA MISMATCH want=$EXPECTED_SHA got=$GOT -- ABORT, nothing wiped\" >&2\n exit 1\nfi\necho \"[rlp-import-init] SHA OK ($GOT)\"\n# Request the canonical full-state wipe. The startup script consumes .wipe-state\n# and clears /data/chainData + every /data/db DATABASE, while preserving\n# /data/staking (identity) and every FILE at /data/db root (this RLP included).\ntouch \"$DB/.wipe-state\"\necho \"[rlp-import-init] requested canonical wipe via .wipe-state (no chain ID named)\"\nprintf '{\"tenant\":\"c-chain\",\"chainAlias\":\"C\",\"contentHash\":\"%s\",\"rlpPath\":\"%s\",\"sentinelPath\":\"%s\"}' \"$H\" \"$RLP\" \"$SENTINEL\" > \"$MARKER.tmp\"\nmv \"$MARKER.tmp\" \"$MARKER\"\nrm -f \"$ARM\"\necho \"[rlp-import-init] marker=$MARKER; import driven on /v1/chain/c/rpc\"\n"
command:
- /bin/sh
- -c
+1 -1
View File
@@ -49,7 +49,7 @@ def load_gate():
NAMESPACE="lux-mainnet",
POD_SELECTOR="app.kubernetes.io/name=luxd",
RPC_PORT="9630",
RPC_PATH="/v1/chain/C/rpc",
RPC_PATH="/v1/chain/c/rpc",
LABEL_KEY="lux.network/rpc",
LABEL_VALUE="fresh",
MAX_LAG_BLOCKS="1",
+1 -1
View File
@@ -194,7 +194,7 @@ spec:
# /v1/, not /ext/. luxd 404s the legacy prefix -- see
# ca234b4 "remove /ext/ from the public API surface".
- name: RPC_PATH
value: /v1/chain/C/rpc
value: /v1/chain/c/rpc
- name: LABEL_KEY
value: lux.network/rpc
- name: LABEL_VALUE
+1 -1
View File
@@ -26,7 +26,7 @@ spec:
command: ["./gateway"]
args:
- "-addr=:8080"
- "-lux-rpc=http://luxd-headless.lux-mainnet.svc:9630/v1/chain/C/rpc"
- "-lux-rpc=http://luxd-headless.lux-mainnet.svc:9630/v1/chain/c/rpc"
- "-zoo-rpc=http://luxd-headless.lux-mainnet.svc:9630/v1/chain/2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp/rpc"
ports:
- containerPort: 8080
@@ -475,7 +475,7 @@ data:
"host": [
"http://luxd.lux-testnet.svc:9640"
],
"url_pattern": "/v1/chain/P"
"url_pattern": "/v1/chain/p"
}
]
},
@@ -489,7 +489,7 @@ data:
"host": [
"http://luxd.lux-testnet.svc:9640"
],
"url_pattern": "/v1/chain/X"
"url_pattern": "/v1/chain/x"
}
]
},
+2 -2
View File
@@ -54,7 +54,7 @@
#
# KILL SWITCH: kubectl -n <ns> scale deploy/chain-traffic --replicas=0
#
# testnet 96368: luxd-1 and luxd-4 answer 404 on /v1/chain/C/rpc; 0, 2 and 3 serve.
# testnet 96368: luxd-1 and luxd-4 answer 404 on /v1/chain/c/rpc; 0, 2 and 3 serve.
# Testnet gets re-genesis'd periodically, which is exactly why SEED_IDX is set —
# a wiped chain leaves the sender at zero balance and the generator would
# otherwise come back mute.
@@ -309,7 +309,7 @@ spec:
command: ["/bin/sh", "/app/chain-traffic.sh"]
env:
- name: RPC_URLS
value: "http://luxd-0.luxd-headless.lux-testnet:9640/v1/chain/C/rpc,http://luxd-1.luxd-headless.lux-testnet:9640/v1/chain/C/rpc,http://luxd-2.luxd-headless.lux-testnet:9640/v1/chain/C/rpc,http://luxd-3.luxd-headless.lux-testnet:9640/v1/chain/C/rpc,http://luxd-4.luxd-headless.lux-testnet:9640/v1/chain/C/rpc"
value: "http://luxd-0.luxd-headless.lux-testnet:9640/v1/chain/c/rpc,http://luxd-1.luxd-headless.lux-testnet:9640/v1/chain/c/rpc,http://luxd-2.luxd-headless.lux-testnet:9640/v1/chain/c/rpc,http://luxd-3.luxd-headless.lux-testnet:9640/v1/chain/c/rpc,http://luxd-4.luxd-headless.lux-testnet:9640/v1/chain/c/rpc"
- name: TX_PER_BURST
value: "2"
- name: BURST_SECS
+1 -1
View File
@@ -42,7 +42,7 @@ data:
NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: "LUX"
NEXT_PUBLIC_NETWORK_CURRENCY_DECIMALS: "18"
NEXT_PUBLIC_IS_TESTNET: "true"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.testnet.lux.network/v1/chain/C/rpc"
NEXT_PUBLIC_NETWORK_RPC_URL: "https://api.testnet.lux.network/v1/chain/c/rpc"
NEXT_PUBLIC_NETWORK_VERIFICATION_TYPE: "mining"
# Theme
NEXT_PUBLIC_COLOR_THEME_DEFAULT: "dark"
+2 -2
View File
@@ -8,7 +8,7 @@
# noticed. Same shape as lux-devnet/exchange-api.yaml, testnet-scoped.
#
# KNOWN GAP (do not "fix" by guessing): LUX_RPC_URL 404s today —
# luxd-headless:9640 serves neither /v1/chain/C/rpc nor /v1/chain/C/rpc on testnet,
# luxd-headless:9640 serves neither /v1/chain/c/rpc nor /v1/chain/c/rpc on testnet,
# so the CLOB real-asset gate (dexMarkets.ts) cannot verify token code/decimals
# and the markets surface stays empty. The API itself is healthy (/health 200).
# Recorded as-running; resolving the testnet C-Chain route is separate work.
@@ -50,7 +50,7 @@ spec:
# on THIS network's C-Chain, so the markets surface can only show
# real accepted state. See KNOWN GAP above.
- name: LUX_RPC_URL
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc"
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc"
# AMM (uniswap-v2/v3-shaped) — testnet explorer amm subgraph.
- name: SUBGRAPH_URL
value: "http://explorer.lux-testnet.svc.cluster.local:8090/v1/graph/cchain/amm/graphql"
+3 -3
View File
@@ -72,11 +72,11 @@ spec:
- name: ETHEREUM_JSONRPC_VARIANT
value: geth
- name: ETHEREUM_JSONRPC_HTTP_URL
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc"
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_TRACE_URL
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc"
value: "http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc"
- name: ETHEREUM_JSONRPC_WS_URL
value: "ws://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/ws"
value: "ws://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/ws"
# Chain identity
- name: CHAIN_ID
value: "96368"
+2 -2
View File
@@ -57,7 +57,7 @@ data:
name: Lux C-Chain
chain_id: 96368
type: evm
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -78,7 +78,7 @@ data:
name: Hanzo
chain_id: 36962
type: evm
rpc: http://10.124.0.63:9630/v1/chain/C/rpc
rpc: http://10.124.0.63:9630/v1/chain/c/rpc
coin: AI
enabled: true
indexer: { poll_interval: 30s }
+3 -3
View File
@@ -29,7 +29,7 @@ data:
name: 'Lux C-Chain (testnet)'
type: evm
chain_id: 96368
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/C/rpc
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/c/rpc
coin: LUX
enabled: true
default: true
@@ -40,14 +40,14 @@ data:
- slug: pchain
name: 'P-Chain (testnet)'
type: linear
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/P
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/p
coin: LUX
enabled: true
- slug: xchain
name: 'X-Chain (testnet)'
type: dag
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/X
rpc: http://luxd-headless.lux-testnet.svc.cluster.local:9640/v1/chain/x
coin: LUX
enabled: true
+2 -2
View File
@@ -15,10 +15,10 @@ metadata:
namespace: zoo-mainnet
data:
# In-cluster RPC. zood-rpc:9630 fronts the mainnet fleet; pod-local
# 127.0.0.1:9630 also answers /v1/chain/C/rpc on zood-mv-0 (verified tip 14795).
# 127.0.0.1:9630 also answers /v1/chain/c/rpc on zood-mv-0 (verified tip 14795).
chains.json: |
[
{"name":"zoo-evm","rpc":"http://zood-rpc.zoo-mainnet.svc.cluster.local:9630/v1/chain/C/rpc","key":"$TRAFFIC_KEY","weight":1,"dex":0}
{"name":"zoo-evm","rpc":"http://zood-rpc.zoo-mainnet.svc.cluster.local:9630/v1/chain/c/rpc","key":"$TRAFFIC_KEY","weight":1,"dex":0}
]
---
apiVersion: v1
+5 -5
View File
@@ -44,7 +44,7 @@ async function main() {
console.log('=== Add Validator-8 to Lux Primary Network ===\n')
// 1. Check current state
const { validators } = await rpc('/v1/chain/P', 'platform.getCurrentValidators', { subnetID: '' })
const { validators } = await rpc('/v1/chain/p', 'platform.getCurrentValidators', { subnetID: '' })
console.log(`Current validators: ${validators.length}`)
const exists = validators.find(v => v.nodeID === V8.nodeID)
@@ -78,7 +78,7 @@ async function main() {
const txBytes = await buildAddValidatorTx(networkID)
if (txBytes) {
console.log('\nSubmitting AddPermissionlessValidator transaction...')
const { txID } = await rpc('/v1/chain/P', 'platform.issueTx', { tx: txBytes })
const { txID } = await rpc('/v1/chain/p', 'platform.issueTx', { tx: txBytes })
console.log(`TX submitted: ${txID}`)
console.log('Waiting for acceptance...')
@@ -86,7 +86,7 @@ async function main() {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 2000))
try {
const { status } = await rpc('/v1/chain/P', 'platform.getTxStatus', { txID })
const { status } = await rpc('/v1/chain/p', 'platform.getTxStatus', { txID })
console.log(` Status: ${status}`)
if (status === 'Accepted' || status === 'Committed') {
console.log('\nValidator added successfully!')
@@ -102,7 +102,7 @@ async function main() {
}
// Verify
const { validators: updated } = await rpc('/v1/chain/P', 'platform.getCurrentValidators', { subnetID: '' })
const { validators: updated } = await rpc('/v1/chain/p', 'platform.getCurrentValidators', { subnetID: '' })
console.log(`\nValidators after: ${updated.length}`)
return
}
@@ -115,7 +115,7 @@ async function main() {
const startTime = Math.floor(Date.now() / 1000) + 120 // 2 min from now
const endTime = startTime + 365 * 24 * 60 * 60 // 1 year
const result = await rpc('/v1/chain/P', 'platform.addPermissionlessValidator', {
const result = await rpc('/v1/chain/p', 'platform.addPermissionlessValidator', {
nodeID: V8.nodeID,
subnetID: '11111111111111111111111111111111LpoYY', // primary network
startTime: String(startTime),
+1 -1
View File
@@ -56,7 +56,7 @@ Account.enable_unaudited_hdwallet_features()
CHAINS = {
"C-Chain": {
"chain_id": 96369,
"rpc": "http://localhost:19630/v1/chain/C/rpc",
"rpc": "http://localhost:19630/v1/chain/c/rpc",
"explorer": "https://api-explore.lux.network",
# Addresses generated by deployer 0xEAbCC110... starting at nonce=5
# (deployer had 5 txns in RLP import history before these deployments)
+3 -3
View File
@@ -278,7 +278,7 @@ def test_validator_network():
print("\n=== Validator Network ===")
def validator_count():
r = http_post("https://api.lux.network/v1/chain/P",
r = http_post("https://api.lux.network/v1/chain/p",
{"jsonrpc": "2.0", "method": "platform.getCurrentValidators", "params": {"netID": ""}, "id": 1})
validators = r.get("result", {}).get("validators", [])
count = len(validators)
@@ -307,7 +307,7 @@ def test_validator_network():
def sybil_protection():
"""Verify sybil protection is enabled (not POA)"""
r = http_post("https://api.lux.network/v1/chain/P",
r = http_post("https://api.lux.network/v1/chain/p",
{"jsonrpc": "2.0", "method": "platform.getCurrentValidators", "params": {"netID": ""}, "id": 1})
validators = r.get("result", {}).get("validators", [])
# Real validators have start/end times and delegation fees
@@ -329,7 +329,7 @@ def test_validator_network():
return " ".join(results)
def app_chains():
r = http_post("https://api.lux.network/v1/chain/P",
r = http_post("https://api.lux.network/v1/chain/p",
{"jsonrpc": "2.0", "method": "platform.getBlockchains", "params": {}, "id": 1})
chains = r.get("result", {}).get("blockchains", [])
names = [c.get("name", "?") for c in chains]
+1 -1
View File
@@ -96,7 +96,7 @@ func allChains() map[string]ChainConfig {
"lux": {
Name: "Lux C-Chain",
ChainID: big.NewInt(96369),
RPC: envOrDefault("RPC_LUX", "https://api.lux.network/mainnet/v1/chain/C/rpc"),
RPC: envOrDefault("RPC_LUX", "https://api.lux.network/mainnet/v1/chain/c/rpc"),
WLUX: common.HexToAddress("0x3C18bB6B17eb3F0879d4653e0120a531aF4d86E3"),
LETH: common.HexToAddress("0x5a88986958ea76Dd043f834542724F081cA1443B"),
LBTC: common.HexToAddress("0x8a3fad1c7FB94461621351aa6A983B6f814F039c"),
+2 -2
View File
@@ -67,7 +67,7 @@ serving() {
kubectl --context lux-k8s exec -n "$1" "$2" -c luxd -- curl -s -m 4 -X POST \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
"http://127.0.0.1:$(port_for "$1")/v1/chain/C/rpc" 2>/dev/null | grep -q result
"http://127.0.0.1:$(port_for "$1")/v1/chain/c/rpc" 2>/dev/null | grep -q result
}
drain_fleet() {
ns=$1
@@ -88,7 +88,7 @@ for ns in lux-mainnet lux-testnet lux-devnet; do
h=$(kubectl --context lux-k8s exec -n "$ns" "luxd-$i" -c luxd -- curl -s -m 4 -X POST \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
"http://127.0.0.1:$(port_for "$ns")/v1/chain/C/rpc" 2>/dev/null \
"http://127.0.0.1:$(port_for "$ns")/v1/chain/c/rpc" 2>/dev/null \
| python3 -c 'import sys,json;print(int(json.load(sys.stdin)["result"],16))' 2>/dev/null)
printf '%9s' "${h:-x}"
done
+2 -2
View File
@@ -15,14 +15,14 @@ from web3 import Web3
CHAINS = {
"mainnet": {
"C": {"chain_id": 96369, "port": 19630, "path": "/v1/chain/C/rpc"},
"C": {"chain_id": 96369, "port": 19630, "path": "/v1/chain/c/rpc"},
"Zoo": {"chain_id": 200200, "port": 19630, "path": "/v1/chain/Zoo/rpc"},
"Hanzo": {"chain_id": 36963, "port": 19630, "path": "/v1/chain/Hanzo/rpc"},
"SPC": {"chain_id": 36911, "port": 19630, "path": "/v1/chain/SPC/rpc"},
"Pars": {"chain_id": 494949, "port": 19630, "path": "/v1/chain/Pars/rpc"},
},
"testnet": {
"C": {"chain_id": 96368, "port": 19640, "path": "/v1/chain/C/rpc"},
"C": {"chain_id": 96368, "port": 19640, "path": "/v1/chain/c/rpc"},
"Zoo": {"chain_id": 200201, "port": 19640, "path": "/v1/chain/Zoo/rpc"},
"Hanzo": {"chain_id": 36962, "port": 19640, "path": "/v1/chain/Hanzo/rpc"},
"SPC": {"chain_id": 36910, "port": 19640, "path": "/v1/chain/SPC/rpc"},