Skip to content

Commit f4ab63c

Browse files
nud3lclaude
andcommitted
feat(gateway-docs): dynamic client-side routes page with token addresses
Replace static generated MDX with an inline React component that fetches routes from the Gateway API and token symbols from the GitHub-hosted tokenlist at page load. Adds source/destination address columns. Removes the generate-routes.ts script and routes-docs Makefile target. Addresses review feedback: routes stay current without PRs, and token addresses are now visible in the table. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent a6a4b50 commit f4ab63c

2 files changed

Lines changed: 85 additions & 291 deletions

File tree

docs/gateway/gateway/supported-routes.mdx

Lines changed: 85 additions & 232 deletions
Original file line numberDiff line numberDiff line change
@@ -4,235 +4,88 @@ description: "All supported chains and token routes available through the BOB Ga
44
icon: "route"
55
---
66

7-
{/* Auto-generated by docs/gateway/scripts/generate-routes.ts — do not edit manually. */}
8-
9-
Auto-generated from the live [`/v1/get-routes`](/api-reference/overview) endpoint
10-
and the [BOB tokenlist](https://github.com/bob-collective/bob/blob/master/tokenlist/tokenlist.json).
11-
Last updated: 2026-03-10
12-
13-
## From Aptos
14-
15-
| Source Token | Destination Chain | Destination Token |
16-
|---|---|---|
17-
| WBTC | Bitcoin | BTC |
18-
19-
## From Avalanche
20-
21-
| Source Token | Destination Chain | Destination Token |
22-
|---|---|---|
23-
| WBTC | Base | WBTC |
24-
| WBTC | Bera | WBTC |
25-
| WBTC | Bitcoin | BTC |
26-
| WBTC | BOB | WBTC |
27-
| WBTC | BSC | WBTC |
28-
| WBTC | Ethereum | WBTC |
29-
| WBTC | Optimism | WBTC |
30-
| WBTC | Sei | WBTC |
31-
| WBTC | Soneium | WBTC |
32-
| WBTC | Sonic | WBTC |
33-
| WBTC | Unichain | WBTC |
34-
35-
## From Base
36-
37-
| Source Token | Destination Chain | Destination Token |
38-
|---|---|---|
39-
| WBTC | Avalanche | WBTC |
40-
| WBTC | Bera | WBTC |
41-
| ETH | Bitcoin | BTC |
42-
| WBTC | Bitcoin | BTC |
43-
| oUSDT | Bitcoin | BTC |
44-
| USDC | Bitcoin | BTC |
45-
| WBTC | BOB | WBTC |
46-
| WBTC | BSC | WBTC |
47-
| WBTC | Ethereum | WBTC |
48-
| WBTC | Optimism | WBTC |
49-
| WBTC | Sei | WBTC |
50-
| WBTC | Soneium | WBTC |
51-
| WBTC | Sonic | WBTC |
52-
| WBTC | Unichain | WBTC |
53-
54-
## From Bera
55-
56-
| Source Token | Destination Chain | Destination Token |
57-
|---|---|---|
58-
| WBTC | Avalanche | WBTC |
59-
| WBTC | Base | WBTC |
60-
| WBTC | Bitcoin | BTC |
61-
| WBTC | BOB | WBTC |
62-
| WBTC | BSC | WBTC |
63-
| WBTC | Ethereum | WBTC |
64-
| WBTC | Optimism | WBTC |
65-
| WBTC | Sei | WBTC |
66-
| WBTC | Soneium | WBTC |
67-
| WBTC | Sonic | WBTC |
68-
| WBTC | Unichain | WBTC |
69-
70-
## From Bitcoin
71-
72-
| Source Token | Destination Chain | Destination Token |
73-
|---|---|---|
74-
| BTC | Aptos | WBTC |
75-
| BTC | Avalanche | WBTC |
76-
| BTC | Base | ETH |
77-
| BTC | Base | USDC |
78-
| BTC | Base | oUSDT |
79-
| BTC | Base | WBTC |
80-
| BTC | Bera | WBTC |
81-
| BTC | BOB | uniBTC |
82-
| BTC | BOB | WBTC |
83-
| BTC | BSC | WBTC |
84-
| BTC | Ethereum | ETH |
85-
| BTC | Ethereum | USDC |
86-
| BTC | Ethereum | USDT |
87-
| BTC | Ethereum | WBTC |
88-
| BTC | Optimism | WBTC |
89-
| BTC | Sei | WBTC |
90-
| BTC | Soneium | WBTC |
91-
| BTC | Sonic | WBTC |
92-
| BTC | Swell | WBTC |
93-
| BTC | Telos | WBTC |
94-
| BTC | Unichain | WBTC |
95-
96-
## From BOB
97-
98-
| Source Token | Destination Chain | Destination Token |
99-
|---|---|---|
100-
| WBTC | Avalanche | WBTC |
101-
| WBTC | Base | WBTC |
102-
| WBTC | Bera | WBTC |
103-
| WBTC | Bitcoin | BTC |
104-
| WBTC | BSC | WBTC |
105-
| WBTC | Ethereum | WBTC |
106-
| WBTC | Optimism | WBTC |
107-
| WBTC | Sei | WBTC |
108-
| WBTC | Soneium | WBTC |
109-
| WBTC | Sonic | WBTC |
110-
| WBTC | Unichain | WBTC |
111-
112-
## From BSC
113-
114-
| Source Token | Destination Chain | Destination Token |
115-
|---|---|---|
116-
| WBTC | Avalanche | WBTC |
117-
| WBTC | Base | WBTC |
118-
| WBTC | Bera | WBTC |
119-
| WBTC | Bitcoin | BTC |
120-
| WBTC | BOB | WBTC |
121-
| WBTC | Ethereum | WBTC |
122-
| WBTC | Optimism | WBTC |
123-
| WBTC | Sei | WBTC |
124-
| WBTC | Soneium | WBTC |
125-
| WBTC | Sonic | WBTC |
126-
| WBTC | Unichain | WBTC |
127-
128-
## From Ethereum
129-
130-
| Source Token | Destination Chain | Destination Token |
131-
|---|---|---|
132-
| WBTC | Avalanche | WBTC |
133-
| WBTC | Base | WBTC |
134-
| WBTC | Bera | WBTC |
135-
| ETH | Bitcoin | BTC |
136-
| WBTC | Bitcoin | BTC |
137-
| USDC | Bitcoin | BTC |
138-
| USDT | Bitcoin | BTC |
139-
| WBTC | BOB | WBTC |
140-
| WBTC | BSC | WBTC |
141-
| WBTC | Optimism | WBTC |
142-
| WBTC | Sei | WBTC |
143-
| WBTC | Soneium | WBTC |
144-
| WBTC | Sonic | WBTC |
145-
| WBTC | Unichain | WBTC |
146-
147-
## From Optimism
148-
149-
| Source Token | Destination Chain | Destination Token |
150-
|---|---|---|
151-
| WBTC | Avalanche | WBTC |
152-
| WBTC | Base | WBTC |
153-
| WBTC | Bera | WBTC |
154-
| WBTC | Bitcoin | BTC |
155-
| WBTC | BOB | WBTC |
156-
| WBTC | BSC | WBTC |
157-
| WBTC | Ethereum | WBTC |
158-
| WBTC | Sei | WBTC |
159-
| WBTC | Soneium | WBTC |
160-
| WBTC | Sonic | WBTC |
161-
| WBTC | Unichain | WBTC |
162-
163-
## From Sei
164-
165-
| Source Token | Destination Chain | Destination Token |
166-
|---|---|---|
167-
| WBTC | Avalanche | WBTC |
168-
| WBTC | Base | WBTC |
169-
| WBTC | Bera | WBTC |
170-
| WBTC | Bitcoin | BTC |
171-
| WBTC | BOB | WBTC |
172-
| WBTC | BSC | WBTC |
173-
| WBTC | Ethereum | WBTC |
174-
| WBTC | Optimism | WBTC |
175-
| WBTC | Soneium | WBTC |
176-
| WBTC | Sonic | WBTC |
177-
| WBTC | Unichain | WBTC |
178-
179-
## From Soneium
180-
181-
| Source Token | Destination Chain | Destination Token |
182-
|---|---|---|
183-
| WBTC | Avalanche | WBTC |
184-
| WBTC | Base | WBTC |
185-
| WBTC | Bera | WBTC |
186-
| WBTC | Bitcoin | BTC |
187-
| WBTC | BOB | WBTC |
188-
| WBTC | BSC | WBTC |
189-
| WBTC | Ethereum | WBTC |
190-
| WBTC | Optimism | WBTC |
191-
| WBTC | Sei | WBTC |
192-
| WBTC | Sonic | WBTC |
193-
| WBTC | Unichain | WBTC |
194-
195-
## From Sonic
196-
197-
| Source Token | Destination Chain | Destination Token |
198-
|---|---|---|
199-
| WBTC | Avalanche | WBTC |
200-
| WBTC | Base | WBTC |
201-
| WBTC | Bera | WBTC |
202-
| WBTC | Bitcoin | BTC |
203-
| WBTC | BOB | WBTC |
204-
| WBTC | BSC | WBTC |
205-
| WBTC | Ethereum | WBTC |
206-
| WBTC | Optimism | WBTC |
207-
| WBTC | Sei | WBTC |
208-
| WBTC | Soneium | WBTC |
209-
| WBTC | Unichain | WBTC |
210-
211-
## From Swell
212-
213-
| Source Token | Destination Chain | Destination Token |
214-
|---|---|---|
215-
| WBTC | Bitcoin | BTC |
216-
217-
## From Telos
218-
219-
| Source Token | Destination Chain | Destination Token |
220-
|---|---|---|
221-
| WBTC | Bitcoin | BTC |
222-
223-
## From Unichain
224-
225-
| Source Token | Destination Chain | Destination Token |
226-
|---|---|---|
227-
| WBTC | Avalanche | WBTC |
228-
| WBTC | Base | WBTC |
229-
| WBTC | Bera | WBTC |
230-
| WBTC | Bitcoin | BTC |
231-
| WBTC | BOB | WBTC |
232-
| WBTC | BSC | WBTC |
233-
| WBTC | Ethereum | WBTC |
234-
| WBTC | Optimism | WBTC |
235-
| WBTC | Sei | WBTC |
236-
| WBTC | Soneium | WBTC |
237-
| WBTC | Sonic | WBTC |
238-
7+
export const ROUTES_API = "https://gateway-api-mainnet.gobob.xyz/v1/get-routes";
8+
export const TOKENLIST_URL = "https://raw.githubusercontent.com/bob-collective/bob/master/tokenlist/tokenlist.json";
9+
export const NON_EVM = { bitcoin: "BTC", aptos: "WBTC" };
10+
export const CHAIN_LABELS = { bsc: "BSC", bob: "BOB" };
11+
12+
export const cap = (s) => CHAIN_LABELS[s] || s[0].toUpperCase() + s.slice(1);
13+
export const truncate = (addr) => addr.slice(0, 6) + "\u2026" + addr.slice(-4);
14+
15+
export const SupportedRoutes = () => {
16+
const [routes, setRoutes] = useState(null);
17+
const [symbols, setSymbols] = useState({});
18+
const [error, setError] = useState(false);
19+
20+
useEffect(() => {
21+
Promise.all([
22+
fetch(ROUTES_API).then((r) => r.json()).catch(() => null),
23+
fetch(TOKENLIST_URL).then((r) => r.json()).then((d) => d.tokens).catch(() => []),
24+
]).then(([routeData, tokens]) => {
25+
if (!routeData) {
26+
setError(true);
27+
return;
28+
}
29+
const map = {};
30+
for (const t of tokens) map[t.address.toLowerCase()] = t.symbol;
31+
setSymbols(map);
32+
setRoutes(routeData);
33+
});
34+
}, []);
35+
36+
if (error) return <p>Routes could not be loaded.</p>;
37+
if (!routes) return <p>Loading routes…</p>;
38+
39+
const sym = (chain, addr) => {
40+
if (NON_EVM[chain]) return NON_EVM[chain];
41+
if (symbols[addr.toLowerCase()]) return symbols[addr.toLowerCase()];
42+
return truncate(addr);
43+
};
44+
45+
const groups = {};
46+
for (const r of routes) {
47+
if (!groups[r.srcChain]) groups[r.srcChain] = [];
48+
groups[r.srcChain].push(r);
49+
}
50+
51+
return (
52+
<div>
53+
{Object.keys(groups).sort().map((chain) => {
54+
const rows = groups[chain].sort((a, b) =>
55+
a.dstChain.localeCompare(b.dstChain) || a.srcToken.localeCompare(b.srcToken)
56+
);
57+
return (
58+
<div key={chain}>
59+
<h2>From {cap(chain)}</h2>
60+
<table>
61+
<thead>
62+
<tr>
63+
<th>Source Token</th>
64+
<th>Source Address</th>
65+
<th>Destination Chain</th>
66+
<th>Destination Token</th>
67+
<th>Destination Address</th>
68+
</tr>
69+
</thead>
70+
<tbody>
71+
{rows.map((r, i) => (
72+
<tr key={i}>
73+
<td>{sym(r.srcChain, r.srcToken)}</td>
74+
<td>{NON_EVM[r.srcChain] ? "" : truncate(r.srcToken)}</td>
75+
<td>{cap(r.dstChain)}</td>
76+
<td>{sym(r.dstChain, r.dstToken)}</td>
77+
<td>{NON_EVM[r.dstChain] ? "" : truncate(r.dstToken)}</td>
78+
</tr>
79+
))}
80+
</tbody>
81+
</table>
82+
</div>
83+
);
84+
})}
85+
</div>
86+
);
87+
};
88+
89+
Live data from the [`/v1/get-routes`](/api-reference/overview) endpoint, with token symbols resolved from the [BOB tokenlist](https://github.com/bob-collective/bob/blob/master/tokenlist/tokenlist.json).
90+
91+
<SupportedRoutes />

docs/gateway/scripts/generate-routes.ts

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)