diff --git a/.beads/pr-context.jsonl b/.beads/pr-context.jsonl index cc0ca5cf695..b46eb353c9f 100644 --- a/.beads/pr-context.jsonl +++ b/.beads/pr-context.jsonl @@ -1,3 +1,7 @@ -{"id":"shapeshiftweb-33d","title":"bugfix pass: wrapped assets, popular assets, chain icons for second-class EVM chains","description":"Sequential bugfix pass from Mantle to Mode. For each PR: checkout, fix issues, merge previous, build/regen/lint/typecheck, commit and push. NEVER force push. NEVER merge PRs. gh api read-only (PR body + comments only). Key fixes: (1) Generalize wrapped native asset detection from Berachain to all chains via chainId-\u003ewrappedNativeAddress mapping, (2) Fix popular assets availability (Cronos only has 2, Linea too), (3) Fix Linea perma-loading asset icon, (4) Sanity check brand chain icons for each chain, (5) Update second-class-evm-chain contract with learnings, (6) Create append-only check skill to prevent closing brace issues in future PRs.","notes":"All fixes applied in Soneium PR: icons, Sonic(S) naming, Sonic+Cronos isPrimary fix. Contract updated.","status":"done","priority":2,"issue_type":"epic","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:00Z","created_by":"gomes","updated_at":"2026-02-21T14:19:16Z"} -{"id":"shapeshiftweb-4gc","title":"Soneium (eip155:1868) - PR #11930","description":"type: task","notes":"Merged develop + Mode branch, auto-resolved conflicts, fixed broken closings, added WETH to wrapped native mapping, regen'd assets (32 fetched), lint/typecheck clean, pushed\nFixed: icons (BOB/Unichain/Mode), Sonic naming, generic tx status (merged #11895), WETH9 Withdrawal fallback for cross-chain swap execution price, Sonic+Cronos popular assets (native tokens as primary in related asset index). Contract updated.","status":"done","priority":2,"issue_type":"task","created_at":"2026-02-20T13:16:54Z","updated_at":"2026-02-21T14:19:15Z","dependencies":[{"issue_id":"shapeshiftweb-4gc","depends_on_id":"shapeshiftweb-k3d","type":"blocks","created_at":"2026-02-20T14:17:31Z","created_by":"gomes","metadata":"{}"}]} -{"id":"shapeshiftweb-w2i.1","title":"Soneium (#11930): merge develop + Mode, regen, lint, typecheck, push","description":"gh pr checkout 11930. Merge origin/develop, auto-resolve, fix closings. Merge Mode branch, auto-resolve, fix closings. Add wrapped native if applicable. Build/regen eip155:1868/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","notes":"Merged develop+Mode, all fixes applied, lint clean, tested, pushing.","status":"done","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:43Z","created_by":"gomes","updated_at":"2026-02-21T14:19:16Z","dependencies":[{"issue_id":"shapeshiftweb-w2i.1","depends_on_id":"shapeshiftweb-w2i","type":"parent-child","created_at":"2026-02-20T16:05:42Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d","title":"bugfix pass: wrapped assets, popular assets, chain icons for second-class EVM chains","description":"Sequential bugfix pass from Mantle to Mode. For each PR: checkout, fix issues, merge previous, build/regen/lint/typecheck, commit and push. NEVER force push. NEVER merge PRs. gh api read-only (PR body + comments only). Key fixes: (1) Generalize wrapped native asset detection from Berachain to all chains via chainId-\u003ewrappedNativeAddress mapping, (2) Fix popular assets availability (Cronos only has 2, Linea too), (3) Fix Linea perma-loading asset icon, (4) Sanity check brand chain icons for each chain, (5) Update second-class-evm-chain contract with learnings, (6) Create append-only check skill to prevent closing brace issues in future PRs.","status":"open","priority":2,"issue_type":"epic","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:00Z","created_by":"gomes","updated_at":"2026-02-20T15:05:00Z"} +{"id":"shapeshiftweb-33d.1","title":"Mantle (#11905): generalize wrapped native detection, fix popular assets, fix Linea icon, update contract, create append-only skill","description":"gh pr checkout 11905. (1) Generalize Berachain's WBERA burn detection to all second-class chains via WRAPPED_NATIVE_BY_CHAIN_ID mapping in SecondClassEvmAdapter.ts - add WMNT address for Mantle. (2) Investigate + fix popular assets issue (compare against happy chains like Scroll/Ink). (3) Fix Linea perma-loading asset icon. (4) Update .claude/contracts/second-class-evm-chain.md with wrapped native + popular assets learnings. (5) Create append-only check skill to prevent closing brace issues. (6) Sanity check Mantle chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"in-progress","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:20Z","created_by":"gomes","updated_at":"2026-02-20T15:05:51Z","dependencies":[{"issue_id":"shapeshiftweb-33d.1","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d.2","title":"Cronos (#11910): ensure wrapped asset fix for WCRO, fix popular assets","description":"gh pr checkout 11910. Merge Mantle branch. Ensure WCRO address in WRAPPED_NATIVE_BY_CHAIN_ID. Fix popular assets (only 2 currently). Sanity check chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"open","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:20Z","created_by":"gomes","updated_at":"2026-02-20T15:05:20Z","dependencies":[{"issue_id":"shapeshiftweb-33d.2","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"},{"issue_id":"shapeshiftweb-33d.2","depends_on_id":"shapeshiftweb-33d.1","type":"blocks","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d.3","title":"Sonic (#11923): merge Cronos, ensure no wrapped/popular bugs, sanity check icon","description":"gh pr checkout 11923. Merge Cronos branch. Check if Sonic has wrapped native pattern (likely WSONIC). Sanity check popular assets + chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"open","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:21Z","created_by":"gomes","updated_at":"2026-02-20T15:05:21Z","dependencies":[{"issue_id":"shapeshiftweb-33d.3","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"},{"issue_id":"shapeshiftweb-33d.3","depends_on_id":"shapeshiftweb-33d.2","type":"blocks","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d.4","title":"Unichain (#11924): merge Sonic, ensure no wrapped/popular bugs, sanity check icon","description":"gh pr checkout 11924. Merge Sonic branch. Check wrapped native pattern (WETH on Unichain). Sanity check popular assets + chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"open","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:21Z","created_by":"gomes","updated_at":"2026-02-20T15:05:21Z","dependencies":[{"issue_id":"shapeshiftweb-33d.4","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"},{"issue_id":"shapeshiftweb-33d.4","depends_on_id":"shapeshiftweb-33d.3","type":"blocks","created_at":"2026-02-20T16:05:20Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d.5","title":"BOB (#11925): merge Unichain, ensure no wrapped/popular bugs, sanity check icon","description":"gh pr checkout 11925. Merge Unichain branch. Check wrapped native pattern (WETH on BOB). Sanity check popular assets + chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"open","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:21Z","created_by":"gomes","updated_at":"2026-02-20T15:05:21Z","dependencies":[{"issue_id":"shapeshiftweb-33d.5","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:21Z","created_by":"gomes","metadata":"{}"},{"issue_id":"shapeshiftweb-33d.5","depends_on_id":"shapeshiftweb-33d.4","type":"blocks","created_at":"2026-02-20T16:05:21Z","created_by":"gomes","metadata":"{}"}]} +{"id":"shapeshiftweb-33d.6","title":"Mode (#11926): merge BOB, ensure no wrapped/popular bugs, sanity check icon","description":"gh pr checkout 11926. Merge BOB branch. Check wrapped native pattern (WETH on Mode). Sanity check popular assets + chain icon. Build/regen/lint/typecheck/commit/push. NEVER force push. NEVER merge PR.","status":"open","priority":2,"issue_type":"task","owner":"17035424+gomesalexandre@users.noreply.github.com","created_at":"2026-02-20T15:05:21Z","created_by":"gomes","updated_at":"2026-02-20T15:05:21Z","dependencies":[{"issue_id":"shapeshiftweb-33d.6","depends_on_id":"shapeshiftweb-33d","type":"parent-child","created_at":"2026-02-20T16:05:21Z","created_by":"gomes","metadata":"{}"},{"issue_id":"shapeshiftweb-33d.6","depends_on_id":"shapeshiftweb-33d.5","type":"blocks","created_at":"2026-02-20T16:05:21Z","created_by":"gomes","metadata":"{}"}]} diff --git a/.beads/ss-dx5.10.json b/.beads/ss-dx5.10.json index 076c7a3bedb..c689e4786ee 100644 --- a/.beads/ss-dx5.10.json +++ b/.beads/ss-dx5.10.json @@ -3,14 +3,14 @@ "id": "ss-dx5.10", "title": "Integrate Mode (chainId: 34443, ETH, OP Stack L2)", "description": "TVL: $69.5M | RPC: https://mainnet.mode.network/ | Explorer: https://explorer.mode.network | Token Support: All | Pattern B (RPC-only) | DeFi-focused L2", - "notes": "Logo: https://assets.relay.link/icons/34443/light.png (dark: dark.png)\nCoinGecko: mode\nArch: OP Stack L2 (DeFi-focused)\nViem: standard OP Stack - should just work\nChecklist: [x] chain-adapters [x] caip [x] asset-service [x] feature-flag [x] plugin [x] env-config [x] icon/logo\n\n--- RELAY ACTIVATION ---\n[x] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[x] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[x] Create scripts/generateAssetData//index.ts\n[x] Add case to scripts/generateAssetData/coingecko.ts\n[x] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[x] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[x] Branch: feat/integrate--relay (off develop)\n[x] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[x] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[x] yarn lint --fix && yarn type-check must pass before PR", - "status": "in-review", + "notes": "Logo: https://assets.relay.link/icons/34443/light.png (dark: dark.png)\nCoinGecko: mode\nArch: OP Stack L2 (DeFi-focused)\nViem: standard OP Stack - should just work\nChecklist: [ ] chain-adapters [ ] caip [ ] asset-service [ ] feature-flag [ ] plugin [ ] env-config [ ] icon/logo\n\n--- RELAY ACTIVATION ---\n[ ] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[ ] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/\u003cchainname\u003e/index.ts\n[ ] Add case to scripts/generateAssetData/coingecko.ts\n[ ] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[ ] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[ ] Branch: feat/integrate-\u003cchainname\u003e-relay (off develop)\n[ ] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[ ] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[ ] yarn lint --fix \u0026\u0026 yarn type-check must pass before PR", + "status": "open", "priority": 2, "issue_type": "task", "owner": "14963751+NeOMakinG@users.noreply.github.com", "created_at": "2026-02-17T10:55:59Z", "created_by": "NeOMakinG", - "updated_at": "2026-02-21T12:00:00Z", + "updated_at": "2026-02-17T11:21:36Z", "labels": [ "evm", "op-stack", @@ -22,7 +22,7 @@ "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->sei-v2, plume->plume-network, zksync->zksync, metis->metis-andromeda, morph->morph-l2, gravity->gravity-alpha, boba->boba, zora->zora-network, funkichain->funki, 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]: .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//index.ts\n Pattern (identical for all EVM chains):\n import { ChainId } from '@shapeshiftoss/caip'\n import type { Asset } from '@shapeshiftoss/types'\n import { , unfreeze } from '@shapeshiftoss/utils'\n import * as coingecko from '../coingecko'\n export const getAssets = async (): Promise => {\n const assets = await coingecko.getAssets(ChainId)\n return [...assets, unfreeze()]\n }\n\nFILE 2 (MODIFY): scripts/generateAssetData/coingecko.ts\n - Import ChainId from @shapeshiftoss/caip\n - Import native asset from @shapeshiftoss/utils\n - Add case in the switch: case ChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, category: adapters.chainIdToCoingeckoAssetPlatform(chainId), explorer/explorerAddressLink/explorerTxLink from 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 from './'\n - Call: const Assets = await .getAssets()\n - Spread into unfilteredAssetData: ...Assets\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--relay (e.g. feat/integrate-scroll-relay)\n\nCOMMAND:\n gh pr create --draft --title 'feat: integrate (chainId: ) via Relay' --body \"$(cat <<'PREOF'\n ## Description\n\n Add (chainId: ) as a second-class EVM chain in ShapeShift Web with Relay bridge support.\n\n **Changes:**\n - Plugin registration in src/plugins//\n - Feature flag `` in preferencesSlice\n - Relay swapper chain mapping in RelaySwapper/constant.ts\n - Asset data generation via CoinGecko (``)\n - Environment config for RPC URL\n\n **Chain details:**\n - TVL: \n - Native token: (18 decimals)\n - Architecture: \n - RPC: \n - Explorer: \n\n ## Issue (if applicable)\n\n Part of #11902\n\n ## Risk\n\n Low risk — new chain behind feature flag (``), no existing functionality affected.\n\n > 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_=true` in .env\n 2. Verify chain appears in supported chains list\n 3. Verify native token balance loads (connect wallet with on )\n 4. Verify Relay bridge quote works: bridge ETH from Ethereum → \n 5. Run `yarn lint --fix && 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 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).", + "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", diff --git a/.beads/ss-dx5.19.json b/.beads/ss-dx5.19.json new file mode 100644 index 00000000000..9ca06e7f13a --- /dev/null +++ b/.beads/ss-dx5.19.json @@ -0,0 +1,40 @@ +[ + { + "id": "ss-dx5.19", + "title": "Integrate zkSync Era (chainId: 324, ETH, zkEVM L2)", + "description": "TVL: $25.2M | RPC: https://mainnet.era.zksync.io | WS: wss://mainnet.era.zksync.io/ws | Explorer: https://explorer.zksync.io | Token Support: All | Pattern B (RPC-only) | Major zkEVM", + "notes": "\nLogo: https://assets.relay.link/icons/324/light.png (dark: dark.png)\nCoinGecko platform: zksync (⚠️ NOT \"zksync-era\"!)\nCoinGecko native ID: ethereum\nArch: zkEVM L2 (zkSync Era — Type 113 EIP-712 transactions)\nNative token: ETH (18 decimals)\nSLIP44: 60 (Ethereum)\nETH-native: YES — affects test ordering + market-service counts\nViem: ✅ zksync (id: 324) — import { zksync } from \"viem/chains\"\nAcross: ✅ SUPPORTED (chainId: 324)\nZerion ID: \"zksync-era\" (hyphenated — verify when integrating)\n\n🔴 CRITICAL QUIRKS:\n- Type 113 (EIP-712) transactions — NOT standard EIP-1559!\n- Viem has special zksync chainConfig for EIP-712 serialization\n- May need custom transaction type handling in chain adapter\n- Gas estimation uses zks_estimateFee RPC (not standard eth_estimateGas)\n- Account abstraction (AA) native support — paymaster patterns\n- Abstract (chainId: 2741) is zkSync-based too — shared architecture\n\n--- PHASE 1 LEARNED CHECKLIST (MANDATORY) ---\n[ ] adapter.json: Create packages/caip/src/adapters/coingecko/generated/eip155_324/adapter.json → {\"eip155:324/slip44:60\":\"ethereum\"}\n[ ] Wire adapter.json: Import+export from packages/caip/src/adapters/coingecko/generated/index.ts\n[ ] getCoingeckoSupportedChainIds: Add zksyncChainId (feature-flagged) in src/lib/coingecko/utils.ts\n[ ] Zerion: Add \"zksync-era\" to ZERION_CHAINS + ZERION_CHAINS_MAP in packages/types/src/zerion.ts\n[ ] Across: ✅ Add [zksyncChainId]: zksync.id to chainIdToAcrossChainId\n[ ] ETH test ordering: ✅ REQUIRED — add eip155:324/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:324/slip44:60 → eip155:1/slip44:60 to manualRelatedAssetIndex\n\n--- RELAY ACTIVATION ---\n[ ] Add [zksyncChainId]: zksync.id to chainIdToRelayChainId\n[ ] Add native asset case in relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/zksync/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-zksync-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:01Z", + "created_by": "NeOMakinG", + "updated_at": "2026-02-17T22:44:07Z", + "labels": [ + "critical-quirk", + "evm", + "relay", + "tier-2", + "zkevm" + ], + "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/.beads/ss-dx5.8.json b/.beads/ss-dx5.8.json index c24f5667a56..7edd42caa57 100644 --- a/.beads/ss-dx5.8.json +++ b/.beads/ss-dx5.8.json @@ -3,14 +3,14 @@ "id": "ss-dx5.8", "title": "Integrate Unichain (chainId: 130, ETH, OP Stack L2)", "description": "TVL: $95.4M | RPC: https://mainnet.unichain.org | Explorer: https://uniscan.xyz | Token Support: All | Pattern B (RPC-only) | Uniswap's L2", - "notes": "Logo: https://assets.relay.link/icons/130/light.png (dark: dark.png)\nCoinGecko: unichain\nArch: OP Stack L2 (Uniswap)\nViem: standard OP Stack - should just work\nChecklist: [x] chain-adapters [x] caip [x] asset-service [x] feature-flag [x] plugin [x] env-config [x] icon/logo\n\n--- RELAY ACTIVATION ---\n[x] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[x] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[x] Create scripts/generateAssetData//index.ts\n[x] Add case to scripts/generateAssetData/coingecko.ts\n[x] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[x] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[x] Branch: feat/integrate--relay (off develop)\n[x] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[x] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[x] yarn lint --fix && yarn type-check must pass before PR", - "status": "in-review", + "notes": "Logo: https://assets.relay.link/icons/130/light.png (dark: dark.png)\nCoinGecko: unichain\nArch: OP Stack L2 (Uniswap)\nViem: standard OP Stack - should just work\nChecklist: [ ] chain-adapters [ ] caip [ ] asset-service [ ] feature-flag [ ] plugin [ ] env-config [ ] icon/logo\n\n--- RELAY ACTIVATION ---\n[ ] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[ ] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/\u003cchainname\u003e/index.ts\n[ ] Add case to scripts/generateAssetData/coingecko.ts\n[ ] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[ ] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[ ] Branch: feat/integrate-\u003cchainname\u003e-relay (off develop)\n[ ] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[ ] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[ ] yarn lint --fix \u0026\u0026 yarn type-check must pass before PR", + "status": "open", "priority": 1, "issue_type": "task", "owner": "14963751+NeOMakinG@users.noreply.github.com", "created_at": "2026-02-17T10:55:25Z", "created_by": "NeOMakinG", - "updated_at": "2026-02-21T11:00:00Z", + "updated_at": "2026-02-17T11:21:35Z", "labels": [ "evm", "op-stack", @@ -22,7 +22,7 @@ "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->sei-v2, plume->plume-network, zksync->zksync, metis->metis-andromeda, morph->morph-l2, gravity->gravity-alpha, boba->boba, zora->zora-network, funkichain->funki, 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]: .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//index.ts\n Pattern (identical for all EVM chains):\n import { ChainId } from '@shapeshiftoss/caip'\n import type { Asset } from '@shapeshiftoss/types'\n import { , unfreeze } from '@shapeshiftoss/utils'\n import * as coingecko from '../coingecko'\n export const getAssets = async (): Promise => {\n const assets = await coingecko.getAssets(ChainId)\n return [...assets, unfreeze()]\n }\n\nFILE 2 (MODIFY): scripts/generateAssetData/coingecko.ts\n - Import ChainId from @shapeshiftoss/caip\n - Import native asset from @shapeshiftoss/utils\n - Add case in the switch: case ChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, category: adapters.chainIdToCoingeckoAssetPlatform(chainId), explorer/explorerAddressLink/explorerTxLink from 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 from './'\n - Call: const Assets = await .getAssets()\n - Spread into unfilteredAssetData: ...Assets\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--relay (e.g. feat/integrate-scroll-relay)\n\nCOMMAND:\n gh pr create --draft --title 'feat: integrate (chainId: ) via Relay' --body \"$(cat <<'PREOF'\n ## Description\n\n Add (chainId: ) as a second-class EVM chain in ShapeShift Web with Relay bridge support.\n\n **Changes:**\n - Plugin registration in src/plugins//\n - Feature flag `` in preferencesSlice\n - Relay swapper chain mapping in RelaySwapper/constant.ts\n - Asset data generation via CoinGecko (``)\n - Environment config for RPC URL\n\n **Chain details:**\n - TVL: \n - Native token: (18 decimals)\n - Architecture: \n - RPC: \n - Explorer: \n\n ## Issue (if applicable)\n\n Part of #11902\n\n ## Risk\n\n Low risk \u2014 new chain behind feature flag (``), no existing functionality affected.\n\n > 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_=true` in .env\n 2. Verify chain appears in supported chains list\n 3. Verify native token balance loads (connect wallet with on )\n 4. Verify Relay bridge quote works: bridge ETH from Ethereum \u2192 \n 5. Run `yarn lint --fix && yarn type-check` \u2014 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 \u2014 chain integration, no UI changes.\n PREOF\n )\"\n\nNOTE: Replace all 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).", + "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", diff --git a/.beads/ss-dx5.9.json b/.beads/ss-dx5.9.json index 73486493ab2..edd0a297bbc 100644 --- a/.beads/ss-dx5.9.json +++ b/.beads/ss-dx5.9.json @@ -3,14 +3,14 @@ "id": "ss-dx5.9", "title": "Integrate BOB (chainId: 60808, ETH, OP Stack L2)", "description": "TVL: $84.9M | RPC: https://rpc.gobob.xyz/ | Explorer: https://explorer.gobob.xyz | Token Support: Limited | Pattern B (RPC-only) | Bitcoin-focused L2", - "notes": "Logo: https://assets.relay.link/icons/60808/light.png (dark: dark.png)\nCoinGecko: bob-network (⚠️ chain_identifier is null - may need name-based lookup)\nArch: OP Stack L2 (Bitcoin-focused)\nViem: standard OP Stack\nChecklist: [x] chain-adapters [x] caip [x] asset-service [x] feature-flag [x] plugin [x] env-config [x] icon/logo\n\n--- RELAY ACTIVATION ---\n[x] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[x] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[x] Create scripts/generateAssetData/bob/index.ts\n[x] Add case to scripts/generateAssetData/coingecko.ts\n[x] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[x] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[x] Branch: feat/integrate-bob-relay (off develop)\n[x] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[x] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[x] yarn lint --fix && yarn type-check must pass before PR", - "status": "in-review", + "notes": "Logo: https://assets.relay.link/icons/60808/light.png (dark: dark.png)\nCoinGecko: bob-network (⚠️ chain_identifier is null - may need name-based lookup)\nArch: OP Stack L2 (Bitcoin-focused)\nViem: standard OP Stack\nChecklist: [ ] chain-adapters [ ] caip [ ] asset-service [ ] feature-flag [ ] plugin [ ] env-config [ ] icon/logo\n\n--- RELAY ACTIVATION ---\n[ ] Add to chainIdToRelayChainId in packages/swapper/src/swappers/RelaySwapper/constant.ts\n[ ] Add native asset case in packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/\u003cchainname\u003e/index.ts\n[ ] Add case to scripts/generateAssetData/coingecko.ts\n[ ] Add import + getAssets call to scripts/generateAssetData/generateAssetData.ts\n[ ] Run: yarn generate:asset-data\n--- DRAFT PR ---\n[ ] Branch: feat/integrate-\u003cchainname\u003e-relay (off develop)\n[ ] gh pr create --draft using .github/PULL_REQUEST_TEMPLATE.md\n[ ] Fill: Description, Issue (Part of #11902), Risk (Low - behind feature flag), Testing (enable flag + verify chain + relay bridge quote), Operations (behind flag checkbox)\n[ ] yarn lint --fix \u0026\u0026 yarn type-check must pass before PR", + "status": "open", "priority": 2, "issue_type": "task", "owner": "14963751+NeOMakinG@users.noreply.github.com", "created_at": "2026-02-17T10:55:59Z", "created_by": "NeOMakinG", - "updated_at": "2026-02-21T11:15:00Z", + "updated_at": "2026-02-17T11:21:35Z", "labels": [ "evm", "op-stack", diff --git a/.env b/.env index c18c6e3684f..c926554048d 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_ZKSYNC_ERA_NODE_URL=https://mainnet.era.zksync.io VITE_BLAST_NODE_URL=https://rpc.blast.io VITE_WORLDCHAIN_NODE_URL=https://worldchain-mainnet.g.alchemy.com/public VITE_HEMI_NODE_URL=https://rpc.hemi.network/rpc @@ -325,6 +326,7 @@ VITE_FEATURE_BERACHAIN=false VITE_FEATURE_SCROLL=false VITE_FEATURE_NEAR=true VITE_FEATURE_KATANA=true +VITE_FEATURE_ZK_SYNC_ERA=false VITE_FEATURE_BLAST=false VITE_FEATURE_HEMI=false VITE_FEATURE_SONIC=false diff --git a/.env.development b/.env.development index 28c425a1f23..514c4e7fbe3 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_ZKSYNC_ERA_NODE_URL=https://mainnet.era.zksync.io VITE_BLAST_NODE_URL=https://rpc.blast.io VITE_WORLDCHAIN_NODE_URL=https://worldchain-mainnet.g.alchemy.com/public VITE_HEMI_NODE_URL=https://rpc.hemi.network/rpc @@ -116,6 +117,7 @@ VITE_FEATURE_LINEA=true VITE_FEATURE_BERACHAIN=true VITE_FEATURE_SCROLL=true VITE_FEATURE_KATANA=true +VITE_FEATURE_ZK_SYNC_ERA=true VITE_FEATURE_BLAST=true VITE_FEATURE_WORLDCHAIN=true VITE_FEATURE_HEMI=true diff --git a/headers/csps/chains/zksyncera.ts b/headers/csps/chains/zksyncera.ts new file mode 100644 index 00000000000..43f75619546 --- /dev/null +++ b/headers/csps/chains/zksyncera.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_ZKSYNC_ERA_NODE_URL], +} diff --git a/headers/csps/index.ts b/headers/csps/index.ts index 9f29a58a44d..969757560b8 100644 --- a/headers/csps/index.ts +++ b/headers/csps/index.ts @@ -45,6 +45,7 @@ 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 zksyncera } from './chains/zksyncera' import { csp as chatwoot } from './chatwoot' import { csp as customTokenImport } from './customTokenImport' import { csp as foxy } from './defi/foxy' @@ -142,6 +143,7 @@ export const csps = [ mantle, mode, megaeth, + zksyncera, optimism, polygon, scroll, diff --git a/packages/caip/src/adapters/coingecko/generated/eip155_324/adapter.json b/packages/caip/src/adapters/coingecko/generated/eip155_324/adapter.json new file mode 100644 index 00000000000..fdfb2abc231 --- /dev/null +++ b/packages/caip/src/adapters/coingecko/generated/eip155_324/adapter.json @@ -0,0 +1 @@ +{"eip155:324/slip44:60":"ethereum"} diff --git a/packages/caip/src/adapters/coingecko/generated/index.ts b/packages/caip/src/adapters/coingecko/generated/index.ts index e8f1a85943f..f2d67e687b9 100644 --- a/packages/caip/src/adapters/coingecko/generated/index.ts +++ b/packages/caip/src/adapters/coingecko/generated/index.ts @@ -29,6 +29,7 @@ import cronos from "./eip155_25/adapter.json"; import sonic from "./eip155_146/adapter.json"; import unichain from "./eip155_130/adapter.json"; import soneium from "./eip155_1868/adapter.json"; +import zksync from "./eip155_324/adapter.json"; import cosmos from "./cosmos_cosmoshub-4/adapter.json"; import thorchain from "./cosmos_thorchain-1/adapter.json"; import mayachain from "./cosmos_mayachain-mainnet-v1/adapter.json"; @@ -72,6 +73,7 @@ export { sonic, unichain, soneium, + zksync, cosmos, thorchain, mayachain, diff --git a/packages/caip/src/adapters/coingecko/index.test.ts b/packages/caip/src/adapters/coingecko/index.test.ts index fca8bcbb2e7..db84d92f493 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 ethOnZkSyncEra = toAssetId({ + chainNamespace, + chainReference: CHAIN_REFERENCE.ZkSyncEraMainnet, + assetNamespace: 'slip44', + assetReference: ASSET_REFERENCE.ZkSyncEra, + }) const ethOnBlast = toAssetId({ chainNamespace, chainReference: CHAIN_REFERENCE.BlastMainnet, @@ -139,6 +145,7 @@ describe('adapters:coingecko', () => { ethOnScroll, ethOnUnichain, ethOnSoneium, + ethOnZkSyncEra, ]) }) diff --git a/packages/caip/src/adapters/coingecko/index.ts b/packages/caip/src/adapters/coingecko/index.ts index 3d2de7d0ba0..75828d12571 100644 --- a/packages/caip/src/adapters/coingecko/index.ts +++ b/packages/caip/src/adapters/coingecko/index.ts @@ -43,6 +43,7 @@ import { tronChainId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '../../constants' import * as adapters from './generated' @@ -66,6 +67,7 @@ export enum CoingeckoAssetPlatform { Plasma = 'plasma', Ink = 'ink', Katana = 'katana', + ZkSyncEra = 'zksync', Blast = 'blast', WorldChain = 'world-chain', Hemi = 'hemi', @@ -140,6 +142,8 @@ export const chainIdToCoingeckoAssetPlatform = (chainId: ChainId): string => { return CoingeckoAssetPlatform.Plasma case CHAIN_REFERENCE.KatanaMainnet: return CoingeckoAssetPlatform.Katana + case CHAIN_REFERENCE.ZkSyncEraMainnet: + return CoingeckoAssetPlatform.ZkSyncEra case CHAIN_REFERENCE.BlastMainnet: return CoingeckoAssetPlatform.Blast case CHAIN_REFERENCE.WorldChainMainnet: @@ -291,6 +295,8 @@ export const coingeckoAssetPlatformToChainId = ( return modeChainId case CoingeckoAssetPlatform.MegaEth: return megaethChainId + case CoingeckoAssetPlatform.ZkSyncEra: + return zkSyncEraChainId case CoingeckoAssetPlatform.Blast: return blastChainId case CoingeckoAssetPlatform.Hemi: diff --git a/packages/caip/src/adapters/coingecko/utils.test.ts b/packages/caip/src/adapters/coingecko/utils.test.ts index 5e685ffcd48..765df7363df 100644 --- a/packages/caip/src/adapters/coingecko/utils.test.ts +++ b/packages/caip/src/adapters/coingecko/utils.test.ts @@ -191,6 +191,9 @@ describe('adapters:coingecko:utils', () => { 'eip155:747474': { 'eip155:747474/slip44:60': 'katana', }, + 'eip155:324': { + 'eip155:324/slip44:60': 'ethereum', + }, 'eip155:81457': { 'eip155:81457/slip44:60': 'ethereum', }, diff --git a/packages/caip/src/adapters/coingecko/utils.ts b/packages/caip/src/adapters/coingecko/utils.ts index 500378668e5..5a0bc633ba4 100644 --- a/packages/caip/src/adapters/coingecko/utils.ts +++ b/packages/caip/src/adapters/coingecko/utils.ts @@ -82,6 +82,8 @@ import { worldChainAssetId, worldChainChainId, zecChainId, + zkSyncEraAssetId, + zkSyncEraChainId, } from '../../constants' import { bitcoinAssetMap, @@ -429,6 +431,20 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { } } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.ZkSyncEra)) { + try { + const assetId = toAssetId({ + chainNamespace: CHAIN_NAMESPACE.Evm, + chainReference: CHAIN_REFERENCE.ZkSyncEraMainnet, + assetNamespace: 'erc20', + assetReference: platforms[CoingeckoAssetPlatform.ZkSyncEra], + }) + prev[zkSyncEraChainId][assetId] = id + } catch { + // unable to create assetId, skip token + } + } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.Blast)) { try { const assetId = toAssetId({ @@ -590,6 +606,7 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { [berachainChainId]: { [berachainAssetId]: 'berachain-bera' }, [cronosChainId]: { [cronosAssetId]: 'crypto-com-chain' }, [katanaChainId]: { [katanaAssetId]: 'katana' }, + [zkSyncEraChainId]: { [zkSyncEraAssetId]: 'ethereum' }, [blastChainId]: { [blastAssetId]: 'ethereum' }, [worldChainChainId]: { [worldChainAssetId]: 'ethereum' }, [hemiChainId]: { [hemiAssetId]: 'ethereum' }, diff --git a/packages/caip/src/constants.ts b/packages/caip/src/constants.ts index 4273be035b7..ea530f5aab5 100644 --- a/packages/caip/src/constants.ts +++ b/packages/caip/src/constants.ts @@ -25,6 +25,7 @@ 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' +export const zkSyncEraAssetId: AssetId = 'eip155:324/slip44:60' export const blastAssetId: AssetId = 'eip155:81457/slip44:60' export const hemiAssetId: AssetId = 'eip155:43111/slip44:60' export const lineaAssetId: AssetId = 'eip155:59144/slip44:60' @@ -100,6 +101,7 @@ export const worldChainChainId: ChainId = 'eip155:480' export const berachainChainId: ChainId = 'eip155:80094' export const cronosChainId: ChainId = 'eip155:25' export const katanaChainId: ChainId = 'eip155:747474' +export const zkSyncEraChainId: ChainId = 'eip155:324' export const blastChainId: ChainId = 'eip155:81457' export const hemiChainId: ChainId = 'eip155:43111' export const lineaChainId: ChainId = 'eip155:59144' @@ -166,6 +168,7 @@ export const CHAIN_REFERENCE = { BerachainMainnet: '80094', CronosMainnet: '25', KatanaMainnet: '747474', // https://docs.katana.network + ZkSyncEraMainnet: '324', // https://docs.zksync.io BlastMainnet: '81457', // https://docs.blast.io HemiMainnet: '43111', // https://docs.hemi.xyz LineaMainnet: '59144', // https://docs.linea.build @@ -224,6 +227,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 + ZkSyncEra: '60', // evm chain which uses ethereum derivation path as common practice Blast: '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 @@ -268,6 +272,7 @@ export const VALID_CHAIN_IDS: ValidChainMap = Object.freeze({ CHAIN_REFERENCE.BerachainMainnet, CHAIN_REFERENCE.CronosMainnet, CHAIN_REFERENCE.KatanaMainnet, + CHAIN_REFERENCE.ZkSyncEraMainnet, CHAIN_REFERENCE.BlastMainnet, CHAIN_REFERENCE.WorldChainMainnet, CHAIN_REFERENCE.HemiMainnet, @@ -335,6 +340,7 @@ export const FEE_ASSET_IDS = [ mantleAssetId, inkAssetId, megaethAssetId, + zkSyncEraAssetId, blastAssetId, hemiAssetId, lineaAssetId, diff --git a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts index 6f5c9922f53..81f3ad7fefd 100644 --- a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts +++ b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts @@ -35,6 +35,7 @@ import { supportsSonic, supportsUnichain, supportsWorldChain, + supportsZkSyncEra, } from '@shapeshiftoss/hdwallet-core' import type { Bip44Params, EvmChainId, RootBip44Params } from '@shapeshiftoss/types' import { KnownChainIds } from '@shapeshiftoss/types' @@ -106,6 +107,7 @@ export const evmChainIds = [ KnownChainIds.BerachainMainnet, KnownChainIds.CronosMainnet, KnownChainIds.KatanaMainnet, + KnownChainIds.ZkSyncEraMainnet, KnownChainIds.BlastMainnet, KnownChainIds.WorldChainMainnet, KnownChainIds.HemiMainnet, @@ -228,6 +230,8 @@ export abstract class EvmBaseAdapter implements IChainAdap return supportsCronos(wallet) case Number(fromChainId(KnownChainIds.KatanaMainnet).chainReference): return supportsKatana(wallet) + case Number(fromChainId(KnownChainIds.ZkSyncEraMainnet).chainReference): + return supportsZkSyncEra(wallet) case Number(fromChainId(KnownChainIds.BlastMainnet).chainReference): return supportsBlast(wallet) case Number(fromChainId(KnownChainIds.WorldChainMainnet).chainReference): @@ -365,6 +369,11 @@ export abstract class EvmBaseAdapter implements IChainAdap symbol: 'ETH', explorer: 'https://katanascan.com', }, + [KnownChainIds.ZkSyncEraMainnet]: { + name: 'Ether', + symbol: 'ETH', + explorer: 'https://explorer.zksync.io', + }, [KnownChainIds.BlastMainnet]: { name: 'Ether', symbol: 'ETH', diff --git a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts index cecd51c3a47..ae310eb511f 100644 --- a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts +++ b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts @@ -14,6 +14,7 @@ import { toAssetId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { evm } from '@shapeshiftoss/common-api' import { MULTICALL3_CONTRACT, viemClientByChainId } from '@shapeshiftoss/contracts' @@ -62,6 +63,7 @@ const WRAPPED_NATIVE_CONTRACT_BY_CHAIN_ID: Partial> = { [hemiChainId]: '0x4200000000000000000000000000000000000006', [worldChainChainId]: '0x4200000000000000000000000000000000000006', [blastChainId]: '0x4300000000000000000000000000000000000004', + [zkSyncEraChainId]: '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91', } const BATCH_SIZE = 500 @@ -403,7 +405,11 @@ export abstract class SecondClassEvmAdapter extends EvmBas private async fetchInternalTransactions( txHash: string, ): Promise<{ from: string; to: string; value: string }[]> { - if (this.chainId === hyperEvmChainId) { + if ( + this.chainId === hyperEvmChainId || + this.chainId === blastChainId || + this.chainId === zkSyncEraChainId + ) { return [] } diff --git a/packages/chain-adapters/src/evm/index.ts b/packages/chain-adapters/src/evm/index.ts index 558f43e155a..c06d57fbabc 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 zksyncera from './zksyncera' export * as blast from './blast' export * as worldchain from './worldchain' export * as hemi from './hemi' diff --git a/packages/chain-adapters/src/evm/zksyncera/ZkSyncEraChainAdapter.ts b/packages/chain-adapters/src/evm/zksyncera/ZkSyncEraChainAdapter.ts new file mode 100644 index 00000000000..5b73b376b72 --- /dev/null +++ b/packages/chain-adapters/src/evm/zksyncera/ZkSyncEraChainAdapter.ts @@ -0,0 +1,57 @@ +import type { AssetId } from '@shapeshiftoss/caip' +import { ASSET_REFERENCE, zkSyncEraAssetId } 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.ZkSyncEraMainnet] +const DEFAULT_CHAIN_ID = KnownChainIds.ZkSyncEraMainnet + +export type ChainAdapterArgs = { + rpcUrl: string + getKnownTokens: () => TokenInfo[] +} + +export const isZkSyncEraChainAdapter = (adapter: unknown): adapter is ChainAdapter => { + return (adapter as ChainAdapter).getType() === KnownChainIds.ZkSyncEraMainnet +} + +export class ChainAdapter extends SecondClassEvmAdapter { + public static readonly rootBip44Params: RootBip44Params = { + purpose: 44, + coinType: Number(ASSET_REFERENCE.ZkSyncEra), + accountNumber: 0, + } + + constructor(args: ChainAdapterArgs) { + super({ + assetId: zkSyncEraAssetId, + chainId: DEFAULT_CHAIN_ID, + rootBip44Params: ChainAdapter.rootBip44Params, + supportedChainIds: SUPPORTED_CHAIN_IDS, + rpcUrl: args.rpcUrl, + getKnownTokens: args.getKnownTokens, + }) + } + + getDisplayName() { + return ChainAdapterDisplayName.ZkSyncEra + } + + getName() { + return 'zkSync Era' + } + + getType(): KnownChainIds.ZkSyncEraMainnet { + return KnownChainIds.ZkSyncEraMainnet + } + + getFeeAssetId(): AssetId { + return this.assetId + } +} + +export type { TokenInfo } diff --git a/packages/chain-adapters/src/evm/zksyncera/index.ts b/packages/chain-adapters/src/evm/zksyncera/index.ts new file mode 100644 index 00000000000..e574d21767e --- /dev/null +++ b/packages/chain-adapters/src/evm/zksyncera/index.ts @@ -0,0 +1 @@ +export * from './ZkSyncEraChainAdapter' diff --git a/packages/chain-adapters/src/types.ts b/packages/chain-adapters/src/types.ts index 842e65dbca2..e84bd40584d 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.ZkSyncEraMainnet]: evm.Account [KnownChainIds.BlastMainnet]: evm.Account [KnownChainIds.WorldChainMainnet]: evm.Account [KnownChainIds.HemiMainnet]: evm.Account @@ -119,6 +120,7 @@ type ChainSpecificFeeData = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.FeeData [KnownChainIds.CronosMainnet]: evm.FeeData [KnownChainIds.KatanaMainnet]: evm.FeeData + [KnownChainIds.ZkSyncEraMainnet]: evm.FeeData [KnownChainIds.BlastMainnet]: evm.FeeData [KnownChainIds.WorldChainMainnet]: evm.FeeData [KnownChainIds.HemiMainnet]: evm.FeeData @@ -218,6 +220,7 @@ export type ChainSignTx = { [KnownChainIds.BerachainMainnet]: ETHSignTx [KnownChainIds.CronosMainnet]: ETHSignTx [KnownChainIds.KatanaMainnet]: ETHSignTx + [KnownChainIds.ZkSyncEraMainnet]: ETHSignTx [KnownChainIds.BlastMainnet]: ETHSignTx [KnownChainIds.WorldChainMainnet]: ETHSignTx [KnownChainIds.HemiMainnet]: ETHSignTx @@ -289,6 +292,7 @@ export type ChainSpecificBuildTxData = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.BuildTxInput [KnownChainIds.CronosMainnet]: evm.BuildTxInput [KnownChainIds.KatanaMainnet]: evm.BuildTxInput + [KnownChainIds.ZkSyncEraMainnet]: evm.BuildTxInput [KnownChainIds.BlastMainnet]: evm.BuildTxInput [KnownChainIds.WorldChainMainnet]: evm.BuildTxInput [KnownChainIds.HemiMainnet]: evm.BuildTxInput @@ -410,6 +414,7 @@ type ChainSpecificGetFeeDataInput = ChainSpecific< [KnownChainIds.BerachainMainnet]: evm.GetFeeDataInput [KnownChainIds.CronosMainnet]: evm.GetFeeDataInput [KnownChainIds.KatanaMainnet]: evm.GetFeeDataInput + [KnownChainIds.ZkSyncEraMainnet]: evm.GetFeeDataInput [KnownChainIds.BlastMainnet]: evm.GetFeeDataInput [KnownChainIds.WorldChainMainnet]: evm.GetFeeDataInput [KnownChainIds.HemiMainnet]: evm.GetFeeDataInput @@ -496,6 +501,7 @@ export enum ChainAdapterDisplayName { Berachain = 'Berachain', Cronos = 'Cronos', Katana = 'Katana', + ZkSyncEra = 'zkSync Era', Blast = 'Blast', WorldChain = 'World Chain', Hemi = 'Hemi', diff --git a/packages/contracts/src/ethersProviderSingleton.ts b/packages/contracts/src/ethersProviderSingleton.ts index d4ab4d7c88b..9481a869c2f 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.ZkSyncEraMainnet: + return process.env.VITE_ZKSYNC_ERA_NODE_URL case KnownChainIds.BlastMainnet: return process.env.VITE_BLAST_NODE_URL case KnownChainIds.WorldChainMainnet: diff --git a/packages/contracts/src/viemClient.ts b/packages/contracts/src/viemClient.ts index cc558d3862a..cb6744580cd 100644 --- a/packages/contracts/src/viemClient.ts +++ b/packages/contracts/src/viemClient.ts @@ -30,6 +30,7 @@ import { sonic, unichain, worldchain, + zksync, } from 'viem/chains' const megaeth = defineChain({ @@ -156,6 +157,11 @@ export const viemKatanaClient = createPublicClient({ transport: fallback([process.env.VITE_KATANA_NODE_URL].filter(Boolean).map(url => http(url))), }) as PublicClient +export const viemZkSyncEraClient = createPublicClient({ + chain: zksync, + transport: fallback([process.env.VITE_ZKSYNC_ERA_NODE_URL].filter(Boolean).map(url => http(url))), +}) as PublicClient + export const viemBlastClient = createPublicClient({ chain: blast, transport: fallback([process.env.VITE_BLAST_NODE_URL].filter(Boolean).map(url => http(url))), @@ -219,6 +225,7 @@ export const viemClientByChainId: Record = { [KnownChainIds.BerachainMainnet]: viemBerachainClient, [KnownChainIds.CronosMainnet]: viemCronosClient, [KnownChainIds.KatanaMainnet]: viemKatanaClient, + [KnownChainIds.ZkSyncEraMainnet]: viemZkSyncEraClient, [KnownChainIds.BlastMainnet]: viemBlastClient, [KnownChainIds.WorldChainMainnet]: viemWorldChainClient, [KnownChainIds.HemiMainnet]: viemHemiClient, @@ -249,6 +256,7 @@ export const viemNetworkIdByChainId: Record = { [KnownChainIds.BerachainMainnet]: berachain.id, [KnownChainIds.CronosMainnet]: cronos.id, [KnownChainIds.KatanaMainnet]: katana.id, + [KnownChainIds.ZkSyncEraMainnet]: zksync.id, [KnownChainIds.BlastMainnet]: blast.id, [KnownChainIds.WorldChainMainnet]: worldchain.id, [KnownChainIds.HemiMainnet]: hemi.id, @@ -279,6 +287,7 @@ export const viemClientByNetworkId: Record = { [berachain.id]: viemBerachainClient, [cronos.id]: viemCronosClient, [katana.id]: viemKatanaClient, + [zksync.id]: viemZkSyncEraClient, [blast.id]: viemBlastClient, [worldchain.id]: viemWorldChainClient, [hemi.id]: viemHemiClient, diff --git a/packages/hdwallet-coinbase/src/coinbase.ts b/packages/hdwallet-coinbase/src/coinbase.ts index fec3690c7bf..d4324648a5b 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 _supportsZkSyncEra = false readonly _supportsBlast = false readonly _supportsWorldChain = false readonly _supportsHemi = false diff --git a/packages/hdwallet-core/src/ethereum.ts b/packages/hdwallet-core/src/ethereum.ts index 782b03c4265..febf4e39450 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 _supportsZkSyncEra: boolean readonly _supportsBlast: boolean readonly _supportsWorldChain: boolean readonly _supportsHemi: boolean diff --git a/packages/hdwallet-core/src/wallet.ts b/packages/hdwallet-core/src/wallet.ts index 0d360af0475..d63aaef4abc 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 supportsZkSyncEra(wallet: HDWallet): wallet is ETHWallet { + return isObject(wallet) && (wallet as any)._supportsZkSyncEra +} + export function supportsBlast(wallet: HDWallet): wallet is ETHWallet { return isObject(wallet) && (wallet as any)._supportsBlast } diff --git a/packages/hdwallet-gridplus/src/gridplus.ts b/packages/hdwallet-gridplus/src/gridplus.ts index 5cf6cfdc3a6..d49f41c0ac1 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 _supportsZkSyncEra = true readonly _supportsBlast = true readonly _supportsWorldChain = true readonly _supportsHemi = true diff --git a/packages/hdwallet-keepkey/src/keepkey.ts b/packages/hdwallet-keepkey/src/keepkey.ts index 05bf84e3fe9..577523aec2e 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 _supportsZkSyncEra = false readonly _supportsBlast = false readonly _supportsWorldChain = false readonly _supportsHemi = false diff --git a/packages/hdwallet-ledger/src/ledger.ts b/packages/hdwallet-ledger/src/ledger.ts index d19c4693cbd..59e4c3db40f 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 _supportsZkSyncEra = true readonly _supportsBlast = true readonly _supportsWorldChain = true readonly _supportsHemi = true diff --git a/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts b/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts index 6b6ee982462..ef4b9928d3e 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 _supportsZkSyncEra = true readonly _supportsBlast = true readonly _supportsWorldChain = true readonly _supportsHemi = true diff --git a/packages/hdwallet-native/src/ethereum.ts b/packages/hdwallet-native/src/ethereum.ts index e9cedbf5cc0..92daf77f05d 100644 --- a/packages/hdwallet-native/src/ethereum.ts +++ b/packages/hdwallet-native/src/ethereum.ts @@ -75,6 +75,7 @@ export function MixinNativeETHWallet = { [lineaChainId]: linea.id, [modeChainId]: mode.id, [plasmaChainId]: plasma.id, + [zkSyncEraChainId]: zksync.id, [blastChainId]: blast.id, [worldChainChainId]: worldchain.id, [unichainChainId]: unichain.id, diff --git a/packages/swapper/src/swappers/RelaySwapper/constant.ts b/packages/swapper/src/swappers/RelaySwapper/constant.ts index 154f11c6018..db901349af4 100644 --- a/packages/swapper/src/swappers/RelaySwapper/constant.ts +++ b/packages/swapper/src/swappers/RelaySwapper/constant.ts @@ -29,6 +29,7 @@ import { tronChainId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import invert from 'lodash/invert' import { zeroAddress } from 'viem' @@ -59,6 +60,7 @@ import { sonic, unichain, worldchain, + zksync, } from 'viem/chains' import { TradeQuoteError } from '../../types' @@ -85,6 +87,7 @@ export const chainIdToRelayChainId = { [megaethChainId]: 4326, [plasmaChainId]: plasma.id, [katanaChainId]: katana.id, + [zkSyncEraChainId]: zksync.id, [blastChainId]: blast.id, [worldChainChainId]: worldchain.id, [hemiChainId]: hemi.id, diff --git a/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts b/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts index 0cedce73213..90b6f1891e8 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.ZkSyncEraMainnet: + return { + assetReference: ASSET_REFERENCE.ZkSyncEra, + assetNamespace: ASSET_NAMESPACE.slip44, + } case CHAIN_REFERENCE.BlastMainnet: return { assetReference: ASSET_REFERENCE.Blast, diff --git a/packages/types/src/base.ts b/packages/types/src/base.ts index a639e1f81a7..6934b986395 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', + ZkSyncEraMainnet = 'eip155:324', BlastMainnet = 'eip155:81457', WorldChainMainnet = 'eip155:480', HemiMainnet = 'eip155:43111', @@ -75,6 +76,7 @@ export type EvmChainId = | KnownChainIds.BerachainMainnet | KnownChainIds.CronosMainnet | KnownChainIds.KatanaMainnet + | KnownChainIds.ZkSyncEraMainnet | KnownChainIds.BlastMainnet | KnownChainIds.WorldChainMainnet | KnownChainIds.HemiMainnet diff --git a/packages/types/src/zerion.ts b/packages/types/src/zerion.ts index 93f370293b1..f0157acc3a4 100644 --- a/packages/types/src/zerion.ts +++ b/packages/types/src/zerion.ts @@ -27,6 +27,7 @@ import { tronChainId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' export const ZERION_CHAINS = [ @@ -46,6 +47,7 @@ export const ZERION_CHAINS = [ 'plasma', 'world-chain', 'katana', + 'zksync-era', 'blast', 'hemi', 'mantle', @@ -81,6 +83,7 @@ export const ZERION_CHAINS_MAP: Record = { plasma: plasmaChainId, 'world-chain': worldChainChainId, katana: katanaChainId, + 'zksync-era': zkSyncEraChainId, blast: blastChainId, hemi: hemiChainId, mantle: mantleChainId, diff --git a/packages/utils/src/assetData/baseAssets.ts b/packages/utils/src/assetData/baseAssets.ts index 185b14c8ffa..04011ae781a 100644 --- a/packages/utils/src/assetData/baseAssets.ts +++ b/packages/utils/src/assetData/baseAssets.ts @@ -472,6 +472,23 @@ export const katana: Readonly = Object.freeze({ relatedAssetKey: 'eip155:1/slip44:60', }) +export const zkSyncEra: Readonly = Object.freeze({ + assetId: caip.zkSyncEraAssetId, + chainId: caip.zkSyncEraChainId, + name: 'Ethereum', + networkName: 'zkSync Era', + symbol: 'ETH', + precision: 18, + color: '#8C8DFC', + networkColor: '#8C8DFC', + icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', + networkIcon: 'https://assets.relay.link/icons/324/light.png', + explorer: 'https://explorer.zksync.io', + explorerAddressLink: 'https://explorer.zksync.io/address/', + explorerTxLink: 'https://explorer.zksync.io/tx/', + relatedAssetKey: 'eip155:1/slip44:60', +}) + export const blast: Readonly = Object.freeze({ assetId: caip.blastAssetId, chainId: caip.blastChainId, diff --git a/packages/utils/src/assetData/getBaseAsset.ts b/packages/utils/src/assetData/getBaseAsset.ts index 5539c165b11..88cc544fa9e 100644 --- a/packages/utils/src/assetData/getBaseAsset.ts +++ b/packages/utils/src/assetData/getBaseAsset.ts @@ -45,6 +45,7 @@ import { unichainChain, worldchain, zcash, + zkSyncEra, } from './baseAssets' export const getBaseAsset = (chainId: ChainId): Readonly => { @@ -106,6 +107,8 @@ export const getBaseAsset = (chainId: ChainId): Readonly => { return cronos case KnownChainIds.KatanaMainnet: return katana + case KnownChainIds.ZkSyncEraMainnet: + return zkSyncEra case KnownChainIds.BlastMainnet: return blast case KnownChainIds.WorldChainMainnet: diff --git a/packages/utils/src/chainIdToFeeAssetId.ts b/packages/utils/src/chainIdToFeeAssetId.ts index 7166eee68b9..5eb3f895c90 100644 --- a/packages/utils/src/chainIdToFeeAssetId.ts +++ b/packages/utils/src/chainIdToFeeAssetId.ts @@ -41,6 +41,7 @@ import { unichainAssetId, worldChainAssetId, zecAssetId, + zkSyncEraAssetId, } from '@shapeshiftoss/caip' import { KnownChainIds } from '@shapeshiftoss/types' @@ -105,6 +106,8 @@ export const chainIdToFeeAssetId = (_chainId: ChainId): AssetId => { return cronosAssetId case KnownChainIds.KatanaMainnet: return katanaAssetId + case KnownChainIds.ZkSyncEraMainnet: + return zkSyncEraAssetId case KnownChainIds.BlastMainnet: return blastAssetId case KnownChainIds.WorldChainMainnet: diff --git a/packages/utils/src/getAssetNamespaceFromChainId.ts b/packages/utils/src/getAssetNamespaceFromChainId.ts index 75410671ff4..24e9142e1b4 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.ZkSyncEraMainnet: case KnownChainIds.BlastMainnet: case KnownChainIds.WorldChainMainnet: case KnownChainIds.HemiMainnet: diff --git a/packages/utils/src/getChainShortName.ts b/packages/utils/src/getChainShortName.ts index 276f413e5a1..e9a3a236a28 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.ZkSyncEraMainnet: + return 'ZKS' case KnownChainIds.BlastMainnet: return 'BLAST' case KnownChainIds.WorldChainMainnet: diff --git a/packages/utils/src/getNativeFeeAssetReference.ts b/packages/utils/src/getNativeFeeAssetReference.ts index 5721da7af5d..78031986601 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.ZkSyncEraMainnet: + return ASSET_REFERENCE.ZkSyncEra case CHAIN_REFERENCE.BlastMainnet: return ASSET_REFERENCE.Blast case CHAIN_REFERENCE.WorldChainMainnet: diff --git a/public/generated/asset-manifest.json b/public/generated/asset-manifest.json index 5db8832c465..c84fae7277a 100644 --- a/public/generated/asset-manifest.json +++ b/public/generated/asset-manifest.json @@ -1,4 +1,4 @@ { - "assetData": "c38a7cdf", - "relatedAssetIndex": "f6cb2a4e" + "assetData": "949760af", + "relatedAssetIndex": "632b7e0d" } \ No newline at end of file diff --git a/public/generated/asset-manifest.json.br b/public/generated/asset-manifest.json.br index 57b5a43b3db..2d7979d8bb0 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 ff2a814081f..93d79b6d653 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 cbb16368554..b004b00c7c9 100644 --- a/public/generated/generatedAssetData.json +++ b/public/generated/generatedAssetData.json @@ -32662,7 +32662,7 @@ "explorer": "https://etherscan.io", "explorerAddressLink": "https://etherscan.io/address/", "explorerTxLink": "https://etherscan.io/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876" }, "eip155:1/erc20:0x4e9fcd48af4738e3bf1382009dc1e93ebfce698f": { "assetId": "eip155:1/erc20:0x4e9fcd48af4738e3bf1382009dc1e93ebfce698f", @@ -42816,7 +42816,7 @@ "explorer": "https://etherscan.io", "explorerAddressLink": "https://etherscan.io/address/", "explorerTxLink": "https://etherscan.io/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e" }, "eip155:1/erc20:0x66b394e0ee14e7d459989910e0be086860269838": { "explorer": "https://etherscan.io", @@ -211573,7 +211573,7 @@ "explorer": "https://monadvision.com", "explorerAddressLink": "https://monadvision.com/address/", "explorerTxLink": "https://monadvision.com/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398" }, "eip155:143/erc20:0x1ad7052bb331a0529c1981c3ec2bc4663498a110": { "assetId": "eip155:143/erc20:0x1ad7052bb331a0529c1981c3ec2bc4663498a110", @@ -211664,7 +211664,7 @@ "explorer": "https://monadvision.com", "explorerAddressLink": "https://monadvision.com/address/", "explorerTxLink": "https://monadvision.com/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a" }, "eip155:143/erc20:0x336d414754967c6682b5a665c7daf6f1409e63e8": { "assetId": "eip155:143/erc20:0x336d414754967c6682b5a665c7daf6f1409e63e8", @@ -226721,7 +226721,7 @@ "explorer": "https://arbiscan.io", "explorerAddressLink": "https://arbiscan.io/address/", "explorerTxLink": "https://arbiscan.io/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9" }, "eip155:42161/erc20:0xce112f0a6dc5b6221c303500d7e8f5a2e8d777da": { "explorer": "https://arbiscan.io", @@ -334444,7 +334444,7 @@ "explorer": "https://basescan.org", "explorerAddressLink": "https://basescan.org/address/", "explorerTxLink": "https://basescan.org/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d" }, "eip155:8453/erc20:0xd0924fa4c6ba194294a414d0fb826739ded98b24": { "assetId": "eip155:8453/erc20:0xd0924fa4c6ba194294a414d0fb826739ded98b24", @@ -430021,7 +430021,7 @@ "explorer": "https://sonicscan.org", "explorerAddressLink": "https://sonicscan.org/address/", "explorerTxLink": "https://sonicscan.org/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398" }, "eip155:146/erc20:0x131f5ae1cbfefe8efbdf93da23fa4d39f14a817c": { "assetId": "eip155:146/erc20:0x131f5ae1cbfefe8efbdf93da23fa4d39f14a817c", @@ -430138,7 +430138,7 @@ "explorer": "https://sonicscan.org", "explorerAddressLink": "https://sonicscan.org/address/", "explorerTxLink": "https://sonicscan.org/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a" }, "eip155:146/erc20:0x2f872623d1e1af5835b08b0e49aad2d81d649d30": { "assetId": "eip155:146/erc20:0x2f872623d1e1af5835b08b0e49aad2d81d649d30", @@ -435298,6 +435298,1257 @@ "explorerAddressLink": "https://blastscan.io/address/", "explorerTxLink": "https://blastscan.io/tx/", "relatedAssetKey": "eip155:1/slip44:60" + }, + "eip155:324/erc20:0x0469d9d1de0ee58fa1153ef00836b9bbcb84c0b6": { + "assetId": "eip155:324/erc20:0x0469d9d1de0ee58fa1153ef00836b9bbcb84c0b6", + "chainId": "eip155:324", + "name": "Noon USN", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53948/large/Copy_of_USN.png?1748952392", + "symbol": "USN", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0xda67b4284609d2d48e5d10cfac411572727dc1ed" + }, + "eip155:324/erc20:0x05b65997ff7cb7976b43000ad376f91108b30d40": { + "assetId": "eip155:324/erc20:0x05b65997ff7cb7976b43000ad376f91108b30d40", + "chainId": "eip155:324", + "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://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + }, + "eip155:324/erc20:0x0c6eaaab86e8374a91e3f42c726b6fd1abacb54c": { + "assetId": "eip155:324/erc20:0x0c6eaaab86e8374a91e3f42c726b6fd1abacb54c", + "chainId": "eip155:324", + "name": "Zino Pet", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/33753/large/%E5%B8%81%E6%A0%87.png?1703024400", + "symbol": "ZPET", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x0e97c7a0f8b2c9885c8ac9fc6136e829cbc21d42": { + "assetId": "eip155:324/erc20:0x0e97c7a0f8b2c9885c8ac9fc6136e829cbc21d42", + "chainId": "eip155:324", + "name": "Mute", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14331/large/MUTE.png?1696514019", + "symbol": "MUTE", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x16a9494e257703797d747540f01683952547ee5b": { + "assetId": "eip155:324/erc20:0x16a9494e257703797d747540f01683952547ee5b", + "chainId": "eip155:324", + "name": "iZUMi Finance", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/21791/large/izumi-logo-symbol.png?1696521144", + "symbol": "IZI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747" + }, + "eip155:324/erc20:0x18012cb9e1478ef458c8c996f99b8dceca60795c": { + "assetId": "eip155:324/erc20:0x18012cb9e1478ef458c8c996f99b8dceca60795c", + "chainId": "eip155:324", + "name": "Tradable Singapore Fintech SSL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66878/large/tradable.jpg?1750921608", + "symbol": "PC0000077", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x1d17cbcf0d6d143135ae902365d2e5e2a16538d4": { + "assetId": "eip155:324/erc20:0x1d17cbcf0d6d143135ae902365d2e5e2a16538d4", + "chainId": "eip155:324", + "name": "USDC", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/6319/large/USDC.png?1769615602", + "symbol": "USDC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "eip155:324/erc20:0x1f179a51ab46252f469733dfcbd9115090a91f03": { + "assetId": "eip155:324/erc20:0x1f179a51ab46252f469733dfcbd9115090a91f03", + "chainId": "eip155:324", + "name": "Tradable North America PoS Lender SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66800/large/tradable.jpg?1750576495", + "symbol": "PC0000019", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x244c238325fc1bdf6eded726ee1b47d55895d944": { + "assetId": "eip155:324/erc20:0x244c238325fc1bdf6eded726ee1b47d55895d944", + "chainId": "eip155:324", + "name": "Zorro", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/34381/large/ZORRO_TP.png?1704777748", + "symbol": "ZORRO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x27d0a2b5316b98088294378692f4eabfb3222e36": { + "assetId": "eip155:324/erc20:0x27d0a2b5316b98088294378692f4eabfb3222e36", + "chainId": "eip155:324", + "name": "ZeroLend", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/37375/large/image.png?1714884543", + "symbol": "ZERO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9": { + "assetId": "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9", + "chainId": "eip155:324", + "name": "Sygnum FIUSD Liquidity Fund", + "precision": 2, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/50749/large/FIUDS_200x200px_%281%29.png?1728956878", + "symbol": "FIUSD", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9" + }, + "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a": { + "assetId": "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a", + "chainId": "eip155:324", + "name": "zkSwap Finance", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31633/large/200x200_Black.png?1747800050", + "symbol": "ZF", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a" + }, + "eip155:324/erc20:0x3355df6d4c9c3035724fd0e3914de96a5a83aaf4": { + "assetId": "eip155:324/erc20:0x3355df6d4c9c3035724fd0e3914de96a5a83aaf4", + "chainId": "eip155:324", + "name": "zkSync Bridged USDC (zkSync)", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35262/large/USDC_Icon.png?1708008941", + "symbol": "USDC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "eip155:324/erc20:0x3613ad277df1d5935d41400a181aa9ec1dc2dc9e": { + "assetId": "eip155:324/erc20:0x3613ad277df1d5935d41400a181aa9ec1dc2dc9e", + "chainId": "eip155:324", + "name": "Wagmi", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31887/large/wagmi_token_logo.png?1696530698", + "symbol": "WAGMI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xaf20f5f19698f1d19351028cd7103b63d30de7d7" + }, + "eip155:324/erc20:0x39fe7a0dacce31bd90418e3e659fb0b5f0b3db0d": { + "assetId": "eip155:324/erc20:0x39fe7a0dacce31bd90418e3e659fb0b5f0b3db0d", + "chainId": "eip155:324", + "name": "Ethena USDe", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/33613/large/usde.png?1733810059", + "symbol": "USDE", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x3a287a06c66f9e95a56327185ca2bdf5f031cecd": { + "assetId": "eip155:324/erc20:0x3a287a06c66f9e95a56327185ca2bdf5f031cecd", + "chainId": "eip155:324", + "name": "PancakeSwap", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/12632/large/pancakeswap-cake-logo_%281%29.png?1696512440", + "symbol": "CAKE", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x1b896893dfc86bb67cf57767298b9073d2c1ba2c" + }, + "eip155:324/erc20:0x3a34fa9a1288597ad6c1da709f001d37fef8b19e": { + "assetId": "eip155:324/erc20:0x3a34fa9a1288597ad6c1da709f001d37fef8b19e", + "chainId": "eip155:324", + "name": "SyncDex", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/29746/large/Logo200x200.png?1696528678", + "symbol": "SYDX", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x3d19625bb8e4b52ac4ca28ecec2b5e243ae2ee81": { + "assetId": "eip155:324/erc20:0x3d19625bb8e4b52ac4ca28ecec2b5e243ae2ee81", + "chainId": "eip155:324", + "name": "NA Post-Settlement Legal Financing Receivables", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66791/large/tradable.jpg?1750576168", + "symbol": "PC0000101", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x3e9c747db47602210ea7513c9d00abf356b53880": { + "assetId": "eip155:324/erc20:0x3e9c747db47602210ea7513c9d00abf356b53880", + "chainId": "eip155:324", + "name": "aiws", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53553/large/aiws_x_200.png?1757832582", + "symbol": "AIWS", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x47ef4a5641992a72cfd57b9406c9d9cefee8e0c4": { + "assetId": "eip155:324/erc20:0x47ef4a5641992a72cfd57b9406c9d9cefee8e0c4", + "chainId": "eip155:324", + "name": "zkApes Token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30316/large/zkApes.png?1696529217", + "symbol": "ZAT", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x493257fd37edb34451f62edf8d2a0c418852ba4c": { + "assetId": "eip155:324/erc20:0x493257fd37edb34451f62edf8d2a0c418852ba4c", + "chainId": "eip155:324", + "name": "Bridged USDT", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35001/large/logo.png?1706959346", + "symbol": "USDT", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "eip155:324/erc20:0x4b9eb6c0b6ea15176bbf62841c6b2a8a398cb656": { + "assetId": "eip155:324/erc20:0x4b9eb6c0b6ea15176bbf62841c6b2a8a398cb656", + "chainId": "eip155:324", + "name": "ZKsync ERC20 Bridged DAI (zkSync)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39805/large/dai.png?1724126260", + "symbol": "DAI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f" + }, + "eip155:324/erc20:0x503234f203fc7eb888eec8513210612a43cf6115": { + "assetId": "eip155:324/erc20:0x503234f203fc7eb888eec8513210612a43cf6115", + "chainId": "eip155:324", + "name": "Liquity USD", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14666/large/Group_3.png?1696514341", + "symbol": "LUSD", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x93b346b6bc2548da6a1e7d98e9a421b42541425b" + }, + "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398": { + "assetId": "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398", + "chainId": "eip155:324", + "name": "Long", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36497/large/Logo_Long_square.png?1717541650", + "symbol": "LONG", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398" + }, + "eip155:324/erc20:0x52869bae3e091e36b0915941577f2d47d8d8b534": { + "assetId": "eip155:324/erc20:0x52869bae3e091e36b0915941577f2d47d8d8b534", + "chainId": "eip155:324", + "name": "Chainlink", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/877/large/Chainlink_Logo_500.png?1760023405", + "symbol": "LINK", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xf97f4df75117a78c1a5a0dbb814af92458539fb4" + }, + "eip155:324/erc20:0x53acd3c88ec04b8e22b8ef768ec4d928153d892e": { + "assetId": "eip155:324/erc20:0x53acd3c88ec04b8e22b8ef768ec4d928153d892e", + "chainId": "eip155:324", + "name": "Tradable LatAm Charge Card SSN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66795/large/tradable.jpg?1750576365", + "symbol": "PC0000111", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5556fe72eb021f97d39ba704f3674f1731e1acc4": { + "assetId": "eip155:324/erc20:0x5556fe72eb021f97d39ba704f3674f1731e1acc4", + "chainId": "eip155:324", + "name": "Tradable NA Residential Real Estate-Backed Credit Card SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66879/large/tradable.jpg?1750921826", + "symbol": "PC0000113", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5756a28e2aae01f600fc2c01358395f5c1f8ad3a": { + "assetId": "eip155:324/erc20:0x5756a28e2aae01f600fc2c01358395f5c1f8ad3a", + "chainId": "eip155:324", + "name": "veSync", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30611/large/veSync-Logo-PNG-200X200.png?1696529480", + "symbol": "VS", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x57fd71a86522dc06d6255537521886057c1772a3": { + "assetId": "eip155:324/erc20:0x57fd71a86522dc06d6255537521886057c1772a3", + "chainId": "eip155:324", + "name": "Blockchain Capital", + "precision": 2, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/56040/large/bcap_logo_200.png?1748088291", + "symbol": "BCAP", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5895024c953bee18d5f026bfcf6259bb2d79e12d": { + "assetId": "eip155:324/erc20:0x5895024c953bee18d5f026bfcf6259bb2d79e12d", + "chainId": "eip155:324", + "name": "NA Music Royalties SSTL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66881/large/tradable.jpg?1750921901", + "symbol": "PC0000061", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e": { + "assetId": "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e", + "chainId": "eip155:324", + "name": "ZKsync", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/38043/large/ZKTokenBlack.png?1718614502", + "symbol": "ZK", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e" + }, + "eip155:324/erc20:0x5abe0a2ead1357f70e73f5b60e227df64a54ddd5": { + "assetId": "eip155:324/erc20:0x5abe0a2ead1357f70e73f5b60e227df64a54ddd5", + "chainId": "eip155:324", + "name": "Tradable LatAm Fintech SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66796/large/tradable.jpg?1750576421", + "symbol": "PC0000097", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5aea5775959fbc2557cc8789bc1bf90a239d9a91": { + "assetId": "eip155:324/erc20:0x5aea5775959fbc2557cc8789bc1bf90a239d9a91", + "chainId": "eip155:324", + "name": "Bridged WETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39723/large/WETH.PNG?1723733967", + "symbol": "WETH", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5c8c39e167c604b036afd3fbb65426f9fe78ce6d": { + "assetId": "eip155:324/erc20:0x5c8c39e167c604b036afd3fbb65426f9fe78ce6d", + "chainId": "eip155:324", + "name": "Tradable Singapore Fintech SSL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66954/large/tradable.jpg?1751254449", + "symbol": "PC0000023", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d": { + "assetId": "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d", + "chainId": "eip155:324", + "name": "ZyfAI", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39770/large/Iso_Blue_with_dark_circle.png?1749018927", + "symbol": "ZFI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d" + }, + "eip155:324/erc20:0x5f7cbcb391d33988dad74d6fd683aadda1123e4d": { + "assetId": "eip155:324/erc20:0x5f7cbcb391d33988dad74d6fd683aadda1123e4d", + "chainId": "eip155:324", + "name": "ReactorFusion", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/29975/large/RF_Token_logo.png?1696528900", + "symbol": "RF", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x5fc44e95eaa48f9eb84be17bd3ac66b6a82af709": { + "assetId": "eip155:324/erc20:0x5fc44e95eaa48f9eb84be17bd3ac66b6a82af709", + "chainId": "eip155:324", + "name": "Grai", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30427/large/GRAI_Token.png?1696529315", + "symbol": "GRAI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x894134a25a5fac1c2c26f1d8fbf05111a3cb9487" + }, + "eip155:324/erc20:0x60e7fe7ae4461b535bb9eb40c20424c7c61063d0": { + "assetId": "eip155:324/erc20:0x60e7fe7ae4461b535bb9eb40c20424c7c61063d0", + "chainId": "eip155:324", + "name": "Zeekwifhat", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36371/large/zeekCG.png?1711338998", + "symbol": "ZWIF", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x686b311f82b407f0be842652a98e5619f64cc25f": { + "assetId": "eip155:324/erc20:0x686b311f82b407f0be842652a98e5619f64cc25f", + "chainId": "eip155:324", + "name": "Ethena", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36530/large/ethena.png?1711701436", + "symbol": "ENA", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x6ee46cb7cd2f15ee1ec9534cf29a5b51c83283e6": { + "assetId": "eip155:324/erc20:0x6ee46cb7cd2f15ee1ec9534cf29a5b51c83283e6", + "chainId": "eip155:324", + "name": "Kyber Network Crystal", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14899/large/RwdVsGcw_400x400.jpg?1696514562", + "symbol": "KNC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb" + }, + "eip155:324/erc20:0x6ff4fafd8d604614c704a5936d9146c0af19bd1e": { + "assetId": "eip155:324/erc20:0x6ff4fafd8d604614c704a5936d9146c0af19bd1e", + "chainId": "eip155:324", + "name": "Tradable APAC Diversified Finance Provider SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66798/large/tradable.jpg?1750576460", + "symbol": "PC0000033", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x703b52f2b28febcb60e1372858af5b18849fe867": { + "assetId": "eip155:324/erc20:0x703b52f2b28febcb60e1372858af5b18849fe867", + "chainId": "eip155:324", + "name": "txSync Bridged wstETH (zkSync)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53019/large/steth.png?1734998126", + "symbol": "WSTETH", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0" + }, + "eip155:324/erc20:0x71fd7dfa7db7094e0f857ad3040f1afef76fef85": { + "assetId": "eip155:324/erc20:0x71fd7dfa7db7094e0f857ad3040f1afef76fef85", + "chainId": "eip155:324", + "name": "Bullets", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30475/large/Logo_BLT_Token_%28200x200%29.png?1696529362", + "symbol": "BLT", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x74ed17608cc2b5f30a59d6af07c9ad1b1ab3a5b1": { + "assetId": "eip155:324/erc20:0x74ed17608cc2b5f30a59d6af07c9ad1b1ab3a5b1", + "chainId": "eip155:324", + "name": "Solv Protocol BTC", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36800/large/solvBTC.png?1719810684", + "symbol": "SOLVBTC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x3647c54c4c2c65bc7a2d63c0da2809b399dbbdc0" + }, + "eip155:324/erc20:0x7715c206a14ac93cb1a6c0316a6e5f8ad7c9dc31": { + "assetId": "eip155:324/erc20:0x7715c206a14ac93cb1a6c0316a6e5f8ad7c9dc31", + "chainId": "eip155:324", + "name": "Mountain Protocol USD", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31719/large/usdm.png?1696530540", + "symbol": "USDM", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c" + }, + "eip155:324/erc20:0x787c09494ec8bcb24dcaf8659e7d5d69979ee508": { + "assetId": "eip155:324/erc20:0x787c09494ec8bcb24dcaf8659e7d5d69979ee508", + "chainId": "eip155:324", + "name": "Maverick Protocol", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30850/large/MAV_Logo.png?1696529701", + "symbol": "MAV", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd" + }, + "eip155:324/erc20:0x79db8c67d0c33203da4efb58f7d325e1e0d4d692": { + "assetId": "eip155:324/erc20:0x79db8c67d0c33203da4efb58f7d325e1e0d4d692", + "chainId": "eip155:324", + "name": "Zeek Coin", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/34101/large/Zeek_200_by_200.png?1714928523", + "symbol": "MEOW", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x7f2fd959013eec5144269ac6edd0015cb10968fc": { + "assetId": "eip155:324/erc20:0x7f2fd959013eec5144269ac6edd0015cb10968fc", + "chainId": "eip155:324", + "name": "Tarot", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31800/large/TAROT.jpg?1696530615", + "symbol": "TAROT", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x81e7186947fb59aaaaeb476a47daac60680cbbaf": { + "assetId": "eip155:324/erc20:0x81e7186947fb59aaaaeb476a47daac60680cbbaf", + "chainId": "eip155:324", + "name": "Wefi", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/30540/large/wefi.png?1696529412", + "symbol": "WEFI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xffa188493c15dfaf2c206c97d8633377847b6a52" + }, + "eip155:324/erc20:0x83547ba6b1992f70ae7203de4e95bb74b37ca3ec": { + "assetId": "eip155:324/erc20:0x83547ba6b1992f70ae7203de4e95bb74b37ca3ec", + "chainId": "eip155:324", + "name": "NA Fintech Nonprime Lender SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66792/large/tradable.jpg?1750576200", + "symbol": "PC0000037", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x8e86e46278518efc1c5ced245cba2c7e3ef11557": { + "assetId": "eip155:324/erc20:0x8e86e46278518efc1c5ced245cba2c7e3ef11557", + "chainId": "eip155:324", + "name": "Overnight.fi USD+", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/25757/large/USD__logo.png?1696524843", + "symbol": "USD+", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xe80772eaf6e2e18b651f160bc9158b2a5cafca65" + }, + "eip155:324/erc20:0x941fc398d9faebdd9f311011541045a1d66c748e": { + "assetId": "eip155:324/erc20:0x941fc398d9faebdd9f311011541045a1d66c748e", + "chainId": "eip155:324", + "name": "Nop App", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36376/large/191.png?1711342125", + "symbol": "NOP", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0x9929bcac4417a21d7e6fc86f6dae1cc7f27a2e41": { + "assetId": "eip155:324/erc20:0x9929bcac4417a21d7e6fc86f6dae1cc7f27a2e41", + "chainId": "eip155:324", + "name": "Memento", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/12634/large/Logo_DEXTF_avatar_gradientFG_transparentBG.png?1741774960", + "symbol": "DEXTF", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:43114/erc20:0x03e8d118a1864c7dc53bf91e007ab7d91f5a06fa" + }, + "eip155:324/erc20:0x9e22d758629761fc5708c171d06c2fabb60b5159": { + "assetId": "eip155:324/erc20:0x9e22d758629761fc5708c171d06c2fabb60b5159", + "chainId": "eip155:324", + "name": "WOO", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/12921/large/WOO_Logos_2023_Profile_Pic_WOO.png?1696512709", + "symbol": "WOO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xcafcd85d8ca7ad1e1c6f82f651fa15e33aefd07b" + }, + "eip155:324/erc20:0xa4b3dc5433ecabdd1498ca7f3f4d890b185c0b0a": { + "assetId": "eip155:324/erc20:0xa4b3dc5433ecabdd1498ca7f3f4d890b185c0b0a", + "chainId": "eip155:324", + "name": "Tradable NA Legal Receivables SSL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66799/large/tradable.jpg?1750576475", + "symbol": "PC0000081", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xa900cbe7739c96d2b153a273953620a701d5442b": { + "assetId": "eip155:324/erc20:0xa900cbe7739c96d2b153a273953620a701d5442b", + "chainId": "eip155:324", + "name": "Wrapped USDM", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/33785/large/wUSDM_PNG_240px.png?1702981552", + "symbol": "WUSDM", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812" + }, + "eip155:324/erc20:0xa995ad25ce5eb76972ab356168f5e1d9257e4d05": { + "assetId": "eip155:324/erc20:0xa995ad25ce5eb76972ab356168f5e1d9257e4d05", + "chainId": "eip155:324", + "name": "Koi", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35766/large/Koi_logo.png?1709782399", + "symbol": "KOI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xabec5ecbe08b6c02f5c9a2ff82696e1e7db6f9bf": { + "assetId": "eip155:324/erc20:0xabec5ecbe08b6c02f5c9a2ff82696e1e7db6f9bf", + "chainId": "eip155:324", + "name": "Heurist", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/51361/large/200X200.png?1733764636", + "symbol": "HEU", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:8453/erc20:0xef22cb48b8483df6152e1423b19df5553bbd818b" + }, + "eip155:324/erc20:0xac4de1e9a9e83524f24af77972dd39d588de8164": { + "assetId": "eip155:324/erc20:0xac4de1e9a9e83524f24af77972dd39d588de8164", + "chainId": "eip155:324", + "name": "Tradable NA Rent Financing Platform SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66150/large/tradable.jpg?1748488921", + "symbol": "PC0000031", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xae0d8cad4ce522538ae34386c319c7ccd11fe428": { + "assetId": "eip155:324/erc20:0xae0d8cad4ce522538ae34386c319c7ccd11fe428", + "chainId": "eip155:324", + "name": "Tradable NA Neobank SSTL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66797/large/tradable.jpg?1750576441", + "symbol": "PC0000023", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xaf08a9d918f16332f22cf8dc9abe9d9e14ddcbc2": { + "assetId": "eip155:324/erc20:0xaf08a9d918f16332f22cf8dc9abe9d9e14ddcbc2", + "chainId": "eip155:324", + "name": "Holdstation USDC", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/32646/large/hsUSDC.png?1698893340", + "symbol": "HSUSDC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xafe4ca0bbe6215cbda12857e723134bc3809f766": { + "assetId": "eip155:324/erc20:0xafe4ca0bbe6215cbda12857e723134bc3809f766", + "chainId": "eip155:324", + "name": "MacaronSwap", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14633/large/macaron.png?1696514311", + "symbol": "MCRN", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:56/erc20:0xacb2d47827c9813ae26de80965845d80935afd0b" + }, + "eip155:324/erc20:0xb0588f9a9cade7cd5f194a5fe77acd6a58250f82": { + "assetId": "eip155:324/erc20:0xb0588f9a9cade7cd5f194a5fe77acd6a58250f82", + "chainId": "eip155:324", + "name": "Bonsai Token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35884/large/bonsaiToken.png?1744187538", + "symbol": "BONSAI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x474f4cb764df9da079d94052fed39625c147c12c" + }, + "eip155:324/erc20:0xb0c2bdc425fd01c33d8514f8be016070212bdc6a": { + "assetId": "eip155:324/erc20:0xb0c2bdc425fd01c33d8514f8be016070212bdc6a", + "chainId": "eip155:324", + "name": "Long Mao", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35213/large/rsz_longmaopfpp.png?1707898201", + "symbol": "LMAO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xb6841b40baafedf4e37935270357ff89df42e68e": { + "assetId": "eip155:324/erc20:0xb6841b40baafedf4e37935270357ff89df42e68e", + "chainId": "eip155:324", + "name": "Stable USDLR", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/33115/large/0x68592c5c98c4f4a8a4bc6da2121e65da3d1c0917.png?1700731571", + "symbol": "USDLR", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x7e40b3e0fd0473e0240288d2b7618ac6f0c17e1b" + }, + "eip155:324/erc20:0xb6a09d426861c63722aa0b333a9ce5d5a9b04c4f": { + "assetId": "eip155:324/erc20:0xb6a09d426861c63722aa0b333a9ce5d5a9b04c4f", + "chainId": "eip155:324", + "name": "Staked USN", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54924/large/sUSN_Logo.png?1742538935", + "symbol": "SUSN", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xb7f5b452b381a90ba10bdde6d75c6a4fd65a4239": { + "assetId": "eip155:324/erc20:0xb7f5b452b381a90ba10bdde6d75c6a4fd65a4239", + "chainId": "eip155:324", + "name": "Rogue MAV", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/32384/large/rMAV.png?1698045143", + "symbol": "RMAV", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6" + }, + "eip155:324/erc20:0xbbeb516fb02a01611cbbe0453fe3c580d7281011": { + "assetId": "eip155:324/erc20:0xbbeb516fb02a01611cbbe0453fe3c580d7281011", + "chainId": "eip155:324", + "name": "zkSync Bridged WBTC (zkSync)", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39592/large/wbtc.png?1723016108", + "symbol": "WBTC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "eip155:324/erc20:0xbd4372e44c5ee654dd838304006e1f0f69983154": { + "assetId": "eip155:324/erc20:0xbd4372e44c5ee654dd838304006e1f0f69983154", + "chainId": "eip155:324", + "name": "Nodle Network", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/27019/large/nodle.png?1696526071", + "symbol": "NODL", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xbe9f8c0d6f0fd7e46cdacca340747ea2f247991d": { + "assetId": "eip155:324/erc20:0xbe9f8c0d6f0fd7e46cdacca340747ea2f247991d", + "chainId": "eip155:324", + "name": "Impermax", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/27606/large/IqwOmX-c_400x400.jpeg?1696526637", + "symbol": "IBEX", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x56659245931cb6920e39c189d2a0e7dd0da2d57b" + }, + "eip155:324/erc20:0xbfb4b5616044eded03e5b1ad75141f0d9cb1499b": { + "assetId": "eip155:324/erc20:0xbfb4b5616044eded03e5b1ad75141f0d9cb1499b", + "chainId": "eip155:324", + "name": "zkDoge", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/29619/large/zkdoge.png?1696528555", + "symbol": "ZKDOGE", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xc1fa6e2e8667d9be0ca938a54c7e0285e9df924a": { + "assetId": "eip155:324/erc20:0xc1fa6e2e8667d9be0ca938a54c7e0285e9df924a", + "chainId": "eip155:324", + "name": "Wrapped eETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/33033/large/weETH.png?1701438396", + "symbol": "WEETH", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x35751007a407ca6feffe80b3cb397736d2cf4dbe" + }, + "eip155:324/erc20:0xc629d9e3d1a4325dbfaff85d5a61da956cc5e32b": { + "assetId": "eip155:324/erc20:0xc629d9e3d1a4325dbfaff85d5a61da956cc5e32b", + "chainId": "eip155:324", + "name": "Tradable LatAm BNPL SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66793/large/tradable.jpg?1750576283", + "symbol": "PC0000027", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xc6dac3a53d5d6de9d1d05aa6e28b8e9e41722601": { + "assetId": "eip155:324/erc20:0xc6dac3a53d5d6de9d1d05aa6e28b8e9e41722601", + "chainId": "eip155:324", + "name": "Wrapped LIBERTAS OMNIBUS", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35181/large/libertas.png?1707796268", + "symbol": "LIBERTAS", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xc8ac6191cdc9c7bf846ad6b52aaaa7a0757ee305": { + "assetId": "eip155:324/erc20:0xc8ac6191cdc9c7bf846ad6b52aaaa7a0757ee305", + "chainId": "eip155:324", + "name": "Metavault Trade", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/25402/large/mvx.png?1696524534", + "symbol": "MVX", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:137/erc20:0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7" + }, + "eip155:324/erc20:0xcd2cfa60f04f3421656d6eebee122b3973b3f60c": { + "assetId": "eip155:324/erc20:0xcd2cfa60f04f3421656d6eebee122b3973b3f60c", + "chainId": "eip155:324", + "name": "MetaElfLand", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31469/large/MELD_LOGO.png?1696530282", + "symbol": "MELD", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xcdb7d260c107499c80b4b748e8331c64595972a1": { + "assetId": "eip155:324/erc20:0xcdb7d260c107499c80b4b748e8331c64595972a1", + "chainId": "eip155:324", + "name": "Karat", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/31834/large/coin1.png?1696530647", + "symbol": "KAT", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xd03465338226ea0178337f4abb16fdd6df529f57": { + "assetId": "eip155:324/erc20:0xd03465338226ea0178337f4abb16fdd6df529f57", + "chainId": "eip155:324", + "name": "Interport Token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/28338/large/ITP_Logo_200.png?1696527344", + "symbol": "ITP", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31" + }, + "eip155:324/erc20:0xd4169e045bcf9a86cc00101225d9ed61d2f51af2": { + "assetId": "eip155:324/erc20:0xd4169e045bcf9a86cc00101225d9ed61d2f51af2", + "chainId": "eip155:324", + "name": "Wrapped rsETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/37919/large/rseth.png?1715936438", + "symbol": "WRSETH", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:59144/erc20:0xd2671165570f41bbb3b0097893300b6eb6101e6c" + }, + "eip155:324/erc20:0xd63ef5e9c628c8a0e8984cdfb7444aee44b09044": { + "assetId": "eip155:324/erc20:0xd63ef5e9c628c8a0e8984cdfb7444aee44b09044", + "chainId": "eip155:324", + "name": "CVI", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/13875/large/GOVI.png?1696513619", + "symbol": "GOVI", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x07e49d5de43dda6162fa28d24d5935c151875283" + }, + "eip155:324/erc20:0xd78abd81a3d57712a3af080dc4185b698fe9ac5a": { + "assetId": "eip155:324/erc20:0xd78abd81a3d57712a3af080dc4185b698fe9ac5a", + "chainId": "eip155:324", + "name": "Venus", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/12677/large/XVS_Token.jpg?1727454303", + "symbol": "XVS", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:56/erc20:0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63" + }, + "eip155:324/erc20:0xd8916e15d351dc728414e99a4883c72010ee11f8": { + "assetId": "eip155:324/erc20:0xd8916e15d351dc728414e99a4883c72010ee11f8", + "chainId": "eip155:324", + "name": "Tradable NA Third Party Online Merchant SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66880/large/tradable.jpg?1750921859", + "symbol": "PC0000015", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xdd9f72afed3631a6c85b5369d84875e6c42f1827": { + "assetId": "eip155:324/erc20:0xdd9f72afed3631a6c85b5369d84875e6c42f1827", + "chainId": "eip155:324", + "name": "Symbiosis", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/20805/large/SymbiosisFinance_logo-150x150.jpeg?1696520198", + "symbol": "SIS", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x9e758b8a98a42d612b3d38b66a22074dc03d7370" + }, + "eip155:324/erc20:0xdea6d5161978d36b5c0fa6a491faa754f4bc809c": { + "assetId": "eip155:324/erc20:0xdea6d5161978d36b5c0fa6a491faa754f4bc809c", + "chainId": "eip155:324", + "name": "Idexo", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/18523/large/qOiqm7T8_400x400.jpg?1696518004", + "symbol": "IDO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876": { + "assetId": "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876", + "chainId": "eip155:324", + "name": "Solarcoin", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/152/large/solarcoin.png?1696501524", + "symbol": "SLR", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876" + }, + "eip155:324/erc20:0xe3d53addadb3f87adc38b4192171aaf5a07a3738": { + "assetId": "eip155:324/erc20:0xe3d53addadb3f87adc38b4192171aaf5a07a3738", + "chainId": "eip155:324", + "name": "NA Capital-as-a-Service SSTN", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66593/large/tradable.jpg?1749883324", + "symbol": "PC0016245", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xe53dbcef6f700536a912c51caea4d0e2be2b1388": { + "assetId": "eip155:324/erc20:0xe53dbcef6f700536a912c51caea4d0e2be2b1388", + "chainId": "eip155:324", + "name": "Tradable Eu/LatAm PoS Financing SSTL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66794/large/tradable.jpg?1750576332", + "symbol": "PC0000049", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xe593853b4d603d5b8f21036bb4ad0d1880097a6e": { + "assetId": "eip155:324/erc20:0xe593853b4d603d5b8f21036bb4ad0d1880097a6e", + "chainId": "eip155:324", + "name": "Fulcrom", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/29684/large/FUL_Token_%281%29.png?1696528618", + "symbol": "FUL", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xe757355edba7ced7b8c0271bba4efda184ad75ab": { + "assetId": "eip155:324/erc20:0xe757355edba7ced7b8c0271bba4efda184ad75ab", + "chainId": "eip155:324", + "name": "Merlin's Seal BTC", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36566/large/photo_2024-03-25_22-04-42.jpg?1711936162", + "symbol": "M-BTC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "sui:35834a8a/coin:0xd1a91b46bd6d966b62686263609074ad16cfdffc63c31a4775870a2d54d20c6b::mbtc::MBTC" + }, + "eip155:324/erc20:0xe75a17b4f5c4f844688d5670b684515d7c785e63": { + "assetId": "eip155:324/erc20:0xe75a17b4f5c4f844688d5670b684515d7c785e63", + "chainId": "eip155:324", + "name": "Veno Finance", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/28799/large/Veno_Token_dark.png?1696527777", + "symbol": "VNO", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xe7895ed01a1a6aacf1c2e955af14e7cf612e7f9d": { + "assetId": "eip155:324/erc20:0xe7895ed01a1a6aacf1c2e955af14e7cf612e7f9d", + "chainId": "eip155:324", + "name": "Veno Finance Staked ETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/34945/large/LETH_%281%29.png?1708020787", + "symbol": "LETH", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xea77c590bb36c43ef7139ce649cfbcfd6163170d": { + "assetId": "eip155:324/erc20:0xea77c590bb36c43ef7139ce649cfbcfd6163170d", + "chainId": "eip155:324", + "name": "Frax USD", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53963/large/frxUSD.png?1737792154", + "symbol": "FRXUSD", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/erc20:0xcacd6fd266af91b8aed52accc382b4e165586e29" + }, + "eip155:324/erc20:0xfb3fccdd38a96c3f769c62e578323f22c3bfcbec": { + "assetId": "eip155:324/erc20:0xfb3fccdd38a96c3f769c62e578323f22c3bfcbec", + "chainId": "eip155:324", + "name": "LatAm Residential SSTL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66590/large/tradable.jpg?1749832358", + "symbol": "PC0000089", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/erc20:0xfb4c64c144c2bd0e7f2a06da7d6aac32d8cb2514": { + "assetId": "eip155:324/erc20:0xfb4c64c144c2bd0e7f2a06da7d6aac32d8cb2514", + "chainId": "eip155:324", + "name": "Archly Finance", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/37308/large/arc-logo-circle-200.png?1713952763", + "symbol": "ARC", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xe8876189a80b2079d8c0a7867e46c50361d972c1" + }, + "eip155:324/erc20:0xfeafde23fb2364896c297c3fa6628f04601a035b": { + "assetId": "eip155:324/erc20:0xfeafde23fb2364896c297c3fa6628f04601a035b", + "chainId": "eip155:324", + "name": "Tradable LatAm Middle-Market Lender SSTL", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/66877/large/tradable.jpg?1750921571", + "symbol": "PC0000085", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": null + }, + "eip155:324/slip44:60": { + "assetId": "eip155:324/slip44:60", + "chainId": "eip155:324", + "name": "Ethereum", + "networkName": "zkSync Era", + "symbol": "ETH", + "precision": 18, + "color": "#8C8DFC", + "networkColor": "#8C8DFC", + "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", + "networkIcon": "https://assets.relay.link/icons/324/light.png", + "explorer": "https://explorer.zksync.io", + "explorerAddressLink": "https://explorer.zksync.io/address/", + "explorerTxLink": "https://explorer.zksync.io/tx/", + "relatedAssetKey": "eip155:1/slip44:60" } }, "ids": [ @@ -466320,6 +467571,102 @@ "eip155:81457/erc20:0xfcbe84b53fd3ed33b5dfa82fb005603daa5204a7", "eip155:81457/erc20:0xfdc1901e40c708e72661af607a8a027740a08676", "eip155:81457/erc20:0xfecf117ce579acb96e89872af6cc9525980c397c", - "eip155:81457/slip44:60" + "eip155:81457/slip44:60", + "eip155:324/erc20:0x0469d9d1de0ee58fa1153ef00836b9bbcb84c0b6", + "eip155:324/erc20:0x05b65997ff7cb7976b43000ad376f91108b30d40", + "eip155:324/erc20:0x0c6eaaab86e8374a91e3f42c726b6fd1abacb54c", + "eip155:324/erc20:0x0e97c7a0f8b2c9885c8ac9fc6136e829cbc21d42", + "eip155:324/erc20:0x16a9494e257703797d747540f01683952547ee5b", + "eip155:324/erc20:0x18012cb9e1478ef458c8c996f99b8dceca60795c", + "eip155:324/erc20:0x1d17cbcf0d6d143135ae902365d2e5e2a16538d4", + "eip155:324/erc20:0x1f179a51ab46252f469733dfcbd9115090a91f03", + "eip155:324/erc20:0x244c238325fc1bdf6eded726ee1b47d55895d944", + "eip155:324/erc20:0x27d0a2b5316b98088294378692f4eabfb3222e36", + "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9", + "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a", + "eip155:324/erc20:0x3355df6d4c9c3035724fd0e3914de96a5a83aaf4", + "eip155:324/erc20:0x3613ad277df1d5935d41400a181aa9ec1dc2dc9e", + "eip155:324/erc20:0x39fe7a0dacce31bd90418e3e659fb0b5f0b3db0d", + "eip155:324/erc20:0x3a287a06c66f9e95a56327185ca2bdf5f031cecd", + "eip155:324/erc20:0x3a34fa9a1288597ad6c1da709f001d37fef8b19e", + "eip155:324/erc20:0x3d19625bb8e4b52ac4ca28ecec2b5e243ae2ee81", + "eip155:324/erc20:0x3e9c747db47602210ea7513c9d00abf356b53880", + "eip155:324/erc20:0x47ef4a5641992a72cfd57b9406c9d9cefee8e0c4", + "eip155:324/erc20:0x493257fd37edb34451f62edf8d2a0c418852ba4c", + "eip155:324/erc20:0x4b9eb6c0b6ea15176bbf62841c6b2a8a398cb656", + "eip155:324/erc20:0x503234f203fc7eb888eec8513210612a43cf6115", + "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398", + "eip155:324/erc20:0x52869bae3e091e36b0915941577f2d47d8d8b534", + "eip155:324/erc20:0x53acd3c88ec04b8e22b8ef768ec4d928153d892e", + "eip155:324/erc20:0x5556fe72eb021f97d39ba704f3674f1731e1acc4", + "eip155:324/erc20:0x5756a28e2aae01f600fc2c01358395f5c1f8ad3a", + "eip155:324/erc20:0x57fd71a86522dc06d6255537521886057c1772a3", + "eip155:324/erc20:0x5895024c953bee18d5f026bfcf6259bb2d79e12d", + "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e", + "eip155:324/erc20:0x5abe0a2ead1357f70e73f5b60e227df64a54ddd5", + "eip155:324/erc20:0x5aea5775959fbc2557cc8789bc1bf90a239d9a91", + "eip155:324/erc20:0x5c8c39e167c604b036afd3fbb65426f9fe78ce6d", + "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d", + "eip155:324/erc20:0x5f7cbcb391d33988dad74d6fd683aadda1123e4d", + "eip155:324/erc20:0x5fc44e95eaa48f9eb84be17bd3ac66b6a82af709", + "eip155:324/erc20:0x60e7fe7ae4461b535bb9eb40c20424c7c61063d0", + "eip155:324/erc20:0x686b311f82b407f0be842652a98e5619f64cc25f", + "eip155:324/erc20:0x6ee46cb7cd2f15ee1ec9534cf29a5b51c83283e6", + "eip155:324/erc20:0x6ff4fafd8d604614c704a5936d9146c0af19bd1e", + "eip155:324/erc20:0x703b52f2b28febcb60e1372858af5b18849fe867", + "eip155:324/erc20:0x71fd7dfa7db7094e0f857ad3040f1afef76fef85", + "eip155:324/erc20:0x74ed17608cc2b5f30a59d6af07c9ad1b1ab3a5b1", + "eip155:324/erc20:0x7715c206a14ac93cb1a6c0316a6e5f8ad7c9dc31", + "eip155:324/erc20:0x787c09494ec8bcb24dcaf8659e7d5d69979ee508", + "eip155:324/erc20:0x79db8c67d0c33203da4efb58f7d325e1e0d4d692", + "eip155:324/erc20:0x7f2fd959013eec5144269ac6edd0015cb10968fc", + "eip155:324/erc20:0x81e7186947fb59aaaaeb476a47daac60680cbbaf", + "eip155:324/erc20:0x83547ba6b1992f70ae7203de4e95bb74b37ca3ec", + "eip155:324/erc20:0x8e86e46278518efc1c5ced245cba2c7e3ef11557", + "eip155:324/erc20:0x941fc398d9faebdd9f311011541045a1d66c748e", + "eip155:324/erc20:0x9929bcac4417a21d7e6fc86f6dae1cc7f27a2e41", + "eip155:324/erc20:0x9e22d758629761fc5708c171d06c2fabb60b5159", + "eip155:324/erc20:0xa4b3dc5433ecabdd1498ca7f3f4d890b185c0b0a", + "eip155:324/erc20:0xa900cbe7739c96d2b153a273953620a701d5442b", + "eip155:324/erc20:0xa995ad25ce5eb76972ab356168f5e1d9257e4d05", + "eip155:324/erc20:0xabec5ecbe08b6c02f5c9a2ff82696e1e7db6f9bf", + "eip155:324/erc20:0xac4de1e9a9e83524f24af77972dd39d588de8164", + "eip155:324/erc20:0xae0d8cad4ce522538ae34386c319c7ccd11fe428", + "eip155:324/erc20:0xaf08a9d918f16332f22cf8dc9abe9d9e14ddcbc2", + "eip155:324/erc20:0xafe4ca0bbe6215cbda12857e723134bc3809f766", + "eip155:324/erc20:0xb0588f9a9cade7cd5f194a5fe77acd6a58250f82", + "eip155:324/erc20:0xb0c2bdc425fd01c33d8514f8be016070212bdc6a", + "eip155:324/erc20:0xb6841b40baafedf4e37935270357ff89df42e68e", + "eip155:324/erc20:0xb6a09d426861c63722aa0b333a9ce5d5a9b04c4f", + "eip155:324/erc20:0xb7f5b452b381a90ba10bdde6d75c6a4fd65a4239", + "eip155:324/erc20:0xbbeb516fb02a01611cbbe0453fe3c580d7281011", + "eip155:324/erc20:0xbd4372e44c5ee654dd838304006e1f0f69983154", + "eip155:324/erc20:0xbe9f8c0d6f0fd7e46cdacca340747ea2f247991d", + "eip155:324/erc20:0xbfb4b5616044eded03e5b1ad75141f0d9cb1499b", + "eip155:324/erc20:0xc1fa6e2e8667d9be0ca938a54c7e0285e9df924a", + "eip155:324/erc20:0xc629d9e3d1a4325dbfaff85d5a61da956cc5e32b", + "eip155:324/erc20:0xc6dac3a53d5d6de9d1d05aa6e28b8e9e41722601", + "eip155:324/erc20:0xc8ac6191cdc9c7bf846ad6b52aaaa7a0757ee305", + "eip155:324/erc20:0xcd2cfa60f04f3421656d6eebee122b3973b3f60c", + "eip155:324/erc20:0xcdb7d260c107499c80b4b748e8331c64595972a1", + "eip155:324/erc20:0xd03465338226ea0178337f4abb16fdd6df529f57", + "eip155:324/erc20:0xd4169e045bcf9a86cc00101225d9ed61d2f51af2", + "eip155:324/erc20:0xd63ef5e9c628c8a0e8984cdfb7444aee44b09044", + "eip155:324/erc20:0xd78abd81a3d57712a3af080dc4185b698fe9ac5a", + "eip155:324/erc20:0xd8916e15d351dc728414e99a4883c72010ee11f8", + "eip155:324/erc20:0xdd9f72afed3631a6c85b5369d84875e6c42f1827", + "eip155:324/erc20:0xdea6d5161978d36b5c0fa6a491faa754f4bc809c", + "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876", + "eip155:324/erc20:0xe3d53addadb3f87adc38b4192171aaf5a07a3738", + "eip155:324/erc20:0xe53dbcef6f700536a912c51caea4d0e2be2b1388", + "eip155:324/erc20:0xe593853b4d603d5b8f21036bb4ad0d1880097a6e", + "eip155:324/erc20:0xe757355edba7ced7b8c0271bba4efda184ad75ab", + "eip155:324/erc20:0xe75a17b4f5c4f844688d5670b684515d7c785e63", + "eip155:324/erc20:0xe7895ed01a1a6aacf1c2e955af14e7cf612e7f9d", + "eip155:324/erc20:0xea77c590bb36c43ef7139ce649cfbcfd6163170d", + "eip155:324/erc20:0xfb3fccdd38a96c3f769c62e578323f22c3bfcbec", + "eip155:324/erc20:0xfb4c64c144c2bd0e7f2a06da7d6aac32d8cb2514", + "eip155:324/erc20:0xfeafde23fb2364896c297c3fa6628f04601a035b", + "eip155:324/slip44:60" ] } \ No newline at end of file diff --git a/public/generated/generatedAssetData.json.br b/public/generated/generatedAssetData.json.br index 1a31697e7db..2d5950b6e77 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 f2d88fdb163..ad14e7e9e48 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 17ddd403948..ed3f3348403 100644 --- a/public/generated/relatedAssetIndex.json +++ b/public/generated/relatedAssetIndex.json @@ -902,7 +902,8 @@ ], "eip155:42161/erc20:0x894134a25a5fac1c2c26f1d8fbf05111a3cb9487": [ "eip155:1/erc20:0x15f74458ae0bfdaa1a96ca1aa779d715cc1eefe4", - "eip155:42161/erc20:0x894134a25a5fac1c2c26f1d8fbf05111a3cb9487" + "eip155:42161/erc20:0x894134a25a5fac1c2c26f1d8fbf05111a3cb9487", + "eip155:324/erc20:0x5fc44e95eaa48f9eb84be17bd3ac66b6a82af709" ], "eip155:1/erc20:0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05": [ "eip155:137/erc20:0x15b7c0c907e4c6b9adaaaabc300c08991d6cea05", @@ -1056,7 +1057,8 @@ "eip155:1/erc20:0x152649ea73beab28c5b49b26eb48f7ead6d4c898", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:4qQeZ5LwSz6HuupUu8jCtgXyW1mYQcNbFAW1sWZp89HL", "eip155:42161/erc20:0x1b896893dfc86bb67cf57767298b9073d2c1ba2c", - "eip155:59144/erc20:0x0d1e753a25ebda689453309112904807625befbe" + "eip155:59144/erc20:0x0d1e753a25ebda689453309112904807625befbe", + "eip155:324/erc20:0x3a287a06c66f9e95a56327185ca2bdf5f031cecd" ], "eip155:42161/erc20:0x123389c2f0e9194d9ba98c21e63c375b67614108": [ "eip155:1/erc20:0x15874d65e649880c2614e7a480cb7c9a55787ff6", @@ -1448,7 +1450,8 @@ "eip155:34443/erc20:0xcdd475325d6f564d27247d1dddbb0dac6fa0a5cf", "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c", "eip155:43111/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", - "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3" + "eip155:480/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", + "eip155:324/erc20:0xbbeb516fb02a01611cbbe0453fe3c580d7281011" ], "eip155:8453/erc20:0xc5fed7c8ccc75d8a72b601a66dffd7a489073f0b": [ "eip155:56/erc20:0x6ef2ffb38d64afe18ce782da280b300e358cfeaf", @@ -1681,7 +1684,8 @@ "eip155:10/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31", "eip155:1/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31", "eip155:534352/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31", - "eip155:59144/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31" + "eip155:59144/erc20:0x2b1d36f5b61addaf7da7ebbd11b35fd8cfb0de31", + "eip155:324/erc20:0xd03465338226ea0178337f4abb16fdd6df529f57" ], "eip155:56/erc20:0x08a513779f46ffb7a34f16094a94016d010128a8": [ "eip155:1/erc20:0x28151f5888833d3d767c4d6945a0ee50d1b193e3", @@ -2756,7 +2760,8 @@ "eip155:42161/erc20:0xcafcd85d8ca7ad1e1c6f82f651fa15e33aefd07b", "near:mainnet/nep141:4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near", "eip155:59144/erc20:0xf3df0a31ec5ea438150987805e841f960b9471b6", - "eip155:5000/erc20:0xf3df0a31ec5ea438150987805e841f960b9471b6" + "eip155:5000/erc20:0xf3df0a31ec5ea438150987805e841f960b9471b6", + "eip155:324/erc20:0x9e22d758629761fc5708c171d06c2fabb60b5159" ], "eip155:42161/erc20:0x808167ea744e02c6fec3f56636d19f3448b72981": [ "eip155:8453/erc20:0x0400373ea12d84f578b8ab2c21556645333cc312", @@ -3177,7 +3182,8 @@ "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec", "eip155:43111/erc20:0x63dbe12a6381d64ade47bc3d92abf4393dff4bc8", "eip155:480/erc20:0x915b648e994d5f31059b38223b9fbe98ae185473", - "eip155:81457/erc20:0x93202ec683288a9ea75bb829c6bacfb2bfea9013" + "eip155:81457/erc20:0x93202ec683288a9ea75bb829c6bacfb2bfea9013", + "eip155:324/erc20:0x52869bae3e091e36b0915941577f2d47d8d8b534" ], "eip155:42161/erc20:0x315a2dca4b1b633d3a707c71d96243534c02f7c4": [ "eip155:8453/erc20:0x78bb8ff6baa486c31ce0ef1a157798f7a606565c", @@ -3366,7 +3372,8 @@ "eip155:1/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812", "eip155:10/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812", "eip155:137/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812", - "eip155:42161/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812" + "eip155:42161/erc20:0x57f5e098cad7a3d1eed53991d4d66c45c9af7812", + "eip155:324/erc20:0xa900cbe7739c96d2b153a273953620a701d5442b" ], "eip155:42161/erc20:0x431402e8b9de9aa016c743880e04e517074d8cec": [ "eip155:1/erc20:0x584bc13c7d411c00c01a62e8019472de68768430", @@ -3460,7 +3467,8 @@ "eip155:1/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c", "eip155:10/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c", "eip155:137/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c", - "eip155:42161/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c" + "eip155:42161/erc20:0x59d9356e565ab3a36dd77763fc0d87feaf85508c", + "eip155:324/erc20:0x7715c206a14ac93cb1a6c0316a6e5f8ad7c9dc31" ], "eip155:56/erc20:0x7283dfa2d8d7e277b148cc263b5d8ae02f1076d3": [ "eip155:1/erc20:0x58f7345b5295e43aa454911571f13be186655be9", @@ -3699,7 +3707,8 @@ "eip155:1/erc20:0x5f98805a4e8be255a32880fdec7f6728c6568ba0", "eip155:10/erc20:0xc40f949f8a4e094d1b49a23ea9241d289b7b2819", "eip155:137/erc20:0x23001f892c0c82b79303edc9b9033cd190bb21c7", - "eip155:42161/erc20:0x93b346b6bc2548da6a1e7d98e9a421b42541425b" + "eip155:42161/erc20:0x93b346b6bc2548da6a1e7d98e9a421b42541425b", + "eip155:324/erc20:0x503234f203fc7eb888eec8513210612a43cf6115" ], "eip155:42161/erc20:0x291a50e611035b6562a2374b8b44de70aa8d7896": [ "eip155:1/erc20:0x5ee3188a3f8adee1d736edd4ae85000105c88f66", @@ -3712,7 +3721,8 @@ "eip155:43114/erc20:0x03e8d118a1864c7dc53bf91e007ab7d91f5a06fa": [ "eip155:8453/erc20:0xb69bbb15095c0949489fbb43951d2b750fa7fa89", "eip155:1/erc20:0x5f64ab1544d28732f0a24f4713c2c8ec0da089f0", - "eip155:43114/erc20:0x03e8d118a1864c7dc53bf91e007ab7d91f5a06fa" + "eip155:43114/erc20:0x03e8d118a1864c7dc53bf91e007ab7d91f5a06fa", + "eip155:324/erc20:0x9929bcac4417a21d7e6fc86f6dae1cc7f27a2e41" ], "eip155:42161/erc20:0xa71e2738704e367798baa2755af5a10499634953": [ "eip155:8453/erc20:0xcaacd56d3d9b41d9d1272457e77f8ae510fdb688", @@ -3989,7 +3999,8 @@ "eip155:1/erc20:0x68592c5c98c4f4a8a4bc6da2121e65da3d1c0917", "eip155:42161/erc20:0x7e40b3e0fd0473e0240288d2b7618ac6f0c17e1b", "eip155:59144/erc20:0x68592c5c98c4f4a8a4bc6da2121e65da3d1c0917", - "eip155:5000/erc20:0x8fe7176f0bf63358ad9490fd24ac0bdb4dac33a8" + "eip155:5000/erc20:0x8fe7176f0bf63358ad9490fd24ac0bdb4dac33a8", + "eip155:324/erc20:0xb6841b40baafedf4e37935270357ff89df42e68e" ], "eip155:56/erc20:0xc5326b32e8baef125acd68f8bc646fd646104f1c": [ "eip155:1/erc20:0x6781a0f84c7e9e846dcb84a9a5bd49333067b104", @@ -4223,7 +4234,8 @@ "starknet:SN_MAIN/token:0x5574eb6b8789a91466f902c380d978e472db68170ff82a5b650b95a58ddf4ad", "starknet:SN_MAIN/token:0xda114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3", "eip155:25/erc20:0xf2001b145b43032aaf5ee2884e456ccd805f677d", - "eip155:59144/erc20:0x4af15ec2a0bd43db75dd04e62faa3b8ef36b00d5" + "eip155:59144/erc20:0x4af15ec2a0bd43db75dd04e62faa3b8ef36b00d5", + "eip155:324/erc20:0x4b9eb6c0b6ea15176bbf62841c6b2a8a398cb656" ], "eip155:1/erc20:0x6c28aef8977c9b773996d0e8376d2ee379446f2f": [ "eip155:137/erc20:0x831753dd7087cac61ab5644b308642cc1c33dc13", @@ -4626,7 +4638,8 @@ "eip155:1/erc20:0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd": [ "eip155:8453/erc20:0x64b88c73a5dfa78d1713fe1b4c69a22d7e0faaa7", "eip155:56/erc20:0xd691d9a68c887bdf34da8c36f63487333acfd103", - "eip155:1/erc20:0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd" + "eip155:1/erc20:0x7448c7456a97769f6cd04f1e83a4a23ccdc46abd", + "eip155:324/erc20:0x787c09494ec8bcb24dcaf8659e7d5d69979ee508" ], "eip155:8453/erc20:0x750cf88d9e0c2bcedeec31d5faad6ed6e3f1abc6": [ "eip155:56/erc20:0xa026ad2ceda16ca5fc28fd3c72f99e2c332c8a26", @@ -4821,7 +4834,8 @@ "eip155:146/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", "eip155:60808/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", "eip155:34443/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", - "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77" + "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", + "eip155:324/erc20:0x74ed17608cc2b5f30a59d6af07c9ad1b1ab3a5b1" ], "eip155:42161/erc20:0x7bbcf1b600565ae023a1806ef637af4739de3255": [ "eip155:8453/erc20:0x7bbcf1b600565ae023a1806ef637af4739de3255", @@ -4887,7 +4901,8 @@ "eip155:100/erc20:0x6c76971f98945ae98dd7d4dfca8711ebea946ea6", "eip155:42161/erc20:0x5979d7b546e38e414f7e9822514be443a4800529", "eip155:59144/erc20:0xb5bedd42000b71fdde22d3ee8a79bd49a568fc8f", - "eip155:130/erc20:0xc02fe7317d4eb8753a02c35fe019786854a92001" + "eip155:130/erc20:0xc02fe7317d4eb8753a02c35fe019786854a92001", + "eip155:324/erc20:0x703b52f2b28febcb60e1372858af5b18849fe867" ], "eip155:42161/erc20:0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8": [ "eip155:8453/erc20:0xa99f6e6785da0f5d6fb42495fe424bce029eeb3e", @@ -5454,7 +5469,8 @@ "eip155:8453/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6": [ "eip155:56/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6", "eip155:1/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6", - "eip155:8453/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6" + "eip155:8453/erc20:0x8f0f56472c3e5730b1ea2f444e7829288da261e6", + "eip155:324/erc20:0xb7f5b452b381a90ba10bdde6d75c6a4fd65a4239" ], "eip155:56/erc20:0xd3113a0ad20a46f6a662c63fe8e637f7713e59c7": [ "eip155:1/erc20:0x8f3e41b378ae010c46d255f36bfc1d303b52dceb", @@ -5600,7 +5616,8 @@ "eip155:137/erc20:0x07ed33a242bd9c08ca3c198e01189e35265024da", "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:Hb4m5r21uoA1rWiNFBJgWN8W52QYbw6UV9jAQDbGNsqH", "eip155:42161/erc20:0xaf20f5f19698f1d19351028cd7103b63d30de7d7", - "eip155:146/erc20:0x0e0ce4d450c705f8a0b6dd9d5123e3df2787d16b" + "eip155:146/erc20:0x0e0ce4d450c705f8a0b6dd9d5123e3df2787d16b", + "eip155:324/erc20:0x3613ad277df1d5935d41400a181aa9ec1dc2dc9e" ], "eip155:56/erc20:0xd9e8d20bde081600fac0d94b88eafaddce55aa43": [ "eip155:1/erc20:0x9196e18bc349b1f64bc08784eae259525329a1ad", @@ -5692,7 +5709,8 @@ "eip155:1/erc20:0x9482c407d32204462d8cbbc0755e96c39b79878e", "eip155:43114/erc20:0xe8876189a80b2079d8c0a7867e46c50361d972c1", "eip155:8453/erc20:0xe8876189a80b2079d8c0a7867e46c50361d972c1", - "eip155:42161/erc20:0xe8876189a80b2079d8c0a7867e46c50361d972c1" + "eip155:42161/erc20:0xe8876189a80b2079d8c0a7867e46c50361d972c1", + "eip155:324/erc20:0xfb4c64c144c2bd0e7f2a06da7d6aac32d8cb2514" ], "eip155:56/erc20:0x5d0158a5c3ddf47d4ea4517d8db0d76aa2e87563": [ "eip155:1/erc20:0x91dfbee3965baaee32784c2d546b7a0c62f268c9", @@ -5956,7 +5974,8 @@ "eip155:42161/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747", "eip155:534352/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747", "eip155:59144/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747", - "eip155:5000/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747" + "eip155:5000/erc20:0x60d01ec2d5e98ac51c8b4cf84dfcce98d527c747", + "eip155:324/erc20:0x16a9494e257703797d747540f01683952547ee5b" ], "eip155:8453/erc20:0x717d31a60a9e811469673429c9f8ea24358990f1": [ "eip155:1/erc20:0x9afa9999e45484adf5d8eed8d9dfe0693bacd838", @@ -6206,7 +6225,9 @@ "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369", "eip155:43111/erc20:0xad11a8beb98bbf61dbb1aa0f6d6f2ecd87b35afa", "eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1", - "eip155:81457/erc20:0xeb466342c4d449bc9f53a865d5cb90586f405215" + "eip155:81457/erc20:0xeb466342c4d449bc9f53a865d5cb90586f405215", + "eip155:324/erc20:0x3355df6d4c9c3035724fd0e3914de96a5a83aaf4", + "eip155:324/erc20:0x1d17cbcf0d6d143135ae902365d2e5e2a16538d4" ], "eip155:8453/erc20:0x9c632e6aaa3ea73f91554f8a3cb2ed2f29605e0c": [ "eip155:56/erc20:0x7324c7c0d95cebc73eea7e85cbaac0dbdf88a05b", @@ -7924,7 +7945,8 @@ "eip155:146/erc20:0x80eede496655fb9047dd39d9f418d5483ed600df", "eip155:130/erc20:0x80eede496655fb9047dd39d9f418d5483ed600df", "eip155:34443/erc20:0x80eede496655fb9047dd39d9f418d5483ed600df", - "eip155:81457/erc20:0x80eede496655fb9047dd39d9f418d5483ed600df" + "eip155:81457/erc20:0x80eede496655fb9047dd39d9f418d5483ed600df", + "eip155:324/erc20:0xea77c590bb36c43ef7139ce649cfbcfd6163170d" ], "eip155:56/erc20:0xcd6926193308d3b371fdd6a6219067e550000000": [ "eip155:1/erc20:0xcd6926193308d3b371fdd6a6219067e550000000", @@ -8049,7 +8071,8 @@ "eip155:146/erc20:0xa3d68b74bf0528fdd07263c60d6488749044914b", "eip155:130/erc20:0x7dcc39b4d1c53cb31e1abc0e358b43987fef80f7", "eip155:34443/erc20:0x04c0599ae5a44757c0af6f9ec3b93da8976c150a", - "eip155:81457/erc20:0x04c0599ae5a44757c0af6f9ec3b93da8976c150a" + "eip155:81457/erc20:0x04c0599ae5a44757c0af6f9ec3b93da8976c150a", + "eip155:324/erc20:0xc1fa6e2e8667d9be0ca938a54c7e0285e9df924a" ], "eip155:43114/erc20:0x6edac263561da41ade155a992759260fafb87b43": [ "eip155:8453/erc20:0x93402f62aeda632b9d768092b61887c4e9a13079", @@ -8176,7 +8199,8 @@ "eip155:42161/erc20:0xc1eb7689147c81ac840d4ff0d298489fc7986d52", "eip155:10/erc20:0x4a971e87ad1f61f7f3081645f52a99277ae917cf", "eip155:56/erc20:0xcf6bb5389c92bdda8a3747ddb454cb7a64626c63", - "eip155:130/erc20:0x81908bbaad3f6fc74093540ab2e9b749bb62aa0d" + "eip155:130/erc20:0x81908bbaad3f6fc74093540ab2e9b749bb62aa0d", + "eip155:324/erc20:0xd78abd81a3d57712a3af080dc4185b698fe9ac5a" ], "eip155:1/erc20:0xd3c5af6b2f0f754b2141f368cfc5ea99c3594d3a": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:XsTuW2zaiPbzgrnQ7b4Z99zeULMM7gPxppE61CtpyDj", @@ -8268,7 +8292,8 @@ "eip155:1/erc20:0xd38bb40815d2b0c2d2c866e0c72c5728ffc76dd9", "eip155:42161/erc20:0x9e758b8a98a42d612b3d38b66a22074dc03d7370", "eip155:534352/erc20:0x1467b62a6ae5cdcb10a6a8173cfe187dd2c5a136", - "eip155:59144/erc20:0x6ef95b6f3b0f39508e3e04054be96d5ee39ede0d" + "eip155:59144/erc20:0x6ef95b6f3b0f39508e3e04054be96d5ee39ede0d", + "eip155:324/erc20:0xdd9f72afed3631a6c85b5369d84875e6c42f1827" ], "eip155:43114/erc20:0x027dbca046ca156de9622cd1e2d907d375e53aa7": [ "eip155:56/erc20:0xdb021b1b247fe2f1fa57e0a87c748cc1e321f07f", @@ -8563,7 +8588,8 @@ "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", "eip155:43111/erc20:0xbb0d083fb1be0a9f6157ec484b6c79e0a4e31c2e", - "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282" + "eip155:480/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", + "eip155:324/erc20:0x493257fd37edb34451f62edf8d2a0c418852ba4c" ], "eip155:1/erc20:0xdb9783ca04bbd64fe2c6d7b9503a979b3de30729": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:XsAsZLF4MmsvS1sDxRMrUz7REjHfwbC9UAMXSRBqgEB", @@ -8763,7 +8789,8 @@ "eip155:10/erc20:0xa00e3a3511aac35ca78530c85007afcd31753819", "eip155:137/erc20:0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c", "eip155:42161/erc20:0xe4dddfe67e7164b0fe14e218d80dc4c08edc01cb", - "eip155:59144/erc20:0x3b2f62d42db19b30588648bf1c184865d4c3b1d6" + "eip155:59144/erc20:0x3b2f62d42db19b30588648bf1c184865d4c3b1d6", + "eip155:324/erc20:0x6ee46cb7cd2f15ee1ec9534cf29a5b51c83283e6" ], "eip155:8453/erc20:0xa0ff877e3d4f3a108b1b3d5eb3e4369301d2b2d7": [ "eip155:1/erc20:0xdfa208bb0b811cfbb5fa3ea98ec37aa86180e668", @@ -9107,7 +9134,8 @@ ], "eip155:8453/erc20:0xef22cb48b8483df6152e1423b19df5553bbd818b": [ "eip155:1/erc20:0xec463d00aa4da76fb112cd2e4ac1c6bef02da6ea", - "eip155:8453/erc20:0xef22cb48b8483df6152e1423b19df5553bbd818b" + "eip155:8453/erc20:0xef22cb48b8483df6152e1423b19df5553bbd818b", + "eip155:324/erc20:0xabec5ecbe08b6c02f5c9a2ff82696e1e7db6f9bf" ], "eip155:42161/erc20:0x0c29891dc5060618c779e2a45fbe4808aa5ae6ad": [ "eip155:8453/erc20:0x0150958b2b183a8e63264b8a6d82b4f747df3f62", @@ -9183,7 +9211,8 @@ "eip155:42161/erc20:0x07e49d5de43dda6162fa28d24d5935c151875283": [ "eip155:1/erc20:0xeeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107", "eip155:137/erc20:0x43df9c0a1156c96cea98737b511ac89d0e2a1f46", - "eip155:42161/erc20:0x07e49d5de43dda6162fa28d24d5935c151875283" + "eip155:42161/erc20:0x07e49d5de43dda6162fa28d24d5935c151875283", + "eip155:324/erc20:0xd63ef5e9c628c8a0e8984cdfb7444aee44b09044" ], "eip155:56/erc20:0x0dae81a905b645a3d1e67129b89cd0acda224e9a": [ "eip155:1/erc20:0xed3618bb8778f8ebbe2f241da532227591771d04", @@ -9439,7 +9468,8 @@ "eip155:42161/erc20:0x56659245931cb6920e39c189d2a0e7dd0da2d57b", "eip155:534352/erc20:0x78ab77f7d590fb101aa18affc238cbfea31ead5b", "eip155:59144/erc20:0xcf0f95e34f25d1bb3d9cad3cbb2eb40dab7c3841", - "eip155:81457/erc20:0x9f04b6cefd5bcd67d76ab708f17553ce40188e6a" + "eip155:81457/erc20:0x9f04b6cefd5bcd67d76ab708f17553ce40188e6a", + "eip155:324/erc20:0xbe9f8c0d6f0fd7e46cdacca340747ea2f247991d" ], "eip155:56/erc20:0x198abb2d13faa2e52e577d59209b5c23c20cd6b3": [ "eip155:1/erc20:0xf56842af3b56fd72d17cb103f92d027bba912e89", @@ -9783,7 +9813,8 @@ "eip155:1868/slip44:60", "eip155:43111/slip44:60", "eip155:480/slip44:60", - "eip155:81457/slip44:60" + "eip155:81457/slip44:60", + "eip155:324/slip44:60" ], "eip155:8453/erc20:0x22a2488fe295047ba13bd8cccdbc8361dbd8cf7c": [ "eip155:10/erc20:0x1db2466d9f5e10d7090e7152b68d62703a2245f0", @@ -9820,7 +9851,8 @@ "eip155:1/erc20:0xffa188493c15dfaf2c206c97d8633377847b6a52", "eip155:137/erc20:0xffa188493c15dfaf2c206c97d8633377847b6a52", "eip155:42161/erc20:0xffa188493c15dfaf2c206c97d8633377847b6a52", - "eip155:59144/erc20:0x60892e742d91d16be2cb0ffe847e85445989e30b" + "eip155:59144/erc20:0x60892e742d91d16be2cb0ffe847e85445989e30b", + "eip155:324/erc20:0x81e7186947fb59aaaaeb476a47daac60680cbbaf" ], "eip155:42161/erc20:0xa3d1a8deb97b111454b294e2324efad13a9d8396": [ "eip155:8453/erc20:0xa3d1a8deb97b111454b294e2324efad13a9d8396", @@ -9872,7 +9904,8 @@ "eip155:56/erc20:0xe80772eaf6e2e18b651f160bc9158b2a5cafca65", "eip155:10/erc20:0x73cb180bf0521828d8849bc8cf2b920918e23032", "eip155:137/erc20:0x236eec6359fb44cce8f97e99387aa7f8cd5cde1f", - "eip155:100/erc20:0xb79dd08ea68a908a97220c76d19a6aa9cbde4376" + "eip155:100/erc20:0xb79dd08ea68a908a97220c76d19a6aa9cbde4376", + "eip155:324/erc20:0x8e86e46278518efc1c5ced245cba2c7e3ef11557" ], "eip155:42161/erc20:0x9cfb13e6c11054ac9fcb92ba89644f30775436e4": [ "eip155:10/erc20:0x9cfb13e6c11054ac9fcb92ba89644f30775436e4", @@ -9974,7 +10007,8 @@ ], "eip155:8453/erc20:0x474f4cb764df9da079d94052fed39625c147c12c": [ "eip155:137/erc20:0x3d2bd0e15829aa5c362a4144fdf4a1112fa29b5c", - "eip155:8453/erc20:0x474f4cb764df9da079d94052fed39625c147c12c" + "eip155:8453/erc20:0x474f4cb764df9da079d94052fed39625c147c12c", + "eip155:324/erc20:0xb0588f9a9cade7cd5f194a5fe77acd6a58250f82" ], "eip155:42161/erc20:0x3509f19581afedeff07c53592bc0ca84e4855475": [ "eip155:137/erc20:0x3a3e7650f8b9f667da98f236010fbf44ee4b2975", @@ -11010,7 +11044,8 @@ ], "eip155:56/erc20:0xacb2d47827c9813ae26de80965845d80935afd0b": [ "eip155:137/erc20:0xba25b552c8a098afdf276324c32c71fe28e0ad40", - "eip155:56/erc20:0xacb2d47827c9813ae26de80965845d80935afd0b" + "eip155:56/erc20:0xacb2d47827c9813ae26de80965845d80935afd0b", + "eip155:324/erc20:0xafe4ca0bbe6215cbda12857e723134bc3809f766" ], "eip155:56/erc20:0xacf34edcc424128cccc730bf85cdaceebcb3eece": [ "eip155:1/erc20:0x77a1f4e744d810239f465043e35d067ca33de259", @@ -11301,7 +11336,8 @@ "eip155:130/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", "eip155:34443/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", - "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + "eip155:480/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "eip155:324/erc20:0x05b65997ff7cb7976b43000ad376f91108b30d40" ], "eip155:8453/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17": [ "eip155:137/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17", @@ -11757,7 +11793,8 @@ ], "eip155:1/erc20:0xda67b4284609d2d48e5d10cfac411572727dc1ed": [ "starknet:SN_MAIN/token:0x1e6545cab7ba4ac866768ba5e1bd540893762286ed3fea7f9c02bfa147e135b", - "eip155:1/erc20:0xda67b4284609d2d48e5d10cfac411572727dc1ed" + "eip155:1/erc20:0xda67b4284609d2d48e5d10cfac411572727dc1ed", + "eip155:324/erc20:0x0469d9d1de0ee58fa1153ef00836b9bbcb84c0b6" ], "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:dog1viwbb2vWDpER5FrJ4YFG6gq6XuyFohUe9TXN65u": [ "starknet:SN_MAIN/token:0x40e81cfeb176bfdbc5047bbc55eb471cfab20a6b221f38d8fda134e1bfffca4", @@ -12534,7 +12571,8 @@ "eip155:137/erc20:0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7": [ "eip155:534352/erc20:0x0018d96c579121a94307249d47f053e2d687b5e7", "eip155:137/erc20:0x2760e46d9bb43dafcbecaad1f64b93207f9f0ed7", - "eip155:59144/erc20:0x0018d96c579121a94307249d47f053e2d687b5e7" + "eip155:59144/erc20:0x0018d96c579121a94307249d47f053e2d687b5e7", + "eip155:324/erc20:0xc8ac6191cdc9c7bf846ad6b52aaaa7a0757ee305" ], "eip155:8453/erc20:0x4da9a0f397db1397902070f93a4d6ddbc0e0e6e8": [ "eip155:57073/erc20:0xe8245188db1efc91aef32e7aa4cf346b9a5830cf", @@ -12592,7 +12630,8 @@ "eip155:534352/erc20:0xa25b25548b4c98b0c7d3d27dca5d5ca743d68b7f", "eip155:59144/erc20:0xd2671165570f41bbb3b0097893300b6eb6101e6c", "eip155:34443/erc20:0xe7903b1f75c534dd8159b313d92cdcfbc62cb3cd", - "eip155:81457/erc20:0xe7903b1f75c534dd8159b313d92cdcfbc62cb3cd" + "eip155:81457/erc20:0xe7903b1f75c534dd8159b313d92cdcfbc62cb3cd", + "eip155:324/erc20:0xd4169e045bcf9a86cc00101225d9ed61d2f51af2" ], "eip155:5000/erc20:0x26a6b0dcdcfb981362afa56d581e4a7dba3be140": [ "eip155:1/erc20:0x31b6100f5f4466e6daeb1edb2f2ce6e548cf8938", @@ -12674,7 +12713,8 @@ ], "sui:35834a8a/coin:0xd1a91b46bd6d966b62686263609074ad16cfdffc63c31a4775870a2d54d20c6b::mbtc::MBTC": [ "eip155:59144/erc20:0xe4d584ae9b753e549cae66200a6475d2f00705f7", - "eip155:34443/erc20:0x59889b7021243db5b1e065385f918316cd90d46c" + "eip155:34443/erc20:0x59889b7021243db5b1e065385f918316cd90d46c", + "eip155:324/erc20:0xe757355edba7ced7b8c0271bba4efda184ad75ab" ], "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5": [ "eip155:56/erc20:0x2a3dc2d5daf9c8c46c954b8669f4643c6b1c081a", @@ -12703,5 +12743,31 @@ "eip155:81457/erc20:0x9306fc95b8becdc9166112fd6cf86b39e2335f09": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:7jC1eiCo7pnrj2fL4k3RvWGTjrSSLiJBxYMm4fiWCASK", "eip155:81457/erc20:0x9306fc95b8becdc9166112fd6cf86b39e2335f09" + ], + "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876": [ + "eip155:1/erc20:0x4e9e4ab99cfc14b852f552f5fb3aa68617825b6c", + "eip155:324/erc20:0xe027d939f7de6f521675907cf086f59e4d75b876" + ], + "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a": [ + "eip155:143/erc20:0x2f2f2f74ab5db61ae8bd3c13ccd4dc8c9e8a2f2f", + "eip155:146/erc20:0x2f2f2f74ab5db61ae8bd3c13ccd4dc8c9e8a2f2f", + "eip155:324/erc20:0x31c2c031fdc9d33e974f327ab0d9883eae06ca4a" + ], + "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e": [ + "eip155:1/erc20:0x66a5cfb2e9c529f14fe6364ad1075df3a649c0a5", + "eip155:324/erc20:0x5a7d6b2f92c77fad6ccabd7ee0624e64907eaf3e" + ], + "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9": [ + "eip155:42161/erc20:0xcded6b899edba762d793f44ed295248049440e1e", + "eip155:324/erc20:0x2ab105a3ead22731082b790ca9a00d9a3a7627f9" + ], + "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398": [ + "eip155:143/erc20:0x123468b48eadbc13c65cd9c66a9913cde4e94321", + "eip155:146/erc20:0x123468b48eadbc13c65cd9c66a9913cde4e94321", + "eip155:324/erc20:0x5165ec33b491d7b67260b3143f96bb4ac4736398" + ], + "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d": [ + "eip155:8453/erc20:0xd080ed3c74a20250a2c9821885203034acd2d5ae", + "eip155:324/erc20:0x5d0d7bca050e2e98fd4a5e8d3ba823b49f39868d" ] } \ No newline at end of file diff --git a/public/generated/relatedAssetIndex.json.br b/public/generated/relatedAssetIndex.json.br index 394a823d8fd..f9b6cca2949 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 d81a2f9ead6..7032ea448e8 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 1998547cb69..dd51c4e2d32 100644 --- a/scripts/generateAssetData/coingecko.ts +++ b/scripts/generateAssetData/coingecko.ts @@ -36,6 +36,7 @@ import { tronChainId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { @@ -71,6 +72,7 @@ import { tron, unichainChain, worldchain, + zkSyncEra, } from '@shapeshiftoss/utils' import axios from 'axios' @@ -249,6 +251,14 @@ export async function getAssets(chainId: ChainId): Promise { explorerAddressLink: katana.explorerAddressLink, explorerTxLink: katana.explorerTxLink, } + case zkSyncEraChainId: + return { + assetNamespace: ASSET_NAMESPACE.erc20, + category: adapters.chainIdToCoingeckoAssetPlatform(chainId), + explorer: zkSyncEra.explorer, + explorerAddressLink: zkSyncEra.explorerAddressLink, + explorerTxLink: zkSyncEra.explorerTxLink, + } case blastChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, diff --git a/scripts/generateAssetData/generateAssetData.ts b/scripts/generateAssetData/generateAssetData.ts index 71d94d93b76..304068ae33c 100644 --- a/scripts/generateAssetData/generateAssetData.ts +++ b/scripts/generateAssetData/generateAssetData.ts @@ -61,6 +61,7 @@ import * as tronModule from './tron' import * as unichain from './unichain' import { filterOutBlacklistedAssets, getSortedAssetIds } from './utils' import * as worldchainModule from './worldchain' +import * as zksyncera from './zksyncera' import { getAssetService } from '@/lib/asset-service' @@ -85,6 +86,7 @@ const generateAssetData = async () => { const monadAssets = await monad.getAssets() const hyperevmAssets = await hyperevm.getAssets() const katanaAssets = await katana.getAssets() + const zksyncEraAssets = await zksyncera.getAssets() const blastAssets = await blast.getAssets() const hemiAssets = await hemi.getAssets() const mantleAssets = await mantle.getAssets() @@ -132,6 +134,7 @@ const generateAssetData = async () => { ...monadAssets, ...hyperevmAssets, ...katanaAssets, + ...zksyncEraAssets, ...blastAssets, ...hemiAssets, ...mantleAssets, diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts index 3d269aac24d..80450089252 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts @@ -24,6 +24,7 @@ import { starknetAssetId, unichainAssetId, worldChainAssetId, + zkSyncEraAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { createThrottle, isToken } from '@shapeshiftoss/utils' @@ -76,6 +77,7 @@ const manualRelatedAssetIndex: Record = { soneiumAssetId, worldChainAssetId, blastAssetId, + zkSyncEraAssetId, ], [foxAssetId]: [foxOnArbitrumOneAssetId], [starknetAssetId]: [ diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts index 3ed2d4c86bc..413d90c187d 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts @@ -24,6 +24,7 @@ import { starknetAssetId, unichainAssetId, worldChainAssetId, + zkSyncEraAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { createThrottle, isToken } from '@shapeshiftoss/utils' @@ -75,6 +76,7 @@ const manualRelatedAssetIndex: Record = { bobAssetId, modeAssetId, soneiumAssetId, + zkSyncEraAssetId, ], [foxAssetId]: [foxOnArbitrumOneAssetId], [starknetAssetId]: [ diff --git a/scripts/generateAssetData/zksyncera/index.ts b/scripts/generateAssetData/zksyncera/index.ts new file mode 100644 index 00000000000..147e5079e95 --- /dev/null +++ b/scripts/generateAssetData/zksyncera/index.ts @@ -0,0 +1,11 @@ +import { zkSyncEraChainId } from '@shapeshiftoss/caip' +import type { Asset } from '@shapeshiftoss/types' +import { unfreeze, zkSyncEra } from '@shapeshiftoss/utils' + +import * as coingecko from '../coingecko' + +export const getAssets = async (): Promise => { + const assets = await coingecko.getAssets(zkSyncEraChainId) + + return [...assets, unfreeze(zkSyncEra)] +} diff --git a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx index d6f06c45b40..31071b1b7d2 100644 --- a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx +++ b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx @@ -25,6 +25,7 @@ import { tronAssetId, unichainAssetId, worldChainAssetId, + zkSyncEraAssetId, } from '@shapeshiftoss/caip' import type { Asset } from '@shapeshiftoss/types' import { useQuery } from '@tanstack/react-query' @@ -61,6 +62,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.ZkSyncEra) assetIds.push(zkSyncEraAssetId) if (enabledFlags.Blast) assetIds.push(blastAssetId) if (enabledFlags.WorldChain) assetIds.push(worldChainAssetId) if (enabledFlags.Hemi) assetIds.push(hemiAssetId) diff --git a/src/config.ts b/src/config.ts index 004ece4ced7..c35f88e2d74 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_ZKSYNC_ERA_NODE_URL: url(), VITE_BLAST_NODE_URL: url(), VITE_WORLDCHAIN_NODE_URL: url(), VITE_HEMI_NODE_URL: url(), @@ -124,6 +125,7 @@ const validators = { VITE_FEATURE_BERACHAIN: bool({ default: false }), VITE_FEATURE_CRONOS: bool({ default: false }), VITE_FEATURE_KATANA: bool({ default: false }), + VITE_FEATURE_ZK_SYNC_ERA: bool({ default: false }), VITE_FEATURE_BLAST: bool({ default: false }), VITE_FEATURE_WORLDCHAIN: bool({ default: false }), VITE_FEATURE_HEMI: bool({ default: false }), diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 31ae303413f..5278804d1f6 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -22,6 +22,7 @@ export const SECOND_CLASS_CHAINS: readonly KnownChainIds[] = [ KnownChainIds.BobMainnet, KnownChainIds.ModeMainnet, KnownChainIds.MegaEthMainnet, + KnownChainIds.ZkSyncEraMainnet, KnownChainIds.BlastMainnet, KnownChainIds.HemiMainnet, KnownChainIds.BerachainMainnet, @@ -56,6 +57,7 @@ export const knownChainIds = Object.values(KnownChainIds).filter(chainId => { if (chainId === KnownChainIds.BobMainnet && !enabledFlags.Bob) return false if (chainId === KnownChainIds.ModeMainnet && !enabledFlags.Mode) return false if (chainId === KnownChainIds.MegaEthMainnet && !enabledFlags.MegaEth) return false + if (chainId === KnownChainIds.ZkSyncEraMainnet && !enabledFlags.ZkSyncEra) return false if (chainId === KnownChainIds.BlastMainnet && !enabledFlags.Blast) return false if (chainId === KnownChainIds.HemiMainnet && !enabledFlags.Hemi) return false if (chainId === KnownChainIds.BerachainMainnet && !enabledFlags.Berachain) return false diff --git a/src/context/PluginProvider/PluginProvider.tsx b/src/context/PluginProvider/PluginProvider.tsx index d4a47aafb62..7809b8e842e 100644 --- a/src/context/PluginProvider/PluginProvider.tsx +++ b/src/context/PluginProvider/PluginProvider.tsx @@ -129,6 +129,7 @@ export const PluginProvider = ({ children }: PluginProviderProps): JSX.Element = if (!featureFlags.Plasma && chainId === KnownChainIds.PlasmaMainnet) return false if (!featureFlags.Ink && chainId === KnownChainIds.InkMainnet) return false if (!featureFlags.MegaEth && chainId === KnownChainIds.MegaEthMainnet) return false + if (!featureFlags.ZkSyncEra && chainId === KnownChainIds.ZkSyncEraMainnet) return false if (!featureFlags.Blast && chainId === KnownChainIds.BlastMainnet) return false if (!featureFlags.Hemi && chainId === KnownChainIds.HemiMainnet) return false if (!featureFlags.Linea && chainId === KnownChainIds.LineaMainnet) return false diff --git a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts index 63dd4bc0a38..2617fb04a04 100644 --- a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts +++ b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts @@ -41,6 +41,7 @@ import { unichainChainId, worldChainChainId, zecChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import { isEvmChainId } from '@shapeshiftoss/chain-adapters' import type { HDWallet } from '@shapeshiftoss/hdwallet-core' @@ -84,6 +85,7 @@ import { supportsTron, supportsUnichain, supportsWorldChain, + supportsZkSyncEra, } from '@shapeshiftoss/hdwallet-core/wallet' import { useMemo } from 'react' @@ -175,6 +177,7 @@ export const walletSupportsChain = ({ // We have no runtime support for the current ChainId - trying and checking for feature-capabilities flags is futile if (!hasRuntimeSupport) return false + const isZkSyncEraEnabled = selectFeatureFlag(store.getState(), 'ZkSyncEra') const isBlastEnabled = selectFeatureFlag(store.getState(), 'Blast') const isHemiEnabled = selectFeatureFlag(store.getState(), 'Hemi') const isHyperEvmEnabled = selectFeatureFlag(store.getState(), 'HyperEvm') @@ -244,6 +247,8 @@ export const walletSupportsChain = ({ return isPlasmaEnabled && supportsPlasma(wallet) case katanaChainId: return isKatanaEnabled && supportsKatana(wallet) + case zkSyncEraChainId: + return isZkSyncEraEnabled && supportsZkSyncEra(wallet) case blastChainId: return isBlastEnabled && supportsBlast(wallet) case worldChainChainId: diff --git a/src/lib/account/evm.ts b/src/lib/account/evm.ts index fa0470be4d8..eb513e8535f 100644 --- a/src/lib/account/evm.ts +++ b/src/lib/account/evm.ts @@ -29,6 +29,7 @@ import { toAccountId, unichainChainId, worldChainChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { HDWallet } from '@shapeshiftoss/hdwallet-core' import { @@ -60,6 +61,7 @@ import { supportsSonic, supportsUnichain, supportsWorldChain, + supportsZkSyncEra, } from '@shapeshiftoss/hdwallet-core/wallet' import type { AccountMetadataById } from '@shapeshiftoss/types' @@ -160,6 +162,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 === zkSyncEraChainId && !supportsZkSyncEra(wallet)) continue if (chainId === blastChainId && !supportsBlast(wallet)) continue if (chainId === worldChainChainId && !supportsWorldChain(wallet)) continue if (chainId === hemiChainId && !supportsHemi(wallet)) continue diff --git a/src/lib/asset-service/service/AssetService.ts b/src/lib/asset-service/service/AssetService.ts index 660c2371c68..7e94dc7cf06 100644 --- a/src/lib/asset-service/service/AssetService.ts +++ b/src/lib/asset-service/service/AssetService.ts @@ -33,6 +33,7 @@ import { unichainChainId, worldChainChainId, zecChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { Asset, AssetsById } from '@shapeshiftoss/types' import { getBaseAsset } from '@shapeshiftoss/utils' @@ -136,6 +137,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_ZK_SYNC_ERA && asset.chainId === zkSyncEraChainId) return false if (!config.VITE_FEATURE_BLAST && asset.chainId === blastChainId) return false if (!config.VITE_FEATURE_WORLDCHAIN && asset.chainId === worldChainChainId) return false if (!config.VITE_FEATURE_HEMI && asset.chainId === hemiChainId) return false diff --git a/src/lib/coingecko/utils.ts b/src/lib/coingecko/utils.ts index cd6bfe94e80..7289a7a87e6 100644 --- a/src/lib/coingecko/utils.ts +++ b/src/lib/coingecko/utils.ts @@ -35,6 +35,7 @@ import { unichainChainId, worldChainChainId, zecChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { KnownChainIds } from '@shapeshiftoss/types' import { getAssetNamespaceFromChainId } from '@shapeshiftoss/utils' @@ -229,6 +230,7 @@ export const getCoingeckoSupportedChainIds = () => { ...(getConfig().VITE_FEATURE_INK ? [inkChainId] : []), ...(getConfig().VITE_FEATURE_CRONOS ? [cronosChainId] : []), ...(getConfig().VITE_FEATURE_KATANA ? [katanaChainId] : []), + ...(getConfig().VITE_FEATURE_ZK_SYNC_ERA ? [zkSyncEraChainId] : []), ...(getConfig().VITE_FEATURE_BLAST ? [blastChainId] : []), ...(getConfig().VITE_FEATURE_WORLDCHAIN ? [worldChainChainId] : []), ...(getConfig().VITE_FEATURE_HEMI ? [hemiChainId] : []), diff --git a/src/lib/market-service/coingecko/coingecko.test.ts b/src/lib/market-service/coingecko/coingecko.test.ts index 5800e3b85dc..df2f90d96de 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(16) + expect(Object.keys(result).length).toEqual(17) }) 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(15) + expect(Object.keys(result).length).toEqual(16) }) it('can use default args', async () => { @@ -238,6 +238,7 @@ describe('CoinGecko market service', () => { ethOnScrollKey, ethOnUnichainKey, ethOnSoneiumKey, + ethOnZkSyncEraKey, ] = Object.keys(result) expect(btcAssetId).toEqual([btcKey]) expect(ethAssetId).toEqual([ @@ -256,6 +257,7 @@ describe('CoinGecko market service', () => { ethOnScrollKey, ethOnUnichainKey, ethOnSoneiumKey, + ethOnZkSyncEraKey, ]) }) diff --git a/src/lib/utils/zksyncera.ts b/src/lib/utils/zksyncera.ts new file mode 100644 index 00000000000..01bf4c3211f --- /dev/null +++ b/src/lib/utils/zksyncera.ts @@ -0,0 +1,43 @@ +import { zkSyncEraChainId } from '@shapeshiftoss/caip' +import type { EvmChainAdapter } from '@shapeshiftoss/chain-adapters' +import { TxStatus } from '@shapeshiftoss/unchained-client' +import { JsonRpcProvider } from 'ethers' + +export const isZkSyncEraChainAdapter = (adapter: unknown): adapter is EvmChainAdapter => { + if (!adapter) return false + + const maybeAdapter = adapter as EvmChainAdapter + if (typeof maybeAdapter.getChainId !== 'function') return false + + return maybeAdapter.getChainId() === zkSyncEraChainId +} + +export const getZkSyncEraTransactionStatus = 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('[zkSync Era] 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 889162d0922..a247d7ed5ba 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 isZkSyncEraEnabled = useAppSelector(state => selectFeatureFlag(state, 'ZkSyncEra')) const isBlastEnabled = useAppSelector(state => selectFeatureFlag(state, 'Blast')) const isWorldChainEnabled = useAppSelector(state => selectFeatureFlag(state, 'WorldChain')) const isHemiEnabled = useAppSelector(state => selectFeatureFlag(state, 'Hemi')) @@ -113,6 +114,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 (!isZkSyncEraEnabled && chainId === KnownChainIds.ZkSyncEraMainnet) return false if (!isBlastEnabled && chainId === KnownChainIds.BlastMainnet) return false if (!isWorldChainEnabled && chainId === KnownChainIds.WorldChainMainnet) return false if (!isHemiEnabled && chainId === KnownChainIds.HemiMainnet) return false @@ -137,6 +139,7 @@ export const MarketsRow: React.FC = ({ isLineaEnabled, isScrollEnabled, isKatanaEnabled, + isZkSyncEraEnabled, isBlastEnabled, isWorldChainEnabled, isHemiEnabled, diff --git a/src/plugins/activePlugins.ts b/src/plugins/activePlugins.ts index d24549dc026..3fea3e1f000 100644 --- a/src/plugins/activePlugins.ts +++ b/src/plugins/activePlugins.ts @@ -41,6 +41,7 @@ import unichain from '@/plugins/unichain' import walletConnectToDapps from '@/plugins/walletConnectToDapps' import worldchain from '@/plugins/worldchain' import zcash from '@/plugins/zcash' +import zksyncera from '@/plugins/zksyncera' export const activePlugins = [ arbitrum, @@ -86,4 +87,5 @@ export const activePlugins = [ walletConnectToDapps, worldchain, zcash, + zksyncera, ] diff --git a/src/plugins/zksyncera/index.tsx b/src/plugins/zksyncera/index.tsx new file mode 100644 index 00000000000..d7d85ed60ed --- /dev/null +++ b/src/plugins/zksyncera/index.tsx @@ -0,0 +1,49 @@ +import { fromAssetId, zkSyncEraChainId } from '@shapeshiftoss/caip' +import { zksyncera } 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 [ + [ + 'zkSyncEraChainAdapter', + { + name: 'zkSyncEraChainAdapter', + featureFlag: ['ZkSyncEra'], + providers: { + chainAdapters: [ + [ + KnownChainIds.ZkSyncEraMainnet, + () => { + const getKnownTokens = () => { + const assetService = getAssetService() + return assetService.assets + .filter(asset => { + const { chainId, assetNamespace } = fromAssetId(asset.assetId) + return chainId === zkSyncEraChainId && assetNamespace === 'erc20' + }) + .map(asset => ({ + assetId: asset.assetId, + contractAddress: fromAssetId(asset.assetId).assetReference, + symbol: asset.symbol, + name: asset.name, + precision: asset.precision, + })) + } + + return new zksyncera.ChainAdapter({ + rpcUrl: getConfig().VITE_ZKSYNC_ERA_NODE_URL, + getKnownTokens, + }) + }, + ], + ], + }, + }, + ], + ] +} diff --git a/src/state/migrations/index.ts b/src/state/migrations/index.ts index 43c1a93a9d2..11ff6767d18 100644 --- a/src/state/migrations/index.ts +++ b/src/state/migrations/index.ts @@ -348,6 +348,7 @@ export const clearAssetsMigrations = { 299: clearAssets, 300: clearAssets, 301: clearAssets, + 302: clearAssets, } as unknown as Omit export const clearMarketDataMigrations = { diff --git a/src/state/slices/opportunitiesSlice/mappings.ts b/src/state/slices/opportunitiesSlice/mappings.ts index 7dc43cf6f93..420cffd2b1d 100644 --- a/src/state/slices/opportunitiesSlice/mappings.ts +++ b/src/state/slices/opportunitiesSlice/mappings.ts @@ -207,6 +207,7 @@ export const CHAIN_ID_TO_SUPPORTED_DEFI_OPPORTUNITIES: Record< [KnownChainIds.ZcashMainnet]: [], [KnownChainIds.NearMainnet]: [], [KnownChainIds.TonMainnet]: [], + [KnownChainIds.ZkSyncEraMainnet]: [], [KnownChainIds.BlastMainnet]: [], [KnownChainIds.HemiMainnet]: [], } diff --git a/src/state/slices/portfolioSlice/utils/index.ts b/src/state/slices/portfolioSlice/utils/index.ts index a8cf5c4b1a8..c21c50cdca7 100644 --- a/src/state/slices/portfolioSlice/utils/index.ts +++ b/src/state/slices/portfolioSlice/utils/index.ts @@ -49,6 +49,7 @@ import { unichainChainId, worldChainChainId, zecChainId, + zkSyncEraChainId, } from '@shapeshiftoss/caip' import type { Account } from '@shapeshiftoss/chain-adapters' import { evmChainIds } from '@shapeshiftoss/chain-adapters' @@ -91,6 +92,7 @@ import { supportsTron, supportsUnichain, supportsWorldChain, + supportsZkSyncEra, } from '@shapeshiftoss/hdwallet-core/wallet' import type { Asset, EvmChainId, KnownChainIds, UtxoChainId } from '@shapeshiftoss/types' import type { MinimalAsset } from '@shapeshiftoss/utils' @@ -128,6 +130,7 @@ export const accountIdToLabel = (accountId: AccountId): string => { case bscChainId: case arbitrumChainId: case baseChainId: + case zkSyncEraChainId: case blastChainId: case hemiChainId: case hyperEvmChainId: @@ -560,6 +563,8 @@ export const isAssetSupportedByWallet = (assetId: AssetId, wallet: HDWallet): bo return supportsPlasma(wallet) case katanaChainId: return supportsKatana(wallet) + case zkSyncEraChainId: + return supportsZkSyncEra(wallet) case blastChainId: return supportsBlast(wallet) case worldChainChainId: diff --git a/src/state/slices/preferencesSlice/preferencesSlice.ts b/src/state/slices/preferencesSlice/preferencesSlice.ts index c0465335878..e5482b45f68 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 + ZkSyncEra: boolean Blast: boolean WorldChain: boolean Hemi: boolean @@ -205,6 +206,7 @@ const initialState: Preferences = { Berachain: getConfig().VITE_FEATURE_BERACHAIN, Cronos: getConfig().VITE_FEATURE_CRONOS, Katana: getConfig().VITE_FEATURE_KATANA, + ZkSyncEra: getConfig().VITE_FEATURE_ZK_SYNC_ERA, Blast: getConfig().VITE_FEATURE_BLAST, WorldChain: getConfig().VITE_FEATURE_WORLDCHAIN, Hemi: getConfig().VITE_FEATURE_HEMI, diff --git a/src/test/mocks/store.ts b/src/test/mocks/store.ts index b4fca243d58..2ce5dd76c91 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, + ZkSyncEra: false, Blast: false, WorldChain: false, Hemi: false, diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 3c6f3918eac..1e9043b3970 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -66,6 +66,8 @@ interface ImportMetaEnv { readonly VITE_MANTLE_NODE_URL: string readonly VITE_FEATURE_INK: string readonly VITE_INK_NODE_URL: string + readonly VITE_FEATURE_ZK_SYNC_ERA: string + readonly VITE_ZKSYNC_ERA_NODE_URL: string // URLs and API keys from base .env (always defined) readonly VITE_ABSOLUTE_URL_PREFIX: string