diff --git a/README.md b/README.md index 9efdc3b66..af8c0f361 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ For right now, each OP Chain has their own review process. So, if you are adding - If you're adding a token to `Base` (e.g. `base` [mainnet] or `base-sepolia` [testnet]), instead of using the predeploy token factory on Base, we recommend you use the token factory [listed here](https://docs.base.org/base-contracts/#l2-contract-addresses) to avoid having a token address that may conflict with a different token on Optimism. - If you are adding a token to `Zora`: please use the [`zora` label](https://github.com/ethereum-optimism/ethereum-optimism.github.io/labels/zora) and add [@tbtstl](https://github.com/tbtstl) as a reviewer. - If you are adding a token to `Mode`: please use the [`mode` label](https://github.com/ethereum-optimism/ethereum-optimism.github.io/labels/mode). +- If you are adding a token to `Lisk` (e.g. `lisk` [mainnet] or `lisk-sepolia` [testnet]): please use the [`lisk` label](https://github.com/ethereum-optimism/ethereum-optimism.github.io/labels/lisk) and add [@shuse2](https://github.com/shuse2) as a reviewer. ### Automated checks @@ -115,6 +116,8 @@ We currently accept tokens on the following chains: - `optimism-sepolia` - `mode` - `pgn` +- `lisk` +- `lisk-sepolia` #### Non-bridgable tokens diff --git a/bin/cli.ts b/bin/cli.ts index 8cea0a5e3..8106a648d 100644 --- a/bin/cli.ts +++ b/bin/cli.ts @@ -32,8 +32,8 @@ program fs.writeFileSync( validationResultsFilePath, `Below are the results from running validation for the token changes. To ` + - `re-run the validation locally run: ` + - `pnpm validate --datadir ./data --tokens ${options.tokens}\n\n` + `re-run the validation locally run: ` + + `pnpm validate --datadir ./data --tokens ${options.tokens}\n\n` ) } diff --git a/data/AURA/data.json b/data/AURA/data.json new file mode 100644 index 000000000..0c986b379 --- /dev/null +++ b/data/AURA/data.json @@ -0,0 +1,20 @@ +{ + "name": "Aura", + "symbol": "AURA", + "description": "AURA is a governance and utility token used on Aura Finance. This token is an OFT bridged with LayerZero.", + "decimals": 18, + "website": "https://app.aura.finance/", + "twitter": "@AuraFinance", + "tokens": { + "ethereum": { + "address": "0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF" + }, + "optimism": { + "address": "0x1509706a6c66CA549ff0cB464de88231DDBe213B" + }, + "base": { + "address": "0x1509706a6c66CA549ff0cB464de88231DDBe213B" + } + }, + "nobridge": true +} \ No newline at end of file diff --git a/data/AURA/logo.svg b/data/AURA/logo.svg new file mode 100644 index 000000000..e5b454036 --- /dev/null +++ b/data/AURA/logo.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/data/CENT/data.json b/data/CENT/data.json new file mode 100644 index 000000000..b1981fe96 --- /dev/null +++ b/data/CENT/data.json @@ -0,0 +1,15 @@ +{ + "name": "One Cent Coin", + "symbol": "CENT", + "decimals": 18, + "description": "A $0.01 stable meme coin.", + "nobridge": true, + "tokens": { + "base": { + "address": "0x2fa824bb2e06d6cac7dbab00be37dc0f3d440e8b", + "overrides": { + "symbol": "🇺🇸" + } + } + } +} diff --git a/data/CENT/logo.svg b/data/CENT/logo.svg new file mode 100644 index 000000000..a697c8977 --- /dev/null +++ b/data/CENT/logo.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/LSK/data.json b/data/LSK/data.json new file mode 100644 index 000000000..588299a31 --- /dev/null +++ b/data/LSK/data.json @@ -0,0 +1,37 @@ +{ + "name": "Lisk", + "symbol": "LSK", + "decimals": 18, + "website": "https://lisk.com", + "twitter": "@LiskHQ", + "tokens": { + "ethereum": { + "address": "0x6033F7f88332B8db6ad452B7C6D5bB643990aE3f", + "overrides": { + "bridge": { + "lisk": "0x2658723Bf70c7667De6B25F99fcce13A16D25d08" + } + } + }, + "lisk": { + "address": "0xac485391EB2d7D88253a7F1eF18C37f4242D1A24", + "overrides": { + "bridge": "0x4200000000000000000000000000000000000010" + } + }, + "sepolia": { + "address": "0x16B840bA01e2b05fc2268eAf6d18892a11EC29D6", + "overrides": { + "bridge": { + "lisk-sepolia": "0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5" + } + } + }, + "lisk-sepolia": { + "address": "0x8a21CF9Ba08Ae709D64Cb25AfAA951183EC9FF6D", + "overrides": { + "bridge": "0x4200000000000000000000000000000000000010" + } + } + } +} \ No newline at end of file diff --git a/data/LSK/logo.svg b/data/LSK/logo.svg new file mode 100644 index 000000000..40a5cae74 --- /dev/null +++ b/data/LSK/logo.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/POPO/data.json b/data/POPO/data.json new file mode 100644 index 000000000..d437ea531 --- /dev/null +++ b/data/POPO/data.json @@ -0,0 +1,14 @@ +{ + "name": "Pepe's Dog", + "symbol": "POPO", + "decimals": 18, + "description": "Popo, Pepe's loyal dog, is a meme coin on the Base network that merges the playful and beloved concepts of Pepe and Doge. Designed to unite the masses through fun and community-driven engagement, Popo aims to bring joy and excitement to the crypto space.", + "website": "https://basedpopo.xyz", + "twitter": "https://x.com/BasedPopoCTO", + "nobridge": true, + "tokens": { + "base": { + "address": "0x7422f030958Edf9884cE9c46a211029E03eF6da7" + } + } +} diff --git a/data/POPO/logo.svg b/data/POPO/logo.svg new file mode 100644 index 000000000..e34f75194 --- /dev/null +++ b/data/POPO/logo.svg @@ -0,0 +1,393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/optimism.tokenlist.json b/optimism.tokenlist.json index 0b14b50a6..736957bfb 100644 --- a/optimism.tokenlist.json +++ b/optimism.tokenlist.json @@ -6,7 +6,7 @@ "layer2", "infrastructure" ], - "timestamp": "2024-07-12T11:26:19.539Z", + "timestamp": "2024-07-22T16:27:32.477Z", "tokens": [ { "chainId": 1, @@ -450,6 +450,42 @@ "opTokenId": "ATH" } }, + { + "chainId": 1, + "address": "0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF", + "name": "Aura", + "symbol": "AURA", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/AURA/logo.svg", + "extensions": { + "opListId": "extended", + "opTokenId": "AURA" + } + }, + { + "chainId": 10, + "address": "0x1509706a6c66CA549ff0cB464de88231DDBe213B", + "name": "Aura", + "symbol": "AURA", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/AURA/logo.svg", + "extensions": { + "opListId": "extended", + "opTokenId": "AURA" + } + }, + { + "chainId": 8453, + "address": "0x1509706a6c66CA549ff0cB464de88231DDBe213B", + "name": "Aura", + "symbol": "AURA", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/AURA/logo.svg", + "extensions": { + "opListId": "extended", + "opTokenId": "AURA" + } + }, { "chainId": 1, "address": "0x616e8BfA43F920657B3497DBf40D6b1A02D4608d", @@ -1128,6 +1164,18 @@ "opTokenId": "cbETH" } }, + { + "chainId": 8453, + "address": "0x2fa824bb2e06d6cac7dbab00be37dc0f3d440e8b", + "name": "One Cent Coin", + "symbol": "🇺🇸", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/CENT/logo.svg", + "extensions": { + "opListId": "extended", + "opTokenId": "CENT" + } + }, { "chainId": 1, "address": "0xC4C2614E694cF534D407Ee49F8E44D125E4681c4", @@ -3947,6 +3995,58 @@ "opTokenId": "LRC" } }, + { + "chainId": 1, + "address": "0x6033F7f88332B8db6ad452B7C6D5bB643990aE3f", + "name": "Lisk", + "symbol": "LSK", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/LSK/logo.svg", + "extensions": { + "liskBridgeAddress": "0x2658723Bf70c7667De6B25F99fcce13A16D25d08", + "opListId": "extended", + "opTokenId": "LSK" + } + }, + { + "chainId": 1135, + "address": "0xac485391EB2d7D88253a7F1eF18C37f4242D1A24", + "name": "Lisk", + "symbol": "LSK", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/LSK/logo.svg", + "extensions": { + "liskBridgeAddress": "0x4200000000000000000000000000000000000010", + "opListId": "extended", + "opTokenId": "LSK" + } + }, + { + "chainId": 11155111, + "address": "0x16B840bA01e2b05fc2268eAf6d18892a11EC29D6", + "name": "Lisk", + "symbol": "LSK", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/LSK/logo.svg", + "extensions": { + "liskBridgeAddress": "0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5", + "opListId": "extended", + "opTokenId": "LSK" + } + }, + { + "chainId": 4202, + "address": "0x8a21CF9Ba08Ae709D64Cb25AfAA951183EC9FF6D", + "name": "Lisk", + "symbol": "LSK", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/LSK/logo.svg", + "extensions": { + "liskBridgeAddress": "0x4200000000000000000000000000000000000010", + "opListId": "extended", + "opTokenId": "LSK" + } + }, { "chainId": 1, "address": "0x5f98805a4e8be255a32880fdec7f6728c6568ba0", @@ -5115,6 +5215,18 @@ "opTokenId": "POP" } }, + { + "chainId": 8453, + "address": "0x7422f030958Edf9884cE9c46a211029E03eF6da7", + "name": "Pepe's Dog", + "symbol": "POPO", + "decimals": 18, + "logoURI": "https://ethereum-optimism.github.io/data/POPO/logo.svg", + "extensions": { + "opListId": "extended", + "opTokenId": "POPO" + } + }, { "chainId": 1, "address": "0xEC213F83defB583af3A000B1c0ada660b1902A0F", @@ -8753,6 +8865,6 @@ "version": { "major": 10, "minor": 0, - "patch": 96 + "patch": 100 } } \ No newline at end of file diff --git a/package.json b/package.json index 2671ee08e..c03c547c5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@eth-optimism/tokenlist", "description": "[Optimism] token list", - "version": "10.0.96", + "version": "10.0.100", "main": "dist/index.js", "module": "dist/index.mjs", "exports": { diff --git a/src/chains.ts b/src/chains.ts index 1162ad19b..ebb94cf51 100644 --- a/src/chains.ts +++ b/src/chains.ts @@ -23,7 +23,7 @@ export const NETWORK_DATA: Record = { id: 8453, name: 'Base', provider: new ethers.providers.StaticJsonRpcProvider( - 'https://mainnet.base.org', + 'https://mainnet.base.org' ), layer: 2, }, @@ -39,14 +39,25 @@ export const NETWORK_DATA: Record = { id: 34443, name: 'Mode', provider: new ethers.providers.StaticJsonRpcProvider( - 'https://mainnet.mode.network', + 'https://mainnet.mode.network' + ), + layer: 2, + }, + lisk: { + id: 1135, + name: 'Lisk', + provider: new ethers.providers.StaticJsonRpcProvider( + 'https://rpc.api.lisk.com' ), layer: 2, }, sepolia: { id: 11155111, name: 'Sepolia', - provider: new ethers.providers.StaticJsonRpcProvider(`https://sepolia.infura.io/v3/${DEFAULT_INFURA_KEY}`, 11155111), + provider: new ethers.providers.StaticJsonRpcProvider( + `https://sepolia.infura.io/v3/${DEFAULT_INFURA_KEY}`, + 11155111 + ), layer: 1, }, 'optimism-sepolia': { @@ -74,6 +85,14 @@ export const NETWORK_DATA: Record = { ), layer: 2, }, + 'lisk-sepolia': { + id: 4202, + name: 'Lisk Sepolia', + provider: new ethers.providers.StaticJsonRpcProvider( + 'https://rpc.sepolia-api.lisk.com' + ), + layer: 2, + }, } interface L2BridgeInformation { @@ -101,6 +120,9 @@ export const L2_STANDARD_BRIDGE_INFORMATION: Record< mode: { l2StandardBridgeAddress: '0x4200000000000000000000000000000000000010', }, + lisk: { + l2StandardBridgeAddress: '0x4200000000000000000000000000000000000010', + }, 'optimism-sepolia': { l2StandardBridgeAddress: '0x4200000000000000000000000000000000000010', }, @@ -110,6 +132,9 @@ export const L2_STANDARD_BRIDGE_INFORMATION: Record< 'pgn-sepolia': { l2StandardBridgeAddress: '0x4200000000000000000000000000000000000010', }, + 'lisk-sepolia': { + l2StandardBridgeAddress: '0x4200000000000000000000000000000000000010', + }, } export const L2_TO_L1_PAIR: Partial> = { @@ -117,9 +142,11 @@ export const L2_TO_L1_PAIR: Partial> = { base: 'ethereum', pgn: 'ethereum', mode: 'ethereum', + lisk: 'ethereum', 'optimism-sepolia': 'sepolia', 'base-sepolia': 'sepolia', - 'pgn-sepolia': 'sepolia' + 'pgn-sepolia': 'sepolia', + 'lisk-sepolia': 'sepolia', } export const L1_STANDARD_BRIDGE_INFORMATION: Record< @@ -143,6 +170,10 @@ export const L1_STANDARD_BRIDGE_INFORMATION: Record< l2Chain: 'mode', l1StandardBridgeAddress: '0x735aDBbE72226BD52e818E7181953f42E3b0FF21', }, + { + l2Chain: 'lisk', + l1StandardBridgeAddress: '0x2658723Bf70c7667De6B25F99fcce13A16D25d08', + }, ], sepolia: [ { @@ -157,5 +188,9 @@ export const L1_STANDARD_BRIDGE_INFORMATION: Record< l2Chain: 'base-sepolia', l1StandardBridgeAddress: '0xfd0Bf71F60660E2f608ed56e1659C450eB113120', }, - ] + { + l2Chain: 'lisk-sepolia', + l1StandardBridgeAddress: '0x1Fb30e446eA791cd1f011675E5F3f5311b70faF5', + }, + ], } diff --git a/src/generate.ts b/src/generate.ts index 8fea6afd4..757fc1acf 100644 --- a/src/generate.ts +++ b/src/generate.ts @@ -119,7 +119,8 @@ const getBridges = (tokenData: TokenData, chain: string, token: Token) => { ) } const networkSep = l2Chain.indexOf('-') - const chainName = networkSep === -1 ? l2Chain : l2Chain.slice(0, networkSep) + const chainName = + networkSep === -1 ? l2Chain : l2Chain.slice(0, networkSep) const bridgeKey = `${chainName}BridgeAddress` return { [bridgeKey]: diff --git a/src/schemas.ts b/src/schemas.ts index 23dd9c2d1..3e056cb69 100644 --- a/src/schemas.ts +++ b/src/schemas.ts @@ -15,7 +15,7 @@ export const TOKEN_SCHEMA = { }, symbol: { type: 'string', - pattern: '^\\S+$' // allow unicode + pattern: '^\\S+$', // allow unicode }, decimals: { type: 'integer', @@ -62,11 +62,13 @@ export const TOKEN_DATA_SCHEMA = { ethereum: TOKEN_SCHEMA, optimism: TOKEN_SCHEMA, base: TOKEN_SCHEMA, + lisk: TOKEN_SCHEMA, mode: TOKEN_SCHEMA, pgn: TOKEN_SCHEMA, sepolia: TOKEN_SCHEMA, 'base-sepolia': TOKEN_SCHEMA, 'optimism-sepolia': TOKEN_SCHEMA, + 'lisk-sepolia': TOKEN_SCHEMA, }, additionalProperties: false, anyOf: [ @@ -75,9 +77,11 @@ export const TOKEN_DATA_SCHEMA = { { required: ['base'] }, { required: ['mode'] }, { required: ['pgn'] }, + { required: ['lisk'] }, { required: ['sepolia'] }, { required: ['base-sepolia'] }, { required: ['optimism-sepolia'] }, + { required: ['lisk-sepolia'] }, ], }, }, diff --git a/src/types.ts b/src/types.ts index eedfc374c..b04942aad 100644 --- a/src/types.ts +++ b/src/types.ts @@ -29,8 +29,20 @@ export type Chain = | 'pgn-sepolia' | 'sepolia' | 'mode' + | 'lisk' + | 'lisk-sepolia' -const l2Chains = ['optimism', 'optimism-sepolia', 'base', 'base-sepolia', 'pgn-sepolia', 'pgn', 'mode'] as const +const l2Chains = [ + 'optimism', + 'optimism-sepolia', + 'base', + 'base-sepolia', + 'pgn-sepolia', + 'pgn', + 'mode', + 'lisk', + 'lisk-sepolia', +] as const export type L2Chain = typeof l2Chains[number] export const isL2Chain = (chain: string): chain is L2Chain => {