Owners: infra/ops (provisioning) + agglayer/agglayer-dev-ui (config values only).
Context
The dev-ui is being migrated off the Bridge Hub API onto the aggkit bridge service (agglayer/agglayer-dev-ui#24, consuming the new sdk aggkit module from agglayer/sdk#28). The app is multi-mode (devnet / testnet / mainnet): each mode's config.json entry carries an aggkitBridgeApis map of networkId → aggkit REST base URL.
Today only the devnet mode has real URLs (a local kurtosis enclave). The testnet/mainnet entries are committed placeholders, e.g. in config.json:
"20": "https://PLACEHOLDER-katana-aggkit",
"22": "https://PLACEHOLDER-forknet-aggkit",
"37": "https://PLACEHOLDER-bokuto-aggkit"
So testnet/mainnet modes cannot work until real endpoints exist.
What needs to be deployed
An aggkit-proxy per environment: aggkit's proxy command, which exposes a single REST entry point that fans out to the per-network aggkit bridge services, serves the bridge tracker API (/tracker/v1/...), and handles CORS for browsers. Two working references:
Config gotcha: as of aggkit v0.11.0-rc5, [Tracker].L1GlobalExitRootAddress is validated at startup — the proxy exits immediately with a clear error if it is unset/zero (#1782, fixed by #1784). It must be set to the environment's real L1 GlobalExitRoot contract address.
Why no dev-ui/sdk code changes are needed
The sdk client derives the tracker endpoint from the same base URL as the bridge API — src/aggkit/client.ts builds trackerApiUrl = ${rootUrl}/tracker/v1``. The moment a real proxy URL replaces a placeholder in aggkitBridgeApis, both bridge data and the tracker UI light up for that mode automatically.
Work
- Deploy aggkit-proxy (proxy + tracker components enabled) for testnet, then mainnet.
- Replace the
https://PLACEHOLDER-* values in dev-ui config.json testnet/mainnet aggkitBridgeApis with the real URLs.
Owners: infra/ops (provisioning) + agglayer/agglayer-dev-ui (config values only).
Context
The dev-ui is being migrated off the Bridge Hub API onto the aggkit bridge service (agglayer/agglayer-dev-ui#24, consuming the new sdk aggkit module from agglayer/sdk#28). The app is multi-mode (devnet / testnet / mainnet): each mode's
config.jsonentry carries anaggkitBridgeApismap ofnetworkId → aggkit REST base URL.Today only the devnet mode has real URLs (a local kurtosis enclave). The testnet/mainnet entries are committed placeholders, e.g. in
config.json:So testnet/mainnet modes cannot work until real endpoints exist.
What needs to be deployed
An aggkit-proxy per environment: aggkit's
proxycommand, which exposes a single REST entry point that fans out to the per-network aggkit bridge services, serves the bridge tracker API (/tracker/v1/...), and handles CORS for browsers. Two working references:src/additional_services/aggkit_proxy.star+ its config templatestatic_files/additional_services/aggkit-proxy/config.toml(from feat(bridge_ui): opt-in aggkit bridge-service backend via aggkit-proxy, 2-L2 enclave + bridge tracker (rc5) 0xPolygon/kurtosis-cdk#929).docs/deployment.md.Config gotcha: as of aggkit
v0.11.0-rc5,[Tracker].L1GlobalExitRootAddressis validated at startup — the proxy exits immediately with a clear error if it is unset/zero (#1782, fixed by #1784). It must be set to the environment's real L1 GlobalExitRoot contract address.Why no dev-ui/sdk code changes are needed
The sdk client derives the tracker endpoint from the same base URL as the bridge API —
src/aggkit/client.tsbuildstrackerApiUrl =${rootUrl}/tracker/v1``. The moment a real proxy URL replaces a placeholder inaggkitBridgeApis, both bridge data and the tracker UI light up for that mode automatically.Work
https://PLACEHOLDER-*values in dev-uiconfig.jsontestnet/mainnetaggkitBridgeApiswith the real URLs.