Skip to content

Commit 00c6f05

Browse files
committed
feat: add tokenlist and generate docs
Signed-off-by: Gregory Hill <gregorydhill@outlook.com>
1 parent 61f6b0b commit 00c6f05

File tree

4 files changed

+807
-50
lines changed

4 files changed

+807
-50
lines changed

docs/docs/docs/reference/token-registry/index.md

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
---
2+
hide_table_of_contents: true
3+
---
4+
5+
import tokenList from '../../../../../token-list.json';
6+
7+
# Token Registry
8+
9+
Various ERC-20 tokens originally deployed to Ethereum also have corresponding "bridged" representations on BOB Mainnet.
10+
11+
:::info Do Your Own Research
12+
13+
Tokens listed on this page are provided for convenience only.
14+
The presence of a token on this page does not imply any endorsement of the token or its minter.
15+
16+
:::
17+
18+
## BOB Mainnet
19+
20+
export const TokenTable = () => {
21+
// Sort tokens alphabetically by name
22+
const sortedTokens = [...tokenList].sort((a, b) => a.name.localeCompare(b.name));
23+
24+
const formatAddress = (address) => {
25+
return `${address.slice(0, 6)}...${address.slice(-4)}`;
26+
};
27+
28+
return (
29+
<table>
30+
<thead>
31+
<tr>
32+
<th>Name</th>
33+
<th>Symbol</th>
34+
<th>L1 Token</th>
35+
<th>L2 Token</th>
36+
<th>Bridge L1</th>
37+
<th>Bridge L2</th>
38+
</tr>
39+
</thead>
40+
<tbody>
41+
{sortedTokens.map((token, index) => {
42+
const bridgeInfo = token.extensions?.bridgeInfo?.["1"];
43+
44+
// L1 Token
45+
let l1Token = 'L2 Native Token';
46+
if (bridgeInfo?.tokenAddress) {
47+
const shortL1 = formatAddress(bridgeInfo.tokenAddress);
48+
l1Token = (
49+
<a href={`https://etherscan.io/address/${bridgeInfo.tokenAddress}`} target="_blank" rel="noopener noreferrer">
50+
{shortL1}
51+
</a>
52+
);
53+
} else if (token.address === '0x0000000000000000000000000000000000000000') {
54+
l1Token = 'Native Asset';
55+
}
56+
57+
// L2 Token
58+
const l2Token = token.address === '0x0000000000000000000000000000000000000000' ? (
59+
'Native Asset'
60+
) : (
61+
<a href={`https://explorer.gobob.xyz/address/${token.address}`} target="_blank" rel="noopener noreferrer">
62+
{formatAddress(token.address)}
63+
</a>
64+
);
65+
66+
// Bridge addresses
67+
let bridgeL1 = 'N/A';
68+
let bridgeL2 = 'N/A';
69+
70+
if (bridgeInfo?.destBridgeAddress) {
71+
const shortBridgeL1 = formatAddress(bridgeInfo.destBridgeAddress);
72+
bridgeL1 = (
73+
<a href={`https://etherscan.io/address/${bridgeInfo.destBridgeAddress}`} target="_blank" rel="noopener noreferrer">
74+
{shortBridgeL1}
75+
</a>
76+
);
77+
}
78+
79+
if (bridgeInfo?.originBridgeAddress) {
80+
const shortBridgeL2 = formatAddress(bridgeInfo.originBridgeAddress);
81+
bridgeL2 = (
82+
<a href={`https://explorer.gobob.xyz/address/${bridgeInfo.originBridgeAddress}`} target="_blank" rel="noopener noreferrer">
83+
{shortBridgeL2}
84+
</a>
85+
);
86+
}
87+
88+
return (
89+
<tr key={index}>
90+
<td>{token.name}</td>
91+
<td><code>{token.symbol}</code></td>
92+
<td>{l1Token}</td>
93+
<td>{l2Token}</td>
94+
<td>{bridgeL1}</td>
95+
<td>{bridgeL2}</td>
96+
</tr>
97+
);
98+
})}
99+
</tbody>
100+
</table>
101+
);
102+
};
103+
104+
<TokenTable />
105+
106+
## Bridge Information
107+
108+
### Standard Bridge
109+
- **L1:** [0x3F6c...1f7](https://etherscan.io/address/0x3F6cE1b36e5120BBc59D0cFe8A5aC8b6464ac1f7)
110+
- **L2:** [0x4200...0010](https://explorer.gobob.xyz/address/0x4200000000000000000000000000000000000010)
111+
112+
### USDC Bridge
113+
- **L1:** [0x450D...aCBb](https://etherscan.io/address/0x450D55a4B4136805B0e5A6BB59377c71FC4FaCBb)
114+
- **L2:** [0xe497...cE90](https://explorer.gobob.xyz/address/0xe497788F8Fcc30B773C9A181a0FFE2e60645cE90)
115+
116+
### wstETH Bridge
117+
- **L1:** [0x091d...5B72](https://etherscan.io/address/0x091dF5E1284E49fA682407096aD34cfD42B95B72)
118+
- **L2:** [0xd155...c4d1](https://explorer.gobob.xyz/address/0xd1559523374D93972E0F7fE1AA98642754f5c4d1)
119+
120+
### Chainlink CCIP
121+
Cross-chain interoperability protocol for select tokens like SolvBTC, xSolvBTC, and uniBTC.
122+
123+
## TokenList Integration
124+
125+
This token registry is automatically generated from our **[token-list.json](https://raw.githubusercontent.com/bob-collective/bob/master/token-list.json)** which follows the [Uniswap Token List Standard](https://tokenlists.org/) with bridge extensions.
126+
127+
**Total Tokens:** {tokenList.length}
128+
129+
### Bridge Extensions
130+
131+
Each bridged token includes bridge information in its `extensions.bridgeInfo` field:
132+
133+
```json
134+
{
135+
"name": "Wrapped BTC",
136+
"address": "0x0555E30da8f98308EdB960aa94C0Db47230d2B9c",
137+
"symbol": "WBTC",
138+
"decimals": 8,
139+
"chainId": 60808,
140+
"logoURI": "https://...",
141+
"extensions": {
142+
"bridgeInfo": {
143+
"1": {
144+
"tokenAddress": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
145+
"originBridgeAddress": "0x4200000000000000000000000000000000000010",
146+
"destBridgeAddress": "0x3F6cE1b36e5120BBc59D0cFe8A5aC8b6464ac1f7"
147+
}
148+
}
149+
}
150+
}
151+
```
152+
153+
### Usage Examples
154+
155+
```javascript
156+
// Fetch the tokenlist
157+
const response = await fetch('https://raw.githubusercontent.com/bob-collective/bob/master/token-list.json');
158+
const tokens = await response.json();
159+
160+
// Find WBTC token info
161+
const wbtc = tokens.find(token => token.symbol === 'WBTC');
162+
console.log(wbtc.address); // L2 WBTC address
163+
164+
// Get bridge information
165+
const bridgeInfo = wbtc.extensions?.bridgeInfo?.["1"];
166+
console.log(bridgeInfo.tokenAddress); // L1 WBTC address
167+
console.log(bridgeInfo.destBridgeAddress); // L1 bridge address
168+
console.log(bridgeInfo.originBridgeAddress); // L2 bridge address
169+
```

0 commit comments

Comments
 (0)