Files
universe/k8s/lux-mainnet/api-gateway-gateway-config.yaml
zeekay 51460827d4 Merge the forge's lux/universe into GitHub's, the one main from here
The two mains shared no history, so this is a per-file three-way merge:
for each file the 65 forge-only commits touched (by patch-id), the base is
the newest version both histories held. 105 files merged or took one side
cleanly, 48 were already identical, and the 45 true conflicts and 31
modify/delete pairs were resolved by what runs on the cluster:

- The forge wins where it is live: explorer 1.5.56 (digest 45db11ff) and
  its archive readers, explore-fe-hanzo's ConfigMap env (AI coin,
  /v1/indexer/hanzo, /v1/chain/hanzo/rpc), exchange-api reading
  luxd-archive, and explore-fe-{lux,zoo}-testnet, pinned to what they run
  (v2.8.5-lux / v2.8.4-lux).
- GitHub wins where it is live: explore-fe-lux v2.8.5-lux, explore-fe-zoo
  v2.8.4-lux, bankd v1.0.18, lux-build's routes.
- The forge's retirement of workloads that run nowhere stands: lux-mainnet
  dex, lux-hb2, lux-market, traffic, wallet-web; the lux-testnet frontends,
  indexer, exchange and gateways; lux-operator. deploy/lux-testnet/luxd.yaml
  stays, since roll_luxd.sh reads it.
- GitHub's deletions stand: lux-finance and lux-financial (static sites
  now), the k8s/ operator manifests, .hanzo/workflows/cicd.yml.
- Paths are /v1/chain/C/rpc where the forge had written /v1/chain/c. All
  four spellings answer; this one is the documented form. The forge's
  /{network}/v1 doc lines are dropped: a network is a host, and the prefix
  404s.

Dry-run against the running objects (server-side, as CD applies), the
merged explorer shows no change where GitHub's showed 152 lines, and no
other live workload moves further from what runs. Every deploy/*/*.yaml
renders with charts/app; price.yaml, which failed on GitHub, now renders.

Claude-Session: https://claude.ai/code/session_01TzirYkGmD88w4GipqivUtV
2026-09-23 20:20:03 -07:00

1120 lines
32 KiB
YAML

# Gateway config for api.lux.network (namespace lux-mainnet).
#
# REAL CONTENT, no longer a placeholder. This file previously held the string
# "placeholder — see comment above" and was left out of kustomization.yaml,
# so mainnet's public route table had no durable home in git at all. It is now
# the verbatim live config with /ext/ removed, and it is in kustomization.yaml.
#
# /ext/ IS GONE. Not deprecated, not redirected — removed.
#
# luxd serves /v1/ only, and a chain hangs from /v1/chain. Against node
# v1.36.181 (server/http/probe_test.go and chain_test.go pin both columns):
# POST /v1/chain/C/rpc -> 200 /v1/bc/C/rpc -> 404
# GET /v1/health/ops/liveness -> 200 /v1/health -> 404
#
# The right column of the three lines that stood here named /ext/, which is
# what the section is about; a later /ext/ -> /v1/ pass rewrote both columns
# and left each line saying one path both answers and 404s. Restated above
# against the segment the node serves now.
#
# On the version: all five mainnet pods actually run
# ghcr.io/luxfi/node:v1.36.2. spec.image.tag on the LuxNetwork CR still says
# v1.34.0, but lux-operator is scaled 0/0 so the CR has never reconciled and
# 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
# node. That rewrite is what made mainnet look like it still spoke /ext/.
#
# Two changes, both forward-only:
#
# 1. The 53 legacy /ext/* and /api/* endpoints are deleted. Every one of them
# had a byte-identical /v1/ twin already serving (same method, same backend
# host list, same url_pattern, same rate-limit extra_config), verified by
# comparing each pair field-by-field before deletion, so nothing that
# worked stops working — callers just have to say /v1/. 124 -> 71 endpoints.
#
# 2. Four surviving /v1/ endpoints still proxied to /ext/* on the node and so
# were dead on arrival: /v1/info, /v1/health, /v1/health/ops/liveness and
# /v1/chains all 404'd publicly while the identical call against the pod
# returned 200. Their backends now point at /v1/*. This fixes routes that
# were already broken; it is not a compatibility shim.
#
# The four remaining "/api/v2/stats" strings are backend url_patterns on the
# Blockscout DAG indexers (indexer-{q,z,t,a}chain). That is the upstream
# service's own API, not a route we expose. The public surface is 100% /v1/.
#
# Nothing here requires restarting luxd. This is gateway config only.
#
# ---------------------------------------------------------------------------
# UPSTREAM: one tip-gated Service, not a list of pod names.
#
# Every luxd-backed route used to carry its own literal copy of
#
# ["http://luxd-1...", "http://luxd-4...", "http://luxd-4..."]
#
# — 20 copies of the same three lines, with luxd-4 duplicated in every one, so
# the round robin sent two thirds of all traffic to a single pod. On
# 2026-07-27 that pod was two blocks behind, and api.lux.network answered
# eth_blockNumber with 1098191 twenty-two times out of thirty and 1098193 the
# other eight. The explorer showed a "3d 3h" tip and a "33m" tip on one page,
# in the same minute, because the two requests behind them landed on different
# nodes. Same chain, not a fork.
#
# All 20 now resolve to one upstream:
#
# http://luxd-rpc.lux-mainnet.svc:9630
#
# luxd-rpc admits a pod only while its C-Chain tip is within MAX_LAG_BLOCKS of
# the best tip any node is serving; see rpc-tip-gate.yaml, which explains why
# "Ready" was never the right signal (luxd answers /v1/health with
# {"healthy":true} while days behind, and the kubelet readiness probe on the
# StatefulSet points at /v1/health/ops/liveness). Pod identity now lives in one
# selector instead of 60 string literals, so a node falling behind leaves the
# rotation on its own and rejoins on its own.
# ---------------------------------------------------------------------------
#
# Same repair as the sister file ../lux-testnet/api-gateway-gateway-config.yaml
# (which fixed the info/health backends but still carries its own /ext/ block).
#
# To regenerate from the cluster:
# kubectl --context=lux-k8s -n lux-mainnet get cm \
# api-gateway-gateway-config -o go-template='{{index .data "gateway.json"}}'
apiVersion: v1
kind: ConfigMap
metadata:
name: api-gateway-gateway-config
namespace: lux-mainnet
data:
gateway.json: |-
{
"$schema": "https://www.krakend.io/schema/v2.7/krakend.json",
"cache_ttl": "0s",
"endpoints": [
{
"endpoint": "/v1/tokens",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/tokens"
}
]
},
{
"endpoint": "/v1/pools",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/pools"
}
]
},
{
"endpoint": "/v1/trades",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/trades"
}
]
},
{
"endpoint": "/v1/price/{symbol}",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/price/{symbol}"
}
]
},
{
"endpoint": "/v1/token/{address}/history",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/token/{address}/history"
}
]
},
{
"endpoint": "/v1/portfolio/{address}",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/portfolio/{address}"
}
]
},
{
"endpoint": "/v1/dex/tokens",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/tokens"
}
]
},
{
"endpoint": "/v1/dex/pools",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/pools"
}
]
},
{
"endpoint": "/v1/dex/trades",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/trades"
}
]
},
{
"endpoint": "/v1/dex/price/{symbol}",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/price/{symbol}"
}
]
},
{
"endpoint": "/v1/dex/token/{address}/history",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/token/{address}/history"
}
]
},
{
"endpoint": "/v1/dex/portfolio/{address}",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/v1/portfolio/{address}"
}
]
},
{
"endpoint": "/subgraph/v3",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/v3"
}
]
},
{
"endpoint": "/subgraph/v2",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/v2"
}
]
},
{
"endpoint": "/subgraph/zoo/v3",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/zoo/v3"
}
]
},
{
"endpoint": "/subgraph/zoo/v2",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/zoo/v2"
}
]
},
{
"endpoint": "/subgraph/pars/v2",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/pars/v2"
}
]
},
{
"endpoint": "/subgraph/hanzo/v2",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://exchange-api.lux-ns.svc:4000"
],
"url_pattern": "/subgraph/hanzo/v2"
}
]
},
{
"endpoint": "/v1/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/P"
}
]
},
{
"endpoint": "/v1/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/X"
}
]
},
{
"endpoint": "/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/info"
}
],
"extra_config": {
"validation/cel": [
{
"check_expr": "req_body.matches('.*\"info\\\\.getNetworkID\".*') || req_body.matches('.*\"info\\\\.getNetworkName\".*') || req_body.matches('.*\"info\\\\.getBlockchainID\".*') || req_body.matches('.*\"info\\\\.isBootstrapped\".*')",
"message": "Method not allowed: only info.getNetworkID, info.getNetworkName, info.getBlockchainID, and info.isBootstrapped are permitted"
}
],
"qos/ratelimit/router": {
"max_rate": 50,
"client_max_rate": 10,
"strategy": "ip"
}
}
},
{
"endpoint": "/v1/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/health"
}
]
},
{
"endpoint": "/v1/health/ops/liveness",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/health/ops/liveness"
}
]
},
{
"endpoint": "/v1/chains",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/info"
}
]
},
{
"endpoint": "/v1/dag/qchain/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-qchain.lux-mainnet.svc:4300"
],
"url_pattern": "/health"
}
]
},
{
"endpoint": "/v1/dag/qchain/stats",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-qchain.lux-mainnet.svc:4300"
],
"url_pattern": "/api/v2/stats"
}
]
},
{
"endpoint": "/v1/dag/zchain/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-zchain.lux-mainnet.svc:4400"
],
"url_pattern": "/health"
}
]
},
{
"endpoint": "/v1/dag/zchain/stats",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-zchain.lux-mainnet.svc:4400"
],
"url_pattern": "/api/v2/stats"
}
]
},
{
"endpoint": "/v1/dag/tchain/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-tchain.lux-mainnet.svc:4700"
],
"url_pattern": "/health"
}
]
},
{
"endpoint": "/v1/dag/tchain/stats",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-tchain.lux-mainnet.svc:4700"
],
"url_pattern": "/api/v2/stats"
}
]
},
{
"endpoint": "/v1/dag/achain/health",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-achain.lux-mainnet.svc:4500"
],
"url_pattern": "/health"
}
]
},
{
"endpoint": "/v1/dag/achain/stats",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://indexer-achain.lux-mainnet.svc:4500"
],
"url_pattern": "/api/v2/stats"
}
]
},
{
"endpoint": "/v1/indexer/indexer-c",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain"
}
]
},
{
"endpoint": "/v1/indexer/indexer-c/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain"
}
]
},
{
"endpoint": "/v1/indexer/indexer-c/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-c/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}/{r2}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-c/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/cchain/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-hanzo",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo"
}
]
},
{
"endpoint": "/v1/indexer/indexer-hanzo/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo"
}
]
},
{
"endpoint": "/v1/indexer/indexer-hanzo/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-hanzo/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}/{r2}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-hanzo/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/hanzo/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-zoo",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo"
}
]
},
{
"endpoint": "/v1/indexer/indexer-zoo/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo"
}
]
},
{
"endpoint": "/v1/indexer/indexer-zoo/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-zoo/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}/{r2}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-zoo/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/zoo/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-pars",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/pars"
}
]
},
{
"endpoint": "/v1/indexer/indexer-pars/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/pars"
}
]
},
{
"endpoint": "/v1/indexer/indexer-pars/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-pars/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}/{r2}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-pars/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/pars/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-spc",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/spc"
}
]
},
{
"endpoint": "/v1/indexer/indexer-spc/v1",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/spc"
}
]
},
{
"endpoint": "/v1/indexer/indexer-spc/v1/{r1}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-spc/v1/{r1}/{r2}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}/{r2}"
}
]
},
{
"endpoint": "/v1/indexer/indexer-spc/v1/{r1}/{r2}/{r3}",
"method": "GET",
"output_encoding": "no-op",
"input_query_strings": [
"*"
],
"backend": [
{
"encoding": "no-op",
"host": [
"http://explorer.lux-mainnet.svc:80"
],
"url_pattern": "/v1/indexer/spc/{r1}/{r2}/{r3}"
}
]
},
{
"endpoint": "/v1/chain/{chain}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
},
{
"endpoint": "/v1/chain/{chain}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}/{p1}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}/{p1}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}/{p2}",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}/{p1}/{p2}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
},
{
"endpoint": "/v1/chain/{chain}/{p1}/{p2}",
"method": "GET",
"output_encoding": "no-op",
"backend": [
{
"encoding": "no-op",
"host": [
"http://luxd-rpc.lux-mainnet.svc:9630"
],
"url_pattern": "/v1/chain/{chain}/{p1}/{p2}",
"timeout": "60s"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
}
],
"extra_config": {
"security/cors": {
"allow_headers": [
"Content-Type",
"Authorization"
],
"allow_methods": [
"GET",
"POST",
"OPTIONS"
],
"allow_origins": [
"*"
],
"expose_headers": [
"Content-Length"
],
"max_age": "12h"
}
},
"name": "Lux Gateway - api.lux.network",
"port": 8080,
"timeout": "30s",
"version": 3
}