diff --git a/bun.lock b/bun.lock index 780aa3d3..df7592c8 100644 --- a/bun.lock +++ b/bun.lock @@ -1,12 +1,11 @@ { "lockfileVersion": 1, - "configVersion": 1, "workspaces": { "": { "name": "openscan", "dependencies": { "@erc7730/sdk": "^0.1.3", - "@openscan/network-connectors": "1.3.2", + "@openscan/network-connectors": "1.4.0", "@rainbow-me/rainbowkit": "^2.2.8", "@react-native-async-storage/async-storage": "^1.24.0", "@tanstack/react-query": "^5.90.21", @@ -280,7 +279,7 @@ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@openscan/network-connectors": ["@openscan/network-connectors@1.3.2", "", {}, "sha512-OdH+PqP/VNYkPrXBCaMhjNF2FQ5N5WH9wd9uGelgkCvbXXS0xXRC4PlPqWSSXqjZJUud0HAGDF5pbZfxIPFQnQ=="], + "@openscan/network-connectors": ["@openscan/network-connectors@1.4.0", "", {}, "sha512-a27b86OBZCXtCI5iKYgttXiEyG9I7NQ5QpRp2PQGydbBMrTF1U4XI3VcJJFm14FD9z8L5WW+VEZ8f7cglh3HPA=="], "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], diff --git a/package.json b/package.json index b8ca7382..d8af2777 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@erc7730/sdk": "^0.1.3", - "@openscan/network-connectors": "1.3.2", + "@openscan/network-connectors": "1.4.0", "@rainbow-me/rainbowkit": "^2.2.8", "@react-native-async-storage/async-storage": "^1.24.0", "@tanstack/react-query": "^5.90.21", diff --git a/src/config/networks.json b/src/config/networks.json index 3bec09b4..a7b49e61 100644 --- a/src/config/networks.json +++ b/src/config/networks.json @@ -185,6 +185,35 @@ } ] }, + { + "type": "evm", + "networkId": "eip155:43114", + "slug": "avax", + "name": "Avalanche C-Chain", + "shortName": "Avalanche", + "description": "EVM-compatible smart contract platform with high throughput", + "currency": "AVAX", + "color": "#E84142", + "isTestnet": false, + "logo": "assets/networks/43114.svg", + "links": [ + { + "name": "Website", + "url": "https://www.avax.network", + "description": "Official Avalanche website" + }, + { + "name": "Docs", + "url": "https://docs.avax.network", + "description": "Developer documentation" + }, + { + "name": "Bridge", + "url": "https://core.app/bridge", + "description": "Bridge assets to Avalanche" + } + ] + }, { "type": "evm", "networkId": "eip155:11155111", diff --git a/src/services/adapters/EVMAdapter/EVMAdapter.ts b/src/services/adapters/EVMAdapter/EVMAdapter.ts index d4e4cded..a0d472dc 100644 --- a/src/services/adapters/EVMAdapter/EVMAdapter.ts +++ b/src/services/adapters/EVMAdapter/EVMAdapter.ts @@ -11,7 +11,8 @@ import { import { normalizeBlockNumber } from "../shared/normalizeBlockNumber"; import { mergeMetadata } from "../shared/mergeMetadata"; -import type { EthereumClient, SupportedChainId } from "@openscan/network-connectors"; +import type { EthereumClient } from "@openscan/network-connectors"; +import type { AppChainId } from "../../../types"; import { getRethClient, NONCE_LOOKUP_CHAIN_ID } from "../../../config/rethProviders"; import { NonceLookupService } from "../../NonceLookupService"; @@ -22,7 +23,7 @@ import { NonceLookupService } from "../../NonceLookupService"; export class EVMAdapter extends NetworkAdapter { private client: EthereumClient; - constructor(networkId: SupportedChainId | 11155111 | 97 | 31337, client: EthereumClient) { + constructor(networkId: AppChainId, client: EthereumClient) { super(networkId); this.client = client; diff --git a/src/services/adapters/NetworkAdapter.ts b/src/services/adapters/NetworkAdapter.ts index 1dcb2f3b..b022d8b5 100644 --- a/src/services/adapters/NetworkAdapter.ts +++ b/src/services/adapters/NetworkAdapter.ts @@ -1,5 +1,6 @@ -import type { SupportedChainId, EthereumClient } from "@openscan/network-connectors"; +import type { EthereumClient } from "@openscan/network-connectors"; import type { + AppChainId, Block, Transaction, Address, @@ -51,7 +52,7 @@ export abstract class NetworkAdapter { isLocalHost: boolean; protected txSearch: AddressTransactionSearch | null = null; - constructor(networkId: SupportedChainId | 31337 | 11155111 | 97) { + constructor(networkId: AppChainId) { this.networkId = networkId; this.isLocalHost = networkId === 31337; } diff --git a/src/services/adapters/adaptersFactory.ts b/src/services/adapters/adaptersFactory.ts index dd98c2f7..7379a3ed 100644 --- a/src/services/adapters/adaptersFactory.ts +++ b/src/services/adapters/adaptersFactory.ts @@ -8,6 +8,7 @@ import { ArbitrumAdapter } from "./ArbitrumAdapter/ArbitrumAdapter"; import { BitcoinAdapter } from "./BitcoinAdapter/BitcoinAdapter"; import type { ArbitrumClient, + AvalancheClient, AztecClient, BaseClient, BitcoinClient, @@ -24,7 +25,7 @@ export class AdapterFactory { * Create an EVM network adapter */ static createAdapter( - networkId: SupportedChainId | 11155111 | 97 | 31337, + networkId: SupportedChainId, client: | EthereumClient | OptimismClient @@ -32,13 +33,15 @@ export class AdapterFactory { | PolygonClient | BaseClient | ArbitrumClient + | AvalancheClient | AztecClient, ): NetworkAdapter { switch (networkId) { case 1: case 11155111: case 31337: - return new EVMAdapter(networkId, client as EthereumClient); + case 43114: + return new EVMAdapter(networkId, client as unknown as EthereumClient); case 10: return new OptimismAdapter(networkId, client as OptimismClient); case 56: diff --git a/src/types/index.ts b/src/types/index.ts index 2abb8c9c..8daf8c5e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,4 @@ -import type { EthLog } from "@openscan/network-connectors"; +import type { EthLog, SupportedChainId } from "@openscan/network-connectors"; import type React from "react"; // ==================== NETWORK TYPES ==================== @@ -8,6 +8,13 @@ import type React from "react"; */ export type NetworkType = "evm" | "bitcoin"; +/** + * All EVM chain IDs supported by the app. + * Maps directly to the connector library's SupportedChainId. + * When adding a new EVM network, add its chain ID to network-connectors first. + */ +export type AppChainId = SupportedChainId; + // ==================== CORE DOMAIN TYPES ==================== export interface NetworkStats {