diff --git a/.beads/pr-context.jsonl b/.beads/pr-context.jsonl index be069c89fc2..cc0ca5cf695 100644 --- a/.beads/pr-context.jsonl +++ b/.beads/pr-context.jsonl @@ -1,9 +1,3 @@ -{"id":"shapeshiftweb-2ft","title":"Sonic (eip155:146) - PR #11923","description":"type: task","status":"open","priority":2,"issue_type":"task","created_at":"2026-02-20T13:16:54Z","updated_at":"2026-02-20T13:16:54Z","dependencies":[{"issue_id":"shapeshiftweb-2ft","depends_on_id":"shapeshiftweb-4rn","type":"blocks","created_at":"2026-02-20T14:17:30Z","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":"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-20T15:52:06Z"} -{"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":"closed","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-20T20:03:03Z","closed_at":"2026-02-20T20:03:03Z","close_reason":"Mantle PR #11905 merged to develop. Wrapped native detection generalized, popular assets fixed, Linea icon fixed, contract updated.","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":"closed","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-20T20:03:11Z","closed_at":"2026-02-20T20:03:11Z","close_reason":"Cronos PR #11910 pushed. WCRO wrapped asset fix, CRO cross-chain relation, effectiveGasPrice null fix, popular assets OK.","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":"closed","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-20T20:03:27Z","closed_at":"2026-02-20T20:03:27Z","close_reason":"Sonic PR #11923: Cronos squash-merged in, develop merged, all 4 chains regen'd, ready for testing.","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":"done","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:38:41Z","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":"done","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:45:30Z","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":"done","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:52:06Z","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":"{}"}]} -{"id":"shapeshiftweb-4rn","title":"Cronos (eip155:25) - PR #11910","description":"type: task","status":"closed","priority":2,"issue_type":"task","created_at":"2026-02-20T13:16:54Z","updated_at":"2026-02-20T20:03:18Z","closed_at":"2026-02-20T20:03:18Z","close_reason":"Cronos PR #11910 pushed and approved. Pending merge to develop.","dependencies":[{"issue_id":"shapeshiftweb-4rn","depends_on_id":"shapeshiftweb-cwh","type":"blocks","created_at":"2026-02-20T14:17:30Z","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.","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":"{}"}]} diff --git a/.beads/ss-dx5.21.json b/.beads/ss-dx5.21.json new file mode 100644 index 00000000000..4463a7e43da --- /dev/null +++ b/.beads/ss-dx5.21.json @@ -0,0 +1,39 @@ +[ + { + "id": "ss-dx5.21", + "title": "Integrate Soneium (chainId: 1868, ETH, OP Stack L2)", + "description": "TVL: $21.1M | RPC: https://rpc.soneium.org/ | Explorer: https://soneium.blockscout.com | Token Support: All | Pattern B (RPC-only) | Sony's L2", + "notes": "\nLogo: https://assets.relay.link/icons/1868/light.png (dark: dark.png)\nCoinGecko platform: soneium\nCoinGecko native ID: ethereum\nArch: OP Stack L2 (Sony ecosystem)\nNative token: ETH (18 decimals)\nSLIP44: 60 (Ethereum)\nETH-native: YES — affects test ordering + market-service counts\nViem: ✅ soneium (id: 1868) — import { soneium } from \"viem/chains\"\nAcross: ✅ SUPPORTED (chainId: 1868)\nZerion ID: \"soneium\" (standard lowercase)\n\n--- PHASE 1 LEARNED CHECKLIST (MANDATORY) ---\n[ ] adapter.json: Create packages/caip/src/adapters/coingecko/generated/eip155_1868/adapter.json → {\"eip155:1868/slip44:60\":\"ethereum\"}\n[ ] Wire adapter.json: Import+export from packages/caip/src/adapters/coingecko/generated/index.ts\n[ ] getCoingeckoSupportedChainIds: Add soneiumChainId (feature-flagged) in src/lib/coingecko/utils.ts\n[ ] Zerion: Add \"soneium\" to ZERION_CHAINS + ZERION_CHAINS_MAP in packages/types/src/zerion.ts\n[ ] Across: ✅ Add [soneiumChainId]: soneium.id to chainIdToAcrossChainId\n[ ] ETH test ordering: ✅ REQUIRED — add eip155:1868/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:1868/slip44:60 → eip155:1/slip44:60 to manualRelatedAssetIndex\n\n--- RELAY ACTIVATION ---\n[ ] Add [soneiumChainId]: soneium.id to chainIdToRelayChainId\n[ ] Add native asset case in relayTokenToAssetId.ts\n--- ASSET DATA REGEN ---\n[ ] Create scripts/generateAssetData/soneium/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-soneium-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:02Z", + "created_by": "NeOMakinG", + "updated_at": "2026-02-17T22:44:28Z", + "labels": [ + "evm", + "op-stack", + "relay", + "tier-2" + ], + "dependencies": [ + { + "id": "ss-dx5", + "title": "Add support for missing Relay.link EVM chains", + "description": "Master epic tracking integration of ALL chains supported by Relay.link that ShapeShift web doesn't currently support. Enables cross-chain bridging capabilities via Relay infrastructure. See https://github.com/shapeshift/web/issues/11902 for full details. All new EVM chains will use Pattern B (RPC-only + getKnownTokens) since no ShapeShift unchained indexer infrastructure exists for these chains.", + "notes": "=== FROM ISSUE COMMENTS ===\n\nLOGO PATTERN: https://assets.relay.link/icons/{chainId}/light.png (dark: dark.png)\n\nARCHITECTURE GROUPS:\n- OP Stack (standard): Ink, Unichain, BOB, Mode, Hemi, World Chain, Soneium, Zircuit, Lisk, Cyber, Blast, Zora, Redstone, Shape, Superseed, Manta Pacific\n- zkEVM (special handling): Scroll, zkSync Era, Linea, Polygon zkEVM, Taiko, Abstract\n- Arbitrum Orbit: ApeChain, Xai, Sanko\n- Non-ETH gas (10 chains): Mantle(MNT), Metis(METIS), Cronos(CRO), Ronin(RON), Sonic(S), Flow(FLOW), Berachain(BERA), Plume(PLUME), Story(IP), Stable(gUSDT)\n\nCRITICAL CHAINS:\n1. Celo (42220): Native token is BOTH native AND ERC20. Relay uses wrapped CELO. Check relayTransactionMetadata.assetRequiringApproval\n2. Blast (81457): Rebasing ETH from L1 staking yield. USDB also rebases. Handle in balance displays.\n3. Ethereal (5064014): NOT in viem. Needs custom chain definition.\n4. zkSync Era (324) + Abstract (2741): Type 113 (EIP-712) transactions. Use viem zksync chainConfig.\n5. Linea (59144): Custom linea_estimateGas RPC method.\n6. Sei (1329): Parallelized EVM + CosmWasm interop. CoinGecko uses sei-v2 NOT sei.\n\nCOINGECKO GOTCHAS: sei-\u003esei-v2, plume-\u003eplume-network, zksync-\u003ezksync, metis-\u003emetis-andromeda, morph-\u003emorph-l2, gravity-\u003egravity-alpha, boba-\u003eboba, zora-\u003ezora-network, funkichain-\u003efunki, Superposition (capital S). BOB/Zero Network have null chain_identifier. 11 chains not on CoinGecko at all.\n\nPER-CHAIN CHECKLIST: [ ] chain-adapters [ ] caip [ ] asset-service [ ] feature-flag [ ] plugin [ ] env-config [ ] icon/logo\n\n=== RELAY SWAPPER INTEGRATION (per chain) ===\n\nFILE 1: packages/swapper/src/swappers/RelaySwapper/constant.ts\n - Add to chainIdToRelayChainId map: [newChainChainId]: \u003cviem_chain\u003e.id (or numeric chain ID)\n - Import the caip chainId (e.g., scrollChainId) from @shapeshiftoss/caip\n - Import viem chain from viem/chains (or use raw numeric ID if not in viem)\n - The reverse map relayChainIdToChainId auto-generates via invert()\n\nFILE 2: packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts\n - Add case CHAIN_REFERENCE.NewChainMainnet: with ASSET_REFERENCE.NewChain + ASSET_NAMESPACE.slip44\n\nNO CHANGES NEEDED (for EVM chains):\n - getRelayAssetAddress.ts (uses generic isNativeEvmAsset + DEFAULT_RELAY_EVM_TOKEN_ADDRESS)\n - getRelayDefaultUserAddress.ts (falls through to DEFAULT_RELAY_EVM_USER_ADDRESS default)\n\nUPSTREAM DEPS REQUIRED (in @shapeshiftoss packages):\n - @shapeshiftoss/caip: export newChainChainId, CHAIN_REFERENCE.NewChainMainnet, ASSET_REFERENCE.NewChain\n - @shapeshiftoss/types: KnownChainIds.NewChainMainnet\n - @shapeshiftoss/chain-adapters: NewChain chain adapter class\n - viem/chains: chain config (or custom if not in viem)\n\nRELAY API: https://api.relay.link (env: VITE_RELAY_API_URL) - no per-chain config needed\n\n=== ASSET DATA REGENERATION (per chain) ===\n\nAfter integrating each chain, run a partial assets data regen to populate the token list.\n\nFILE 1 (CREATE): scripts/generateAssetData/\u003cchainname\u003e/index.ts\n Pattern (identical for all EVM chains):\n import { \u003cchainname\u003eChainId } from '@shapeshiftoss/caip'\n import type { Asset } from '@shapeshiftoss/types'\n import { \u003cchainname\u003e, unfreeze } from '@shapeshiftoss/utils'\n import * as coingecko from '../coingecko'\n export const getAssets = async (): Promise\u003cAsset[]\u003e =\u003e {\n const assets = await coingecko.getAssets(\u003cchainname\u003eChainId)\n return [...assets, unfreeze(\u003cchainname\u003e)]\n }\n\nFILE 2 (MODIFY): scripts/generateAssetData/coingecko.ts\n - Import \u003cchainname\u003eChainId from @shapeshiftoss/caip\n - Import \u003cchainname\u003e native asset from @shapeshiftoss/utils\n - Add case in the switch: case \u003cchainname\u003eChainId: return { assetNamespace: ASSET_NAMESPACE.erc20, category: adapters.chainIdToCoingeckoAssetPlatform(chainId), explorer/explorerAddressLink/explorerTxLink from \u003cchainname\u003e utils }\n - NOTE: chains not on CoinGecko will only have the native asset (no ERC20 token list)\n\nFILE 3 (MODIFY): scripts/generateAssetData/generateAssetData.ts\n - Import: import * as \u003cchainname\u003e from './\u003cchainname\u003e'\n - Call: const \u003cchainname\u003eAssets = await \u003cchainname\u003e.getAssets()\n - Spread into unfilteredAssetData: ...\u003cchainname\u003eAssets\n\nCOMMAND: yarn generate:asset-data\n This regenerates: src/generated/asset-data.json + related-asset-index + manifest + compressed assets\n\n=== DRAFT PR CREATION (final step per chain) ===\n\nAfter all code changes are complete for a chain, open a draft PR using the repo template.\n\nBRANCH NAMING: feat/integrate-\u003cchainname\u003e-relay (e.g. feat/integrate-scroll-relay)\n\nCOMMAND:\n gh pr create --draft --title 'feat: integrate \u003cChainName\u003e (chainId: \u003cid\u003e) via Relay' --body \"$(cat \u003c\u003c'PREOF'\n ## Description\n\n Add \u003cChainName\u003e (chainId: \u003cid\u003e) as a second-class EVM chain in ShapeShift Web with Relay bridge support.\n\n **Changes:**\n - Plugin registration in src/plugins/\u003cchainname\u003e/\n - Feature flag `\u003cChainName\u003e` in preferencesSlice\n - Relay swapper chain mapping in RelaySwapper/constant.ts\n - Asset data generation via CoinGecko (`\u003ccoingecko_platform_id\u003e`)\n - Environment config for RPC URL\n\n **Chain details:**\n - TVL: \u003ctvl\u003e\n - Native token: \u003ctoken\u003e (18 decimals)\n - Architecture: \u003carch_type\u003e\n - RPC: \u003crpc_url\u003e\n - Explorer: \u003cexplorer_url\u003e\n\n ## Issue (if applicable)\n\n Part of #11902\n\n ## Risk\n\n Low risk — new chain behind feature flag (`\u003cChainName\u003e`), no existing functionality affected.\n\n \u003e New chain plugin + Relay bridge mapping. No modifications to existing chain logic.\n\n ## Testing\n\n ### Engineering\n\n 1. Enable feature flag: set `VITE_FEATURE_\u003cCHAINNAME\u003e=true` in .env\n 2. Verify chain appears in supported chains list\n 3. Verify native token balance loads (connect wallet with \u003ctoken\u003e on \u003cChainName\u003e)\n 4. Verify Relay bridge quote works: bridge ETH from Ethereum → \u003cChainName\u003e\n 5. Run `yarn lint --fix \u0026\u0026 yarn type-check` — must pass\n\n ### Operations\n\n - [x] :checkered_flag: My feature is behind a flag and doesn't require operations testing (yet)\n\n ## Screenshots (if applicable)\n\n N/A — chain integration, no UI changes.\n PREOF\n )\"\n\nNOTE: Replace all \u003cplaceholders\u003e with actual chain values from the bead description/notes.\nNOTE: Use --draft flag to create as draft PR.\nNOTE: Branch off develop (main branch is develop, not main).", + "status": "open", + "priority": 0, + "issue_type": "epic", + "owner": "14963751+NeOMakinG@users.noreply.github.com", + "created_at": "2026-02-17T10:55:02Z", + "created_by": "NeOMakinG", + "updated_at": "2026-02-17T11:21:27Z", + "external_ref": "gh-11902", + "dependency_type": "parent-child" + } + ], + "parent": "ss-dx5" + } +] diff --git a/.claude/contracts/second-class-evm-chain.md b/.claude/contracts/second-class-evm-chain.md index c44522271f1..780d968611b 100644 --- a/.claude/contracts/second-class-evm-chain.md +++ b/.claude/contracts/second-class-evm-chain.md @@ -80,14 +80,14 @@ All integration points required when adding a new second-class EVM chain to Shap - `coingeckoAssetPlatformToChainId()` switch case - `parseData()` in `utils.ts` - platform check for ERC20 token discovery - Default asset mapping - - Generated adapter JSON in `generated/eip155_/` - - Index export + - Generated adapter JSON in `generated/eip155_/adapter.json` + - **Generated index** - `packages/caip/src/adapters/coingecko/generated/index.ts` must import and re-export the new chain's adapter JSON. Without this, `coingeckoToAssetIds()` won't return the chain's assets and the CoinGecko test will fail. - Test coverage - **Update multi-chain token test assertions** - `index.test.ts` assertions for tokens that exist across many chains (e.g. `coingeckoToAssetIds('usd-coin')`) must include the new chain's token address -16. **Transaction Status Utility** - `src/lib/utils/.ts` - - `isChainAdapter()` type guard - - `getTransactionStatus()` - RPC-based tx receipt polling +16. **Transaction Status** - handled generically by `SecondClassEvmAdapter.getTransactionStatus()` + - NO per-chain tx status util file needed (the `default` case in `useSendActionSubscriber.tsx` uses `getSecondClassEvmTxStatus()` which detects any `SecondClassEvmAdapter` via `isSecondClassEvmAdapter` type guard) + - Only non-EVM chains (Tron, Sui, Near, Ton, Starknet) have individual cases 16b. **State Migration** - `src/state/migrations/index.ts` - A new `clearAssets` migration entry is REQUIRED when adding a chain @@ -134,7 +134,8 @@ All integration points required when adding a new second-class EVM chain to Shap - Empty array entry for new chain 26. **Action Center Subscriber** - `src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx` - - Transaction status checking for new chain (usually handled by SECOND_CLASS_CHAINS constant) + - NO per-chain case needed - the `default` handler auto-detects any `SecondClassEvmAdapter` via `isSecondClassEvmAdapter` and calls `getTransactionStatus()` on it + - Only add a case if the chain needs non-standard tx status logic (unlikely for EVM chains) ## Phase 3: Swapper & Data Provider Integration @@ -178,8 +179,12 @@ For cross-chain swaps where the destination is native (e.g., ETH→MNT via Relay 42. **Wrapped Native Contract** - `packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts` - Add the chain's wrapped native token address to `WRAPPED_NATIVE_CONTRACT_BY_CHAIN_ID` mapping - Common addresses: WBERA `0x6969...`, WMNT `0x78c1b0C9...`, WETH varies by chain - - The detection logic is already generalized: it parses `Transfer` burn events (to zero address) on the wrapped contract to synthesize internal Txs - - To find the wrapped native address: search `W` on the chain's block explorer or check the Relay Tx from the user's review comment + - The detection logic is already generalized with THREE fallback strategies in order: + 1. `debug_traceTransaction` for internal txs (not supported on all RPCs) + 2. ERC20 `Transfer` burn events (to zero address) on the wrapped contract + 3. WETH9 `Withdrawal(address indexed src, uint256 wad)` event - used by Across on OP Stack L2s where `withdraw()` emits Withdrawal instead of Transfer-to-zero + - All three fallbacks are in `SecondClassEvmAdapter.parseTx()` and apply to ALL chains automatically + - To find the wrapped native address: search `W` on the chain's block explorer or check the Relay/Across Tx from the user's review comment ## Phase 3.6: Native Token ERC20 Duplicate Blacklisting @@ -204,10 +209,11 @@ Some chains have an ERC20 contract that represents the native token (e.g., Mantl 40. **Related Asset Index** - `public/generated/relatedAssetIndex.json` + `scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts` - If the native asset is ETH: verify it's in `manualRelatedAssetIndex[ethAssetId]` array - - **If the native asset is NOT ETH** (e.g., CRO, MNT): research whether the same token exists on Ethereum mainnet as an ERC20 (e.g., CRO has `eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b`). If it does, add a manual mapping in `manualRelatedAssetIndex` in BOTH `generateRelatedAssetIndex.ts` AND `generateChainRelatedAssetIndex.ts`, linking the Ethereum ERC20 to the chain's native `slip44:60`. Use a research agent to check CoinGecko/block explorer if unsure. Without this, the chain's native token won't show as a "Popular Asset" when filtering by the chain. + - **If the native asset is NOT ETH** (e.g., CRO, S, MNT): research whether the same token exists on Ethereum mainnet as an ERC20. If it does, add a manual mapping in `manualRelatedAssetIndex` in BOTH `generateRelatedAssetIndex.ts` AND `generateChainRelatedAssetIndex.ts`. + - **CRITICAL: The native chain token MUST be the KEY, not a value.** Use `[chainAssetId]: ['eip155:1/erc20:0x...']` (native = key, ETH ERC20 = value). If the ETH ERC20 is the key and the native is a value, the native asset gets `relatedAssetKey` pointing to ETH ERC20, making `isPrimary=false`, which causes it to be excluded from `selectPrimaryAssets` and missing from "Popular Assets". This is because `isPrimary = relatedAssetKey === null || relatedAssetKey === assetId` in AssetService. - Verify `relatedAssetIndex.json` has been regenerated and contains entries for the new chain's tokens - - Check `generatedAssetData.json` - the chain's ERC20 tokens should have `relatedAssetKey` values linking them to mainnet counterparts - - Without this, tokens won't appear in the trade modal "Popular Assets" section + - Check `generatedAssetData.json` - the chain's native asset should have `relatedAssetKey` pointing to ITSELF (self-referencing), NOT to an ETH ERC20 + - Without this, the native token won't appear in the trade modal "Popular Assets" section - **Manual stablecoin mappings**: Look up the chain's native USDC, USDT, and DAI contract addresses (NOT bridged variants - CoinGecko auto-discovers those). Add them to `manualRelatedAssetIndex` in BOTH `generateRelatedAssetIndex.ts` AND `generateChainRelatedAssetIndex.ts`, keyed by the Ethereum canonical token's AssetId. Without this, popular stablecoins won't show for the chain in the trade modal. 41. **Trade modal "Popular Assets" verification** - after enabling the feature flag, open the trade modal "To" asset selector and filter by the new chain diff --git a/.env b/.env index ac92eea44cd..dfd65f971be 100644 --- a/.env +++ b/.env @@ -166,6 +166,7 @@ VITE_SONIC_NODE_URL=https://rpc.soniclabs.com VITE_UNICHAIN_NODE_URL=https://mainnet.unichain.org VITE_BOB_NODE_URL=https://rpc.gobob.xyz VITE_MODE_NODE_URL=https://mainnet.mode.network +VITE_SONEIUM_NODE_URL=https://rpc.soneium.org/ VITE_THORCHAIN_NODE_URL=https://api.thorchain.shapeshift.com/lcd VITE_MAYACHAIN_NODE_URL=https://api.mayachain.shapeshift.com/lcd VITE_SOLANA_NODE_URL=https://api.solana.shapeshift.com/api/v1/jsonrpc @@ -324,6 +325,7 @@ VITE_FEATURE_SONIC=false VITE_FEATURE_UNICHAIN=false VITE_FEATURE_BOB=false VITE_FEATURE_MODE=false +VITE_FEATURE_SONEIUM=false # Yield.xyz Feature Flag VITE_FEATURE_YIELD_XYZ=true diff --git a/.env.development b/.env.development index 500696b278b..04dbe1036d8 100644 --- a/.env.development +++ b/.env.development @@ -73,6 +73,7 @@ VITE_MEGAETH_NODE_URL=https://mainnet.megaeth.com/rpc VITE_LINEA_NODE_URL=https://rpc.linea.build VITE_BERACHAIN_NODE_URL=https://rpc.berachain.com VITE_SCROLL_NODE_URL=https://rpc.scroll.io/ +VITE_SONEIUM_NODE_URL=https://rpc.soneium.org/ # Swap me back to 9R as-needed # VITE_THORCHAIN_NODE_URL=https://thornode.ninerealms.com VITE_THORCHAIN_NODE_URL=https://dev-api.thorchain.shapeshift.com/lcd @@ -116,6 +117,7 @@ VITE_FEATURE_SONIC=true VITE_FEATURE_UNICHAIN=true VITE_FEATURE_BOB=true VITE_FEATURE_MODE=true +VITE_FEATURE_SONEIUM=true VITE_FEATURE_TON=true VITE_FEATURE_STONFI_SWAP=true VITE_FEATURE_ACROSS_SWAP=true diff --git a/headers/csps/chains/soneium.ts b/headers/csps/chains/soneium.ts new file mode 100644 index 00000000000..408fb9c95ee --- /dev/null +++ b/headers/csps/chains/soneium.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_SONEIUM_NODE_URL], +} diff --git a/headers/csps/index.ts b/headers/csps/index.ts index 77e3c3e47ef..273b8ea0781 100644 --- a/headers/csps/index.ts +++ b/headers/csps/index.ts @@ -33,6 +33,7 @@ import { csp as plasma } from './chains/plasma' import { csp as polygon } from './chains/polygon' import { csp as scroll } from './chains/scroll' import { csp as solana } from './chains/solana' +import { csp as soneium } from './chains/soneium' import { csp as sonic } from './chains/sonic' import { csp as starknet } from './chains/starknet' import { csp as sui } from './chains/sui' @@ -139,6 +140,7 @@ export const csps = [ optimism, polygon, scroll, + soneium, solana, starknet, sui, diff --git a/packages/caip/src/adapters/coingecko/generated/eip155_1868/adapter.json b/packages/caip/src/adapters/coingecko/generated/eip155_1868/adapter.json new file mode 100644 index 00000000000..9dadbb9a567 --- /dev/null +++ b/packages/caip/src/adapters/coingecko/generated/eip155_1868/adapter.json @@ -0,0 +1 @@ +{"eip155:1868/slip44:60":"ethereum"} diff --git a/packages/caip/src/adapters/coingecko/generated/index.ts b/packages/caip/src/adapters/coingecko/generated/index.ts index 99be7c70a12..728e218b5da 100644 --- a/packages/caip/src/adapters/coingecko/generated/index.ts +++ b/packages/caip/src/adapters/coingecko/generated/index.ts @@ -25,6 +25,7 @@ import scroll from "./eip155_534352/adapter.json"; 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 cosmos from "./cosmos_cosmoshub-4/adapter.json"; import thorchain from "./cosmos_thorchain-1/adapter.json"; import mayachain from "./cosmos_mayachain-mainnet-v1/adapter.json"; @@ -64,6 +65,7 @@ export { cronos, sonic, unichain, + soneium, cosmos, thorchain, mayachain, diff --git a/packages/caip/src/adapters/coingecko/index.test.ts b/packages/caip/src/adapters/coingecko/index.test.ts index f327f167bc9..cfd7f3fafdc 100644 --- a/packages/caip/src/adapters/coingecko/index.test.ts +++ b/packages/caip/src/adapters/coingecko/index.test.ts @@ -99,6 +99,12 @@ describe('adapters:coingecko', () => { assetNamespace: 'slip44', assetReference: ASSET_REFERENCE.Mode, }) + const ethOnSoneium = toAssetId({ + chainNamespace, + chainReference: CHAIN_REFERENCE.SoneiumMainnet, + assetNamespace: 'slip44', + assetReference: ASSET_REFERENCE.Soneium, + }) expect(coingeckoToAssetIds('ethereum')).toEqual([ ethOnEthereum, ethOnOptimism, @@ -111,6 +117,7 @@ describe('adapters:coingecko', () => { ethOnInk, ethOnScroll, ethOnUnichain, + ethOnSoneium, ]) }) diff --git a/packages/caip/src/adapters/coingecko/index.ts b/packages/caip/src/adapters/coingecko/index.ts index 641f35e4b16..7937d501fae 100644 --- a/packages/caip/src/adapters/coingecko/index.ts +++ b/packages/caip/src/adapters/coingecko/index.ts @@ -32,6 +32,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -72,6 +73,7 @@ export enum CoingeckoAssetPlatform { Berachain = 'berachain', Scroll = 'scroll', Cronos = 'cronos', + Soneium = 'soneium', Solana = 'solana', Starknet = 'starknet', Tron = 'tron', @@ -154,6 +156,8 @@ export const chainIdToCoingeckoAssetPlatform = (chainId: ChainId): string => { return CoingeckoAssetPlatform.Scroll case CHAIN_REFERENCE.CronosMainnet: return CoingeckoAssetPlatform.Cronos + case CHAIN_REFERENCE.SoneiumMainnet: + return CoingeckoAssetPlatform.Soneium default: throw new Error( `chainNamespace ${chainNamespace}, chainReference ${chainReference} not supported.`, @@ -283,6 +287,8 @@ export const coingeckoAssetPlatformToChainId = ( return scrollChainId case CoingeckoAssetPlatform.Cronos: return cronosChainId + case CoingeckoAssetPlatform.Soneium: + return soneiumChainId case CoingeckoAssetPlatform.Cosmos: return cosmosChainId case CoingeckoAssetPlatform.Thorchain: diff --git a/packages/caip/src/adapters/coingecko/utils.test.ts b/packages/caip/src/adapters/coingecko/utils.test.ts index aebc01bebe2..691170adcce 100644 --- a/packages/caip/src/adapters/coingecko/utils.test.ts +++ b/packages/caip/src/adapters/coingecko/utils.test.ts @@ -212,6 +212,9 @@ describe('adapters:coingecko:utils', () => { 'eip155:34443': { 'eip155:34443/slip44:60': 'ethereum', }, + 'eip155:1868': { + 'eip155:1868/slip44:60': 'ethereum', + }, 'near:mainnet': { 'near:mainnet/slip44:397': 'near', }, diff --git a/packages/caip/src/adapters/coingecko/utils.ts b/packages/caip/src/adapters/coingecko/utils.ts index d86d5f20886..d044f86a7e4 100644 --- a/packages/caip/src/adapters/coingecko/utils.ts +++ b/packages/caip/src/adapters/coingecko/utils.ts @@ -60,6 +60,8 @@ import { scrollChainId, solanaChainId, solAssetId, + soneiumAssetId, + soneiumChainId, sonicAssetId, sonicChainId, starknetAssetId, @@ -463,6 +465,20 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { } } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.Soneium)) { + try { + const assetId = toAssetId({ + chainNamespace: CHAIN_NAMESPACE.Evm, + chainReference: CHAIN_REFERENCE.SoneiumMainnet, + assetNamespace: 'erc20', + assetReference: platforms[CoingeckoAssetPlatform.Soneium], + }) + prev[soneiumChainId][assetId] = id + } catch { + // unable to create assetId, skip token + } + } + if (Object.keys(platforms).includes(CoingeckoAssetPlatform.Starknet)) { try { const assetId = toAssetId({ @@ -531,6 +547,7 @@ export const parseData = (coins: CoingeckoCoin[]): AssetMap => { [unichainChainId]: { [unichainAssetId]: 'ethereum' }, [bobChainId]: { [bobAssetId]: 'ethereum' }, [modeChainId]: { [modeAssetId]: 'ethereum' }, + [soneiumChainId]: { [soneiumAssetId]: 'ethereum' }, [solanaChainId]: { [solAssetId]: 'solana' }, [starknetChainId]: { [starknetAssetId]: 'starknet' }, [tronChainId]: { [tronAssetId]: 'tron' }, diff --git a/packages/caip/src/constants.ts b/packages/caip/src/constants.ts index 5c8566f194b..e93d5339577 100644 --- a/packages/caip/src/constants.ts +++ b/packages/caip/src/constants.ts @@ -30,6 +30,7 @@ export const sonicAssetId: AssetId = 'eip155:146/slip44:60' export const unichainAssetId: AssetId = 'eip155:130/slip44:60' export const bobAssetId: AssetId = 'eip155:60808/slip44:60' export const modeAssetId: AssetId = 'eip155:34443/slip44:60' +export const soneiumAssetId: AssetId = 'eip155:1868/slip44:60' export const solAssetId: AssetId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/slip44:501' export const wrappedSolAssetId: AssetId = 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:So11111111111111111111111111111111111111112' @@ -101,6 +102,7 @@ export const sonicChainId: ChainId = 'eip155:146' export const unichainChainId: ChainId = 'eip155:130' export const bobChainId: ChainId = 'eip155:60808' export const modeChainId: ChainId = 'eip155:34443' +export const soneiumChainId: ChainId = 'eip155:1868' export const cosmosChainId: ChainId = 'cosmos:cosmoshub-4' export const thorchainChainId: ChainId = 'cosmos:thorchain-1' @@ -163,6 +165,7 @@ export const CHAIN_REFERENCE = { UnichainMainnet: '130', // https://docs.unichain.org BobMainnet: '60808', // https://docs.gobob.xyz ModeMainnet: '34443', // https://docs.mode.network + SoneiumMainnet: '1868', // https://soneium.org SolanaMainnet: '5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', // https://namespaces.chainagnostic.org/solana/caip2 TronMainnet: '0x2b6653dc', // https://developers.tron.network/docs/networks SuiMainnet: '35834a8a', // First 8 chars of SUI mainnet genesis hash @@ -218,6 +221,7 @@ export const ASSET_REFERENCE = { Unichain: '60', // evm chain which uses ethereum derivation path as common practice Bob: '60', // evm chain which uses ethereum derivation path as common practice Mode: '60', // evm chain which uses ethereum derivation path as common practice + Soneium: '60', // evm chain which uses ethereum derivation path as common practice Solana: '501', Tron: '195', Sui: '784', @@ -258,6 +262,7 @@ export const VALID_CHAIN_IDS: ValidChainMap = Object.freeze({ CHAIN_REFERENCE.UnichainMainnet, CHAIN_REFERENCE.BobMainnet, CHAIN_REFERENCE.ModeMainnet, + CHAIN_REFERENCE.SoneiumMainnet, ], [CHAIN_NAMESPACE.CosmosSdk]: [ CHAIN_REFERENCE.CosmosHubMainnet, @@ -321,6 +326,7 @@ export const FEE_ASSET_IDS = [ cronosAssetId, sonicAssetId, unichainAssetId, + soneiumAssetId, solAssetId, tronAssetId, suiAssetId, diff --git a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts index d8e20ee02be..eb8e3d9c031 100644 --- a/packages/chain-adapters/src/evm/EvmBaseAdapter.ts +++ b/packages/chain-adapters/src/evm/EvmBaseAdapter.ts @@ -29,6 +29,7 @@ import { supportsPlasma, supportsPolygon, supportsScroll, + supportsSoneium, supportsSonic, supportsUnichain, } from '@shapeshiftoss/hdwallet-core' @@ -108,6 +109,7 @@ export const evmChainIds = [ KnownChainIds.UnichainMainnet, KnownChainIds.BobMainnet, KnownChainIds.ModeMainnet, + KnownChainIds.SoneiumMainnet, ] as const export type EvmChainAdapter = EvmBaseAdapter @@ -232,6 +234,8 @@ export abstract class EvmBaseAdapter implements IChainAdap return supportsBob(wallet) case Number(fromChainId(KnownChainIds.ModeMainnet).chainReference): return supportsMode(wallet) + case Number(fromChainId(KnownChainIds.SoneiumMainnet).chainReference): + return supportsSoneium(wallet) default: return false } @@ -379,6 +383,11 @@ export abstract class EvmBaseAdapter implements IChainAdap symbol: 'ETH', explorer: 'https://modescan.io', }, + [KnownChainIds.SoneiumMainnet]: { + name: 'Ethereum', + symbol: 'ETH', + explorer: 'https://soneium.blockscout.com', + }, }[this.chainId] try { diff --git a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts index 3474b91f81e..da633336b0a 100644 --- a/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts +++ b/packages/chain-adapters/src/evm/SecondClassEvmAdapter.ts @@ -7,6 +7,7 @@ import { hyperEvmChainId, mantleChainId, modeChainId, + soneiumChainId, sonicChainId, toAssetId, unichainChainId, @@ -54,6 +55,7 @@ const WRAPPED_NATIVE_CONTRACT_BY_CHAIN_ID: Partial> = { [unichainChainId]: '0x4200000000000000000000000000000000000006', [bobChainId]: '0x4200000000000000000000000000000000000006', [modeChainId]: '0x4200000000000000000000000000000000000006', + [soneiumChainId]: '0x4200000000000000000000000000000000000006', } const BATCH_SIZE = 500 @@ -116,6 +118,26 @@ export abstract class SecondClassEvmAdapter extends EvmBas }) } + async getTransactionStatus(txHash: string): Promise { + try { + const receipt = await this.requestQueue.add(() => this.provider.getTransactionReceipt(txHash)) + + if (!receipt) return TxStatus.Pending + + switch (receipt.status) { + case 1: + return TxStatus.Confirmed + case 0: + return TxStatus.Failed + default: + return TxStatus.Unknown + } + } catch (error) { + console.error(`[${this.getName()}] Error getting transaction status:`, error) + return TxStatus.Unknown + } + } + async getAccount(pubkey: string): Promise> { try { const [balance, nonce] = await Promise.all([ @@ -152,26 +174,6 @@ export abstract class SecondClassEvmAdapter extends EvmBas } } - async getTransactionStatus(txHash: string): Promise { - try { - const receipt = await this.requestQueue.add(() => this.provider.getTransactionReceipt(txHash)) - - if (!receipt) return TxStatus.Pending - - switch (receipt.status) { - case 1: - return TxStatus.Confirmed - case 0: - return TxStatus.Failed - default: - return TxStatus.Unknown - } - } catch (error) { - console.error(`[${this.getName()}] Error getting transaction status:`, error) - return TxStatus.Unknown - } - } - private async getTokenBalancesMulticall( pubkey: string, tokens: TokenInfo[], @@ -470,6 +472,27 @@ export abstract class SecondClassEvmAdapter extends EvmBas value: log.args.value.toString(), }) } + + // Fallback: WETH9 Withdrawal(address indexed src, uint256 wad) event + // On OP Stack L2s and other chains, WETH.withdraw() emits Withdrawal instead of Transfer-to-zero + if (internalTxs.length === 0) { + const WITHDRAWAL_TOPIC = + '0x7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65' + const withdrawalLogs = receipt.logs.filter( + log => + log.address && + isAddressEqual(getAddress(log.address), getAddress(wrappedNativeContract)) && + log.topics[0] === WITHDRAWAL_TOPIC, + ) + + for (const log of withdrawalLogs) { + internalTxs.push({ + from: wrappedNativeContract, + to: getAddress(pubkey), + value: BigInt(log.data).toString(), + }) + } + } } const block = receipt.blockHash diff --git a/packages/chain-adapters/src/evm/index.ts b/packages/chain-adapters/src/evm/index.ts index 687b6fa98a6..4f101bf0250 100644 --- a/packages/chain-adapters/src/evm/index.ts +++ b/packages/chain-adapters/src/evm/index.ts @@ -28,3 +28,4 @@ export * as sonic from './sonic' export * as unichain from './unichain' export * as bob from './bob' export * as mode from './mode' +export * as soneium from './soneium' diff --git a/packages/chain-adapters/src/evm/soneium/SoneiumChainAdapter.ts b/packages/chain-adapters/src/evm/soneium/SoneiumChainAdapter.ts new file mode 100644 index 00000000000..7e01f29727b --- /dev/null +++ b/packages/chain-adapters/src/evm/soneium/SoneiumChainAdapter.ts @@ -0,0 +1,57 @@ +import type { AssetId } from '@shapeshiftoss/caip' +import { ASSET_REFERENCE, soneiumAssetId } 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.SoneiumMainnet] +const DEFAULT_CHAIN_ID = KnownChainIds.SoneiumMainnet + +export type ChainAdapterArgs = { + rpcUrl: string + getKnownTokens: () => TokenInfo[] +} + +export const isSoneiumChainAdapter = (adapter: unknown): adapter is ChainAdapter => { + return (adapter as ChainAdapter).getType() === KnownChainIds.SoneiumMainnet +} + +export class ChainAdapter extends SecondClassEvmAdapter { + public static readonly rootBip44Params: RootBip44Params = { + purpose: 44, + coinType: Number(ASSET_REFERENCE.Soneium), + accountNumber: 0, + } + + constructor(args: ChainAdapterArgs) { + super({ + assetId: soneiumAssetId, + chainId: DEFAULT_CHAIN_ID, + rootBip44Params: ChainAdapter.rootBip44Params, + supportedChainIds: SUPPORTED_CHAIN_IDS, + rpcUrl: args.rpcUrl, + getKnownTokens: args.getKnownTokens, + }) + } + + getDisplayName() { + return ChainAdapterDisplayName.Soneium + } + + getName() { + return 'Soneium' + } + + getType(): KnownChainIds.SoneiumMainnet { + return KnownChainIds.SoneiumMainnet + } + + getFeeAssetId(): AssetId { + return this.assetId + } +} + +export type { TokenInfo } diff --git a/packages/chain-adapters/src/evm/soneium/index.ts b/packages/chain-adapters/src/evm/soneium/index.ts new file mode 100644 index 00000000000..c70f1d00da6 --- /dev/null +++ b/packages/chain-adapters/src/evm/soneium/index.ts @@ -0,0 +1 @@ +export * from './SoneiumChainAdapter' diff --git a/packages/chain-adapters/src/types.ts b/packages/chain-adapters/src/types.ts index ee2345aae83..f1b48fbf1ec 100644 --- a/packages/chain-adapters/src/types.ts +++ b/packages/chain-adapters/src/types.ts @@ -59,6 +59,7 @@ type ChainSpecificAccount = ChainSpecific< [KnownChainIds.UnichainMainnet]: evm.Account [KnownChainIds.BobMainnet]: evm.Account [KnownChainIds.ModeMainnet]: evm.Account + [KnownChainIds.SoneiumMainnet]: evm.Account [KnownChainIds.BitcoinMainnet]: utxo.Account [KnownChainIds.BitcoinCashMainnet]: utxo.Account [KnownChainIds.DogecoinMainnet]: utxo.Account @@ -121,6 +122,7 @@ type ChainSpecificFeeData = ChainSpecific< [KnownChainIds.UnichainMainnet]: evm.FeeData [KnownChainIds.BobMainnet]: evm.FeeData [KnownChainIds.ModeMainnet]: evm.FeeData + [KnownChainIds.SoneiumMainnet]: evm.FeeData [KnownChainIds.BitcoinMainnet]: utxo.FeeData [KnownChainIds.BitcoinCashMainnet]: utxo.FeeData [KnownChainIds.DogecoinMainnet]: utxo.FeeData @@ -216,6 +218,7 @@ export type ChainSignTx = { [KnownChainIds.UnichainMainnet]: ETHSignTx [KnownChainIds.BobMainnet]: ETHSignTx [KnownChainIds.ModeMainnet]: ETHSignTx + [KnownChainIds.SoneiumMainnet]: ETHSignTx [KnownChainIds.BitcoinMainnet]: BTCSignTx [KnownChainIds.BitcoinCashMainnet]: BTCSignTx [KnownChainIds.DogecoinMainnet]: BTCSignTx @@ -283,6 +286,7 @@ export type ChainSpecificBuildTxData = ChainSpecific< [KnownChainIds.UnichainMainnet]: evm.BuildTxInput [KnownChainIds.BobMainnet]: evm.BuildTxInput [KnownChainIds.ModeMainnet]: evm.BuildTxInput + [KnownChainIds.SoneiumMainnet]: evm.BuildTxInput [KnownChainIds.BitcoinMainnet]: utxo.BuildTxInput [KnownChainIds.BitcoinCashMainnet]: utxo.BuildTxInput [KnownChainIds.DogecoinMainnet]: utxo.BuildTxInput @@ -400,6 +404,7 @@ type ChainSpecificGetFeeDataInput = ChainSpecific< [KnownChainIds.UnichainMainnet]: evm.GetFeeDataInput [KnownChainIds.BobMainnet]: evm.GetFeeDataInput [KnownChainIds.ModeMainnet]: evm.GetFeeDataInput + [KnownChainIds.SoneiumMainnet]: evm.GetFeeDataInput [KnownChainIds.BitcoinMainnet]: utxo.GetFeeDataInput [KnownChainIds.BitcoinCashMainnet]: utxo.GetFeeDataInput [KnownChainIds.DogecoinMainnet]: utxo.GetFeeDataInput @@ -482,6 +487,7 @@ export enum ChainAdapterDisplayName { Unichain = 'Unichain', Bob = 'BOB', Mode = 'Mode', + Soneium = 'Soneium', Cosmos = 'Cosmos', Bitcoin = 'Bitcoin', BitcoinCash = 'Bitcoin Cash', diff --git a/packages/contracts/src/ethersProviderSingleton.ts b/packages/contracts/src/ethersProviderSingleton.ts index 30d144b638a..a76bbb4097f 100644 --- a/packages/contracts/src/ethersProviderSingleton.ts +++ b/packages/contracts/src/ethersProviderSingleton.ts @@ -54,6 +54,8 @@ export const rpcUrlByChainId = (chainId: EvmChainId): string => { return process.env.VITE_BOB_NODE_URL case KnownChainIds.ModeMainnet: return process.env.VITE_MODE_NODE_URL + case KnownChainIds.SoneiumMainnet: + return process.env.VITE_SONEIUM_NODE_URL default: return assertUnreachable(chainId) } diff --git a/packages/contracts/src/viemClient.ts b/packages/contracts/src/viemClient.ts index b7e299acdae..08fdfd62522 100644 --- a/packages/contracts/src/viemClient.ts +++ b/packages/contracts/src/viemClient.ts @@ -24,6 +24,7 @@ import { plasma, polygon, scroll, + soneium, sonic, unichain, } from 'viem/chains' @@ -177,6 +178,11 @@ export const viemModeClient = createPublicClient({ transport: fallback([process.env.VITE_MODE_NODE_URL].filter(Boolean).map(url => http(url))), }) as PublicClient +export const viemSoneiumClient = createPublicClient({ + chain: soneium, + transport: fallback([process.env.VITE_SONEIUM_NODE_URL].filter(Boolean).map(url => http(url))), +}) as PublicClient + export const viemClientByChainId: Record = { [KnownChainIds.EthereumMainnet]: viemEthMainnetClient, [KnownChainIds.BnbSmartChainMainnet]: viemBscClient, @@ -201,6 +207,7 @@ export const viemClientByChainId: Record = { [KnownChainIds.UnichainMainnet]: viemUnichainClient, [KnownChainIds.BobMainnet]: viemBobClient, [KnownChainIds.ModeMainnet]: viemModeClient, + [KnownChainIds.SoneiumMainnet]: viemSoneiumClient, } export const viemNetworkIdByChainId: Record = { @@ -227,6 +234,7 @@ export const viemNetworkIdByChainId: Record = { [KnownChainIds.UnichainMainnet]: unichain.id, [KnownChainIds.BobMainnet]: bob.id, [KnownChainIds.ModeMainnet]: mode.id, + [KnownChainIds.SoneiumMainnet]: soneium.id, } export const viemClientByNetworkId: Record = { @@ -253,6 +261,7 @@ export const viemClientByNetworkId: Record = { [unichain.id]: viemUnichainClient, [bob.id]: viemBobClient, [mode.id]: viemModeClient, + [soneium.id]: viemSoneiumClient, } export const assertGetViemClient = (chainId: ChainId): PublicClient => { diff --git a/packages/hdwallet-coinbase/src/coinbase.ts b/packages/hdwallet-coinbase/src/coinbase.ts index a3195742241..815df58b911 100644 --- a/packages/hdwallet-coinbase/src/coinbase.ts +++ b/packages/hdwallet-coinbase/src/coinbase.ts @@ -122,6 +122,7 @@ export class CoinbaseHDWallet implements core.HDWallet, core.ETHWallet { readonly _supportsScroll = false readonly _supportsCronos = false readonly _supportsUnichain = false + readonly _supportsSoneium = false readonly _supportsOsmosisInfo = false readonly _supportsOsmosis = false readonly _supportsBinanceInfo = false diff --git a/packages/hdwallet-core/src/ethereum.ts b/packages/hdwallet-core/src/ethereum.ts index 40cfea5edf4..3f6cbc7769c 100644 --- a/packages/hdwallet-core/src/ethereum.ts +++ b/packages/hdwallet-core/src/ethereum.ts @@ -220,6 +220,7 @@ export interface ETHWallet extends ETHWalletInfo, HDWallet { readonly _supportsScroll: boolean readonly _supportsCronos: boolean readonly _supportsUnichain: boolean + readonly _supportsSoneium: boolean ethGetAddress(msg: ETHGetAddress): Promise
ethGetAddresses?(msgs: ETHGetAddress[]): Promise diff --git a/packages/hdwallet-core/src/wallet.ts b/packages/hdwallet-core/src/wallet.ts index 3855b37ddda..9e916b4fd01 100644 --- a/packages/hdwallet-core/src/wallet.ts +++ b/packages/hdwallet-core/src/wallet.ts @@ -229,6 +229,10 @@ export function supportsUnichain(wallet: HDWallet): wallet is ETHWallet { return isObject(wallet) && (wallet as any)._supportsUnichain } +export function supportsSoneium(wallet: HDWallet): wallet is ETHWallet { + return isObject(wallet) && (wallet as any)._supportsSoneium +} + export function infoCosmos(info: HDWalletInfo): info is CosmosWalletInfo { return isObject(info) && (info as any)._supportsCosmosInfo } diff --git a/packages/hdwallet-gridplus/src/gridplus.ts b/packages/hdwallet-gridplus/src/gridplus.ts index c3dcd11734d..a56afa0d1ac 100644 --- a/packages/hdwallet-gridplus/src/gridplus.ts +++ b/packages/hdwallet-gridplus/src/gridplus.ts @@ -375,6 +375,7 @@ export class GridPlusHDWallet readonly _supportsScroll = true readonly _supportsCronos = true readonly _supportsUnichain = false + readonly _supportsSoneium = false readonly _supportsCosmos = true readonly _supportsETH = true readonly _supportsEthSwitchChain = false diff --git a/packages/hdwallet-keepkey/src/keepkey.ts b/packages/hdwallet-keepkey/src/keepkey.ts index 65411a1cd6b..cc165b7dcb5 100644 --- a/packages/hdwallet-keepkey/src/keepkey.ts +++ b/packages/hdwallet-keepkey/src/keepkey.ts @@ -564,6 +564,7 @@ export class KeepKeyHDWallet readonly _supportsScroll = false readonly _supportsCronos = false readonly _supportsUnichain = false + readonly _supportsSoneium = false readonly _supportsBTC = true _supportsCosmos = true _supportsOsmosis = true diff --git a/packages/hdwallet-ledger/src/ledger.ts b/packages/hdwallet-ledger/src/ledger.ts index a79363cfd39..4aa88af2665 100644 --- a/packages/hdwallet-ledger/src/ledger.ts +++ b/packages/hdwallet-ledger/src/ledger.ts @@ -441,6 +441,7 @@ export class LedgerHDWallet readonly _supportsScroll = true readonly _supportsCronos = true readonly _supportsUnichain = true + readonly _supportsSoneium = true readonly _supportsThorchain = true readonly _supportsMayachain = true readonly _supportsCosmos = true diff --git a/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts b/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts index 66b0ff5a5a9..9a8a1e3215a 100644 --- a/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts +++ b/packages/hdwallet-metamask-multichain/src/shapeshift-multichain.ts @@ -291,6 +291,7 @@ export class MetaMaskMultiChainHDWallet readonly _supportsScroll = true readonly _supportsCronos = true readonly _supportsUnichain = true + readonly _supportsSoneium = true readonly _supportsOsmosisInfo = true readonly _supportsOsmosis = true readonly _supportsBinanceInfo = false diff --git a/packages/hdwallet-native/src/ethereum.ts b/packages/hdwallet-native/src/ethereum.ts index 08a7afff59f..3a0390d46f3 100644 --- a/packages/hdwallet-native/src/ethereum.ts +++ b/packages/hdwallet-native/src/ethereum.ts @@ -80,6 +80,7 @@ export function MixinNativeETHWallet = { [modeChainId]: mode.id, [plasmaChainId]: plasma.id, [unichainChainId]: unichain.id, + [soneiumChainId]: soneium.id, // Across uses a custom Solana chain ID [solanaChainId]: 34268394551451, } diff --git a/packages/swapper/src/swappers/RelaySwapper/constant.ts b/packages/swapper/src/swappers/RelaySwapper/constant.ts index e7f0cf48897..80defc58c56 100644 --- a/packages/swapper/src/swappers/RelaySwapper/constant.ts +++ b/packages/swapper/src/swappers/RelaySwapper/constant.ts @@ -22,6 +22,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, tronChainId, unichainChainId, @@ -49,6 +50,7 @@ import { plasma, polygon, scroll, + soneium, sonic, unichain, } from 'viem/chains' @@ -85,6 +87,7 @@ export const chainIdToRelayChainId = { [unichainChainId]: unichain.id, [bobChainId]: bob.id, [modeChainId]: mode.id, + [soneiumChainId]: soneium.id, } export enum RelayStatusMessage { diff --git a/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts b/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts index e2afc678791..e9831ae2a92 100644 --- a/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts +++ b/packages/swapper/src/swappers/RelaySwapper/utils/relayTokenToAssetId.ts @@ -196,6 +196,11 @@ export const relayTokenToAssetId = (relayToken: RelayToken): AssetId => { assetReference: ASSET_REFERENCE.Mode, assetNamespace: ASSET_NAMESPACE.slip44, } + case CHAIN_REFERENCE.SoneiumMainnet: + return { + assetReference: ASSET_REFERENCE.Soneium, + assetNamespace: ASSET_NAMESPACE.slip44, + } default: throw Error(`chainId '${relayToken.chainId}' not supported`) } diff --git a/packages/types/src/base.ts b/packages/types/src/base.ts index ae03b6005ef..1e5a306692a 100644 --- a/packages/types/src/base.ts +++ b/packages/types/src/base.ts @@ -37,6 +37,7 @@ export enum KnownChainIds { UnichainMainnet = 'eip155:130', BobMainnet = 'eip155:60808', ModeMainnet = 'eip155:34443', + SoneiumMainnet = 'eip155:1868', BitcoinMainnet = 'bip122:000000000019d6689c085ae165831e93', BitcoinCashMainnet = 'bip122:000000000000000000651ef99cb9fcbe', DogecoinMainnet = 'bip122:00000000001a91e3dace36e2be3bf030', @@ -77,6 +78,7 @@ export type EvmChainId = | KnownChainIds.UnichainMainnet | KnownChainIds.BobMainnet | KnownChainIds.ModeMainnet + | KnownChainIds.SoneiumMainnet export type CosmosSdkChainId = | KnownChainIds.CosmosMainnet diff --git a/packages/types/src/zerion.ts b/packages/types/src/zerion.ts index 8c2e158cb13..2c8d4d6a144 100644 --- a/packages/types/src/zerion.ts +++ b/packages/types/src/zerion.ts @@ -19,6 +19,7 @@ import { plasmaChainId, polygonChainId, solanaChainId, + soneiumChainId, sonicChainId, suiChainId, tronChainId, @@ -50,6 +51,7 @@ export const ZERION_CHAINS = [ 'unichain', 'bob', 'mode', + 'soneium', // not yet // 'aurora', // 'fantom', @@ -81,6 +83,7 @@ export const ZERION_CHAINS_MAP: Record = { unichain: unichainChainId, bob: bobChainId, mode: modeChainId, + soneium: soneiumChainId, } export const zerionChainIdToChainId = (chainId: ZerionChainId): ChainId | undefined => diff --git a/packages/utils/src/assetData/baseAssets.ts b/packages/utils/src/assetData/baseAssets.ts index d23267e4540..2254dc33269 100644 --- a/packages/utils/src/assetData/baseAssets.ts +++ b/packages/utils/src/assetData/baseAssets.ts @@ -492,7 +492,7 @@ export const scroll: Readonly = Object.freeze({ export const sonic: Readonly = Object.freeze({ assetId: caip.sonicAssetId, chainId: caip.sonicChainId, - name: 'Sonic', + name: 'Sonic (S)', networkName: 'Sonic', symbol: 'S', precision: 18, @@ -516,7 +516,7 @@ export const unichainChain: Readonly = Object.freeze({ color: '#5C6BC0', networkColor: '#F50DB4', icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', - networkIcon: 'https://assets.coingecko.com/asset_platforms/images/305/small/unichain-logo.png', + networkIcon: 'https://assets.coingecko.com/asset_platforms/images/22206/small/unichain.png', explorer: 'https://uniscan.xyz', explorerAddressLink: 'https://uniscan.xyz/address/', explorerTxLink: 'https://uniscan.xyz/tx/', @@ -533,7 +533,7 @@ export const bobChain: Readonly = Object.freeze({ color: '#5C6BC0', networkColor: '#F25D00', icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', - networkIcon: 'https://assets.coingecko.com/asset_platforms/images/203/small/bob.jpeg', + networkIcon: 'https://assets.coingecko.com/asset_platforms/images/255/small/bob.jpeg', explorer: 'https://explorer.gobob.xyz', explorerAddressLink: 'https://explorer.gobob.xyz/address/', explorerTxLink: 'https://explorer.gobob.xyz/tx/', @@ -550,13 +550,30 @@ export const modeChain: Readonly = Object.freeze({ color: '#5C6BC0', networkColor: '#DFFE00', icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', - networkIcon: 'https://assets.coingecko.com/asset_platforms/images/180/small/mode.jpeg', + networkIcon: 'https://assets.relay.link/icons/34443/light.png', explorer: 'https://modescan.io', explorerAddressLink: 'https://modescan.io/address/', explorerTxLink: 'https://modescan.io/tx/', relatedAssetKey: 'eip155:1/slip44:60', }) +export const soneium: Readonly = Object.freeze({ + assetId: caip.soneiumAssetId, + chainId: caip.soneiumChainId, + name: 'Ethereum', + networkName: 'Soneium', + symbol: 'ETH', + precision: 18, + color: '#627EEA', + networkColor: '#1A1A2E', + icon: 'https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png', + networkIcon: 'https://assets.relay.link/icons/1868/light.png', + explorer: 'https://soneium.blockscout.com', + explorerAddressLink: 'https://soneium.blockscout.com/address/', + explorerTxLink: 'https://soneium.blockscout.com/tx/', + relatedAssetKey: 'eip155:1/slip44:60', +}) + export const solana: Readonly = Object.freeze({ assetId: caip.solAssetId, chainId: caip.solanaChainId, diff --git a/packages/utils/src/assetData/getBaseAsset.ts b/packages/utils/src/assetData/getBaseAsset.ts index dd2dc2ea137..cd6ee93c624 100644 --- a/packages/utils/src/assetData/getBaseAsset.ts +++ b/packages/utils/src/assetData/getBaseAsset.ts @@ -33,6 +33,7 @@ import { polygon, scroll, solana, + soneium, sonic, starknet, sui, @@ -114,6 +115,8 @@ export const getBaseAsset = (chainId: ChainId): Readonly => { return bobChain case KnownChainIds.ModeMainnet: return modeChain + case KnownChainIds.SoneiumMainnet: + return soneium case KnownChainIds.NearMainnet: return near case KnownChainIds.ZcashMainnet: diff --git a/packages/utils/src/chainIdToFeeAssetId.ts b/packages/utils/src/chainIdToFeeAssetId.ts index 2f5651ca7eb..2d154153a70 100644 --- a/packages/utils/src/chainIdToFeeAssetId.ts +++ b/packages/utils/src/chainIdToFeeAssetId.ts @@ -29,6 +29,7 @@ import { polygonAssetId, scrollAssetId, solAssetId, + soneiumAssetId, sonicAssetId, starknetAssetId, suiAssetId, @@ -113,6 +114,8 @@ export const chainIdToFeeAssetId = (_chainId: ChainId): AssetId => { return bobAssetId case KnownChainIds.ModeMainnet: return modeAssetId + case KnownChainIds.SoneiumMainnet: + return soneiumAssetId case KnownChainIds.ZcashMainnet: return zecAssetId case KnownChainIds.NearMainnet: diff --git a/packages/utils/src/getAssetNamespaceFromChainId.ts b/packages/utils/src/getAssetNamespaceFromChainId.ts index 01a6e951f3a..08922004638 100644 --- a/packages/utils/src/getAssetNamespaceFromChainId.ts +++ b/packages/utils/src/getAssetNamespaceFromChainId.ts @@ -37,6 +37,7 @@ export const getAssetNamespaceFromChainId = (chainId: KnownChainIds): AssetNames case KnownChainIds.UnichainMainnet: case KnownChainIds.BobMainnet: case KnownChainIds.ModeMainnet: + case KnownChainIds.SoneiumMainnet: return ASSET_NAMESPACE.erc20 case KnownChainIds.StarknetMainnet: return ASSET_NAMESPACE.starknetToken diff --git a/packages/utils/src/getChainShortName.ts b/packages/utils/src/getChainShortName.ts index ff6e597ab5a..b87daecb3d0 100644 --- a/packages/utils/src/getChainShortName.ts +++ b/packages/utils/src/getChainShortName.ts @@ -72,6 +72,8 @@ export const getChainShortName = (chainId: KnownChainIds) => { return 'BOB' case KnownChainIds.ModeMainnet: return 'MODE' + case KnownChainIds.SoneiumMainnet: + return 'SON' case KnownChainIds.ZcashMainnet: return 'ZEC' case KnownChainIds.NearMainnet: diff --git a/packages/utils/src/getNativeFeeAssetReference.ts b/packages/utils/src/getNativeFeeAssetReference.ts index b8e0538ea9c..5b2b7344308 100644 --- a/packages/utils/src/getNativeFeeAssetReference.ts +++ b/packages/utils/src/getNativeFeeAssetReference.ts @@ -70,6 +70,8 @@ export const getNativeFeeAssetReference = ( return ASSET_REFERENCE.Bob case CHAIN_REFERENCE.ModeMainnet: return ASSET_REFERENCE.Mode + case CHAIN_REFERENCE.SoneiumMainnet: + return ASSET_REFERENCE.Soneium default: throw new Error(`Chain namespace ${chainNamespace} on ${chainReference} not supported.`) } diff --git a/public/generated/asset-manifest.json b/public/generated/asset-manifest.json index 88ecf5e76f8..3502fd0699b 100644 --- a/public/generated/asset-manifest.json +++ b/public/generated/asset-manifest.json @@ -1,4 +1,4 @@ { - "assetData": "fbad2af0", - "relatedAssetIndex": "f85493f3" -} \ No newline at end of file + "assetData": "0ccbb144", + "relatedAssetIndex": "590969d5" +} diff --git a/public/generated/asset-manifest.json.br b/public/generated/asset-manifest.json.br index b6cdf415ee7..86b78b948dd 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 ee8b0fe6294..be4655187a7 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 e10a96ee1d2..9c71655a1dd 100644 --- a/public/generated/generatedAssetData.json +++ b/public/generated/generatedAssetData.json @@ -32467,7 +32467,7 @@ "explorer": "https://etherscan.io", "explorerAddressLink": "https://etherscan.io/address/", "explorerTxLink": "https://etherscan.io/tx/", - "relatedAssetKey": "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe" + "relatedAssetKey": "eip155:146/slip44:60" }, "eip155:1/erc20:0x4e1a609ec87cf6477613f515f6eb64ef2d31089a": { "assetId": "eip155:1/erc20:0x4e1a609ec87cf6477613f515f6eb64ef2d31089a", @@ -67436,7 +67436,7 @@ "explorer": "https://etherscan.io", "explorerAddressLink": "https://etherscan.io/address/", "explorerTxLink": "https://etherscan.io/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:25/slip44:60" }, "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48": { "assetId": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", @@ -249105,7 +249105,7 @@ "explorer": "https://bscscan.com", "explorerAddressLink": "https://bscscan.com/address/", "explorerTxLink": "https://bscscan.com/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5" }, "eip155:56/erc20:0x2a48ece377b87ce941406657b9278b4459595e06": { "assetId": "eip155:56/erc20:0x2a48ece377b87ce941406657b9278b4459595e06", @@ -281077,7 +281077,7 @@ "explorer": "https://bscscan.com", "explorerAddressLink": "https://bscscan.com/address/", "explorerTxLink": "https://bscscan.com/tx/", - "relatedAssetKey": "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe" + "relatedAssetKey": "eip155:146/slip44:60" }, "eip155:56/erc20:0xad3597c75186860b6714a034255c8d1cbdeb456f": { "explorer": "https://bscscan.com", @@ -301802,7 +301802,7 @@ "explorer": "https://berascan.com", "explorerAddressLink": "https://berascan.com/address/", "explorerTxLink": "https://berascan.com/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:42161/erc20:0x66cfbd79257dc5217903a36293120282548e2254" }, "eip155:80094/erc20:0xd2c41bf4033a83c0fc3a7f58a392bf37d6dcdb58": { "assetId": "eip155:80094/erc20:0xd2c41bf4033a83c0fc3a7f58a392bf37d6dcdb58", @@ -326790,7 +326790,7 @@ "explorer": "https://basescan.org", "explorerAddressLink": "https://basescan.org/address/", "explorerTxLink": "https://basescan.org/tx/", - "relatedAssetKey": null + "relatedAssetKey": "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee" }, "eip155:8453/erc20:0xa0ca5bebc42cdbf3623b1c09206ae4e3975b0fc7": { "explorer": "https://basescan.org", @@ -427690,7 +427690,7 @@ "explorer": "https://explorer.cronos.org", "explorerAddressLink": "https://explorer.cronos.org/address/", "explorerTxLink": "https://explorer.cronos.org/tx/", - "relatedAssetKey": "eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b" + "relatedAssetKey": "eip155:25/slip44:60" }, "eip155:5000/erc20:0x00000000efe302beaa2b3e6e1b18d08d69a9012a": { "assetId": "eip155:5000/erc20:0x00000000efe302beaa2b3e6e1b18d08d69a9012a", @@ -431352,7 +431352,7 @@ "eip155:146/slip44:60": { "assetId": "eip155:146/slip44:60", "chainId": "eip155:146", - "name": "Sonic", + "name": "Sonic (S)", "networkName": "Sonic", "symbol": "S", "precision": 18, @@ -431363,7 +431363,7 @@ "explorer": "https://sonicscan.org", "explorerAddressLink": "https://sonicscan.org/address/", "explorerTxLink": "https://sonicscan.org/tx/", - "relatedAssetKey": "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe" + "relatedAssetKey": "eip155:146/slip44:60" }, "eip155:130/erc20:0x03c2868c6d7fd27575426f395ee081498b1120dd": { "assetId": "eip155:130/erc20:0x03c2868c6d7fd27575426f395ee081498b1120dd", @@ -431856,7 +431856,7 @@ "color": "#5C6BC0", "networkColor": "#F50DB4", "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", - "networkIcon": "https://assets.coingecko.com/asset_platforms/images/305/small/unichain-logo.png", + "networkIcon": "https://assets.coingecko.com/asset_platforms/images/22206/small/unichain.png", "explorer": "https://uniscan.xyz", "explorerAddressLink": "https://uniscan.xyz/address/", "explorerTxLink": "https://uniscan.xyz/tx/", @@ -432015,7 +432015,7 @@ "color": "#5C6BC0", "networkColor": "#F25D00", "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", - "networkIcon": "https://assets.coingecko.com/asset_platforms/images/203/small/bob.jpeg", + "networkIcon": "https://assets.coingecko.com/asset_platforms/images/255/small/bob.jpeg", "explorer": "https://explorer.gobob.xyz", "explorerAddressLink": "https://explorer.gobob.xyz/address/", "explorerTxLink": "https://explorer.gobob.xyz/tx/", @@ -432512,11 +432512,430 @@ "color": "#5C6BC0", "networkColor": "#DFFE00", "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", - "networkIcon": "https://assets.coingecko.com/asset_platforms/images/180/small/mode.jpeg", + "networkIcon": "https://assets.relay.link/icons/34443/light.png", "explorer": "https://modescan.io", "explorerAddressLink": "https://modescan.io/address/", "explorerTxLink": "https://modescan.io/tx/", "relatedAssetKey": "eip155:1/slip44:60" + }, + "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c": { + "assetId": "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c", + "chainId": "eip155:1868", + "name": "Wrapped Bitcoin", + "precision": 8, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/7598/large/WBTCLOGO.png?1764496367", + "symbol": "WBTC", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" + }, + "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282": { + "assetId": "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", + "chainId": "eip155:1868", + "name": "Stargate Bridged USDT0", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/69528/large/usdt0.jpg?1758873945", + "symbol": "USDT0", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189": { + "assetId": "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", + "chainId": "eip155:1868", + "name": "OpenUSDT", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54815/large/ousdt.jpg?1741848258", + "symbol": "OUSDT", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "eip155:1868/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd": { + "assetId": "eip155:1868/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd", + "chainId": "eip155:1868", + "name": "SuperReturn sSuperUSD", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/67821/large/sSuperUSD_200x200.png?1753943152", + "symbol": "SSUPERUSD", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd" + }, + "eip155:1868/erc20:0x2a52b289ba68bbd02676640aa9f605700c9e5699": { + "assetId": "eip155:1868/erc20:0x2a52b289ba68bbd02676640aa9f605700c9e5699", + "chainId": "eip155:1868", + "name": "Resolv wstUSR", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/51880/large/USR_LOGO.png?1732098841", + "symbol": "WSTUSR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x66cfbd79257dc5217903a36293120282548e2254" + }, + "eip155:1868/erc20:0x2cae934a1e84f693fbb78ca5ed3b0a6893259441": { + "assetId": "eip155:1868/erc20:0x2cae934a1e84f693fbb78ca5ed3b0a6893259441", + "chainId": "eip155:1868", + "name": "Soneium Bridged ASTR (Soneium)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53778/large/astar.jpg?1737341226", + "symbol": "ASTR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec": { + "assetId": "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec", + "chainId": "eip155:1868", + "name": "Chainlink", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/877/large/Chainlink_Logo_500.png?1760023405", + "symbol": "LINK", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0xf97f4df75117a78c1a5a0dbb814af92458539fb4" + }, + "eip155:1868/erc20:0x35533f54740f1f1aa4179e57ba37039dfa16868b": { + "assetId": "eip155:1868/erc20:0x35533f54740f1f1aa4179e57ba37039dfa16868b", + "chainId": "eip155:1868", + "name": "Resolv Liquidity Provider Token", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/40017/large/orangeLogo..png?1725344586", + "symbol": "RLP", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x35e5db674d8e93a03d814fa0ada70731efe8a4b9" + }, + "eip155:1868/erc20:0x3a337a6ada9d885b6ad95ec48f9b75f197b5ae35": { + "assetId": "eip155:1868/erc20:0x3a337a6ada9d885b6ad95ec48f9b75f197b5ae35", + "chainId": "eip155:1868", + "name": "Soneium Bridged USDT (Soneium)", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53779/large/usdt.jpg?1737341724", + "symbol": "USDT", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7" + }, + "eip155:1868/erc20:0x3b0dc2dac9498a024003609031d973b1171de09e": { + "assetId": "eip155:1868/erc20:0x3b0dc2dac9498a024003609031d973b1171de09e", + "chainId": "eip155:1868", + "name": "Wrapped stASTR", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54782/large/wstASTR.png?1741570094", + "symbol": "WSTASTR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368": { + "assetId": "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "chainId": "eip155:1868", + "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://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:8453/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + }, + "eip155:1868/erc20:0x3f99231dd03a9f0e7e3421c92b7b90fbe012985a": { + "assetId": "eip155:1868/erc20:0x3f99231dd03a9f0e7e3421c92b7b90fbe012985a", + "chainId": "eip155:1868", + "name": "Startale USD", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/70883/large/stataleusd_2x.png?1764684119", + "symbol": "USDSC", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x4200000000000000000000000000000000000006": { + "assetId": "eip155:1868/erc20:0x4200000000000000000000000000000000000006", + "chainId": "eip155:1868", + "name": "Superbridge Bridged WETH (Soneium)", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53777/large/weth_2.jpg?1737340348", + "symbol": "WETH", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2" + }, + "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77": { + "assetId": "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", + "chainId": "eip155:1868", + "name": "Solv Protocol BTC", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36800/large/solvBTC.png?1719810684", + "symbol": "SOLVBTC", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x3647c54c4c2c65bc7a2d63c0da2809b399dbbdc0" + }, + "eip155:1868/erc20:0x54e86315c03217b76a7466c302245fd10ebef25a": { + "assetId": "eip155:1868/erc20:0x54e86315c03217b76a7466c302245fd10ebef25a", + "chainId": "eip155:1868", + "name": "Yay StakeStone Ether", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54279/large/Yay!_Stone200w.png?1739438931", + "symbol": "YAYSTONE", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x570f09ac53b96929e3868f71864e36ff6b1b67d7": { + "assetId": "eip155:1868/erc20:0x570f09ac53b96929e3868f71864e36ff6b1b67d7", + "chainId": "eip155:1868", + "name": "Arcas", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/17404/large/Arcas_Logo.png?1737199437", + "symbol": "ARCAS", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:56/erc20:0x7ca058309053f90b39bfc58de1eda2a89e9c03a8" + }, + "eip155:1868/erc20:0x60336f9296c79da4294a19153ec87f8e52158e5f": { + "assetId": "eip155:1868/erc20:0x60336f9296c79da4294a19153ec87f8e52158e5f", + "chainId": "eip155:1868", + "name": "Bifrost Voucher ASTR", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/34706/large/vASTR.png?1705893008", + "symbol": "VASTR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5": { + "assetId": "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5", + "chainId": "eip155:1868", + "name": "uBTC", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/55079/large/uBTC.png?1743613297", + "symbol": "UBTC", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5" + }, + "eip155:1868/erc20:0x6c460b2c6d6719562d5da43e5152b375e79b9a8b": { + "assetId": "eip155:1868/erc20:0x6c460b2c6d6719562d5da43e5152b375e79b9a8b", + "chainId": "eip155:1868", + "name": "pufETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/35176/large/pufETH-200-200-resolution.png?1707753174", + "symbol": "PUFETH", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0x9317841c2e9f6bcb44119c184152cfb1ef79034a": { + "assetId": "eip155:1868/erc20:0x9317841c2e9f6bcb44119c184152cfb1ef79034a", + "chainId": "eip155:1868", + "name": "Lootcoin", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/71197/large/lootcoin-logo.jpg?1766302463", + "symbol": "LOOT", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee": { + "assetId": "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee", + "chainId": "eip155:1868", + "name": "Bonsai Coin", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39273/large/1000007690.png?1721386111", + "symbol": "BONSAICOIN", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee" + }, + "eip155:1868/erc20:0xa8feaae65c44b458a16ea4e709036a2ee85d073a": { + "assetId": "eip155:1868/erc20:0xa8feaae65c44b458a16ea4e709036a2ee85d073a", + "chainId": "eip155:1868", + "name": "Mother of Memes", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/36245/large/HAHA_Logo.png?1710921482", + "symbol": "HAHA", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xaffeb8576b927050f5a3b6fba43f360d2883a118": { + "assetId": "eip155:1868/erc20:0xaffeb8576b927050f5a3b6fba43f360d2883a118", + "chainId": "eip155:1868", + "name": "Solv Protocol SolvBTC Jupiter", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54834/large/solvBTC_Jupiter.png?1741969449", + "symbol": "SOLVBTC.JUP", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:56/erc20:0x38a001e57430f781404fff7a81de4bd67d1f6117" + }, + "eip155:1868/erc20:0xb1b385542b6e80f77b94393ba8342c3af699f15c": { + "assetId": "eip155:1868/erc20:0xb1b385542b6e80f77b94393ba8342c3af699f15c", + "chainId": "eip155:1868", + "name": "Resolv USR", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/40008/large/USR_LOGO.png?1725222638", + "symbol": "USR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x2492d0006411af6c8bbb1c8afc1b0197350a79e9" + }, + "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369": { + "assetId": "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369", + "chainId": "eip155:1868", + "name": "Soneium Bridged USDC (Soneium)", + "precision": 6, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53776/large/usdc.jpg?1737340150", + "symbol": "USDC.E", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + }, + "eip155:1868/erc20:0xc67476893c166c537afd9bc6bc87b3f228b44337": { + "assetId": "eip155:1868/erc20:0xc67476893c166c537afd9bc6bc87b3f228b44337", + "chainId": "eip155:1868", + "name": "Neemo Staked Astar", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53907/large/nsASTR_2x.png?1737707599", + "symbol": "NSASTR", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c": { + "assetId": "eip155:1868/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c", + "chainId": "eip155:1868", + "name": "Solv Protocol Staked BTC", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/39384/large/xSolvBTC.png?1744170824", + "symbol": "XSOLVBTC", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:42161/erc20:0x346c574c56e1a4aaa8dc88cda8f7eb12b39947ab" + }, + "eip155:1868/erc20:0xd8bf9997f46dcda1be57018ec8e7728e8f7c139a": { + "assetId": "eip155:1868/erc20:0xd8bf9997f46dcda1be57018ec8e7728e8f7c139a", + "chainId": "eip155:1868", + "name": "Kyo", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/71031/large/Kyo.png?1765377840", + "symbol": "KYO", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xda14b3b7aef494b8c37ed9710d14e44d490316fa": { + "assetId": "eip155:1868/erc20:0xda14b3b7aef494b8c37ed9710d14e44d490316fa", + "chainId": "eip155:1868", + "name": "Yay Kelp DAO’s Airdrop Gain ETH", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/54281/large/yayagETH200w.png?1739438881", + "symbol": "YAYAGETH", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xf24e57b1cb00d98c31f04f86328e22e8fca457fb": { + "assetId": "eip155:1868/erc20:0xf24e57b1cb00d98c31f04f86328e22e8fca457fb", + "chainId": "eip155:1868", + "name": "SONE", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/53814/large/20250116-173015.png?1737432919", + "symbol": "SONE", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": null + }, + "eip155:1868/erc20:0xf765356c901a064a74fa4560622f21c91048c3d7": { + "assetId": "eip155:1868/erc20:0xf765356c901a064a74fa4560622f21c91048c3d7", + "chainId": "eip155:1868", + "name": "SuperVerse", + "precision": 18, + "color": "#FFFFFF", + "icon": "https://assets.coingecko.com/coins/images/14040/large/SV-Logo-200x200.png?1706880312", + "symbol": "SUPER", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:43114/erc20:0x09fa58228bb791ea355c90da1e4783452b9bd8c3" + }, + "eip155:1868/slip44:60": { + "assetId": "eip155:1868/slip44:60", + "chainId": "eip155:1868", + "name": "Ethereum", + "networkName": "Soneium", + "symbol": "ETH", + "precision": 18, + "color": "#627EEA", + "networkColor": "#1A1A2E", + "icon": "https://rawcdn.githack.com/trustwallet/assets/32e51d582a890b3dd3135fe3ee7c20c2fd699a6d/blockchains/ethereum/info/logo.png", + "networkIcon": "https://assets.relay.link/icons/1868/light.png", + "explorer": "https://soneium.blockscout.com", + "explorerAddressLink": "https://soneium.blockscout.com/address/", + "explorerTxLink": "https://soneium.blockscout.com/tx/", + "relatedAssetKey": "eip155:1/slip44:60" } }, "ids": [ @@ -463326,6 +463745,38 @@ "eip155:34443/erc20:0xe7903b1f75c534dd8159b313d92cdcfbc62cb3cd", "eip155:34443/erc20:0xf0f161fda2712db8b566946122a5af183995e2ed", "eip155:34443/erc20:0xf15578bcdb3ccba8585c563af9aae200c1413bca", - "eip155:34443/slip44:60" + "eip155:34443/slip44:60", + "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c", + "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", + "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", + "eip155:1868/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd", + "eip155:1868/erc20:0x2a52b289ba68bbd02676640aa9f605700c9e5699", + "eip155:1868/erc20:0x2cae934a1e84f693fbb78ca5ed3b0a6893259441", + "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec", + "eip155:1868/erc20:0x35533f54740f1f1aa4179e57ba37039dfa16868b", + "eip155:1868/erc20:0x3a337a6ada9d885b6ad95ec48f9b75f197b5ae35", + "eip155:1868/erc20:0x3b0dc2dac9498a024003609031d973b1171de09e", + "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "eip155:1868/erc20:0x3f99231dd03a9f0e7e3421c92b7b90fbe012985a", + "eip155:1868/erc20:0x4200000000000000000000000000000000000006", + "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", + "eip155:1868/erc20:0x54e86315c03217b76a7466c302245fd10ebef25a", + "eip155:1868/erc20:0x570f09ac53b96929e3868f71864e36ff6b1b67d7", + "eip155:1868/erc20:0x60336f9296c79da4294a19153ec87f8e52158e5f", + "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5", + "eip155:1868/erc20:0x6c460b2c6d6719562d5da43e5152b375e79b9a8b", + "eip155:1868/erc20:0x9317841c2e9f6bcb44119c184152cfb1ef79034a", + "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee", + "eip155:1868/erc20:0xa8feaae65c44b458a16ea4e709036a2ee85d073a", + "eip155:1868/erc20:0xaffeb8576b927050f5a3b6fba43f360d2883a118", + "eip155:1868/erc20:0xb1b385542b6e80f77b94393ba8342c3af699f15c", + "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369", + "eip155:1868/erc20:0xc67476893c166c537afd9bc6bc87b3f228b44337", + "eip155:1868/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c", + "eip155:1868/erc20:0xd8bf9997f46dcda1be57018ec8e7728e8f7c139a", + "eip155:1868/erc20:0xda14b3b7aef494b8c37ed9710d14e44d490316fa", + "eip155:1868/erc20:0xf24e57b1cb00d98c31f04f86328e22e8fca457fb", + "eip155:1868/erc20:0xf765356c901a064a74fa4560622f21c91048c3d7", + "eip155:1868/slip44:60" ] } \ No newline at end of file diff --git a/public/generated/generatedAssetData.json.br b/public/generated/generatedAssetData.json.br index c935b2a231e..e5f70ea7462 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 ec2f1f14c83..edd5a8b5845 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 fccb15646ff..d9fd111181c 100644 --- a/public/generated/relatedAssetIndex.json +++ b/public/generated/relatedAssetIndex.json @@ -850,7 +850,9 @@ "eip155:9745/erc20:0x2a52b289ba68bbd02676640aa9f605700c9e5699", "eip155:999/erc20:0x46c1c168ca597b9e5423aa7081a0dce782caeaab", "eip155:42161/erc20:0x66cfbd79257dc5217903a36293120282548e2254", - "eip155:100/erc20:0x1202f5c7b4b9e47a1a484e8b270be34dbbc75055" + "eip155:100/erc20:0x1202f5c7b4b9e47a1a484e8b270be34dbbc75055", + "eip155:80094/erc20:0xcc601605dc5011616934b6fdac8a14d51b791a94", + "eip155:1868/erc20:0x2a52b289ba68bbd02676640aa9f605700c9e5699" ], "eip155:56/erc20:0x8d0fa28f221eb5735bc71d3a0da67ee5bc821311": [ "eip155:1/erc20:0x136471a34f6ef19fe571effc1ca711fdb8e49f2b", @@ -881,7 +883,8 @@ ], "eip155:42161/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd": [ "eip155:1/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd", - "eip155:42161/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd" + "eip155:42161/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd", + "eip155:1868/erc20:0x139450c2dcef827c9a2a0bb1cb5506260940c9fd" ], "eip155:42161/erc20:0x894134a25a5fac1c2c26f1d8fbf05111a3cb9487": [ "eip155:1/erc20:0x15f74458ae0bfdaa1a96ca1aa779d715cc1eefe4", @@ -1425,7 +1428,8 @@ "eip155:130/erc20:0x927b51f251480a681271180da4de28d44ec4afb8", "eip155:130/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c", "eip155:60808/erc20:0x03c7054bcb39f7b2e5b2c7acb37583e32d70cfa3", - "eip155:34443/erc20:0xcdd475325d6f564d27247d1dddbb0dac6fa0a5cf" + "eip155:34443/erc20:0xcdd475325d6f564d27247d1dddbb0dac6fa0a5cf", + "eip155:1868/erc20:0x0555e30da8f98308edb960aa94c0db47230d2b9c" ], "eip155:8453/erc20:0xc5fed7c8ccc75d8a72b601a66dffd7a489073f0b": [ "eip155:56/erc20:0x6ef2ffb38d64afe18ce782da280b300e358cfeaf", @@ -2782,7 +2786,8 @@ "eip155:9745/erc20:0x35533f54740f1f1aa4179e57ba37039dfa16868b", "eip155:999/erc20:0x0a3d8466f5de586fa5f6de117301e2f90bcc5c48", "eip155:42161/erc20:0x35e5db674d8e93a03d814fa0ada70731efe8a4b9", - "eip155:80094/erc20:0x35e5db674d8e93a03d814fa0ada70731efe8a4b9" + "eip155:80094/erc20:0x35e5db674d8e93a03d814fa0ada70731efe8a4b9", + "eip155:1868/erc20:0x35533f54740f1f1aa4179e57ba37039dfa16868b" ], "eip155:56/erc20:0x629520dee1620def11596f84e85de9f1ff653012": [ "eip155:1/erc20:0x4ad2118da8a65eaa81402a3d583fef6ee76bdf3f", @@ -3048,11 +3053,6 @@ "eip155:10/erc20:0x4e107a0000db66f0e9fd2039288bf811dd1f9c74", "eip155:8453/erc20:0x4e107a0000db66f0e9fd2039288bf811dd1f9c74" ], - "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe": [ - "eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870", - "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe", - "eip155:146/slip44:60" - ], "eip155:42161/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3": [ "eip155:8453/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3", "eip155:1/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3", @@ -3138,7 +3138,8 @@ "eip155:25/erc20:0x8c80a01f461f297df7f9da3a4f740d7297c8ac85", "eip155:146/erc20:0x71052bae71c25c78e37fd12e5ff1101a71d9018f", "eip155:130/erc20:0xef66491eab4bbb582c57b14778afd8dfb70d8a1a", - "eip155:34443/erc20:0x183e3691eff3524b2315d3703d94f922cbe51f54" + "eip155:34443/erc20:0x183e3691eff3524b2315d3703d94f922cbe51f54", + "eip155:1868/erc20:0x32d8f819c8080ae44375f8d383ffd39fc642f3ec" ], "eip155:42161/erc20:0x315a2dca4b1b633d3a707c71d96243534c02f7c4": [ "eip155:8453/erc20:0x78bb8ff6baa486c31ce0ef1a157798f7a606565c", @@ -3851,7 +3852,8 @@ "eip155:1/erc20:0x66a1e37c9b0eaddca17d3662d6c05f4decf3e110", "eip155:999/erc20:0x0ad339d66bf4aed5ce31c64bc37b3244b6394a77", "eip155:42161/erc20:0x2492d0006411af6c8bbb1c8afc1b0197350a79e9", - "eip155:80094/erc20:0x2492d0006411af6c8bbb1c8afc1b0197350a79e9" + "eip155:80094/erc20:0x2492d0006411af6c8bbb1c8afc1b0197350a79e9", + "eip155:1868/erc20:0xb1b385542b6e80f77b94393ba8342c3af699f15c" ], "eip155:42161/erc20:0x51fc0f6660482ea73330e414efd7808811a57fa2": [ "eip155:1/erc20:0x6399c842dd2be3de30bf99bc7d1bbf6fa3650e70", @@ -4770,7 +4772,8 @@ "eip155:5000/erc20:0xa68d25fc2af7278db4bcdcaabce31814252642a9", "eip155:146/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", "eip155:60808/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", - "eip155:34443/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77" + "eip155:34443/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77", + "eip155:1868/erc20:0x541fd749419ca806a8bc7da8ac23d346f2df8b77" ], "eip155:42161/erc20:0x7bbcf1b600565ae023a1806ef637af4739de3255": [ "eip155:8453/erc20:0x7bbcf1b600565ae023a1806ef637af4739de3255", @@ -6132,7 +6135,8 @@ "eip155:146/erc20:0x29219dd400f2bf60e5a23d13be72b486d4038894", "eip155:130/erc20:0x078d782b760474a361dda0af3839290b0ef57ad6", "eip155:60808/erc20:0xe75d0fb2c24a55ca1e3f96781a2bcc7bdba058f0", - "eip155:34443/erc20:0xd988097fb8612cc24eec14542bc03424c656005f" + "eip155:34443/erc20:0xd988097fb8612cc24eec14542bc03424c656005f", + "eip155:1868/erc20:0xba9986d2381edf1da03b0b9c1f8b00dc4aacc369" ], "eip155:8453/erc20:0x9c632e6aaa3ea73f91554f8a3cb2ed2f29605e0c": [ "eip155:56/erc20:0x7324c7c0d95cebc73eea7e85cbaac0dbdf88a05b", @@ -7383,7 +7387,8 @@ "eip155:146/erc20:0x50c42deacd8fc9773493ed674b675be577f2634b", "eip155:130/erc20:0x4200000000000000000000000000000000000006", "eip155:60808/erc20:0x4200000000000000000000000000000000000006", - "eip155:34443/erc20:0x4200000000000000000000000000000000000006" + "eip155:34443/erc20:0x4200000000000000000000000000000000000006", + "eip155:1868/erc20:0x4200000000000000000000000000000000000006" ], "eip155:42161/erc20:0xea986d33ef8a20a96120ecc44dbdd49830192043": [ "eip155:56/erc20:0x3028b4395f98777123c7da327010c40f3c7cc4ef", @@ -8398,7 +8403,8 @@ "eip155:59144/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c", "eip155:5000/erc20:0x1d40bafc49c37cda49f2a5427e2fb95e1e3fcf20", "eip155:146/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c", - "eip155:60808/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c" + "eip155:60808/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c", + "eip155:1868/erc20:0xcc0966d8418d412c599a6421b760a847eb169a8c" ], "eip155:42161/erc20:0x462cd9e0247b2e63831c3189ae738e5e9a5a4b64": [ "eip155:43114/erc20:0x9ceed3a7f753608372eeab300486cc7c2f38ac68", @@ -8455,7 +8461,10 @@ "eip155:60808/erc20:0x05d032ac25d322df992303dca074ee7392c117b9", "eip155:34443/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282", "eip155:34443/erc20:0xf0f161fda2712db8b566946122a5af183995e2ed", - "eip155:34443/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189" + "eip155:34443/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", + "eip155:1868/erc20:0x3a337a6ada9d885b6ad95ec48f9b75f197b5ae35", + "eip155:1868/erc20:0x1217bfe6c773eec6cc4a38b5dc45b92292b6e189", + "eip155:1868/erc20:0x102d758f688a4c1c5a80b116bd945d4455460282" ], "eip155:1/erc20:0xdb9783ca04bbd64fe2c6d7b9503a979b3de30729": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:XsAsZLF4MmsvS1sDxRMrUz7REjHfwbC9UAMXSRBqgEB", @@ -8814,7 +8823,8 @@ "eip155:8453/erc20:0x391359ab0ccef572dcac78f74e47d7c06db0b982", "eip155:1/erc20:0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55", "eip155:137/erc20:0xa1428174f516f527fafdd146b883bb4428682737", - "eip155:43114/erc20:0x09fa58228bb791ea355c90da1e4783452b9bd8c3" + "eip155:43114/erc20:0x09fa58228bb791ea355c90da1e4783452b9bd8c3", + "eip155:1868/erc20:0xf765356c901a064a74fa4560622f21c91048c3d7" ], "eip155:56/erc20:0x393d87e44c7b1f5ba521b351532c24ece253b849": [ "eip155:1/erc20:0xe796d6ca1ceb1b022ece5296226bf784110031cd", @@ -9656,7 +9666,8 @@ "eip155:59144/slip44:60", "eip155:130/slip44:60", "eip155:60808/slip44:60", - "eip155:34443/slip44:60" + "eip155:34443/slip44:60", + "eip155:1868/slip44:60" ], "eip155:8453/erc20:0x22a2488fe295047ba13bd8cccdbc8361dbd8cf7c": [ "eip155:10/erc20:0x1db2466d9f5e10d7090e7152b68d62703a2245f0", @@ -10578,7 +10589,8 @@ ], "eip155:56/erc20:0x38a001e57430f781404fff7a81de4bd67d1f6117": [ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:SoLvzL3ZVjofmNB5LYFrf94QtNhMUSea4DawFhnAau8", - "eip155:56/erc20:0x38a001e57430f781404fff7a81de4bd67d1f6117" + "eip155:56/erc20:0x38a001e57430f781404fff7a81de4bd67d1f6117", + "eip155:1868/erc20:0xaffeb8576b927050f5a3b6fba43f360d2883a118" ], "eip155:8453/erc20:0x8c1851488f2daceae46d815dd204d5f6d946666a": [ "eip155:56/erc20:0x3e45b22622b19c1eced632d8fe1ed708f9d471c3", @@ -10743,7 +10755,8 @@ ], "eip155:56/erc20:0x7ca058309053f90b39bfc58de1eda2a89e9c03a8": [ "eip155:1/erc20:0x570f09ac53b96929e3868f71864e36ff6b1b67d7", - "eip155:56/erc20:0x7ca058309053f90b39bfc58de1eda2a89e9c03a8" + "eip155:56/erc20:0x7ca058309053f90b39bfc58de1eda2a89e9c03a8", + "eip155:1868/erc20:0x570f09ac53b96929e3868f71864e36ff6b1b67d7" ], "eip155:8453/erc20:0x4b556f3a476b58be7f35df77edd68fbe5076f706": [ "eip155:56/erc20:0x7c3b00cb3b40cc77d88329a58574e29cfa3cb9e2", @@ -11159,7 +11172,8 @@ "eip155:5000/erc20:0xc53ac24320e3a54c7211e4993c8095078a0cb3cf", "eip155:146/erc20:0xc53ac24320e3a54c7211e4993c8095078a0cb3cf", "eip155:130/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", - "eip155:34443/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" + "eip155:34443/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368", + "eip155:1868/erc20:0x3d63825b0d8669307366e6c8202f656b9e91d368" ], "eip155:8453/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17": [ "eip155:137/erc20:0x38029c62dfa30d9fd3cadf4c64e9b2ab21dbda17", @@ -12484,10 +12498,6 @@ "eip155:5000/erc20:0x74ccbe53f77b08632ce0cb91d3a545bf6b8e0979", "eip155:59144/erc20:0x8cf881799e3b5ab24271a9b66b6ca2b0e575b1ef" ], - "eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b": [ - "eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b", - "eip155:25/slip44:60" - ], "eip155:146/erc20:0x41a5477364bf60d8936b90310fecfda79593304e": [ "eip155:1/erc20:0x7cb20517776636ed76b68edb3d99dcce356abf02", "eip155:146/erc20:0x41a5477364bf60d8936b90310fecfda79593304e" @@ -12532,5 +12542,20 @@ "sui:35834a8a/coin:0xd1a91b46bd6d966b62686263609074ad16cfdffc63c31a4775870a2d54d20c6b::mbtc::MBTC": [ "eip155:59144/erc20:0xe4d584ae9b753e549cae66200a6475d2f00705f7", "eip155:34443/erc20:0x59889b7021243db5b1e065385f918316cd90d46c" + ], + "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5": [ + "eip155:56/erc20:0x2a3dc2d5daf9c8c46c954b8669f4643c6b1c081a", + "eip155:1868/erc20:0x61f2993a644762a345b483adf0d6351c5edfb3b5" + ], + "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee": [ + "eip155:8453/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee", + "eip155:1868/erc20:0xa0aebd4ae5f256b72b7d43f67ed934237adb1aee" + ], + "eip155:146/slip44:60": [ + "eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870", + "eip155:56/erc20:0xad29abb318791d579433d831ed122afeaf29dcfe" + ], + "eip155:25/slip44:60": [ + "eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b" ] } \ No newline at end of file diff --git a/public/generated/relatedAssetIndex.json.br b/public/generated/relatedAssetIndex.json.br index d23be9c8e19..9ad5116679a 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 b14e12cb9e5..6b70f5a4fb5 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 5b08dbb27ba..61b1a0b554a 100644 --- a/scripts/generateAssetData/coingecko.ts +++ b/scripts/generateAssetData/coingecko.ts @@ -25,6 +25,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -58,6 +59,7 @@ import { polygon, scroll, solana, + soneium, sonic, sui, ton, @@ -273,6 +275,14 @@ export async function getAssets(chainId: ChainId): Promise { explorerAddressLink: modeChain.explorerAddressLink, explorerTxLink: modeChain.explorerTxLink, } + case soneiumChainId: + return { + assetNamespace: ASSET_NAMESPACE.erc20, + category: adapters.chainIdToCoingeckoAssetPlatform(chainId), + explorer: soneium.explorer, + explorerAddressLink: soneium.explorerAddressLink, + explorerTxLink: soneium.explorerTxLink, + } case solanaChainId: return { assetNamespace: ASSET_NAMESPACE.splToken, diff --git a/scripts/generateAssetData/generateAssetData.ts b/scripts/generateAssetData/generateAssetData.ts index 65dddb246a7..ef4b2358817 100644 --- a/scripts/generateAssetData/generateAssetData.ts +++ b/scripts/generateAssetData/generateAssetData.ts @@ -50,6 +50,7 @@ import * as plasma from './plasma' import * as polygon from './polygon' import * as scroll from './scroll' import * as solana from './solana' +import * as soneium from './soneium' import * as sonic from './sonic' import * as starknet from './starknet' import * as sui from './sui' @@ -93,6 +94,7 @@ const generateAssetData = async () => { const modeAssets = await mode.getAssets() const plasmaAssets = await plasma.getAssets() const sonicAssets = await sonic.getAssets() + const soneiumAssets = await soneium.getAssets() const solanaAssets = await solana.getAssets() const starknetAssets = await starknet.getAssets() const tronAssets = await tronModule.getAssets() @@ -136,6 +138,7 @@ const generateAssetData = async () => { ...modeAssets, ...plasmaAssets, ...sonicAssets, + ...soneiumAssets, ...solanaAssets, ...starknetAssets, ...tronAssets, diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts index 43916cd57bc..a06dbbd9deb 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateChainRelatedAssetIndex.ts @@ -4,6 +4,7 @@ import { arbitrumAssetId, baseAssetId, bobAssetId, + cronosAssetId, ethAssetId, FEE_ASSET_IDS, foxAssetId, @@ -16,6 +17,7 @@ import { modeAssetId, optimismAssetId, scrollAssetId, + soneiumAssetId, sonicAssetId, starknetAssetId, unichainAssetId, @@ -67,6 +69,7 @@ const manualRelatedAssetIndex: Record = { unichainAssetId, bobAssetId, modeAssetId, + soneiumAssetId, ], [foxAssetId]: [foxOnArbitrumOneAssetId], [starknetAssetId]: [ @@ -87,10 +90,9 @@ const manualRelatedAssetIndex: Record = { 'eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f': [ 'eip155:59144/erc20:0x4af15ec2a0bd43db75dd04e62faa3b8ef36b00d5', ], - // CRO on Ethereum <-> CRO native on Cronos - 'eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b': ['eip155:25/slip44:60'], - // FTM on Ethereum <-> S native on Sonic - 'eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870': [sonicAssetId], + // Native chain tokens as keys (isPrimary=true) with their Ethereum ERC20 counterparts as values + [sonicAssetId]: ['eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870'], + [cronosAssetId]: ['eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b'], } const getManualRelatedAssetIds = ( diff --git a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts index 0316133c6a0..d1dba82d1bc 100644 --- a/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts +++ b/scripts/generateAssetData/generateRelatedAssetIndex/generateRelatedAssetIndex.ts @@ -4,6 +4,7 @@ import { arbitrumAssetId, baseAssetId, bobAssetId, + cronosAssetId, ethAssetId, FEE_ASSET_IDS, foxAssetId, @@ -16,6 +17,7 @@ import { modeAssetId, optimismAssetId, scrollAssetId, + soneiumAssetId, sonicAssetId, starknetAssetId, unichainAssetId, @@ -66,13 +68,15 @@ const manualRelatedAssetIndex: Record = { unichainAssetId, bobAssetId, modeAssetId, + soneiumAssetId, ], [foxAssetId]: [foxOnArbitrumOneAssetId], [starknetAssetId]: [ 'eip155:1/erc20:0xca14007eff0db1f8135f4c25b34de49ab0d42766', 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp/token:HsRpHQn6VbyMs5b5j5SV6xQ2VvpvvCCzu19GjytVSCoz', ], - 'eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870': [sonicAssetId], + [sonicAssetId]: ['eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870'], + [cronosAssetId]: ['eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b'], 'eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48': [ 'eip155:146/erc20:0x29219dd400f2bf60e5a23d13be72b486d4038894', ], diff --git a/scripts/generateAssetData/soneium/index.ts b/scripts/generateAssetData/soneium/index.ts new file mode 100644 index 00000000000..e5f8a569c4b --- /dev/null +++ b/scripts/generateAssetData/soneium/index.ts @@ -0,0 +1,11 @@ +import { soneiumChainId } from '@shapeshiftoss/caip' +import type { Asset } from '@shapeshiftoss/types' +import { soneium, unfreeze } from '@shapeshiftoss/utils' + +import * as coingecko from '../coingecko' + +export const getAssets = async (): Promise => { + const assets = await coingecko.getAssets(soneiumChainId) + + return [...assets, unfreeze(soneium)] +} diff --git a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx index 45c8143b53e..42af18743de 100644 --- a/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx +++ b/src/components/TradeAssetSearch/hooks/useGetPopularAssetsQuery.tsx @@ -15,6 +15,7 @@ import { nearAssetId, plasmaAssetId, scrollAssetId, + soneiumAssetId, sonicAssetId, starknetAssetId, suiAssetId, @@ -63,6 +64,7 @@ export const queryFn = async () => { if (enabledFlags.Unichain) assetIds.push(unichainAssetId) if (enabledFlags.Bob) assetIds.push(bobAssetId) if (enabledFlags.Mode) assetIds.push(modeAssetId) + if (enabledFlags.Soneium) assetIds.push(soneiumAssetId) if (enabledFlags.Starknet) assetIds.push(starknetAssetId) if (enabledFlags.Tron) assetIds.push(tronAssetId) if (enabledFlags.Berachain) assetIds.push(berachainAssetId) diff --git a/src/config.ts b/src/config.ts index f39d2eb067c..e1b79bc66f9 100644 --- a/src/config.ts +++ b/src/config.ts @@ -74,6 +74,7 @@ const validators = { VITE_UNICHAIN_NODE_URL: url(), VITE_BOB_NODE_URL: url(), VITE_MODE_NODE_URL: url(), + VITE_SONEIUM_NODE_URL: url(), VITE_SOLANA_NODE_URL: url(), VITE_STARKNET_NODE_URL: url(), VITE_TRON_NODE_URL: url(), @@ -126,6 +127,7 @@ const validators = { VITE_FEATURE_UNICHAIN: bool({ default: false }), VITE_FEATURE_BOB: bool({ default: false }), VITE_FEATURE_MODE: bool({ default: false }), + VITE_FEATURE_SONEIUM: bool({ default: false }), VITE_FEATURE_MAYACHAIN: bool({ default: false }), VITE_FEATURE_ZCASH: bool({ default: false }), VITE_FEATURE_ZRX_SWAP: bool({ default: false }), diff --git a/src/constants/chains.ts b/src/constants/chains.ts index 698766d45dc..47fb62556f7 100644 --- a/src/constants/chains.ts +++ b/src/constants/chains.ts @@ -24,6 +24,7 @@ export const SECOND_CLASS_CHAINS: readonly KnownChainIds[] = [ KnownChainIds.BerachainMainnet, KnownChainIds.ScrollMainnet, KnownChainIds.CronosMainnet, + KnownChainIds.SoneiumMainnet, KnownChainIds.NearMainnet, KnownChainIds.StarknetMainnet, ] @@ -54,6 +55,7 @@ export const knownChainIds = Object.values(KnownChainIds).filter(chainId => { if (chainId === KnownChainIds.BerachainMainnet && !enabledFlags.Berachain) return false if (chainId === KnownChainIds.ScrollMainnet && !enabledFlags.Scroll) return false if (chainId === KnownChainIds.CronosMainnet && !enabledFlags.Cronos) return false + if (chainId === KnownChainIds.SoneiumMainnet && !enabledFlags.Soneium) return false if (chainId === KnownChainIds.NearMainnet && !enabledFlags.Near) return false if (chainId === KnownChainIds.StarknetMainnet && !enabledFlags.Starknet) return false if (chainId === KnownChainIds.TonMainnet && !enabledFlags.Ton) return false diff --git a/src/context/PluginProvider/PluginProvider.tsx b/src/context/PluginProvider/PluginProvider.tsx index 3e081e93971..4543f12ed50 100644 --- a/src/context/PluginProvider/PluginProvider.tsx +++ b/src/context/PluginProvider/PluginProvider.tsx @@ -131,6 +131,7 @@ export const PluginProvider = ({ children }: PluginProviderProps): JSX.Element = if (!featureFlags.Linea && chainId === KnownChainIds.LineaMainnet) return false if (!featureFlags.Scroll && chainId === KnownChainIds.ScrollMainnet) return false if (!featureFlags.Berachain && chainId === KnownChainIds.BerachainMainnet) return false + if (!featureFlags.Soneium && chainId === KnownChainIds.SoneiumMainnet) return false if (!featureFlags.BnbSmartChain && chainId === KnownChainIds.BnbSmartChainMainnet) return false if (!featureFlags.Tron && chainId === KnownChainIds.TronMainnet) return false diff --git a/src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx b/src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx index 8c62097db8c..635a44d364a 100644 --- a/src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx +++ b/src/hooks/useActionCenterSubscribers/useSendActionSubscriber.tsx @@ -183,25 +183,6 @@ export const useSendActionSubscriber = () => { suiTxStatus === TxStatus.Confirmed || suiTxStatus === TxStatus.Failed break } - case KnownChainIds.MonadMainnet: - case KnownChainIds.PlasmaMainnet: - case KnownChainIds.HyperEvmMainnet: - case KnownChainIds.MantleMainnet: - case KnownChainIds.CronosMainnet: - case KnownChainIds.MegaEthMainnet: - case KnownChainIds.BerachainMainnet: - case KnownChainIds.InkMainnet: - case KnownChainIds.KatanaMainnet: - case KnownChainIds.LineaMainnet: - case KnownChainIds.SonicMainnet: - case KnownChainIds.UnichainMainnet: - case KnownChainIds.BobMainnet: - case KnownChainIds.ModeMainnet: { - const txStatus = await getSecondClassEvmTxStatus(chainId, txHash) - if (!txStatus) return - isConfirmed = txStatus === TxStatus.Confirmed || txStatus === TxStatus.Failed - break - } case KnownChainIds.NearMainnet: { const nearTxStatus = await getNearTransactionStatus(txHash) isConfirmed = @@ -278,9 +259,16 @@ export const useSendActionSubscriber = () => { } break } - default: + default: { + // All second-class EVM chains are handled generically via adapter.getTransactionStatus() + const txStatus = await getSecondClassEvmTxStatus(chainId, txHash) + if (txStatus) { + isConfirmed = txStatus === TxStatus.Confirmed || txStatus === TxStatus.Failed + break + } console.error(`Unsupported second-class chain: ${chainId}`) return + } } if (isConfirmed) { diff --git a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts index a752afe9e1b..999048b9f65 100644 --- a/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts +++ b/src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts @@ -29,6 +29,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -70,6 +71,7 @@ import { supportsPolygon, supportsScroll, supportsSolana, + supportsSoneium, supportsSonic, supportsStarknet, supportsSui, @@ -176,6 +178,7 @@ export const walletSupportsChain = ({ const isCronosEnabled = selectFeatureFlag(store.getState(), 'Cronos') const isSonicEnabled = selectFeatureFlag(store.getState(), 'Sonic') const isUnichainEnabled = selectFeatureFlag(store.getState(), 'Unichain') + const isSoneiumEnabled = selectFeatureFlag(store.getState(), 'Soneium') const isMegaEthEnabled = selectFeatureFlag(store.getState(), 'MegaEth') const isBerachainEnabled = selectFeatureFlag(store.getState(), 'Berachain') const isModeEnabled = selectFeatureFlag(store.getState(), 'Mode') @@ -246,6 +249,8 @@ export const walletSupportsChain = ({ return isBobEnabled && supportsBob(wallet) case modeChainId: return isModeEnabled && supportsMode(wallet) + case soneiumChainId: + return isSoneiumEnabled && supportsSoneium(wallet) case cosmosChainId: return supportsCosmos(wallet) case thorchainChainId: diff --git a/src/lib/account/evm.ts b/src/lib/account/evm.ts index cbd7f470bf4..c46e9856e70 100644 --- a/src/lib/account/evm.ts +++ b/src/lib/account/evm.ts @@ -22,6 +22,7 @@ import { plasmaChainId, polygonChainId, scrollChainId, + soneiumChainId, sonicChainId, toAccountId, unichainChainId, @@ -50,6 +51,7 @@ import { supportsPlasma, supportsPolygon, supportsScroll, + supportsSoneium, supportsSonic, supportsUnichain, } from '@shapeshiftoss/hdwallet-core/wallet' @@ -157,6 +159,7 @@ export const deriveEvmAccountIdsAndMetadata: DeriveAccountIdsAndMetadata = async if (chainId === unichainChainId && !supportsUnichain(wallet)) continue if (chainId === bobChainId && !supportsBob(wallet)) continue if (chainId === modeChainId && !supportsMode(wallet)) continue + if (chainId === soneiumChainId && !supportsSoneium(wallet)) continue if ( isMetaMask(wallet) && !canAddMetaMaskAccount({ accountNumber, chainId, wallet, isSnapInstalled }) diff --git a/src/lib/asset-service/service/AssetService.ts b/src/lib/asset-service/service/AssetService.ts index 91caea6bbd0..ad0b674e8d7 100644 --- a/src/lib/asset-service/service/AssetService.ts +++ b/src/lib/asset-service/service/AssetService.ts @@ -22,6 +22,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -143,6 +144,7 @@ class _AssetService { if (!config.VITE_FEATURE_BERACHAIN && asset.chainId === berachainChainId) return false if (!config.VITE_FEATURE_SCROLL && asset.chainId === scrollChainId) return false if (!config.VITE_FEATURE_CRONOS && asset.chainId === cronosChainId) return false + if (!config.VITE_FEATURE_SONEIUM && asset.chainId === soneiumChainId) return false if (!config.VITE_FEATURE_MAYACHAIN && asset.chainId === mayachainChainId) return false if (!config.VITE_FEATURE_NEAR && asset.chainId === nearChainId) return false if (!config.VITE_FEATURE_ZCASH && asset.chainId === zecChainId) return false diff --git a/src/lib/coingecko/utils.ts b/src/lib/coingecko/utils.ts index 6fea04c1560..ef801209db0 100644 --- a/src/lib/coingecko/utils.ts +++ b/src/lib/coingecko/utils.ts @@ -23,6 +23,7 @@ import { optimismChainId, polygonChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -231,6 +232,7 @@ export const getCoingeckoSupportedChainIds = () => { ...(getConfig().VITE_FEATURE_UNICHAIN ? [unichainChainId] : []), ...(getConfig().VITE_FEATURE_BOB ? [bobChainId] : []), ...(getConfig().VITE_FEATURE_MODE ? [modeChainId] : []), + ...(getConfig().VITE_FEATURE_SONEIUM ? [soneiumChainId] : []), ...(getConfig().VITE_FEATURE_TON ? [tonChainId] : []), ] } diff --git a/src/lib/market-service/coingecko/coingecko.test.ts b/src/lib/market-service/coingecko/coingecko.test.ts index a0c9972a353..4b75f18fc7b 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(12) + expect(Object.keys(result).length).toEqual(13) }) 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(11) + expect(Object.keys(result).length).toEqual(12) }) it('can use default args', async () => { @@ -234,6 +234,7 @@ describe('CoinGecko market service', () => { ethOnInkKey, ethOnScrollKey, ethOnUnichainKey, + ethOnSoneiumKey, ] = Object.keys(result) expect(btcAssetId).toEqual([btcKey]) expect(ethAssetId).toEqual([ @@ -248,6 +249,7 @@ describe('CoinGecko market service', () => { ethOnInkKey, ethOnScrollKey, ethOnUnichainKey, + ethOnSoneiumKey, ]) }) diff --git a/src/lib/utils/soneium.ts b/src/lib/utils/soneium.ts new file mode 100644 index 00000000000..784fc83019c --- /dev/null +++ b/src/lib/utils/soneium.ts @@ -0,0 +1,43 @@ +import { soneiumChainId } from '@shapeshiftoss/caip' +import type { EvmChainAdapter } from '@shapeshiftoss/chain-adapters' +import { TxStatus } from '@shapeshiftoss/unchained-client' +import { JsonRpcProvider } from 'ethers' + +export const isSoneiumChainAdapter = (adapter: unknown): adapter is EvmChainAdapter => { + if (!adapter) return false + + const maybeAdapter = adapter as EvmChainAdapter + if (typeof maybeAdapter.getChainId !== 'function') return false + + return maybeAdapter.getChainId() === soneiumChainId +} + +export const getSoneiumTransactionStatus = 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('[Soneium] 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 6f0bbd6414d..2402e03b0d2 100644 --- a/src/pages/Markets/components/MarketsRow.tsx +++ b/src/pages/Markets/components/MarketsRow.tsx @@ -94,6 +94,7 @@ export const MarketsRow: React.FC = ({ const isUnichainEnabled = useAppSelector(state => selectFeatureFlag(state, 'Unichain')) const isBobEnabled = useAppSelector(state => selectFeatureFlag(state, 'Bob')) const isModeEnabled = useAppSelector(state => selectFeatureFlag(state, 'Mode')) + const isSoneiumEnabled = useAppSelector(state => selectFeatureFlag(state, 'Soneium')) const [isSmallerThanLg] = useMediaQuery(`(max-width: ${breakpoints.lg})`) const chainIds = useMemo(() => { @@ -115,6 +116,7 @@ export const MarketsRow: React.FC = ({ if (!isUnichainEnabled && chainId === KnownChainIds.UnichainMainnet) return false if (!isBobEnabled && chainId === KnownChainIds.BobMainnet) return false if (!isModeEnabled && chainId === KnownChainIds.ModeMainnet) return false + if (!isSoneiumEnabled && chainId === KnownChainIds.SoneiumMainnet) return false return true }) }, [ @@ -134,6 +136,7 @@ export const MarketsRow: React.FC = ({ isUnichainEnabled, isBobEnabled, isModeEnabled, + isSoneiumEnabled, ]) const Title = useMemo(() => { diff --git a/src/plugins/activePlugins.ts b/src/plugins/activePlugins.ts index 427bcadd3a1..83a8ad986eb 100644 --- a/src/plugins/activePlugins.ts +++ b/src/plugins/activePlugins.ts @@ -28,6 +28,7 @@ import plasma from '@/plugins/plasma' import polygon from '@/plugins/polygon' import scroll from '@/plugins/scroll' import solana from '@/plugins/solana' +import soneium from '@/plugins/soneium' import sonic from '@/plugins/sonic' import starknet from '@/plugins/starknet' import sui from '@/plugins/sui' @@ -69,6 +70,7 @@ export const activePlugins = [ plasma, polygon, scroll, + soneium, solana, sonic, starknet, diff --git a/src/plugins/soneium/index.tsx b/src/plugins/soneium/index.tsx new file mode 100644 index 00000000000..7ae1e7d0f50 --- /dev/null +++ b/src/plugins/soneium/index.tsx @@ -0,0 +1,49 @@ +import { fromAssetId, soneiumChainId } from '@shapeshiftoss/caip' +import { soneium } 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 [ + [ + 'soneiumChainAdapter', + { + name: 'soneiumChainAdapter', + featureFlag: ['Soneium'], + providers: { + chainAdapters: [ + [ + KnownChainIds.SoneiumMainnet, + () => { + const getKnownTokens = () => { + const assetService = getAssetService() + return assetService.assets + .filter(asset => { + const { chainId, assetNamespace } = fromAssetId(asset.assetId) + return chainId === soneiumChainId && assetNamespace === 'erc20' + }) + .map(asset => ({ + assetId: asset.assetId, + contractAddress: fromAssetId(asset.assetId).assetReference, + symbol: asset.symbol, + name: asset.name, + precision: asset.precision, + })) + } + + return new soneium.ChainAdapter({ + rpcUrl: getConfig().VITE_SONEIUM_NODE_URL, + getKnownTokens, + }) + }, + ], + ], + }, + }, + ], + ] +} diff --git a/src/state/migrations/index.ts b/src/state/migrations/index.ts index 4609edf0e90..d70e81aa005 100644 --- a/src/state/migrations/index.ts +++ b/src/state/migrations/index.ts @@ -346,6 +346,7 @@ export const clearAssetsMigrations = { 297: clearAssets, 298: clearAssets, 299: clearAssets, + 300: 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 61b6c342b23..eb1cb95a677 100644 --- a/src/state/slices/opportunitiesSlice/mappings.ts +++ b/src/state/slices/opportunitiesSlice/mappings.ts @@ -202,6 +202,7 @@ export const CHAIN_ID_TO_SUPPORTED_DEFI_OPPORTUNITIES: Record< [KnownChainIds.UnichainMainnet]: [], [KnownChainIds.BobMainnet]: [], [KnownChainIds.ModeMainnet]: [], + [KnownChainIds.SoneiumMainnet]: [], [KnownChainIds.ZcashMainnet]: [], [KnownChainIds.NearMainnet]: [], [KnownChainIds.TonMainnet]: [], diff --git a/src/state/slices/portfolioSlice/utils/index.ts b/src/state/slices/portfolioSlice/utils/index.ts index a79d489acaf..ef5dc6ef8b3 100644 --- a/src/state/slices/portfolioSlice/utils/index.ts +++ b/src/state/slices/portfolioSlice/utils/index.ts @@ -35,6 +35,7 @@ import { polygonChainId, scrollChainId, solanaChainId, + soneiumChainId, sonicChainId, starknetChainId, suiChainId, @@ -77,6 +78,7 @@ import { supportsPolygon, supportsScroll, supportsSolana, + supportsSoneium, supportsSonic, supportsStarknet, supportsSui, @@ -133,6 +135,7 @@ export const accountIdToLabel = (accountId: AccountId): string => { case unichainChainId: case bobChainId: case modeChainId: + case soneiumChainId: case monadChainId: case plasmaChainId: case thorchainChainId: @@ -562,6 +565,8 @@ export const isAssetSupportedByWallet = (assetId: AssetId, wallet: HDWallet): bo return supportsBob(wallet) case modeChainId: return supportsMode(wallet) + case soneiumChainId: + return supportsSoneium(wallet) case tronChainId: return supportsTron(wallet) case nearChainId: diff --git a/src/state/slices/preferencesSlice/preferencesSlice.ts b/src/state/slices/preferencesSlice/preferencesSlice.ts index 4fa06fe4a72..6ce4ff922ea 100644 --- a/src/state/slices/preferencesSlice/preferencesSlice.ts +++ b/src/state/slices/preferencesSlice/preferencesSlice.ts @@ -48,6 +48,7 @@ export type FeatureFlags = { Unichain: boolean Bob: boolean Mode: boolean + Soneium: boolean Zcash: boolean ThorSwap: boolean WalletConnectToDapps: boolean @@ -207,6 +208,7 @@ const initialState: Preferences = { Unichain: getConfig().VITE_FEATURE_UNICHAIN, Bob: getConfig().VITE_FEATURE_BOB, Mode: getConfig().VITE_FEATURE_MODE, + Soneium: getConfig().VITE_FEATURE_SONEIUM, Zcash: getConfig().VITE_FEATURE_ZCASH, ThorSwap: getConfig().VITE_FEATURE_THOR_SWAP, WalletConnectToDappsV2: getConfig().VITE_FEATURE_WALLET_CONNECT_TO_DAPPS_V2, diff --git a/src/test/mocks/store.ts b/src/test/mocks/store.ts index 2fe2e21c50b..023c54b6a77 100644 --- a/src/test/mocks/store.ts +++ b/src/test/mocks/store.ts @@ -121,6 +121,7 @@ export const mockStore: ReduxState = { Unichain: false, Bob: false, Mode: false, + Soneium: false, Zcash: false, ZrxSwap: false, ThorSwap: false, diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 8abe1a51773..b7183ff1cf8 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -198,6 +198,8 @@ interface ImportMetaEnv { readonly VITE_FEATURE_BOB: string readonly VITE_MODE_NODE_URL: string readonly VITE_FEATURE_MODE: string + readonly VITE_SONEIUM_NODE_URL: string + readonly VITE_FEATURE_SONEIUM: string readonly VITE_FEATURE_NOTIFICATIONS_WEBSERVICES: string // Only present in *some* envs