Files
universe/k8s/lux-gateway/gateway.yaml
T

2756 lines
111 KiB
YAML

---
apiVersion: v1
kind: ConfigMap
metadata:
name: gateway-config
namespace: lux-gateway
data:
gateway.json: |
{
"version": 3,
"name": "Lux API Gateway",
"port": 8080,
"timeout": "60s",
"cache_ttl": "0s",
"output_encoding": "no-op",
"extra_config": {
"router": {
"return_error_msg": false
},
"qos/ratelimit/router": {
"max_rate": 10000,
"client_max_rate": 500,
"strategy": "ip"
},
"qos/ratelimit/service": {
"max_rate": 10000,
"capacity": 10000
},
"security/cors": {
"allow_origins": [
"https://*.lux.network",
"https://*.lux.exchange",
"https://lux.network",
"https://lux.exchange",
"https://lux.market"
],
"allow_methods": [
"GET",
"POST",
"OPTIONS"
],
"allow_headers": [
"Content-Type",
"Authorization"
],
"expose_headers": [
"Content-Length"
],
"max_age": "12h"
},
"security/http": {
"allowed_hosts": [],
"browser_xss_filter": true,
"content_type_nosniff": true,
"custom_frame_options_value": "DENY",
"force_sts_header": true,
"sts_include_subdomains": true,
"sts_seconds": 31536000
},
"modifier/response-headers-blacklist": {
"blacklist": [
"X-Gateway-Completed",
"node-id",
"Node-Id",
"Server"
]
}
},
"endpoints": [
{
"endpoint": "/v1/chain/C/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/C/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/exchange",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/D/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/chain/D/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/info",
"host": [
"http://info-filter.lux-mainnet.svc.cluster.local:8080"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"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"
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/v1/health",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/health",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/C/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/C/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/C/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/P",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/exchange",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/X",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/D/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/D/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/ws",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/dex/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/info",
"host": [
"http://info-filter.lux-mainnet.svc.cluster.local:8080"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"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"
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/health",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/health",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/C/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/C/ws",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/exchange",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/D/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/D/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/ws",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/dex/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/health",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/health",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/C/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/C/ws",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/P",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/X",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/exchange",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"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",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/D/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/D/ws",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/ws",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/dex/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/D/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/health",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/health",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/info",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"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"
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/info",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/info",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"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"
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/zoo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2Y625Kvdd4wZ5LKx9kLSf1jGALyARmXVN1YsTb4F3Hzv4bPDbp/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/2GiQb73CeJESjc4omFv2YtQHZrRgJf25NXPzAr5J6UNHRcDV2F/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2GiQb73CeJESjc4omFv2YtQHZrRgJf25NXPzAr5J6UNHRcDV2F/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/hanzo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2GiQb73CeJESjc4omFv2YtQHZrRgJf25NXPzAr5J6UNHRcDV2F/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/rtjwvtE1tEvrokmpeYdTq7b2zqZgmybKwR5MLjKMGAR1W78dQ/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/rtjwvtE1tEvrokmpeYdTq7b2zqZgmybKwR5MLjKMGAR1W78dQ/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/spc/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/rtjwvtE1tEvrokmpeYdTq7b2zqZgmybKwR5MLjKMGAR1W78dQ/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/mainnet/v1/chain/pars/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2pUskxqaL5Bpx7uRUGG1fDjPckjxQ4UKX4sLKeaS1NdSVBJd3F/rpc",
"host": [
"http://luxd-headless.lux-mainnet.svc.cluster.local:9630"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/2BSjBuuRHUMGdhw9HzcmiRMtWEBsVcS98tjeF3x5F99T1BfbQo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2BSjBuuRHUMGdhw9HzcmiRMtWEBsVcS98tjeF3x5F99T1BfbQo/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/zoo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2BSjBuuRHUMGdhw9HzcmiRMtWEBsVcS98tjeF3x5F99T1BfbQo/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/hanzo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2ZUpGYPyaDsmuwnMUrhkcP3C24RYHvGWTZZYPaNr4oPPdUmnh3/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/spc/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/Sd9bKzGu5Mzh6nafNecxicWJLdDmc9DB2aQPN6EUb1KfknReh/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/testnet/v1/chain/pars/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/26a3qkQ5VzTwFDBerz2a9kte8GPqS1wJpguc9x4BHz26YXrtL9/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-1.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-2.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-3.luxd-headless.lux-testnet.svc.cluster.local:9640",
"http://luxd-4.luxd-headless.lux-testnet.svc.cluster.local:9640"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/2caKCdNop9C4oAPR1kYihN53HeSRDXD3JyMKS7ntfcpQYucmii/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2caKCdNop9C4oAPR1kYihN53HeSRDXD3JyMKS7ntfcpQYucmii/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/zoo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/2caKCdNop9C4oAPR1kYihN53HeSRDXD3JyMKS7ntfcpQYucmii/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/tecXMucYDxwN65mebPE6cvQ9GynG6Y5WEvwGFsY3xVDWHxiqT/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/tecXMucYDxwN65mebPE6cvQ9GynG6Y5WEvwGFsY3xVDWHxiqT/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/hanzo/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/tecXMucYDxwN65mebPE6cvQ9GynG6Y5WEvwGFsY3xVDWHxiqT/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/213ZsFLRCBSmrii4huQqa6S3SxYPP8ec6dPEn6ad4CtLk3RdXp/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/213ZsFLRCBSmrii4huQqa6S3SxYPP8ec6dPEn6ad4CtLk3RdXp/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/spc/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/213ZsFLRCBSmrii4huQqa6S3SxYPP8ec6dPEn6ad4CtLk3RdXp/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/MEGAgimfcodi7QaqCruFpTkNM6fqu7ZduLmWJJjGQwUg8uDPJ/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/MEGAgimfcodi7QaqCruFpTkNM6fqu7ZduLmWJJjGQwUg8uDPJ/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op",
"extra_config": {
"qos/http-cache": {},
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
}
}
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
},
"proxy": {
"sequential": false
},
"qos/retry": {
"max_retries": 2,
"backoff_strategy": "exponential"
}
}
},
{
"endpoint": "/devnet/v1/chain/pars/rpc",
"method": "POST",
"output_encoding": "no-op",
"backend": [
{
"url_pattern": "/v1/chain/MEGAgimfcodi7QaqCruFpTkNM6fqu7ZduLmWJJjGQwUg8uDPJ/rpc",
"host": [
"http://luxd-0.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-1.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-2.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-3.luxd-headless.lux-devnet.svc.cluster.local:9650",
"http://luxd-4.luxd-headless.lux-devnet.svc.cluster.local:9650"
],
"encoding": "no-op"
}
],
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"client_max_rate": 20,
"strategy": "ip",
"capacity": 200
}
}
}
]
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway
namespace: lux-gateway
labels:
app: gateway
spec:
replicas: 2
selector:
matchLabels:
app: gateway
template:
metadata:
labels:
app: gateway
spec:
containers:
- name: gateway
image: ghcr.io/hanzoai/gateway:0.1.0
ports:
- containerPort: 8080
volumeMounts:
- name: config
mountPath: /etc/gateway
livenessProbe:
httpGet:
path: /__health
port: 8080
initialDelaySeconds: 5
periodSeconds: 15
readinessProbe:
httpGet:
path: /__health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
volumes:
- name: config
configMap:
name: gateway-config
---
apiVersion: v1
kind: Service
metadata:
name: gateway
namespace: lux-gateway
labels:
app: gateway
spec:
type: ClusterIP
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: gateway
---
###############################################################################
# CORS Middleware: restrict to known Lux origins only.
# Replaces the old cors-allow-all wildcard from lux-system namespace.
# See: security audit 2026-03-24 — CORS wildcard on API gateway
###############################################################################
apiVersion: hanzo.ai/v1alpha1
kind: Middleware
metadata:
name: gateway-cors
namespace: lux-gateway
labels:
app: gateway
spec:
headers:
accessControlAllowMethods:
- GET
- POST
- OPTIONS
accessControlAllowHeaders:
- Content-Type
- Authorization
accessControlAllowOriginListRegex:
- "^https://([a-z0-9-]+\\.)?lux\\.network$"
- "^https://([a-z0-9-]+\\.)?lux\\.exchange$"
- "^https://lux\\.market$"
accessControlMaxAge: 43200
addVaryHeader: true
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: gateway
namespace: lux-gateway
spec:
entryPoints:
- websecure
routes:
- match: Host(`api.lux.network`)
kind: Rule
middlewares:
- name: gateway-cors
services:
- name: gateway
port: 8080
passHostHeader: false
- match: Host(`api.testnet.lux.network`)
kind: Rule
middlewares:
- name: gateway-cors
services:
- name: gateway
port: 8080
passHostHeader: false
- match: Host(`api.devnet.lux.network`)
kind: Rule
middlewares:
- name: gateway-cors
services:
- name: gateway
port: 8080
passHostHeader: false
tls:
certResolver: letsencrypt