diff --git a/.beads/ss-dx5.14.json b/.beads/ss-dx5.14.json new file mode 100644 index 00000000000..25e14dd0608 --- /dev/null +++ b/.beads/ss-dx5.14.json @@ -0,0 +1,39 @@ +[ + { + "id": "ss-dx5.14", + "title": "Integrate World Chain (chainId: 480, ETH, OP Stack L2)", + "description": "TVL: $51.6M | RPC: https://worldchain-mainnet.gateway.tenderly.co | Explorer: https://worldscan.org | Token Support: All | Pattern B (RPC-only) | Worldcoin ecosystem", + "notes": "\nLogo: https://assets.relay.link/icons/480/light.png (dark: dark.png)\nCoinGecko platform: world-chain\nCoinGecko native ID: ethereum\nArch: OP Stack L2 (Worldcoin ecosystem)\nNative token: ETH (18 decimals)\nSLIP44: 60 (Ethereum)\nETH-native: YES — affects test ordering + market-service counts\nViem: ✅ worldchain (id: 480) — import { worldchain } from \"viem/chains\"\nAcross: ✅ SUPPORTED (chainId: 480)\nZerion ID: \"world-chain\" (hyphenated)\n\n--- PHASE 1 LEARNED CHECKLIST (MANDATORY) ---\n[ ] adapter.json: Create packages/caip/src/adapters/coingecko/generated/eip155_480/adapter.json → {\"eip155:480/slip44:60\":\"ethereum\"}\n[ ] Wire adapter.json: Import+export from packages/caip/src/adapters/coingecko/generated/index.ts\n[ ] getCoingeckoSupportedChainIds: Add worldChainChainId (feature-flagged) in src/lib/coingecko/utils.ts\n[ ] Zerion: Add \"world-chain\" to ZERION_CHAINS + ZERION_CHAINS_MAP in packages/types/src/zerion.ts\n[ ] Across: ✅ Add [worldChainChainId]: worldchain.id to chainIdToAcrossChainId\n[ ] ETH test ordering: ✅ REQUIRED — add eip155:480/slip44:60 to ethereum array in index.test.ts\n[ ] Market-service counts: ✅ REQUIRED — bump counts + add destructuring in coingecko.test.ts\n[ ] generateRelatedAssetIndex: Add eip155:480/slip44:60 → eip155:1/slip44:60 to manualRelatedAssetIndex\n\n--- RELAY ACTIVATION ---\n[ ] Add [worldChainChainId]: worldchain.id to chainIdToRelayChainId\n[ ] Add native asset case in relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/worldchain/index.ts\n[ ] Add case to scripts/generateAssetData/coingecko.ts\n[ ] Add import + getAssets call to generateAssetData.ts\n--- DRAFT PR ---\n[ ] Branch: feat/integrate-worldchain-relay (off develop)\n[ ] gh pr create --draft\n[ ] yarn lint --fix \u0026\u0026 yarn type-check must pass\n", + "status": "open", + "priority": 2, + "issue_type": "task", + "owner": "14963751+NeOMakinG@users.noreply.github.com", + "created_at": "2026-02-17T10:56:00Z", + "created_by": "NeOMakinG", + "updated_at": "2026-02-17T22:43:02Z", + "labels": [ + "evm", + "op-stack", + "relay", + "tier-2" + ], + "dependencies": [ + { + "id": "ss-dx5", + "title": "Add support for missing Relay.link EVM chains", + "description": "Master epic tracking integration of ALL chains supported by Relay.link that ShapeShift web doesn't currently support. Enables cross-chain bridging capabilities via Relay infrastructure. See https://github.com/shapeshift/web/issues/11902 for full details. All new EVM chains will use Pattern B (RPC-only + getKnownTokens) since no ShapeShift unchained indexer infrastructure exists for these chains.", + "notes": "=== FROM ISSUE COMMENTS ===\n\nLOGO PATTERN: https://assets.relay.link/icons/{chainId}/light.png (dark: dark.png)\n\nARCHITECTURE GROUPS:\n- OP Stack (standard): Ink, Unichain, BOB, Mode, Hemi, World Chain, Soneium, Zircuit, Lisk, Cyber, Blast, Zora, Redstone, Shape, Superseed, Manta Pacific\n- zkEVM (special handling): Scroll, zkSync Era, Linea, Polygon zkEVM, Taiko, Abstract\n- Arbitrum Orbit: ApeChain, Xai, Sanko\n- Non-ETH gas (10 chains): Mantle(MNT), Metis(METIS), Cronos(CRO), Ronin(RON), Sonic(S), Flow(FLOW), Berachain(BERA), Plume(PLUME), Story(IP), Stable(gUSDT)\n\nCRITICAL CHAINS:\n1. Celo (42220): Native token is BOTH native AND ERC20. Relay uses wrapped CELO. Check relayTransactionMetadata.assetRequiringApproval\n2. Blast (81457): Rebasing ETH from L1 staking yield. USDB also rebases. Handle in balance displays.\n3. Ethereal (5064014): NOT in viem. Needs custom chain definition.\n4. zkSync Era (324) + Abstract (2741): Type 113 (EIP-712) transactions. Use viem zksync chainConfig.\n5. Linea (59144): Custom linea_estimateGas RPC method.\n6. Sei (1329): Parallelized EVM + CosmWasm interop. CoinGecko uses sei-v2 NOT sei.\n\nCOINGECKO GOTCHAS: sei-\u003esei-v2, plume-\u003eplume-network, zksync-\u003ezksync, metis-\u003emetis-andromeda, morph-\u003emorph-l2, gravity-\u003egravity-alpha, boba-\u003eboba, zora-\u003ezora-network, funkichain-\u003efunki, Superposition (capital S). BOB/Zero Network have null chain_identifier. 11 chains not on CoinGecko at all.\n\nPER-CHAIN CHECKLIST: [ ] chain-adapters [ ] caip [ ] asset-service [ ] feature-flag [ ] plugin [ ] env-config [ ] icon/logo\n\n=== RELAY SWAPPER INTEGRATION (per chain) ===\n\nFILE 1: packages/swapper/src/swappers/RelaySwapper/constant.ts\n - Add to chainIdToRelayChainId map: [newChainChainId]: \u003cviem_chain\u003e.id (or numeric chain ID)\n - Import the caip chainId (e.g., scrollChainId) from @shapeshiftoss/caip\n - Import viem chain from viem/chains (or use raw numeric ID if not in viem)\n - The reverse map relayChainIdToChainId auto-generates via invert()\n\nFILE 2: packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n - Add case CHAIN_REFERENCE.NewChainMainnet: with ASSET_REFERENCE.NewChain + ASSET_NAMESPACE.slip44\n\nNO CHANGES NEEDED (for EVM chains):\n - getRelayAssetAddress.ts (uses generic isNativeEvmAsset + DEFAULT_RELAY_EVM_TOKEN_ADDRESS)\n - getRelayDefaultUserAddress.ts (falls through to DEFAULT_RELAY_EVM_USER_ADDRESS default)\n\nUPSTREAM DEPS REQUIRED (in @shapeshiftoss packages):\n - @shapeshiftoss/caip: export newChainChainId, CHAIN_REFERENCE.NewChainMainnet, ASSET_REFERENCE.NewChain\n - @shapeshiftoss/types: KnownChainIds.NewChainMainnet\n - @shapeshiftoss/chain-adapters: NewChain chain adapter class\n - viem/chains: chain config (or custom if not in viem)\n\nRELAY API: https://api.relay.link (env: VITE_RELAY_API_URL) - no per-chain config needed\n\n=== ASSET DATA REGENERATION (per chain) ===\n\nAfter integrating each chain, run a partial assets data regen to populate the token list.\n\nFILE 1 (CREATE): scripts/generateAssetData/\u003cchainname\u003e/index.ts\n Pattern (identical for all EVM chains):\n import { \u003cchainname\u003eChainId } from '@shapeshiftoss/caip'\n import type { Asset } from '@shapeshiftoss/types'\n import { \u003cchainname\u003e, unfreeze } from '@shapeshiftoss/utils'\n import * as coingecko from '../coingecko'\n export const getAssets = async (): Promise\u003cAsset[]\u003e =\u003e {\n const assets = await coingecko.getAssets(\u003cchainname\u003eChainId)\n return [...assets, unfreeze(\u003cchainname\u003e)]\n }\n\nFILE 2 (MODIFY): scripts/generateAssetData/coingecko.ts\n - Import \u003cchainname\u003eChainId from @shapeshiftoss/caip\n - Import \u003cchainname\u003e native asset from @shapeshiftoss/utils\n - Add case in the switch: case \u003cchainname\u003eChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, category: adapters.chainIdToCoingeckoAssetPlatform(chainId), explorer/explorerAddressLink/explorerTxLink from \u003cchainname\u003e utils }\n - NOTE: chains not on CoinGecko will only have the native asset (no ERC20 token list)\n\nFILE 3 (MODIFY): scripts/generateAssetData/generateAssetData.ts\n - Import: import * as \u003cchainname\u003e from './\u003cchainname\u003e'\n - Call: const \u003cchainname\u003eAssets = await \u003cchainname\u003e.getAssets()\n - Spread into unfilteredAssetData: ...\u003cchainname\u003eAssets\n\nCOMMAND: yarn generate:asset-data\n This regenerates: src/generated/asset-data.json + related-asset-index + manifest + compressed assets\n\n=== DRAFT PR CREATION (final step per chain) ===\n\nAfter all code changes are complete for a chain, open a draft PR using the repo template.\n\nBRANCH NAMING: feat/integrate-\u003cchainname\u003e-relay (e.g. feat/integrate-scroll-relay)\n\nCOMMAND:\n gh pr create --draft --title 'feat: integrate \u003cChainName\u003e (chainId: \u003cid\u003e) via Relay' --body \"$(cat \u003c\u003c'PREOF'\n ## Description\n\n Add \u003cChainName\u003e (chainId: \u003cid\u003e) as a second-class EVM chain in ShapeShift Web with Relay bridge support.\n\n **Changes:**\n - Plugin registration in src/plugins/\u003cchainname\u003e/\n - Feature flag `\u003cChainName\u003e` in preferencesSlice\n - Relay swapper chain mapping in RelaySwapper/constant.ts\n - Asset data generation via CoinGecko (`\u003ccoingecko_platform_id\u003e`)\n - Environment config for RPC URL\n\n **Chain details:**\n - TVL: \u003ctvl\u003e\n - Native token: \u003ctoken\u003e (18 decimals)\n - Architecture: \u003carch_type\u003e\n - RPC: \u003crpc_url\u003e\n - Explorer: \u003cexplorer_url\u003e\n\n ## Issue (if applicable)\n\n Part of #11902\n\n ## Risk\n\n Low risk — new chain behind feature flag (`\u003cChainName\u003e`), no existing functionality affected.\n\n \u003e New chain plugin + Relay bridge mapping. No modifications to existing chain logic.\n\n ## Testing\n\n ### Engineering\n\n 1. Enable feature flag: set `VITE_FEATURE_\u003cCHAINNAME\u003e=true` in .env\n 2. Verify chain appears in supported chains list\n 3. Verify native token balance loads (connect wallet with \u003ctoken\u003e on \u003cChainName\u003e)\n 4. Verify Relay bridge quote works: bridge ETH from Ethereum → \u003cChainName\u003e\n 5. Run `yarn lint --fix \u0026\u0026 yarn type-check` — must pass\n\n ### Operations\n\n - [x] :checkered_flag: My feature is behind a flag and doesn't require operations testing (yet)\n\n ## Screenshots (if applicable)\n\n N/A — chain integration, no UI changes.\n PREOF\n )\"\n\nNOTE: Replace all \u003cplaceholders\u003e with actual chain values from the bead description/notes.\nNOTE: Use --draft flag to create as draft PR.\nNOTE: Branch off develop (main branch is develop, not main).", + "status": "open", + "priority": 0, + "issue_type": "epic", + "owner": "14963751+NeOMakinG@users.noreply.github.com", + "created_at": "2026-02-17T10:55:02Z", + "created_by": "NeOMakinG", + "updated_at": "2026-02-17T11:21:27Z", + "external_ref": "gh-11902", + "dependency_type": "parent-child" + } + ], + "parent": "ss-dx5" + } +] diff --git a/.claude/contracts/second-class-evm-chain.md b/.claude/contracts/second-class-evm-chain.md index 780d968611b..2ad9e6f310f 100644 --- a/.claude/contracts/second-class-evm-chain.md +++ b/.claude/contracts/second-class-evm-chain.md @@ -37,6 +37,7 @@ All integration points required when adding a new second-class EVM chain to Shap - `src/config.ts` - `VITE_FEATURE_` validation (`bool({ default: false })`) + `VITE__NODE_URL` validation (must use `url()`, NOT `str()`) - `src/test/mocks/store.ts` - Mock default - `src/vite-env.d.ts` - Type declarations + - **RPC URL research**: Check https://chainlist.org/chain/ for public RPC endpoints as a fallback when official docs don't provide one. Always verify the endpoint works with `curl -s -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'` before committing. Avoid endpoints requiring API keys in `.env.development`. - `.env` - Production default (usually `false`) - `.env.development` - Dev default (usually `true`) diff --git a/.env b/.env index 24f84f1d39f..3ac0907bb35 100644 --- a/.env +++ b/.env @@ -162,6 +162,7 @@ VITE_MEGAETH_NODE_URL=https://mainnet.megaeth.com/rpc VITE_LINEA_NODE_URL=https://rpc.linea.build VITE_SCROLL_NODE_URL=https://rpc.scroll.io/ VITE_KATANA_NODE_URL=https://rpc.katana.network +VITE_WORLDCHAIN_NODE_URL=https://worldchain-mainnet.g.alchemy.com/public VITE_HEMI_NODE_URL=https://rpc.hemi.network/rpc VITE_SONIC_NODE_URL=https://rpc.soniclabs.com VITE_UNICHAIN_NODE_URL=https://mainnet.unichain.org @@ -310,6 +311,7 @@ VITE_FEATURE_CETUS_SWAP=false VITE_FEATURE_SUNIO_SWAP=true VITE_FEATURE_MONAD=true VITE_FEATURE_PLASMA=true +VITE_FEATURE_WORLDCHAIN=false VITE_HYPEREVM_NODE_URL=https://rpc.hyperliquid.xyz/evm VITE_FEATURE_HYPEREVM=true VITE_FEATURE_MANTLE=false diff --git a/.env.development b/.env.development index 80b0c84acef..c75a9c2e353 100644 --- a/.env.development +++ b/.env.development @@ -61,6 +61,7 @@ VITE_BASE_NODE_URL=https://dev-api.base.shapeshift.com/api/v1/jsonrpc VITE_MONAD_NODE_URL=https://rpc.monad.xyz VITE_PLASMA_NODE_URL=https://rpc.plasma.to VITE_KATANA_NODE_URL=https://rpc.katana.network +VITE_WORLDCHAIN_NODE_URL=https://worldchain-mainnet.g.alchemy.com/public VITE_HEMI_NODE_URL=https://rpc.hemi.network/rpc VITE_SONIC_NODE_URL=https://rpc.soniclabs.com VITE_UNICHAIN_NODE_URL=https://mainnet.unichain.org @@ -114,6 +115,7 @@ VITE_FEATURE_LINEA=true VITE_FEATURE_BERACHAIN=true VITE_FEATURE_SCROLL=true VITE_FEATURE_KATANA=true +VITE_FEATURE_WORLDCHAIN=true VITE_FEATURE_HEMI=true VITE_FEATURE_SONIC=true VITE_FEATURE_UNICHAIN=true diff --git a/headers/csps/chains/worldchain.ts b/headers/csps/chains/worldchain.ts new file mode 100644 index 00000000000..91d48b5ebee --- /dev/null +++ b/headers/csps/chains/worldchain.ts @@ -0,0 +1,10 @@ +import { loadEnv } from 'vite' + +import type { Csp } from '../../types' + +const mode = process.env.MODE ?? process.env.NODE_ENV ?? 'development' +const env = loadEnv(mode, process.cwd(), '') + +export const csp: Csp = { + 'connect-src': [env.VITE_WORLDCHAIN_NODE_URL], +} diff --git a/headers/csps/index.ts b/headers/csps/index.ts index 5718262fed2..52a6d2be965 100644 --- a/headers/csps/index.ts +++ b/headers/csps/index.ts @@ -42,6 +42,7 @@ import { csp as thorchain } from './chains/thorchain' import { csp as ton } from './chains/ton' import { csp as tron } from './chains/tron' import { csp as unichain } from './chains/unichain' +import { csp as worldchain } from './chains/worldchain' import { csp as zcash } from './chains/zcash' import { csp as chatwoot } from './chatwoot' import { csp as customTokenImport } from './customTokenImport' @@ -154,6 +155,7 @@ export const csps = [ monad, near, plasma, + worldchain, sonic, trustwallet, coincap, diff --git a/packages/caip/src/adapters/coingecko/generated/eip155_480/adapter.json b/packages/caip/src/adapters/coingecko/generated/eip155_480/adapter.json new file mode 100644 index 00000000000..d089b92f6ea --- /dev/null +++ b/packages/caip/src/adapters/coingecko/generated/eip155_480/adapter.json @@ -0,0 +1 @@ +{"eip155:480/slip44:60":"ethereum"} \ No newline at end of file diff --git a/packages/caip/src/adapters/coingecko/generated/index.ts b/packages/caip/src/adapters/coingecko/generated/index.ts index e5e36aeb5d7..9244efb23f7 100644 --- a/packages/caip/src/adapters/coingecko/generated/index.ts +++ b/packages/caip/src/adapters/coingecko/generated/index.ts @@ -14,6 +14,7 @@ import monad from "./eip155_143/adapter.json"; import hyperevm from "./eip155_999/adapter.json"; import plasma from "./eip155_9745/adapter.json"; import katana from "./eip155_747474/adapter.json"; +import worldchain from "./eip155_480/adapter.json"; import hemi from "./eip155_43111/adapter.json"; import linea from "./eip155_59144/adapter.json"; import bob from "./eip155_60808/adapter.json"; @@ -56,6 +57,7 @@ export { hyperevm, plasma, katana, + worldchain, hemi, linea, mode, diff --git a/packages/caip/src/adapters/coingecko/index.test.ts b/packages/caip/src/adapters/coingecko/index.test.ts index 1681ef517d2..59f5afd48fb 100644 --- a/packages/caip/src/adapters/coingecko/index.test.ts +++ b/packages/caip/src/adapters/coingecko/index.test.ts @@ -63,6 +63,12 @@ describe('adapters:coingecko', () => { assetNamespace: 'slip44', assetReference: ASSET_REFERENCE.MegaEth, }) + const ethOnWorldChain = toAssetId({ + chainNamespace, + chainReference: CHAIN_REFERENCE.WorldChainMainnet, + assetNamespace: 'slip44', + assetReference: ASSET_REFERENCE.WorldChain, + }) const ethOnHemi = toAssetId({ chainNamespace, chainReference: CHAIN_REFERENCE.HemiMainnet, @@ -117,6 +123,7 @@ describe('adapters:coingecko', () => { ethOnArbitrum, ethOnBase, ethOnBob, + ethOnWorldChain, ethOnHemi, ethOnLinea, ethOnMode, diff --git a/packages/caip/src/adapters/coingecko/index.ts b/packages/caip/src/adapters/coingecko/index.ts index 43c5b3fae45..cb867ae4866 100644 --- a/packages/caip/src/adapters/coingecko/index.ts +++ b/packages/caip/src/adapters/coingecko/index.ts @@ -41,6 +41,7 @@ import { tonChainId, tronChainId, unichainChainId, + worldChainChainId, } from '../../constants' import * as adapters from './generated' @@ -64,6 +65,7 @@ export enum CoingeckoAssetPlatform { Plasma = 'plasma', Ink = 'ink', Katana = 'katana', + WorldChain = 'world-chain', Hemi = 'hemi', Mantle = 'mantle', Linea = 'linea', @@ -136,6 +138,8 @@ export const chainIdToCoingeckoAssetPlatform = (chainId: ChainId): string => { return CoingeckoAssetPlatform.Plasma case CHAIN_REFERENCE.KatanaMainnet: return CoingeckoAssetPlatform.Katana + case CHAIN_REFERENCE.WorldChainMainnet: + return CoingeckoAssetPlatform.WorldChain case CHAIN_REFERENCE.HemiMainnet: return CoingeckoAssetPlatform.Hemi case CHAIN_REFERENCE.MantleMainnet: @@ -267,6 +271,8 @@ export const coingeckoAssetPlatformToChainId = ( return hyperEvmChainId case CoingeckoAssetPlatform.Plasma: return plasmaChainId + case CoingeckoAssetPlatform.WorldChain: + return worldChainChainId case CoingeckoAssetPlatform.Katana: return katanaChainId case CoingeckoAssetPlatform.Mantle: diff --git a/packages/caip/src/adapters/coingecko/utils.test.ts b/packages/caip/src/adapters/coingecko/utils.test.ts index 962e41eb815..fed51ad9618 100644 --- a/packages/caip/src/adapters/coingecko/utils.test.ts +++ b/packages/caip/src/adapters/coingecko/utils.test.ts @@ -176,6 +176,9 @@ describe('adapters:coingecko:utils', () => { 'eip155:9745': { 'eip155:9745/slip44:60': 'plasma', }, + 'eip155:480': { + 'eip155:480/slip44:60': 'ethereum', + }, 'eip155:4326': { 'eip155:4326/slip44:60': 'ethereum', }, diff --git a/packages/caip/src/adapters/coingecko/utils.ts b/packages/caip/src/adapters/coingecko/utils.ts index 799fe251762..5ff26fd8c0d 100644 --- a/packages/caip/src/adapters/coingecko/utils.ts +++ b/packages/caip/src/adapters/coingecko/utils.ts @@ -77,6 +77,8 @@ import { tronChainId, unichainAssetId, unichainChainId, + worldChainAssetId, + worldChainChainId, zecChainId, } from '../../constants' import { @@ -299,6 +301,20 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { } } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.WorldChain)) { + try { + const assetId = toAssetId({ + chainNamespace: CHAIN_NAMESPACE.Evm, + chainReference: CHAIN_REFERENCE.WorldChainMainnet, + assetNamespace: 'erc20', + assetReference: platforms[CoingeckoAssetPlatform.WorldChain], + }) + prev[worldChainChainId][assetId] = id + } catch { + // unable to create assetId, skip token + } + } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.Mantle)) { try { const assetId = toAssetId({ @@ -558,6 +574,7 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { [berachainChainId]: { [berachainAssetId]: 'berachain-bera' }, [cronosChainId]: { [cronosAssetId]: 'crypto-com-chain' }, [katanaChainId]: { [katanaAssetId]: 'katana' }, + [worldChainChainId]: { [worldChainAssetId]: 'ethereum' }, [hemiChainId]: { [hemiAssetId]: 'ethereum' }, [scrollChainId]: { [scrollAssetId]: 'ethereum' }, [sonicChainId]: { [sonicAssetId]: 'sonic-3' }, diff --git a/packages/caip/src/constants.ts b/packages/caip/src/constants.ts index 8dfa5611936..278638f6e88 100644 --- a/packages/caip/src/constants.ts +++ b/packages/caip/src/constants.ts @@ -21,6 +21,7 @@ export const plasmaAssetId: AssetId = 'eip155:9745/slip44:60' export const mantleAssetId: AssetId = 'eip155:5000/slip44:60' export const inkAssetId: AssetId = 'eip155:57073/slip44:60' export const megaethAssetId: AssetId = 'eip155:4326/slip44:60' +export const worldChainAssetId: AssetId = 'eip155:480/slip44:60' export const berachainAssetId: AssetId = 'eip155:80094/slip44:60' export const cronosAssetId: AssetId = 'eip155:25/slip44:60' export const katanaAssetId: AssetId = 'eip155:747474/slip44:60' @@ -94,6 +95,7 @@ export const plasmaChainId: ChainId = 'eip155:9745' export const mantleChainId: ChainId = 'eip155:5000' export const inkChainId: ChainId = 'eip155:57073' export const megaethChainId: ChainId = 'eip155:4326' +export const worldChainChainId: ChainId = 'eip155:480' export const berachainChainId: ChainId = 'eip155:80094' export const cronosChainId: ChainId = 'eip155:25' export const katanaChainId: ChainId = 'eip155:747474' @@ -158,6 +160,7 @@ export const CHAIN_REFERENCE = { MantleMainnet: '5000', // https://chainlist.org/chain/5000 InkMainnet: '57073', MegaEthMainnet: '4326', + WorldChainMainnet: '480', // https://worldscan.org BerachainMainnet: '80094', CronosMainnet: '25', KatanaMainnet: '747474', // https://docs.katana.network @@ -218,6 +221,7 @@ export const ASSET_REFERENCE = { Berachain: '60', // evm chain which uses ethereum derivation path as common practice Cronos: '60', // evm chain which uses ethereum derivation path as common practice Katana: '60', // evm chain which uses ethereum derivation path as common practice + WorldChain: '60', // evm chain which uses ethereum derivation path as common practice Hemi: '60', // evm chain which uses ethereum derivation path as common practice Linea: '60', // evm chain which uses ethereum derivation path as common practice Scroll: '60', // evm chain which uses ethereum derivation path as common practice @@ -260,6 +264,7 @@ export const VALID_CHAIN_IDS: ValidChainMap = Object.freeze({ CHAIN_REFERENCE.BerachainMainnet, CHAIN_REFERENCE.CronosMainnet, CHAIN_REFERENCE.KatanaMainnet, + CHAIN_REFERENCE.WorldChainMainnet, CHAIN_REFERENCE.HemiMainnet, CHAIN_REFERENCE.LineaMainnet, CHAIN_REFERENCE.ScrollMainnet, @@ -340,4 +345,8 @@ export const FEE_ASSET_IDS = [ starknetAssetId, tonAssetId, zecAssetId, + hyperEvmAssetId, + plasmaAssetId, + worldChainAssetId, + katanaAssetId, ] diff --git a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts index 9129e63d418..2efa2fa9227 100644 --- a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts +++ b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts @@ -33,6 +33,7 @@ import { supportsSoneium, supportsSonic, supportsUnichain, + supportsWorldChain, } from '@shapeshiftoss/hdwallet-core' import type { Bip44Params, EvmChainId, RootBip44Params } from '@shapeshiftoss/types' import { KnownChainIds } from '@shapeshiftoss/types' @@ -104,6 +105,7 @@ export const evmChainIds = [ KnownChainIds.BerachainMainnet, KnownChainIds.CronosMainnet, KnownChainIds.KatanaMainnet, + KnownChainIds.WorldChainMainnet, KnownChainIds.HemiMainnet, KnownChainIds.LineaMainnet, KnownChainIds.ScrollMainnet, @@ -224,6 +226,8 @@ export abstract class EvmBaseAdapter implements IChainAdap return supportsCronos(wallet) case Number(fromChainId(KnownChainIds.KatanaMainnet).chainReference): return supportsKatana(wallet) + case Number(fromChainId(KnownChainIds.WorldChainMainnet).chainReference): + return supportsWorldChain(wallet) case Number(fromChainId(KnownChainIds.HemiMainnet).chainReference): return supportsHemi(wallet) case Number(fromChainId(KnownChainIds.LineaMainnet).chainReference): @@ -357,6 +361,11 @@ export abstract class EvmBaseAdapter implements IChainAdap symbol: 'ETH', explorer: 'https://katanascan.com', }, + [KnownChainIds.WorldChainMainnet]: { + name: 'Ethereum', + symbol: 'ETH', + explorer: 'https://worldscan.org', + }, [KnownChainIds.HemiMainnet]: { name: 'Ether', symbol: 'ETH', diff --git a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts index d8c684822c1..de44aeef529 100644 --- a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts +++ b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts @@ -12,6 +12,7 @@ import { sonicChainId, toAssetId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import type { evm } from '@shapeshiftoss/common-api' import { MULTICALL3_CONTRACT, viemClientByChainId } from '@shapeshiftoss/contracts' @@ -58,6 +59,7 @@ const WRAPPED_NATIVE_CONTRACT_BY_CHAIN_ID: Partial> = { [modeChainId]: '0x4200000000000000000000000000000000000006', [soneiumChainId]: '0x4200000000000000000000000000000000000006', [hemiChainId]: '0x4200000000000000000000000000000000000006', + [worldChainChainId]: '0x4200000000000000000000000000000000000006', } const BATCH_SIZE = 500 diff --git a/packages/chain-adapters/src/evm/index.ts b/packages/chain-adapters/src/evm/index.ts index f206abbc964..117f013aba6 100644 --- a/packages/chain-adapters/src/evm/index.ts +++ b/packages/chain-adapters/src/evm/index.ts @@ -22,6 +22,7 @@ export * as megaeth from './megaeth' export * as berachain from './berachain' export * as cronos from './cronos' export * as katana from './katana' +export * as worldchain from './worldchain' export * as hemi from './hemi' export * as linea from './linea' export * as scroll from './scroll' diff --git a/packages/chain-adapters/src/evm/worldchain/WorldChainChainAdapter.ts b/packages/chain-adapters/src/evm/worldchain/WorldChainChainAdapter.ts new file mode 100644 index 00000000000..850d5012ea2 --- /dev/null +++ b/packages/chain-adapters/src/evm/worldchain/WorldChainChainAdapter.ts @@ -0,0 +1,57 @@ +import type { AssetId } from '@shapeshiftoss/caip' +import { ASSET_REFERENCE, worldChainAssetId } from '@shapeshiftoss/caip' +import type { RootBip44Params } from '@shapeshiftoss/types' +import { KnownChainIds } from '@shapeshiftoss/types' + +import { ChainAdapterDisplayName } from '../../types' +import type { TokenInfo } from '../SecondClassEvmAdapter' +import { SecondClassEvmAdapter } from '../SecondClassEvmAdapter' + +const SUPPORTED_CHAIN_IDS = [KnownChainIds.WorldChainMainnet] +const DEFAULT_CHAIN_ID = KnownChainIds.WorldChainMainnet + +export type ChainAdapterArgs = { + rpcUrl: string + getKnownTokens: () => TokenInfo[] +} + +export const isWorldChainChainAdapter = (adapter: unknown): adapter is ChainAdapter => { + return (adapter as ChainAdapter).getType() === KnownChainIds.WorldChainMainnet +} + +export class ChainAdapter extends SecondClassEvmAdapter { + public static readonly rootBip44Params: RootBip44Params = { + purpose: 44, + coinType: Number(ASSET_REFERENCE.WorldChain), + accountNumber: 0, + } + + constructor(args: ChainAdapterArgs) { + super({ + assetId: worldChainAssetId, + chainId: DEFAULT_CHAIN_ID, + rootBip44Params: ChainAdapter.rootBip44Params, + supportedChainIds: SUPPORTED_CHAIN_IDS, + rpcUrl: args.rpcUrl, + getKnownTokens: args.getKnownTokens, + }) + } + + getDisplayName() { + return ChainAdapterDisplayName.WorldChain + } + + getName() { + return 'WorldChain' + } + + getType(): KnownChainIds.WorldChainMainnet { + return KnownChainIds.WorldChainMainnet + } + + getFeeAssetId(): AssetId { + return this.assetId + } +} + +export type { TokenInfo } diff --git a/packages/chain-adapters/src/evm/worldchain/index.ts b/packages/chain-adapters/src/evm/worldchain/index.ts new file mode 100644 index 00000000000..067102b1ff7 --- /dev/null +++ b/packages/chain-adapters/src/evm/worldchain/index.ts @@ -0,0 +1 @@ +export * from './WorldChainChainAdapter' diff --git a/packages/chain-adapters/src/types.ts b/packages/chain-adapters/src/types.ts index 37717e7c1e9..99266c360a2 100644 --- a/packages/chain-adapters/src/types.ts +++ b/packages/chain-adapters/src/types.ts @@ -53,6 +53,7 @@ type ChainSpecificAccount = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.Account [KnownChainIds.CronosMainnet]: evm.Account [KnownChainIds.KatanaMainnet]: evm.Account + [KnownChainIds.WorldChainMainnet]: evm.Account [KnownChainIds.HemiMainnet]: evm.Account [KnownChainIds.LineaMainnet]: evm.Account [KnownChainIds.ScrollMainnet]: evm.Account @@ -117,6 +118,7 @@ type ChainSpecificFeeData = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.FeeData [KnownChainIds.CronosMainnet]: evm.FeeData [KnownChainIds.KatanaMainnet]: evm.FeeData + [KnownChainIds.WorldChainMainnet]: evm.FeeData [KnownChainIds.HemiMainnet]: evm.FeeData [KnownChainIds.LineaMainnet]: evm.FeeData [KnownChainIds.ScrollMainnet]: evm.FeeData @@ -214,6 +216,7 @@ export type ChainSignTx = { [KnownChainIds.BerachainMainnet]: ETHSignTx [KnownChainIds.CronosMainnet]: ETHSignTx [KnownChainIds.KatanaMainnet]: ETHSignTx + [KnownChainIds.WorldChainMainnet]: ETHSignTx [KnownChainIds.HemiMainnet]: ETHSignTx [KnownChainIds.LineaMainnet]: ETHSignTx [KnownChainIds.ScrollMainnet]: ETHSignTx @@ -283,6 +286,7 @@ export type ChainSpecificBuildTxData = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.BuildTxInput [KnownChainIds.CronosMainnet]: evm.BuildTxInput [KnownChainIds.KatanaMainnet]: evm.BuildTxInput + [KnownChainIds.WorldChainMainnet]: evm.BuildTxInput [KnownChainIds.HemiMainnet]: evm.BuildTxInput [KnownChainIds.LineaMainnet]: evm.BuildTxInput [KnownChainIds.ScrollMainnet]: evm.BuildTxInput @@ -402,6 +406,7 @@ type ChainSpecificGetFeeDataInput = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.GetFeeDataInput [KnownChainIds.CronosMainnet]: evm.GetFeeDataInput [KnownChainIds.KatanaMainnet]: evm.GetFeeDataInput + [KnownChainIds.WorldChainMainnet]: evm.GetFeeDataInput [KnownChainIds.HemiMainnet]: evm.GetFeeDataInput [KnownChainIds.LineaMainnet]: evm.GetFeeDataInput [KnownChainIds.ScrollMainnet]: evm.GetFeeDataInput @@ -486,6 +491,7 @@ export enum ChainAdapterDisplayName { Berachain = 'Berachain', Cronos = 'Cronos', Katana = 'Katana', + WorldChain = 'World Chain', Hemi = 'Hemi', Linea = 'Linea', Scroll = 'Scroll', diff --git a/packages/contracts/src/ethersProviderSingleton.ts b/packages/contracts/src/ethersProviderSingleton.ts index 1ecd2d39b17..51b7f0e0a31 100644 --- a/packages/contracts/src/ethersProviderSingleton.ts +++ b/packages/contracts/src/ethersProviderSingleton.ts @@ -42,6 +42,8 @@ export const rpcUrlByChainId = (chainId: EvmChainId): string => { return process.env.VITE_CRONOS_NODE_URL case KnownChainIds.KatanaMainnet: return process.env.VITE_KATANA_NODE_URL + case KnownChainIds.WorldChainMainnet: + return process.env.VITE_WORLDCHAIN_NODE_URL case KnownChainIds.HemiMainnet: return process.env.VITE_HEMI_NODE_URL case KnownChainIds.LineaMainnet: diff --git a/packages/contracts/src/viemClient.ts b/packages/contracts/src/viemClient.ts index 0a47197e2fa..1dc2cc83682 100644 --- a/packages/contracts/src/viemClient.ts +++ b/packages/contracts/src/viemClient.ts @@ -28,6 +28,7 @@ import { soneium, sonic, unichain, + worldchain, } from 'viem/chains' const megaeth = defineChain({ @@ -154,6 +155,11 @@ export const viemKatanaClient = createPublicClient({ transport: fallback([process.env.VITE_KATANA_NODE_URL].filter(Boolean).map(url => http(url))), }) as PublicClient +export const viemWorldChainClient = createPublicClient({ + chain: worldchain, + transport: fallback([process.env.VITE_WORLDCHAIN_NODE_URL].filter(Boolean).map(url => http(url))), +}) as PublicClient + export const viemHemiClient = createPublicClient({ chain: hemi, transport: fallback([process.env.VITE_HEMI_NODE_URL].filter(Boolean).map(url => http(url))), @@ -207,6 +213,7 @@ export const viemClientByChainId: Record = { [KnownChainIds.BerachainMainnet]: viemBerachainClient, [KnownChainIds.CronosMainnet]: viemCronosClient, [KnownChainIds.KatanaMainnet]: viemKatanaClient, + [KnownChainIds.WorldChainMainnet]: viemWorldChainClient, [KnownChainIds.HemiMainnet]: viemHemiClient, [KnownChainIds.LineaMainnet]: viemLineaClient, [KnownChainIds.ScrollMainnet]: viemScrollClient, @@ -235,6 +242,7 @@ export const viemNetworkIdByChainId: Record = { [KnownChainIds.BerachainMainnet]: berachain.id, [KnownChainIds.CronosMainnet]: cronos.id, [KnownChainIds.KatanaMainnet]: katana.id, + [KnownChainIds.WorldChainMainnet]: worldchain.id, [KnownChainIds.HemiMainnet]: hemi.id, [KnownChainIds.LineaMainnet]: linea.id, [KnownChainIds.ScrollMainnet]: scroll.id, @@ -263,6 +271,7 @@ export const viemClientByNetworkId: Record = { [berachain.id]: viemBerachainClient, [cronos.id]: viemCronosClient, [katana.id]: viemKatanaClient, + [worldchain.id]: viemWorldChainClient, [hemi.id]: viemHemiClient, [linea.id]: viemLineaClient, [scroll.id]: viemScrollClient, diff --git a/packages/hdwallet-coinbase/src/coinbase.ts b/packages/hdwallet-coinbase/src/coinbase.ts index 95bbd72913a..4807baa6c66 100644 --- a/packages/hdwallet-coinbase/src/coinbase.ts +++ b/packages/hdwallet-coinbase/src/coinbase.ts @@ -117,6 +117,7 @@ export class CoinbaseHDWallet implements core.HDWallet, core.ETHWallet { readonly _supportsMantle = false readonly _supportsInk = false readonly _supportsMegaEth = false + readonly _supportsWorldChain = false readonly _supportsHemi = false readonly _supportsBerachain = false readonly _supportsLinea = false diff --git a/packages/hdwallet-core/src/ethereum.ts b/packages/hdwallet-core/src/ethereum.ts index 819ba1cc0a6..ed885f5677e 100644 --- a/packages/hdwallet-core/src/ethereum.ts +++ b/packages/hdwallet-core/src/ethereum.ts @@ -215,6 +215,7 @@ export interface ETHWallet extends ETHWalletInfo, HDWallet { readonly _supportsMantle: boolean readonly _supportsInk: boolean readonly _supportsMegaEth: boolean + readonly _supportsWorldChain: boolean readonly _supportsHemi: boolean readonly _supportsBerachain: boolean readonly _supportsLinea: boolean diff --git a/packages/hdwallet-core/src/wallet.ts b/packages/hdwallet-core/src/wallet.ts index 7a125140c25..5a79e4a07ac 100644 --- a/packages/hdwallet-core/src/wallet.ts +++ b/packages/hdwallet-core/src/wallet.ts @@ -209,6 +209,10 @@ export function supportsMegaEth(wallet: HDWallet): wallet is ETHWallet { return isObject(wallet) && (wallet as any)._supportsMegaEth } +export function supportsWorldChain(wallet: HDWallet): wallet is ETHWallet { + return isObject(wallet) && (wallet as any)._supportsWorldChain +} + export function supportsHemi(wallet: HDWallet): wallet is ETHWallet { return isObject(wallet) && (wallet as any)._supportsHemi } diff --git a/packages/hdwallet-gridplus/src/gridplus.ts b/packages/hdwallet-gridplus/src/gridplus.ts index aef1212675a..5c5df98bb3b 100644 --- a/packages/hdwallet-gridplus/src/gridplus.ts +++ b/packages/hdwallet-gridplus/src/gridplus.ts @@ -370,6 +370,7 @@ export class GridPlusHDWallet readonly _supportsMantle = true readonly _supportsInk = true readonly _supportsMegaEth = true + readonly _supportsWorldChain = true readonly _supportsHemi = true readonly _supportsBerachain = true readonly _supportsLinea = true diff --git a/packages/hdwallet-keepkey/src/keepkey.ts b/packages/hdwallet-keepkey/src/keepkey.ts index 94c8b850807..a8e74627f43 100644 --- a/packages/hdwallet-keepkey/src/keepkey.ts +++ b/packages/hdwallet-keepkey/src/keepkey.ts @@ -559,6 +559,7 @@ export class KeepKeyHDWallet readonly _supportsMantle = false readonly _supportsInk = false readonly _supportsMegaEth = false + readonly _supportsWorldChain = false readonly _supportsHemi = false readonly _supportsBerachain = false readonly _supportsLinea = false diff --git a/packages/hdwallet-ledger/src/ledger.ts b/packages/hdwallet-ledger/src/ledger.ts index 6055df4678b..a4a9cf1405d 100644 --- a/packages/hdwallet-ledger/src/ledger.ts +++ b/packages/hdwallet-ledger/src/ledger.ts @@ -436,6 +436,7 @@ export class LedgerHDWallet readonly _supportsMantle = true readonly _supportsInk = true readonly _supportsMegaEth = true + readonly _supportsWorldChain = true readonly _supportsHemi = true readonly _supportsBerachain = true readonly _supportsLinea = true diff --git a/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts b/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts index 7c8c1085515..183d90307f2 100644 --- a/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts +++ b/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts @@ -286,6 +286,7 @@ export class MetaMaskMultiChainHDWallet readonly _supportsMantle = true readonly _supportsInk = true readonly _supportsMegaEth = true + readonly _supportsWorldChain = true readonly _supportsHemi = true readonly _supportsBerachain = true readonly _supportsLinea = true diff --git a/packages/hdwallet-native/src/ethereum.ts b/packages/hdwallet-native/src/ethereum.ts index 07639e05d0b..8ea467f552b 100644 --- a/packages/hdwallet-native/src/ethereum.ts +++ b/packages/hdwallet-native/src/ethereum.ts @@ -75,6 +75,7 @@ export function MixinNativeETHWallet = { 999: hyperEvm, 8453: base, 9745: plasma, + 480: worldchain, 42161: arbitrum, 43114: avalanche, 747474: katana, diff --git a/packages/swap-widget/src/config/appkit.ts b/packages/swap-widget/src/config/appkit.ts index b69e007878f..91ecb38f053 100644 --- a/packages/swap-widget/src/config/appkit.ts +++ b/packages/swap-widget/src/config/appkit.ts @@ -13,6 +13,7 @@ import { plasma, polygon, solana, + worldchain, } from '@reown/appkit/networks' import { createAppKit } from '@reown/appkit/react' import { BitcoinAdapter } from '@reown/appkit-adapter-bitcoin' @@ -32,6 +33,7 @@ export const EVM_NETWORKS = [ monad, hyperEvm, plasma, + worldchain, katana, ] as const diff --git a/packages/swap-widget/src/constants/chains.ts b/packages/swap-widget/src/constants/chains.ts index d41d66db074..9d14daf6339 100644 --- a/packages/swap-widget/src/constants/chains.ts +++ b/packages/swap-widget/src/constants/chains.ts @@ -20,6 +20,7 @@ import { polygon, solana, thorchain, + worldchain, } from '@shapeshiftoss/utils' import type { ChainId } from '../types' @@ -36,6 +37,7 @@ const BASE_ASSETS_BY_CHAIN_ID: Record = { [monad.chainId]: monad, [hyperevm.chainId]: hyperevm, [plasma.chainId]: plasma, + [worldchain.chainId]: worldchain, [katana.chainId]: katana, [bitcoin.chainId]: bitcoin, [bitcoincash.chainId]: bitcoincash, diff --git a/packages/swap-widget/src/types/index.ts b/packages/swap-widget/src/types/index.ts index fe5686b5b32..8d2487d3a29 100644 --- a/packages/swap-widget/src/types/index.ts +++ b/packages/swap-widget/src/types/index.ts @@ -24,6 +24,7 @@ import { polygonChainId, solanaChainId, thorchainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import type { TransactionData } from '@shapeshiftoss/types' import { BigAmount } from '@shapeshiftoss/utils' @@ -226,6 +227,7 @@ export const EVM_CHAIN_IDS = { monad: monadChainId, hyperEvm: hyperEvmChainId, plasma: plasmaChainId, + worldChain: worldChainChainId, katana: katanaChainId, } as const diff --git a/packages/swapper/src/swappers/AcrossSwapper/constant.ts b/packages/swapper/src/swappers/AcrossSwapper/constant.ts index 12312fbb560..1862d6d96a4 100644 --- a/packages/swapper/src/swappers/AcrossSwapper/constant.ts +++ b/packages/swapper/src/swappers/AcrossSwapper/constant.ts @@ -14,6 +14,7 @@ import { solanaChainId, soneiumChainId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import invert from 'lodash/invert' import { zeroAddress } from 'viem' @@ -32,6 +33,7 @@ import { polygon, soneium, unichain, + worldchain, } from 'viem/chains' import { TradeQuoteError } from '../../types' @@ -50,6 +52,7 @@ export const chainIdToAcrossChainId: Record = { [lineaChainId]: linea.id, [modeChainId]: mode.id, [plasmaChainId]: plasma.id, + [worldChainChainId]: worldchain.id, [unichainChainId]: unichain.id, [soneiumChainId]: soneium.id, // Across uses a custom Solana chain ID diff --git a/packages/swapper/src/swappers/RelaySwapper/constant.ts b/packages/swapper/src/swappers/RelaySwapper/constant.ts index 37a72d74fab..048712e3414 100644 --- a/packages/swapper/src/swappers/RelaySwapper/constant.ts +++ b/packages/swapper/src/swappers/RelaySwapper/constant.ts @@ -27,6 +27,7 @@ import { sonicChainId, tronChainId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import invert from 'lodash/invert' import { zeroAddress } from 'viem' @@ -55,6 +56,7 @@ import { soneium, sonic, unichain, + worldchain, } from 'viem/chains' import { TradeQuoteError } from '../../types' @@ -81,6 +83,7 @@ export const chainIdToRelayChainId = { [megaethChainId]: 4326, [plasmaChainId]: plasma.id, [katanaChainId]: katana.id, + [worldChainChainId]: worldchain.id, [hemiChainId]: hemi.id, [lineaChainId]: linea.id, [berachainChainId]: berachain.id, diff --git a/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts b/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts index 91da237e82d..2eb9ade4993 100644 --- a/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts +++ b/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts @@ -161,6 +161,11 @@ export const relayTokenToAssetId = (relayToken: RelayToken): AssetId => { assetReference: ASSET_REFERENCE.Katana, assetNamespace: ASSET_NAMESPACE.slip44, } + case CHAIN_REFERENCE.WorldChainMainnet: + return { + assetReference: ASSET_REFERENCE.WorldChain, + assetNamespace: ASSET_NAMESPACE.slip44, + } case CHAIN_REFERENCE.HemiMainnet: return { assetReference: ASSET_REFERENCE.Hemi, diff --git a/packages/types/src/base.ts b/packages/types/src/base.ts index bdb6688ef3c..c55f975c4b0 100644 --- a/packages/types/src/base.ts +++ b/packages/types/src/base.ts @@ -31,6 +31,7 @@ export enum KnownChainIds { BerachainMainnet = 'eip155:80094', CronosMainnet = 'eip155:25', KatanaMainnet = 'eip155:747474', + WorldChainMainnet = 'eip155:480', HemiMainnet = 'eip155:43111', LineaMainnet = 'eip155:59144', ScrollMainnet = 'eip155:534352', @@ -73,6 +74,7 @@ export type EvmChainId = | KnownChainIds.BerachainMainnet | KnownChainIds.CronosMainnet | KnownChainIds.KatanaMainnet + | KnownChainIds.WorldChainMainnet | KnownChainIds.HemiMainnet | KnownChainIds.LineaMainnet | KnownChainIds.ScrollMainnet diff --git a/packages/types/src/zerion.ts b/packages/types/src/zerion.ts index e8c401d8d1f..e3fad7da0db 100644 --- a/packages/types/src/zerion.ts +++ b/packages/types/src/zerion.ts @@ -25,6 +25,7 @@ import { suiChainId, tronChainId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' export const ZERION_CHAINS = [ @@ -42,6 +43,7 @@ export const ZERION_CHAINS = [ 'monad', 'sui', 'plasma', + 'world-chain', 'katana', 'hemi', 'mantle', @@ -75,6 +77,7 @@ export const ZERION_CHAINS_MAP: Record = { monad: monadChainId, sui: suiChainId, plasma: plasmaChainId, + 'world-chain': worldChainChainId, katana: katanaChainId, hemi: hemiChainId, mantle: mantleChainId, diff --git a/packages/utils/src/assetData/baseAssets.ts b/packages/utils/src/assetData/baseAssets.ts index 78aadf4d199..e78fbab6327 100644 --- a/packages/utils/src/assetData/baseAssets.ts +++ b/packages/utils/src/assetData/baseAssets.ts @@ -354,6 +354,23 @@ export const plasma: Readonly = Object.freeze({ relatedAssetKey: null, }) +export const worldchain: Readonly = Object.freeze({ + assetId: caip.worldChainAssetId, + chainId: caip.worldChainChainId, + name: 'Ethereum', + networkName: 'World Chain', + symbol: 'ETH', + precision: 18, + color: '#000000', + networkColor: '#000000', + icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', + networkIcon: 'https://assets.relay.link/icons/480/light.png', + explorer: 'https://worldscan.org', + explorerAddressLink: 'https://worldscan.org/address/', + explorerTxLink: 'https://worldscan.org/tx/', + relatedAssetKey: 'eip155:1/slip44:60', +}) + export const mantle: Readonly = Object.freeze({ assetId: caip.mantleAssetId, chainId: caip.mantleChainId, diff --git a/packages/utils/src/assetData/getBaseAsset.ts b/packages/utils/src/assetData/getBaseAsset.ts index d67ecab26b4..55fdfbfa32f 100644 --- a/packages/utils/src/assetData/getBaseAsset.ts +++ b/packages/utils/src/assetData/getBaseAsset.ts @@ -42,6 +42,7 @@ import { ton, tron, unichainChain, + worldchain, zcash, } from './baseAssets' @@ -104,6 +105,8 @@ export const getBaseAsset = (chainId: ChainId): Readonly => { return cronos case KnownChainIds.KatanaMainnet: return katana + case KnownChainIds.WorldChainMainnet: + return worldchain case KnownChainIds.HemiMainnet: return hemi case KnownChainIds.LineaMainnet: diff --git a/packages/utils/src/chainIdToFeeAssetId.ts b/packages/utils/src/chainIdToFeeAssetId.ts index 2664ba71f59..c8d0f733a6d 100644 --- a/packages/utils/src/chainIdToFeeAssetId.ts +++ b/packages/utils/src/chainIdToFeeAssetId.ts @@ -38,6 +38,7 @@ import { tonAssetId, tronAssetId, unichainAssetId, + worldChainAssetId, zecAssetId, } from '@shapeshiftoss/caip' import { KnownChainIds } from '@shapeshiftoss/types' @@ -103,6 +104,8 @@ export const chainIdToFeeAssetId = (_chainId: ChainId): AssetId => { return cronosAssetId case KnownChainIds.KatanaMainnet: return katanaAssetId + case KnownChainIds.WorldChainMainnet: + return worldChainAssetId case KnownChainIds.HemiMainnet: return hemiAssetId case KnownChainIds.LineaMainnet: diff --git a/packages/utils/src/getAssetNamespaceFromChainId.ts b/packages/utils/src/getAssetNamespaceFromChainId.ts index a7a5670f243..12c5e0f7679 100644 --- a/packages/utils/src/getAssetNamespaceFromChainId.ts +++ b/packages/utils/src/getAssetNamespaceFromChainId.ts @@ -31,6 +31,7 @@ export const getAssetNamespaceFromChainId = (chainId: KnownChainIds): AssetNames case KnownChainIds.BerachainMainnet: case KnownChainIds.CronosMainnet: case KnownChainIds.KatanaMainnet: + case KnownChainIds.WorldChainMainnet: case KnownChainIds.HemiMainnet: case KnownChainIds.LineaMainnet: case KnownChainIds.ScrollMainnet: diff --git a/packages/utils/src/getChainShortName.ts b/packages/utils/src/getChainShortName.ts index 525b63a573a..18fcaba2d48 100644 --- a/packages/utils/src/getChainShortName.ts +++ b/packages/utils/src/getChainShortName.ts @@ -60,6 +60,8 @@ export const getChainShortName = (chainId: KnownChainIds) => { return 'CRO' case KnownChainIds.KatanaMainnet: return 'KAT' + case KnownChainIds.WorldChainMainnet: + return 'WLD' case KnownChainIds.HemiMainnet: return 'HEM' case KnownChainIds.LineaMainnet: diff --git a/packages/utils/src/getNativeFeeAssetReference.ts b/packages/utils/src/getNativeFeeAssetReference.ts index 4a614d3200c..6f0e2676db2 100644 --- a/packages/utils/src/getNativeFeeAssetReference.ts +++ b/packages/utils/src/getNativeFeeAssetReference.ts @@ -58,6 +58,8 @@ export const getNativeFeeAssetReference = ( return ASSET_REFERENCE.Cronos case CHAIN_REFERENCE.KatanaMainnet: return ASSET_REFERENCE.Katana + case CHAIN_REFERENCE.WorldChainMainnet: + return ASSET_REFERENCE.WorldChain case CHAIN_REFERENCE.HemiMainnet: return ASSET_REFERENCE.Hemi case CHAIN_REFERENCE.LineaMainnet: diff --git a/public/generated/asset-manifest.json b/public/generated/asset-manifest.json index 49fa553e6fc..767ea310a69 100644 --- a/public/generated/asset-manifest.json +++ b/public/generated/asset-manifest.json @@ -1,4 +1,4 @@ { - "assetData": "4c7a3031", - "relatedAssetIndex": "4422d243" + "assetData": "b529ca85", + "relatedAssetIndex": "0f36a022" } \ No newline at end of file diff --git a/public/generated/asset-manifest.json.br b/public/generated/asset-manifest.json.br index 015e07a4b89..d6dc9ab38ee 100644 Binary files a/public/generated/asset-manifest.json.br and b/public/generated/asset-manifest.json.br differ diff --git a/public/generated/asset-manifest.json.gz b/public/generated/asset-manifest.json.gz index 35462569206..e950dd097d6 100644 Binary files a/public/generated/asset-manifest.json.gz and b/public/generated/asset-manifest.json.gz differ diff --git a/public/generated/generatedAssetData.json b/public/generated/generatedAssetData.json index e0ddfdea8fd..1b15d4de88f 100644 --- a/public/generated/generatedAssetData.json +++ b/public/generated/generatedAssetData.json @@ -433160,6 +433160,386 @@ "explorerAddressLink": "https://explorer.hemi.xyz/address/", "explorerTxLink": "https://explorer.hemi.xyz/tx/", "relatedAssetKey": "eip155:1/slip44:60" + }, + "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3": { + "assetId": "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", + "chainId": "eip155:480", + "name": "Bridged Wrapped Bitcoin (Worldchain)", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/51159/large/wbtc_28.png?1730242311", + "symbol": "WBTC", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "eip155:480/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34": { + "assetId": "eip155:480/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", + "chainId": "eip155:480", + "name": "Reservoir rUSD", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54117/large/rusd_bera2.png?1738311629", + "symbol": "RUSD", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34" + }, + "eip155:480/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d": { + "assetId": "eip155:480/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d", + "chainId": "eip155:480", + "name": "Argentine Peso", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70846/large/world_logos_wars_logo_3.png?1764176749", + "symbol": "WARS", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d" + }, + "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282": { + "assetId": "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", + "chainId": "eip155:480", + "name": "Stargate Bridged USDT0", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/69528/large/usdt0.jpg?1758873945", + "symbol": "USDT0", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "eip155:480/erc20:0x12e96c2bfea6e835cf8dd38a5834fa61cf723736": { + "assetId": "eip155:480/erc20:0x12e96c2bfea6e835cf8dd38a5834fa61cf723736", + "chainId": "eip155:480", + "name": "Wrapped DOGE (Universal)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/40099/large/UA-DOGE_1.png?1725632510", + "symbol": "UDOGE", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22": { + "assetId": "eip155:480/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22", + "chainId": "eip155:480", + "name": "IDRX", + "precision": 2, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/34883/large/IDRX_BLUE_COIN_200x200.png?1734983273", + "symbol": "IDRX", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22" + }, + "eip155:480/erc20:0x1c60ba0a0ed1019e8eb035e6daf4155a5ce2380b": { + "assetId": "eip155:480/erc20:0x1c60ba0a0ed1019e8eb035e6daf4155a5ce2380b", + "chainId": "eip155:480", + "name": "EURC", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/26045/large/EURC.png?1769615705", + "symbol": "EURC", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:43114/erc20:0xc891eb4cbdeff6e073e859e987815ed1505c2acd" + }, + "eip155:480/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae": { + "assetId": "eip155:480/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae", + "chainId": "eip155:480", + "name": "Wrapped XRP (Universal)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/51658/large/UA-XRP_1.png?1731703523", + "symbol": "UXRP", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae" + }, + "eip155:480/erc20:0x2c537e5624e4af88a7ae4060c022609376c8d0eb": { + "assetId": "eip155:480/erc20:0x2c537e5624e4af88a7ae4060c022609376c8d0eb", + "chainId": "eip155:480", + "name": "BiLira", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/10119/large/JBs9jiXO_400x400.jpg?1696510144", + "symbol": "TRYB", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:43114/erc20:0x564a341df6c126f90cf3ecb92120fd7190acb401" + }, + "eip155:480/erc20:0x2cfc85d8e48f8eab294be644d9e25c3030863003": { + "assetId": "eip155:480/erc20:0x2cfc85d8e48f8eab294be644d9e25c3030863003", + "chainId": "eip155:480", + "name": "Worldcoin", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31069/large/worldcoin.jpeg?1696529903", + "symbol": "WLD", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/erc20:0x163f8c2467924be0ae7b5347228cabf260318753" + }, + "eip155:480/erc20:0x337e7456b420bd3481e7fa61fa9850343d610d34": { + "assetId": "eip155:480/erc20:0x337e7456b420bd3481e7fa61fa9850343d610d34", + "chainId": "eip155:480", + "name": "Mexican Peso", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70880/large/wmxn_logo_1.png?1764392404", + "symbol": "WMXN", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368": { + "assetId": "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "chainId": "eip155:480", + "name": "Wild Goat Coin", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/37966/large/wgcCoin-256px.png?1768798052", + "symbol": "WGC", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + }, + "eip155:480/erc20:0x4200000000000000000000000000000000000006": { + "assetId": "eip155:480/erc20:0x4200000000000000000000000000000000000006", + "chainId": "eip155:480", + "name": "Wrapped ETH (World Chain)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/50790/large/wETH_32.png?1729214345", + "symbol": "WETH", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x4809010926aec940b550d34a46a52739f996d75d": { + "assetId": "eip155:480/erc20:0x4809010926aec940b550d34a46a52739f996d75d", + "chainId": "eip155:480", + "name": "Wrapped Savings rUSD", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66163/large/wsrUSD.png?1748500965", + "symbol": "WSRUSD", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x4809010926aec940b550d34a46a52739f996d75d" + }, + "eip155:480/erc20:0x4f34c8b3b5fb6d98da888f0fea543d4d9c9f2ebe": { + "assetId": "eip155:480/erc20:0x4f34c8b3b5fb6d98da888f0fea543d4d9c9f2ebe", + "chainId": "eip155:480", + "name": "Peruvian Sol", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70975/large/wpen_logo_1.png?1764954695", + "symbol": "WPEN", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x61d450a098b6a7f69fc4b98ce68198fe59768651": { + "assetId": "eip155:480/erc20:0x61d450a098b6a7f69fc4b98ce68198fe59768651", + "chainId": "eip155:480", + "name": "Chilean Peso", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70976/large/wclp_logo_1.png?1764954870", + "symbol": "WCLP", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x6770a7133bd0d74f95e4c9e9b7735bb4cd5653a6": { + "assetId": "eip155:480/erc20:0x6770a7133bd0d74f95e4c9e9b7735bb4cd5653a6", + "chainId": "eip155:480", + "name": "World Cat", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/67236/large/worldcat-logo.jpg?1752144407", + "symbol": "WORLDCAT", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x6fb9df9530e302be9dc126363bd7529b807f7167": { + "assetId": "eip155:480/erc20:0x6fb9df9530e302be9dc126363bd7529b807f7167", + "chainId": "eip155:480", + "name": "CrazyFootball token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/69748/large/Logo.jpg?1759482957", + "symbol": "FOOTBALL", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x7047b80cb47527e864029d3cfe1899534dc15402": { + "assetId": "eip155:480/erc20:0x7047b80cb47527e864029d3cfe1899534dc15402", + "chainId": "eip155:480", + "name": "Bowser", + "precision": 9, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/50784/large/BOWSER_200.jpg?1729193270", + "symbol": "BOWSER", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x7077c71b4af70737a08287e279b717dcf64fdc57": { + "assetId": "eip155:480/erc20:0x7077c71b4af70737a08287e279b717dcf64fdc57", + "chainId": "eip155:480", + "name": "PoolTogether", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14003/large/PoolTogether.png?1696513732", + "symbol": "POOL", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xcf934e2402a5e072928a39a956964eb8f2b5b79c" + }, + "eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1": { + "assetId": "eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1", + "chainId": "eip155:480", + "name": "USDC", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/6319/large/USDC.png?1769615602", + "symbol": "USDC", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "eip155:480/erc20:0x8a1d45e102e886510e891d2ec656a708991e2d76": { + "assetId": "eip155:480/erc20:0x8a1d45e102e886510e891d2ec656a708991e2d76", + "chainId": "eip155:480", + "name": "Colombian Peso", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70887/large/wcop_logo_1.png?1764394538", + "symbol": "WCOP", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0x915b648e994d5f31059b38223b9fbe98ae185473": { + "assetId": "eip155:480/erc20:0x915b648e994d5f31059b38223b9fbe98ae185473", + "chainId": "eip155:480", + "name": "Chainlink", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/877/large/Chainlink_Logo_500.png?1760023405", + "symbol": "LINK", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xf97f4df75117a78c1a5a0dbb814af92458539fb4" + }, + "eip155:480/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55": { + "assetId": "eip155:480/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", + "chainId": "eip155:480", + "name": "Wrapped Solana (Universal)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39987/large/UA-SOL_1.png?1725027946", + "symbol": "USOL", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55" + }, + "eip155:480/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4": { + "assetId": "eip155:480/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4", + "chainId": "eip155:480", + "name": "Wrapped SUI (Universal)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/50482/large/UA-SUI-PAD.png?1727888681", + "symbol": "USUI", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:8453/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4" + }, + "eip155:480/erc20:0xcd1e32b86953d79a6ac58e813d2ea7a1790cab63": { + "assetId": "eip155:480/erc20:0xcd1e32b86953d79a6ac58e813d2ea7a1790cab63", + "chainId": "eip155:480", + "name": "ORO", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70441/large/oro.png?1762076294", + "symbol": "ORO", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0xd76f5faf6888e24d9f04bf92a0c8b921fe4390e0": { + "assetId": "eip155:480/erc20:0xd76f5faf6888e24d9f04bf92a0c8b921fe4390e0", + "chainId": "eip155:480", + "name": "Brazilian real", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70862/large/wbrl.png?1764272108", + "symbol": "WBRL", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/erc20:0xed49fe44fd4249a09843c2ba4bba7e50beca7113": { + "assetId": "eip155:480/erc20:0xed49fe44fd4249a09843c2ba4bba7e50beca7113", + "chainId": "eip155:480", + "name": "DNA Token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54349/large/DNA_Logo_200-200.png?1755931235", + "symbol": "DNA", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": null + }, + "eip155:480/slip44:60": { + "assetId": "eip155:480/slip44:60", + "chainId": "eip155:480", + "name": "Ethereum", + "networkName": "World Chain", + "symbol": "ETH", + "precision": 18, + "color": "#000000", + "networkColor": "#000000", + "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", + "networkIcon": "https://assets.relay.link/icons/480/light.png", + "explorer": "https://worldscan.org", + "explorerAddressLink": "https://worldscan.org/address/", + "explorerTxLink": "https://worldscan.org/tx/", + "relatedAssetKey": "eip155:1/slip44:60" } }, "ids": [ @@ -464018,6 +464398,35 @@ "eip155:43111/erc20:0xbb0d083fb1be0a9f6157ec484b6c79e0a4e31c2e", "eip155:43111/erc20:0xc3eacf0612346366db554c991d7858716db09f58", "eip155:43111/erc20:0xf9775085d726e782e83585033b58606f7731ab18", - "eip155:43111/slip44:60" + "eip155:43111/slip44:60", + "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", + "eip155:480/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", + "eip155:480/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d", + "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", + "eip155:480/erc20:0x12e96c2bfea6e835cf8dd38a5834fa61cf723736", + "eip155:480/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22", + "eip155:480/erc20:0x1c60ba0a0ed1019e8eb035e6daf4155a5ce2380b", + "eip155:480/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae", + "eip155:480/erc20:0x2c537e5624e4af88a7ae4060c022609376c8d0eb", + "eip155:480/erc20:0x2cfc85d8e48f8eab294be644d9e25c3030863003", + "eip155:480/erc20:0x337e7456b420bd3481e7fa61fa9850343d610d34", + "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "eip155:480/erc20:0x4200000000000000000000000000000000000006", + "eip155:480/erc20:0x4809010926aec940b550d34a46a52739f996d75d", + "eip155:480/erc20:0x4f34c8b3b5fb6d98da888f0fea543d4d9c9f2ebe", + "eip155:480/erc20:0x61d450a098b6a7f69fc4b98ce68198fe59768651", + "eip155:480/erc20:0x6770a7133bd0d74f95e4c9e9b7735bb4cd5653a6", + "eip155:480/erc20:0x6fb9df9530e302be9dc126363bd7529b807f7167", + "eip155:480/erc20:0x7047b80cb47527e864029d3cfe1899534dc15402", + "eip155:480/erc20:0x7077c71b4af70737a08287e279b717dcf64fdc57", + "eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1", + "eip155:480/erc20:0x8a1d45e102e886510e891d2ec656a708991e2d76", + "eip155:480/erc20:0x915b648e994d5f31059b38223b9fbe98ae185473", + "eip155:480/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", + "eip155:480/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4", + "eip155:480/erc20:0xcd1e32b86953d79a6ac58e813d2ea7a1790cab63", + "eip155:480/erc20:0xd76f5faf6888e24d9f04bf92a0c8b921fe4390e0", + "eip155:480/erc20:0xed49fe44fd4249a09843c2ba4bba7e50beca7113", + "eip155:480/slip44:60" ] } \ No newline at end of file diff --git a/public/generated/generatedAssetData.json.br b/public/generated/generatedAssetData.json.br index cb0ab7e1dde..2fed7616401 100644 Binary files a/public/generated/generatedAssetData.json.br and b/public/generated/generatedAssetData.json.br differ diff --git a/public/generated/generatedAssetData.json.gz b/public/generated/generatedAssetData.json.gz index 94cb1430ecf..d6b46664019 100644 Binary files a/public/generated/generatedAssetData.json.gz and b/public/generated/generatedAssetData.json.gz differ diff --git a/public/generated/relatedAssetIndex.json b/public/generated/relatedAssetIndex.json index 7a82a29b548..dbcc659e5e9 100644 --- a/public/generated/relatedAssetIndex.json +++ b/public/generated/relatedAssetIndex.json @@ -495,7 +495,8 @@ "eip155:747474/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", "eip155:80094/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", "eip155:146/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", - "eip155:130/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34" + "eip155:130/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34", + "eip155:480/erc20:0x09d4214c03d01f49544c0448dbe3a27f768f2b34" ], "eip155:42161/erc20:0x8d9ba570d6cb60c7e3e0f31343efe75ab8e65fb1": [ "eip155:43114/erc20:0x321e7092a180bb43555132ec53aaa65a5bf84251", @@ -586,7 +587,8 @@ "eip155:137/erc20:0x25788a1a171ec66da6502f9975a15b609ff54cf6", "eip155:100/erc20:0x216a7d520992ed198593a16e0b17c784c9cdc660", "eip155:42161/erc20:0xcf934e2402a5e072928a39a956964eb8f2b5b79c", - "eip155:534352/erc20:0xf9af83fc41e0cc2af2fba93644d542df6ea0f2b7" + "eip155:534352/erc20:0xf9af83fc41e0cc2af2fba93644d542df6ea0f2b7", + "eip155:480/erc20:0x7077c71b4af70737a08287e279b717dcf64fdc57" ], "eip155:1/erc20:0x0c90c57aaf95a3a87eadda6ec3974c99d786511f": [ "eip155:10/erc20:0x50bce64397c75488465253c0a034b8097fea6578", @@ -602,7 +604,8 @@ ], "eip155:8453/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d": [ "eip155:1/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d", - "eip155:8453/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d" + "eip155:8453/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d", + "eip155:480/erc20:0x0dc4f92879b7670e5f4e4e6e3c801d229129d90d" ], "eip155:42161/erc20:0x82e3a8f066a6989666b031d916c43672085b1582": [ "eip155:43114/erc20:0x9eaac1b23d935365bd7b542fe22ceee2922f52dc", @@ -956,7 +959,8 @@ ], "eip155:1/erc20:0x163f8c2467924be0ae7b5347228cabf260318753": [ "eip155:10/erc20:0xdc6ff44d5d932cbd77b52e5612ba0529dc6226f1", - "eip155:1/erc20:0x163f8c2467924be0ae7b5347228cabf260318753" + "eip155:1/erc20:0x163f8c2467924be0ae7b5347228cabf260318753", + "eip155:480/erc20:0x2cfc85d8e48f8eab294be644d9e25c3030863003" ], "eip155:56/erc20:0x3a9eed92422abdd7566fba8c34bb74b3f656dbb3": [ "eip155:1/erc20:0x14da230d6726c50f759bc1838717f8ce6373509c", @@ -1147,7 +1151,8 @@ "eip155:8453/erc20:0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42", "eip155:1/erc20:0x1abaea1f7c830bd89acc67ec4af516284b1bc33c", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr", - "eip155:43114/erc20:0xc891eb4cbdeff6e073e859e987815ed1505c2acd" + "eip155:43114/erc20:0xc891eb4cbdeff6e073e859e987815ed1505c2acd", + "eip155:480/erc20:0x1c60ba0a0ed1019e8eb035e6daf4155a5ce2380b" ], "eip155:42161/erc20:0x8d010bf9c26881788b4e6bf5fd1bdc358c8f90b8": [ "eip155:8453/erc20:0x8d010bf9c26881788b4e6bf5fd1bdc358c8f90b8", @@ -1431,7 +1436,8 @@ "eip155:60808/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", "eip155:34443/erc20:0xcdd475325d6f564d27247d1dddbb0dac6fa0a5cf", "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c", - "eip155:43111/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3" + "eip155:43111/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", + "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3" ], "eip155:8453/erc20:0xc5fed7c8ccc75d8a72b601a66dffd7a489073f0b": [ "eip155:56/erc20:0x6ef2ffb38d64afe18ce782da280b300e358cfeaf", @@ -1831,7 +1837,8 @@ "eip155:9745/erc20:0x90729a45948c3078890bc80f2a4e7870a2ea4c5e", "eip155:137/erc20:0x4fb71290ac171e1d144f7221d882becac7196eb5", "eip155:43114/erc20:0x564a341df6c126f90cf3ecb92120fd7190acb401", - "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:A94X2fRy3wydNShU4dRaDyap2UuoeWJGWyATtyp61WZf" + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:A94X2fRy3wydNShU4dRaDyap2UuoeWJGWyATtyp61WZf", + "eip155:480/erc20:0x2c537e5624e4af88a7ae4060c022609376c8d0eb" ], "eip155:56/erc20:0x976e33b07565b0c05b08b2e13affd3113e3d178d": [ "eip155:1/erc20:0x2d80f5f5328fdcb6eceb7cacf5dd8aedaec94e20", @@ -3143,7 +3150,8 @@ "eip155:130/erc20:0xef66491eab4bbb582c57b14778afd8dfb70d8a1a", "eip155:34443/erc20:0x183e3691eff3524b2315d3703d94f922cbe51f54", "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec", - "eip155:43111/erc20:0x63dbe12a6381d64ade47bc3d92abf4393dff4bc8" + "eip155:43111/erc20:0x63dbe12a6381d64ade47bc3d92abf4393dff4bc8", + "eip155:480/erc20:0x915b648e994d5f31059b38223b9fbe98ae185473" ], "eip155:42161/erc20:0x315a2dca4b1b633d3a707c71d96243534c02f7c4": [ "eip155:8453/erc20:0x78bb8ff6baa486c31ce0ef1a157798f7a606565c", @@ -6141,7 +6149,8 @@ "eip155:60808/erc20:0xe75d0fb2c24a55ca1e3f96781a2bcc7bdba058f0", "eip155:34443/erc20:0xd988097fb8612cc24eec14542bc03424c656005f", "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369", - "eip155:43111/erc20:0xad11a8beb98bbf61dbb1aa0f6d6f2ecd87b35afa" + "eip155:43111/erc20:0xad11a8beb98bbf61dbb1aa0f6d6f2ecd87b35afa", + "eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1" ], "eip155:8453/erc20:0x9c632e6aaa3ea73f91554f8a3cb2ed2f29605e0c": [ "eip155:56/erc20:0x7324c7c0d95cebc73eea7e85cbaac0dbdf88a05b", @@ -8146,7 +8155,8 @@ "eip155:42161/erc20:0x4809010926aec940b550d34a46a52739f996d75d", "eip155:747474/erc20:0x4809010926aec940b550d34a46a52739f996d75d", "eip155:146/erc20:0x4809010926aec940b550d34a46a52739f996d75d", - "eip155:130/erc20:0x4809010926aec940b550d34a46a52739f996d75d" + "eip155:130/erc20:0x4809010926aec940b550d34a46a52739f996d75d", + "eip155:480/erc20:0x4809010926aec940b550d34a46a52739f996d75d" ], "eip155:1/erc20:0xd457b379801433ea5c3a8542b61902023ae39dcd": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:XsicTFC7G68d74FaYDctWggkKDgkMx8LpNoFNr81TrF", @@ -8472,7 +8482,8 @@ "eip155:1868/erc20:0x3a337a6ada9d885b6ad95ec48f9b75f197b5ae35", "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", - "eip155:43111/erc20:0xbb0d083fb1be0a9f6157ec484b6c79e0a4e31c2e" + "eip155:43111/erc20:0xbb0d083fb1be0a9f6157ec484b6c79e0a4e31c2e", + "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282" ], "eip155:1/erc20:0xdb9783ca04bbd64fe2c6d7b9503a979b3de30729": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:XsAsZLF4MmsvS1sDxRMrUz7REjHfwbC9UAMXSRBqgEB", @@ -9677,7 +9688,8 @@ "eip155:60808/slip44:60", "eip155:34443/slip44:60", "eip155:1868/slip44:60", - "eip155:43111/slip44:60" + "eip155:43111/slip44:60", + "eip155:480/slip44:60" ], "eip155:8453/erc20:0x22a2488fe295047ba13bd8cccdbc8361dbd8cf7c": [ "eip155:10/erc20:0x1db2466d9f5e10d7090e7152b68d62703a2245f0", @@ -9801,7 +9813,8 @@ "eip155:100/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22", "eip155:8453/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22", "eip155:56/erc20:0x649a2da7b28e0d54c13d5eff95d3a660652742cc", - "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:idrxZcP8xiKkYk6XGD4uz1dxEYCWSgKDHqgjsBbwDur" + "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:idrxZcP8xiKkYk6XGD4uz1dxEYCWSgKDHqgjsBbwDur", + "eip155:480/erc20:0x18bc5bcc660cf2b9ce3cd51a404afe1a0cbd3c22" ], "eip155:42161/erc20:0x848e0ba28b637e8490d88bae51fa99c87116409b": [ "eip155:100/erc20:0x3a97704a1b25f08aa230ae53b352e2e72ef52843", @@ -10198,7 +10211,8 @@ "eip155:42161/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55": [ "eip155:8453/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", "eip155:42161/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", - "eip155:747474/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55" + "eip155:747474/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55", + "eip155:480/erc20:0x9b8df6e244526ab5f6e6400d331db28c8fdddb55" ], "eip155:42161/erc20:0x95146881b86b3ee99e63705ec87afe29fcc044d9": [ "eip155:43114/erc20:0xfd91ed44fc13f7faff758fe6d339d5790c4a85ec", @@ -11154,7 +11168,8 @@ ], "eip155:8453/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae": [ "eip155:42161/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae", - "eip155:8453/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae" + "eip155:8453/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae", + "eip155:480/erc20:0x2615a94df961278dcbc41fb0a54fec5f10a693ae" ], "eip155:8453/erc20:0x290f057a2c59b95d8027aa4abf31782676502071": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:3g7Lv7KKCXH6Hyb2vUKYmAFJvKgspWD3CER1NxAY71AR", @@ -11183,7 +11198,8 @@ "eip155:146/erc20:0xc53ac24320e3a54c7211e4993c8095078a0cb3cf", "eip155:130/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", "eip155:34443/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", - "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" ], "eip155:8453/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17": [ "eip155:137/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17", @@ -11331,7 +11347,8 @@ ], "eip155:8453/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4": [ "eip155:42161/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4", - "eip155:8453/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4" + "eip155:8453/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4", + "eip155:480/erc20:0xb0505e5a99abd03d94a1169e638b78edfed26ea4" ], "eip155:8453/erc20:0xb34457736aa191ff423f84f5d669f68b231e6c4e": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:6V1vZKRFfu6eimDNk6w4BzxR4UTYxJvt5emuJkxTcMJv", diff --git a/public/generated/relatedAssetIndex.json.br b/public/generated/relatedAssetIndex.json.br index 98b16fdf381..c4c97a8bf0d 100644 Binary files a/public/generated/relatedAssetIndex.json.br and b/public/generated/relatedAssetIndex.json.br differ diff --git a/public/generated/relatedAssetIndex.json.gz b/public/generated/relatedAssetIndex.json.gz index 848c68b6ec2..d93b9b09447 100644 Binary files a/public/generated/relatedAssetIndex.json.gz and b/public/generated/relatedAssetIndex.json.gz differ diff --git a/scripts/generateAssetData/coingecko.ts b/scripts/generateAssetData/coingecko.ts index e50b59e461d..ef728641433 100644 --- a/scripts/generateAssetData/coingecko.ts +++ b/scripts/generateAssetData/coingecko.ts @@ -34,6 +34,7 @@ import { tonChainId, tronChainId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { @@ -67,6 +68,7 @@ import { ton, tron, unichainChain, + worldchain, } from '@shapeshiftoss/utils' import axios from 'axios' @@ -205,6 +207,14 @@ export async function getAssets(chainId: ChainId): Promise { explorerAddressLink: megaeth.explorerAddressLink, explorerTxLink: megaeth.explorerTxLink, } + case worldChainChainId: + return { + assetNamespace: ASSET_NAMESPACE.erc20, + category: adapters.chainIdToCoingeckoAssetPlatform(chainId), + explorer: worldchain.explorer, + explorerAddressLink: worldchain.explorerAddressLink, + explorerTxLink: worldchain.explorerTxLink, + } case lineaChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, diff --git a/scripts/generateAssetData/generateAssetData.ts b/scripts/generateAssetData/generateAssetData.ts index c1d8e0711e7..2c03a315a6f 100644 --- a/scripts/generateAssetData/generateAssetData.ts +++ b/scripts/generateAssetData/generateAssetData.ts @@ -59,6 +59,7 @@ import * as tonModule from './ton' import * as tronModule from './tron' import * as unichain from './unichain' import { filterOutBlacklistedAssets, getSortedAssetIds } from './utils' +import * as worldchainModule from './worldchain' import { getAssetService } from '@/lib/asset-service' @@ -95,6 +96,7 @@ const generateAssetData = async () => { const scrollAssets = await scroll.getAssets() const modeAssets = await mode.getAssets() const plasmaAssets = await plasma.getAssets() + const worldchainAssets = await worldchainModule.getAssets() const sonicAssets = await sonic.getAssets() const soneiumAssets = await soneium.getAssets() const solanaAssets = await solana.getAssets() @@ -140,6 +142,7 @@ const generateAssetData = async () => { ...scrollAssets, ...modeAssets, ...plasmaAssets, + ...worldchainAssets, ...sonicAssets, ...soneiumAssets, ...solanaAssets, diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts index a40d0605805..6a7fd51cd18 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts @@ -22,6 +22,7 @@ import { sonicAssetId, starknetAssetId, unichainAssetId, + worldChainAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { createThrottle, isToken } from '@shapeshiftoss/utils' @@ -72,6 +73,7 @@ const manualRelatedAssetIndex: Record = { bobAssetId, modeAssetId, soneiumAssetId, + worldChainAssetId, ], [foxAssetId]: [foxOnArbitrumOneAssetId], [starknetAssetId]: [ @@ -92,6 +94,8 @@ const manualRelatedAssetIndex: Record = { 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f': [ 'eip155:59144/erc20:0x4af15ec2a0bd43db75dd04e62faa3b8ef36b00d5', ], + // CRO on Ethereum <-> CRO native on Cronos + 'eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b': ['eip155:25/slip44:60'], // Native chain tokens as keys (isPrimary=true) with their Ethereum ERC20 counterparts as values [sonicAssetId]: ['eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870'], [cronosAssetId]: ['eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b'], diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts index c463e7e7558..2bcf4c56c8f 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts @@ -22,6 +22,7 @@ import { sonicAssetId, starknetAssetId, unichainAssetId, + worldChainAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { createThrottle, isToken } from '@shapeshiftoss/utils' @@ -67,6 +68,7 @@ const manualRelatedAssetIndex: Record = { lineaAssetId, megaethAssetId, scrollAssetId, + worldChainAssetId, unichainAssetId, bobAssetId, modeAssetId, diff --git a/scripts/generateAssetData/worldchain/index.ts b/scripts/generateAssetData/worldchain/index.ts new file mode 100644 index 00000000000..566e5c56ba9 --- /dev/null +++ b/scripts/generateAssetData/worldchain/index.ts @@ -0,0 +1,11 @@ +import { worldChainChainId } from '@shapeshiftoss/caip' +import type { Asset } from '@shapeshiftoss/types' +import { unfreeze, worldchain } from '@shapeshiftoss/utils' + +import * as coingecko from '../coingecko' + +export const getAssets = async (): Promise => { + const assets = await coingecko.getAssets(worldChainChainId) + + return [...assets, unfreeze(worldchain)] +} diff --git a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx index 7a91e0e6f7d..bd7babb663b 100644 --- a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx +++ b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx @@ -23,6 +23,7 @@ import { thorchainAssetId, tronAssetId, unichainAssetId, + worldChainAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { useQuery } from '@tanstack/react-query' @@ -59,6 +60,7 @@ export const queryFn = async () => { if (enabledFlags.Ink) assetIds.push(inkAssetId) if (enabledFlags.Scroll) assetIds.push(scrollAssetId) if (enabledFlags.Katana) assetIds.push(katanaAssetId) + if (enabledFlags.WorldChain) assetIds.push(worldChainAssetId) if (enabledFlags.Hemi) assetIds.push(hemiAssetId) if (enabledFlags.Linea) assetIds.push(lineaAssetId) if (enabledFlags.Cronos) assetIds.push(cronosAssetId) diff --git a/src/config.ts b/src/config.ts index b2933663e70..cb0888d7bd2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -68,6 +68,7 @@ const validators = { VITE_BERACHAIN_NODE_URL: url(), VITE_CRONOS_NODE_URL: str(), VITE_KATANA_NODE_URL: url(), + VITE_WORLDCHAIN_NODE_URL: url(), VITE_HEMI_NODE_URL: url(), VITE_LINEA_NODE_URL: url(), VITE_SCROLL_NODE_URL: url(), @@ -122,6 +123,7 @@ const validators = { VITE_FEATURE_BERACHAIN: bool({ default: false }), VITE_FEATURE_CRONOS: bool({ default: false }), VITE_FEATURE_KATANA: bool({ default: false }), + VITE_FEATURE_WORLDCHAIN: bool({ default: false }), VITE_FEATURE_HEMI: bool({ default: false }), VITE_FEATURE_LINEA: bool({ default: false }), VITE_FEATURE_SCROLL: bool({ default: false }), diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 644aa4de604..d74ef39f028 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -13,6 +13,7 @@ export const SECOND_CLASS_CHAINS: readonly KnownChainIds[] = [ KnownChainIds.HyperEvmMainnet, KnownChainIds.PlasmaMainnet, KnownChainIds.KatanaMainnet, + KnownChainIds.WorldChainMainnet, KnownChainIds.MantleMainnet, KnownChainIds.InkMainnet, KnownChainIds.LineaMainnet, @@ -45,6 +46,7 @@ export const knownChainIds = Object.values(KnownChainIds).filter(chainId => { if (chainId === KnownChainIds.HyperEvmMainnet && !enabledFlags.HyperEvm) return false if (chainId === KnownChainIds.PlasmaMainnet && !enabledFlags.Plasma) return false if (chainId === KnownChainIds.KatanaMainnet && !enabledFlags.Katana) return false + if (chainId === KnownChainIds.WorldChainMainnet && !enabledFlags.WorldChain) return false if (chainId === KnownChainIds.MantleMainnet && !enabledFlags.Mantle) return false if (chainId === KnownChainIds.InkMainnet && !enabledFlags.Ink) return false if (chainId === KnownChainIds.LineaMainnet && !enabledFlags.Linea) return false diff --git a/src/context/PluginProvider/PluginProvider.tsx b/src/context/PluginProvider/PluginProvider.tsx index a42cb79e57b..0e456184ed5 100644 --- a/src/context/PluginProvider/PluginProvider.tsx +++ b/src/context/PluginProvider/PluginProvider.tsx @@ -121,6 +121,7 @@ export const PluginProvider = ({ children }: PluginProviderProps): JSX.Element = if (!featureFlags.Monad && chainId === KnownChainIds.MonadMainnet) return false if (!featureFlags.HyperEvm && chainId === KnownChainIds.HyperEvmMainnet) return false if (!featureFlags.Katana && chainId === KnownChainIds.KatanaMainnet) return false + if (!featureFlags.WorldChain && chainId === KnownChainIds.WorldChainMainnet) return false if (!featureFlags.Sonic && chainId === KnownChainIds.SonicMainnet) return false if (!featureFlags.Unichain && chainId === KnownChainIds.UnichainMainnet) return false if (!featureFlags.Bob && chainId === KnownChainIds.BobMainnet) return false diff --git a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts index 225337182c0..bff23fb0d72 100644 --- a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts +++ b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts @@ -38,6 +38,7 @@ import { tonChainId, tronChainId, unichainChainId, + worldChainChainId, zecChainId, } from '@shapeshiftoss/caip' import { isEvmChainId } from '@shapeshiftoss/chain-adapters' @@ -80,6 +81,7 @@ import { supportsThorchain, supportsTron, supportsUnichain, + supportsWorldChain, } from '@shapeshiftoss/hdwallet-core/wallet' import { useMemo } from 'react' @@ -190,6 +192,7 @@ export const walletSupportsChain = ({ const isPlasmaEnabled = selectFeatureFlag(store.getState(), 'Plasma') const isScrollEnabled = selectFeatureFlag(store.getState(), 'Scroll') const isStarknetEnabled = selectFeatureFlag(store.getState(), 'Starknet') + const isWorldChainEnabled = selectFeatureFlag(store.getState(), 'WorldChain') const isTonEnabled = selectFeatureFlag(store.getState(), 'Ton') switch (chainId) { @@ -238,6 +241,8 @@ export const walletSupportsChain = ({ return isPlasmaEnabled && supportsPlasma(wallet) case katanaChainId: return isKatanaEnabled && supportsKatana(wallet) + case worldChainChainId: + return isWorldChainEnabled && supportsWorldChain(wallet) case hemiChainId: return isHemiEnabled && supportsHemi(wallet) case lineaChainId: diff --git a/src/lib/account/evm.ts b/src/lib/account/evm.ts index 60c52765e78..025e8b6048d 100644 --- a/src/lib/account/evm.ts +++ b/src/lib/account/evm.ts @@ -27,6 +27,7 @@ import { sonicChainId, toAccountId, unichainChainId, + worldChainChainId, } from '@shapeshiftoss/caip' import type { HDWallet } from '@shapeshiftoss/hdwallet-core' import { @@ -56,6 +57,7 @@ import { supportsSoneium, supportsSonic, supportsUnichain, + supportsWorldChain, } from '@shapeshiftoss/hdwallet-core/wallet' import type { AccountMetadataById } from '@shapeshiftoss/types' @@ -156,6 +158,7 @@ export const deriveEvmAccountIdsAndMetadata: DeriveAccountIdsAndMetadata = async if (chainId === scrollChainId && !supportsScroll(wallet)) continue if (chainId === cronosChainId && !supportsCronos(wallet)) continue if (chainId === katanaChainId && !supportsKatana(wallet)) continue + if (chainId === worldChainChainId && !supportsWorldChain(wallet)) continue if (chainId === hemiChainId && !supportsHemi(wallet)) continue if (chainId === lineaChainId && !supportsLinea(wallet)) continue if (chainId === sonicChainId && !supportsSonic(wallet)) continue diff --git a/src/lib/asset-service/service/AssetService.ts b/src/lib/asset-service/service/AssetService.ts index 98b8166e7f7..712c036e54d 100644 --- a/src/lib/asset-service/service/AssetService.ts +++ b/src/lib/asset-service/service/AssetService.ts @@ -30,6 +30,7 @@ import { tonChainId, tronChainId, unichainChainId, + worldChainChainId, zecChainId, } from '@shapeshiftoss/caip' import type { Asset, AssetsById } from '@shapeshiftoss/types' @@ -134,6 +135,7 @@ class _AssetService { if (!config.VITE_FEATURE_MONAD && asset.chainId === monadChainId) return false if (!config.VITE_FEATURE_HYPEREVM && asset.chainId === hyperEvmChainId) return false if (!config.VITE_FEATURE_KATANA && asset.chainId === katanaChainId) return false + if (!config.VITE_FEATURE_WORLDCHAIN && asset.chainId === worldChainChainId) return false if (!config.VITE_FEATURE_HEMI && asset.chainId === hemiChainId) return false if (!config.VITE_FEATURE_MANTLE && asset.chainId === mantleChainId) return false if (!config.VITE_FEATURE_INK && asset.chainId === inkChainId) return false diff --git a/src/lib/coingecko/utils.ts b/src/lib/coingecko/utils.ts index efe5dc6f52c..14fd18be7b4 100644 --- a/src/lib/coingecko/utils.ts +++ b/src/lib/coingecko/utils.ts @@ -32,6 +32,7 @@ import { toAssetId, tonChainId, unichainChainId, + worldChainChainId, zecChainId, } from '@shapeshiftoss/caip' import type { KnownChainIds } from '@shapeshiftoss/types' @@ -227,6 +228,7 @@ export const getCoingeckoSupportedChainIds = () => { ...(getConfig().VITE_FEATURE_INK ? [inkChainId] : []), ...(getConfig().VITE_FEATURE_CRONOS ? [cronosChainId] : []), ...(getConfig().VITE_FEATURE_KATANA ? [katanaChainId] : []), + ...(getConfig().VITE_FEATURE_WORLDCHAIN ? [worldChainChainId] : []), ...(getConfig().VITE_FEATURE_HEMI ? [hemiChainId] : []), ...(getConfig().VITE_FEATURE_MANTLE ? [mantleChainId] : []), ...(getConfig().VITE_FEATURE_LINEA ? [lineaChainId] : []), diff --git a/src/lib/market-service/coingecko/coingecko.test.ts b/src/lib/market-service/coingecko/coingecko.test.ts index b57a877d6ae..572f77506d2 100644 --- a/src/lib/market-service/coingecko/coingecko.test.ts +++ b/src/lib/market-service/coingecko/coingecko.test.ts @@ -169,7 +169,7 @@ describe('CoinGecko market service', () => { it('can flatten multiple responses', async () => { mocks.get.mockResolvedValueOnce({ data: [eth] }).mockResolvedValue({ data: [btc] }) const result = await coinGeckoMarketService.findAll() - expect(Object.keys(result).length).toEqual(14) + expect(Object.keys(result).length).toEqual(15) }) it('can sort by market cap', async () => { @@ -193,7 +193,7 @@ describe('CoinGecko market service', () => { it('can return some results if partially rate limited', async () => { mocks.get.mockResolvedValueOnce({ status: 429 }).mockResolvedValue({ data: [eth] }) const result = await coinGeckoMarketService.findAll() - expect(Object.keys(result).length).toEqual(13) + expect(Object.keys(result).length).toEqual(14) }) it('can use default args', async () => { @@ -228,6 +228,7 @@ describe('CoinGecko market service', () => { ethOnArbitrumKey, ethOnBaseKey, ethOnBobKey, + ethOnWorldChainKey, ethOnHemiKey, ethOnLineaKey, ethOnModeKey, @@ -244,6 +245,7 @@ describe('CoinGecko market service', () => { ethOnArbitrumKey, ethOnBaseKey, ethOnBobKey, + ethOnWorldChainKey, ethOnHemiKey, ethOnLineaKey, ethOnModeKey, diff --git a/src/lib/utils/worldchain.ts b/src/lib/utils/worldchain.ts new file mode 100644 index 00000000000..038a40f47d6 --- /dev/null +++ b/src/lib/utils/worldchain.ts @@ -0,0 +1,43 @@ +import { worldChainChainId } from '@shapeshiftoss/caip' +import type { EvmChainAdapter } from '@shapeshiftoss/chain-adapters' +import { TxStatus } from '@shapeshiftoss/unchained-client' +import { JsonRpcProvider } from 'ethers' + +export const isWorldChainChainAdapter = (adapter: unknown): adapter is EvmChainAdapter => { + if (!adapter) return false + + const maybeAdapter = adapter as EvmChainAdapter + if (typeof maybeAdapter.getChainId !== 'function') return false + + return maybeAdapter.getChainId() === worldChainChainId +} + +export const getWorldChainTransactionStatus = async ( + txHash: string, + nodeUrl: string, +): Promise => { + try { + const provider = new JsonRpcProvider(nodeUrl, undefined, { + staticNetwork: true, + }) + + const receipt = await provider.getTransactionReceipt(txHash) + + if (!receipt) return TxStatus.Unknown + + switch (receipt.status) { + case 1: + return TxStatus.Confirmed + case 0: + return TxStatus.Failed + case null: + case undefined: + return TxStatus.Unknown + default: + return TxStatus.Unknown + } + } catch (error) { + console.error('[WorldChain] Error getting transaction status:', error) + return TxStatus.Unknown + } +} diff --git a/src/pages/Markets/components/MarketsRow.tsx b/src/pages/Markets/components/MarketsRow.tsx index 010f6523b57..074e52442d7 100644 --- a/src/pages/Markets/components/MarketsRow.tsx +++ b/src/pages/Markets/components/MarketsRow.tsx @@ -89,6 +89,7 @@ export const MarketsRow: React.FC = ({ const isLineaEnabled = useAppSelector(state => selectFeatureFlag(state, 'Linea')) const isScrollEnabled = useAppSelector(state => selectFeatureFlag(state, 'Scroll')) const isKatanaEnabled = useAppSelector(state => selectFeatureFlag(state, 'Katana')) + const isWorldChainEnabled = useAppSelector(state => selectFeatureFlag(state, 'WorldChain')) const isHemiEnabled = useAppSelector(state => selectFeatureFlag(state, 'Hemi')) const isCronosEnabled = useAppSelector(state => selectFeatureFlag(state, 'Cronos')) const isSonicEnabled = useAppSelector(state => selectFeatureFlag(state, 'Sonic')) @@ -111,6 +112,7 @@ export const MarketsRow: React.FC = ({ if (!isLineaEnabled && chainId === KnownChainIds.LineaMainnet) return false if (!isScrollEnabled && chainId === KnownChainIds.ScrollMainnet) return false if (!isKatanaEnabled && chainId === KnownChainIds.KatanaMainnet) return false + if (!isWorldChainEnabled && chainId === KnownChainIds.WorldChainMainnet) return false if (!isHemiEnabled && chainId === KnownChainIds.HemiMainnet) return false if (!isBerachainEnabled && chainId === KnownChainIds.BerachainMainnet) return false if (!isCronosEnabled && chainId === KnownChainIds.CronosMainnet) return false @@ -133,6 +135,7 @@ export const MarketsRow: React.FC = ({ isLineaEnabled, isScrollEnabled, isKatanaEnabled, + isWorldChainEnabled, isHemiEnabled, isCronosEnabled, isSonicEnabled, diff --git a/src/plugins/activePlugins.ts b/src/plugins/activePlugins.ts index 2b4aeb9ec99..322514623b3 100644 --- a/src/plugins/activePlugins.ts +++ b/src/plugins/activePlugins.ts @@ -38,6 +38,7 @@ import ton from '@/plugins/ton' import tron from '@/plugins/tron' import unichain from '@/plugins/unichain' import walletConnectToDapps from '@/plugins/walletConnectToDapps' +import worldchain from '@/plugins/worldchain' import zcash from '@/plugins/zcash' export const activePlugins = [ @@ -81,5 +82,6 @@ export const activePlugins = [ ton, tron, walletConnectToDapps, + worldchain, zcash, ] diff --git a/src/plugins/worldchain/index.tsx b/src/plugins/worldchain/index.tsx new file mode 100644 index 00000000000..a386e21c9f1 --- /dev/null +++ b/src/plugins/worldchain/index.tsx @@ -0,0 +1,49 @@ +import { fromAssetId, worldChainChainId } from '@shapeshiftoss/caip' +import { worldchain } from '@shapeshiftoss/chain-adapters' +import { KnownChainIds } from '@shapeshiftoss/types' + +import { getConfig } from '@/config' +import { getAssetService } from '@/lib/asset-service' +import type { Plugins } from '@/plugins/types' + +// eslint-disable-next-line import/no-default-export +export default function register(): Plugins { + return [ + [ + 'worldChainChainAdapter', + { + name: 'worldChainChainAdapter', + featureFlag: ['WorldChain'], + providers: { + chainAdapters: [ + [ + KnownChainIds.WorldChainMainnet, + () => { + const getKnownTokens = () => { + const assetService = getAssetService() + return assetService.assets + .filter(asset => { + const { chainId, assetNamespace } = fromAssetId(asset.assetId) + return chainId === worldChainChainId && assetNamespace === 'erc20' + }) + .map(asset => ({ + assetId: asset.assetId, + contractAddress: fromAssetId(asset.assetId).assetReference, + symbol: asset.symbol, + name: asset.name, + precision: asset.precision, + })) + } + + return new worldchain.ChainAdapter({ + rpcUrl: getConfig().VITE_WORLDCHAIN_NODE_URL, + getKnownTokens, + }) + }, + ], + ], + }, + }, + ], + ] +} diff --git a/src/state/slices/opportunitiesSlice/mappings.ts b/src/state/slices/opportunitiesSlice/mappings.ts index 8f922e3515c..fb6ab66899e 100644 --- a/src/state/slices/opportunitiesSlice/mappings.ts +++ b/src/state/slices/opportunitiesSlice/mappings.ts @@ -198,6 +198,7 @@ export const CHAIN_ID_TO_SUPPORTED_DEFI_OPPORTUNITIES: Record< [KnownChainIds.ScrollMainnet]: [], [KnownChainIds.CronosMainnet]: [], [KnownChainIds.KatanaMainnet]: [], + [KnownChainIds.WorldChainMainnet]: [], [KnownChainIds.SonicMainnet]: [], [KnownChainIds.UnichainMainnet]: [], [KnownChainIds.BobMainnet]: [], diff --git a/src/state/slices/portfolioSlice/utils/index.ts b/src/state/slices/portfolioSlice/utils/index.ts index 6478bf00829..a40ee5d60be 100644 --- a/src/state/slices/portfolioSlice/utils/index.ts +++ b/src/state/slices/portfolioSlice/utils/index.ts @@ -46,6 +46,7 @@ import { tonChainId, tronChainId, unichainChainId, + worldChainChainId, zecChainId, } from '@shapeshiftoss/caip' import type { Account } from '@shapeshiftoss/chain-adapters' @@ -87,6 +88,7 @@ import { supportsThorchain, supportsTron, supportsUnichain, + supportsWorldChain, } from '@shapeshiftoss/hdwallet-core/wallet' import type { Asset, EvmChainId, KnownChainIds, UtxoChainId } from '@shapeshiftoss/types' import type { MinimalAsset } from '@shapeshiftoss/utils' @@ -133,6 +135,7 @@ export const accountIdToLabel = (accountId: AccountId): string => { case lineaChainId: case cronosChainId: case katanaChainId: + case worldChainChainId: case scrollChainId: case sonicChainId: case unichainChainId: @@ -554,6 +557,8 @@ export const isAssetSupportedByWallet = (assetId: AssetId, wallet: HDWallet): bo return supportsPlasma(wallet) case katanaChainId: return supportsKatana(wallet) + case worldChainChainId: + return supportsWorldChain(wallet) case hemiChainId: return supportsHemi(wallet) case lineaChainId: diff --git a/src/state/slices/preferencesSlice/preferencesSlice.ts b/src/state/slices/preferencesSlice/preferencesSlice.ts index 6647ebbbf81..6681a7e5530 100644 --- a/src/state/slices/preferencesSlice/preferencesSlice.ts +++ b/src/state/slices/preferencesSlice/preferencesSlice.ts @@ -42,6 +42,7 @@ export type FeatureFlags = { Berachain: boolean Cronos: boolean Katana: boolean + WorldChain: boolean Hemi: boolean Linea: boolean Scroll: boolean @@ -203,6 +204,7 @@ const initialState: Preferences = { Berachain: getConfig().VITE_FEATURE_BERACHAIN, Cronos: getConfig().VITE_FEATURE_CRONOS, Katana: getConfig().VITE_FEATURE_KATANA, + WorldChain: getConfig().VITE_FEATURE_WORLDCHAIN, Hemi: getConfig().VITE_FEATURE_HEMI, Linea: getConfig().VITE_FEATURE_LINEA, Scroll: getConfig().VITE_FEATURE_SCROLL, diff --git a/src/test/mocks/store.ts b/src/test/mocks/store.ts index ef6fdde9632..7f7735914d4 100644 --- a/src/test/mocks/store.ts +++ b/src/test/mocks/store.ts @@ -115,6 +115,7 @@ export const mockStore: ReduxState = { Berachain: false, Cronos: false, Katana: false, + WorldChain: false, Hemi: false, Linea: false, Scroll: false,