@rallycash/networks 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @rallycash/networks
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6a6c767: EVM wallets require `signTypedData` and Solana wallets require `signMessage`. Add `@rallycash/networks` for the shared product chain list.
package/README.md CHANGED
@@ -1,3 +1,7 @@
1
- # Temporary Holding Version
1
+ # `@rallycash/networks`
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Product chain list shared by Rally apps. It does not read `process.env`.
4
+
5
+ `ALL_NETWORKS` is the swappable on-chain list (Arbitrum, Robinhood, Base, Solana). Hyperliquid perps is a separate family: Relay's 16-byte USDC id is not an EVM address. `getNetwork` still resolves it.
6
+
7
+ Solana's chain id here is `1399811149`. `@rallycash/sendor` quotes Solana as `792703809`.
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Chains Rally products know about.
3
+ * `usdToken` is the stablecoin users send on that chain (USDC on
4
+ * Arbitrum and Base, USDG on Robinhood).
5
+ *
6
+ * Families are separate collections with a literal discriminant.
7
+ * Hyperliquid perps are a third family: Relay's 16-byte USDC id is not an
8
+ * EVM address, so it is not an EvmNetwork. `ALL_NETWORKS` is the swappable
9
+ * on-chain list (EVM and Solana). `getNetwork` still resolves Hyperliquid.
10
+ */
11
+ export type EvmNetworkId = 'arbitrum' | 'robinhood' | 'base';
12
+ export type SvmNetworkId = 'solana';
13
+ export type HyperliquidNetworkId = 'hyperliquid';
14
+ /** Product chains. Hyperliquid is not one of these. */
15
+ export type NetworkId = EvmNetworkId | SvmNetworkId;
16
+ export type EvmChainId = 42161 | 4663 | 8453;
17
+ export type SvmChainId = 1399811149;
18
+ /** Relay Hyperliquid perps chain. The 16-byte USDC id is not an EVM address. */
19
+ export declare const HYPERLIQUID_PERPS_CHAIN_ID = 1337;
20
+ export declare const HYPERLIQUID_PERPS_USDC_ADDRESS = "0x00000000000000000000000000000000";
21
+ export type HyperliquidChainId = typeof HYPERLIQUID_PERPS_CHAIN_ID;
22
+ export type UsdToken = {
23
+ symbol: string;
24
+ name: string;
25
+ decimals: number;
26
+ address: string;
27
+ };
28
+ type NetworkIdentity = {
29
+ chainId: number;
30
+ displayName: string;
31
+ usdToken: UsdToken;
32
+ };
33
+ export type EvmNetwork = NetworkIdentity & {
34
+ id: EvmNetworkId;
35
+ chainId: EvmChainId;
36
+ accent: string;
37
+ isEvm: true;
38
+ isSvm: false;
39
+ machine: 'evm';
40
+ };
41
+ export type SvmNetwork = NetworkIdentity & {
42
+ id: SvmNetworkId;
43
+ chainId: SvmChainId;
44
+ accent: string;
45
+ isEvm: false;
46
+ isSvm: true;
47
+ machine: 'svm';
48
+ };
49
+ /** Relay perps identity only. Settlement fields live on EVM and SVM networks. */
50
+ export type HyperliquidNetwork = NetworkIdentity & {
51
+ id: HyperliquidNetworkId;
52
+ chainId: HyperliquidChainId;
53
+ };
54
+ /** Chains ordinary buys, cash balances, and Privy can use. */
55
+ export type Network = EvmNetwork | SvmNetwork;
56
+ /** Every network `getNetwork` can return. */
57
+ export type KnownNetwork = Network | HyperliquidNetwork;
58
+ export declare const ARBITRUM: EvmNetwork;
59
+ export declare const ROBINHOOD: EvmNetwork;
60
+ export declare const BASE: EvmNetwork;
61
+ /** Solana USDC mint. Base58 is case-sensitive. */
62
+ export declare const SOLANA: SvmNetwork;
63
+ /**
64
+ * Relay Hyperliquid perps USDC. Chain 1337, 16-byte zero currency id.
65
+ * Decimals are 8: Relay's quote for 10 USDC posts amount "1000000000".
66
+ */
67
+ export declare const HYPERLIQUID: HyperliquidNetwork;
68
+ export declare const EVM_NETWORKS: readonly EvmNetwork[];
69
+ export declare const SVM_NETWORKS: readonly SvmNetwork[];
70
+ export declare const HYPERLIQUID_NETWORKS: readonly HyperliquidNetwork[];
71
+ /** On-chain networks a buy, balance, or delegation can settle on. */
72
+ export declare const ALL_NETWORKS: readonly Network[];
73
+ export declare function isEvmNetwork(network: KnownNetwork): network is EvmNetwork;
74
+ export declare function isSvmNetwork(network: KnownNetwork): network is SvmNetwork;
75
+ export declare function isHyperliquidNetwork(network: KnownNetwork): network is HyperliquidNetwork;
76
+ export declare function isEvmNetworkId(value: string): value is EvmNetworkId;
77
+ export declare function isSvmNetworkId(value: string): value is SvmNetworkId;
78
+ export declare function isHyperliquidNetworkId(value: string): value is HyperliquidNetworkId;
79
+ export declare function getNetwork(id: EvmNetworkId): EvmNetwork;
80
+ export declare function getNetwork(id: EvmChainId): EvmNetwork;
81
+ export declare function getNetwork(id: SvmNetworkId): SvmNetwork;
82
+ export declare function getNetwork(id: SvmChainId): SvmNetwork;
83
+ export declare function getNetwork(id: HyperliquidNetworkId): HyperliquidNetwork;
84
+ export declare function getNetwork(id: HyperliquidChainId): HyperliquidNetwork;
85
+ export declare function getNetwork(id: NetworkId): Network;
86
+ export declare function getNetwork(id: NetworkId | HyperliquidNetworkId): KnownNetwork;
87
+ export declare function getNetwork(id: number): KnownNetwork;
88
+ export declare const NetworkUtils: {
89
+ getNetwork: typeof getNetwork;
90
+ isEvmNetwork: typeof isEvmNetwork;
91
+ isSvmNetwork: typeof isSvmNetwork;
92
+ isHyperliquidNetwork: typeof isHyperliquidNetwork;
93
+ isEvmNetworkId: typeof isEvmNetworkId;
94
+ isSvmNetworkId: typeof isSvmNetworkId;
95
+ isHyperliquidNetworkId: typeof isHyperliquidNetworkId;
96
+ };
97
+ export {};
98
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,124 @@
1
+ /** Relay Hyperliquid perps chain. The 16-byte USDC id is not an EVM address. */
2
+ export const HYPERLIQUID_PERPS_CHAIN_ID = 1337;
3
+ export const HYPERLIQUID_PERPS_USDC_ADDRESS = '0x00000000000000000000000000000000';
4
+ export const ARBITRUM = {
5
+ id: 'arbitrum',
6
+ chainId: 42161,
7
+ displayName: 'Arbitrum',
8
+ isEvm: true,
9
+ isSvm: false,
10
+ machine: 'evm',
11
+ accent: '#28A0F0',
12
+ usdToken: {
13
+ symbol: 'USDC',
14
+ name: 'USD Coin',
15
+ decimals: 6,
16
+ address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
17
+ },
18
+ };
19
+ export const ROBINHOOD = {
20
+ id: 'robinhood',
21
+ chainId: 4663,
22
+ displayName: 'Robinhood',
23
+ isEvm: true,
24
+ isSvm: false,
25
+ machine: 'evm',
26
+ accent: '#00C805',
27
+ usdToken: {
28
+ symbol: 'USDG',
29
+ name: 'Global Dollar',
30
+ decimals: 6,
31
+ address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168',
32
+ },
33
+ };
34
+ export const BASE = {
35
+ id: 'base',
36
+ chainId: 8453,
37
+ displayName: 'Base',
38
+ isEvm: true,
39
+ isSvm: false,
40
+ machine: 'evm',
41
+ accent: '#0052FF',
42
+ usdToken: {
43
+ symbol: 'USDC',
44
+ name: 'USD Coin',
45
+ decimals: 6,
46
+ address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
47
+ },
48
+ };
49
+ /** Solana USDC mint. Base58 is case-sensitive. */
50
+ export const SOLANA = {
51
+ id: 'solana',
52
+ chainId: 1399811149,
53
+ displayName: 'Solana',
54
+ isEvm: false,
55
+ isSvm: true,
56
+ machine: 'svm',
57
+ accent: '#9945FF',
58
+ usdToken: {
59
+ symbol: 'USDC',
60
+ name: 'USD Coin',
61
+ decimals: 6,
62
+ address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
63
+ },
64
+ };
65
+ /**
66
+ * Relay Hyperliquid perps USDC. Chain 1337, 16-byte zero currency id.
67
+ * Decimals are 8: Relay's quote for 10 USDC posts amount "1000000000".
68
+ */
69
+ export const HYPERLIQUID = {
70
+ id: 'hyperliquid',
71
+ chainId: HYPERLIQUID_PERPS_CHAIN_ID,
72
+ displayName: 'Hyperliquid',
73
+ usdToken: {
74
+ symbol: 'USDC',
75
+ name: 'USDC (Perps)',
76
+ decimals: 8,
77
+ address: HYPERLIQUID_PERPS_USDC_ADDRESS,
78
+ },
79
+ };
80
+ export const EVM_NETWORKS = [ARBITRUM, ROBINHOOD, BASE];
81
+ export const SVM_NETWORKS = [SOLANA];
82
+ export const HYPERLIQUID_NETWORKS = [HYPERLIQUID];
83
+ /** On-chain networks a buy, balance, or delegation can settle on. */
84
+ export const ALL_NETWORKS = [...EVM_NETWORKS, ...SVM_NETWORKS];
85
+ const knownNetworks = [...ALL_NETWORKS, ...HYPERLIQUID_NETWORKS];
86
+ const EVM_NETWORK_IDS = new Set(EVM_NETWORKS.map((network) => network.id));
87
+ const SVM_NETWORK_IDS = new Set(SVM_NETWORKS.map((network) => network.id));
88
+ const HYPERLIQUID_NETWORK_IDS = new Set(HYPERLIQUID_NETWORKS.map((network) => network.id));
89
+ export function isEvmNetwork(network) {
90
+ return 'isEvm' in network && network.isEvm;
91
+ }
92
+ export function isSvmNetwork(network) {
93
+ return 'isSvm' in network && network.isSvm;
94
+ }
95
+ export function isHyperliquidNetwork(network) {
96
+ return network.id === 'hyperliquid';
97
+ }
98
+ export function isEvmNetworkId(value) {
99
+ return EVM_NETWORK_IDS.has(value);
100
+ }
101
+ export function isSvmNetworkId(value) {
102
+ return SVM_NETWORK_IDS.has(value);
103
+ }
104
+ export function isHyperliquidNetworkId(value) {
105
+ return HYPERLIQUID_NETWORK_IDS.has(value);
106
+ }
107
+ export function getNetwork(chainIdOrId) {
108
+ const network = typeof chainIdOrId === 'number'
109
+ ? knownNetworks.find((item) => item.chainId === chainIdOrId)
110
+ : knownNetworks.find((item) => item.id === chainIdOrId);
111
+ if (!network) {
112
+ throw new Error(`Unsupported network: ${String(chainIdOrId)}`);
113
+ }
114
+ return network;
115
+ }
116
+ export const NetworkUtils = {
117
+ getNetwork,
118
+ isEvmNetwork,
119
+ isSvmNetwork,
120
+ isHyperliquidNetwork,
121
+ isEvmNetworkId,
122
+ isSvmNetworkId,
123
+ isHyperliquidNetworkId,
124
+ };
package/package.json CHANGED
@@ -1,6 +1,33 @@
1
1
  {
2
2
  "name": "@rallycash/networks",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Shared chain list for Rally products",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./src/index.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "src",
19
+ "README.md"
20
+ ],
21
+ "sideEffects": false,
22
+ "scripts": {
23
+ "build": "../../node_modules/.bin/tsc -b --force",
24
+ "typecheck": "../../node_modules/.bin/tsc --noEmit -p tsconfig.json",
25
+ "test": "../../node_modules/.bin/vitest run"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "engines": {
31
+ "node": ">=20"
32
+ }
6
33
  }
@@ -0,0 +1,39 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import {
3
+ ALL_NETWORKS,
4
+ BASE,
5
+ HYPERLIQUID,
6
+ SOLANA,
7
+ getNetwork,
8
+ isEvmNetwork,
9
+ isHyperliquidNetwork,
10
+ isSvmNetwork,
11
+ } from './index.js'
12
+
13
+ describe('getNetwork', () => {
14
+ it('resolves product chains by id and chain id', () => {
15
+ expect(getNetwork('base')).toBe(BASE)
16
+ expect(getNetwork(8453).usdToken.symbol).toBe('USDC')
17
+ expect(getNetwork('solana')).toBe(SOLANA)
18
+ expect(getNetwork(1399811149).machine).toBe('svm')
19
+ })
20
+
21
+ it('resolves Hyperliquid without treating it as a swappable network', () => {
22
+ expect(getNetwork('hyperliquid')).toBe(HYPERLIQUID)
23
+ expect(getNetwork(1337).usdToken.decimals).toBe(8)
24
+ expect(isHyperliquidNetwork(getNetwork(1337))).toBe(true)
25
+ expect(ALL_NETWORKS.some((network) => network.id === 'hyperliquid')).toBe(false)
26
+ })
27
+
28
+ it('narrows EVM and Solana', () => {
29
+ const base = getNetwork('base')
30
+ const solana = getNetwork('solana')
31
+ expect(isEvmNetwork(base) && base.isEvm).toBe(true)
32
+ expect(isSvmNetwork(solana) && solana.isSvm).toBe(true)
33
+ expect(isEvmNetwork(solana)).toBe(false)
34
+ })
35
+
36
+ it('rejects an unknown chain', () => {
37
+ expect(() => getNetwork(777)).toThrow('Unsupported network: 777')
38
+ })
39
+ })
package/src/index.ts ADDED
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Chains Rally products know about.
3
+ * `usdToken` is the stablecoin users send on that chain (USDC on
4
+ * Arbitrum and Base, USDG on Robinhood).
5
+ *
6
+ * Families are separate collections with a literal discriminant.
7
+ * Hyperliquid perps are a third family: Relay's 16-byte USDC id is not an
8
+ * EVM address, so it is not an EvmNetwork. `ALL_NETWORKS` is the swappable
9
+ * on-chain list (EVM and Solana). `getNetwork` still resolves Hyperliquid.
10
+ */
11
+ export type EvmNetworkId = 'arbitrum' | 'robinhood' | 'base'
12
+ export type SvmNetworkId = 'solana'
13
+ export type HyperliquidNetworkId = 'hyperliquid'
14
+
15
+ /** Product chains. Hyperliquid is not one of these. */
16
+ export type NetworkId = EvmNetworkId | SvmNetworkId
17
+
18
+ export type EvmChainId = 42161 | 4663 | 8453
19
+ export type SvmChainId = 1399811149
20
+
21
+ /** Relay Hyperliquid perps chain. The 16-byte USDC id is not an EVM address. */
22
+ export const HYPERLIQUID_PERPS_CHAIN_ID = 1337
23
+ export const HYPERLIQUID_PERPS_USDC_ADDRESS = '0x00000000000000000000000000000000'
24
+
25
+ export type HyperliquidChainId = typeof HYPERLIQUID_PERPS_CHAIN_ID
26
+
27
+ export type UsdToken = {
28
+ symbol: string
29
+ name: string
30
+ decimals: number
31
+ address: string
32
+ }
33
+
34
+ type NetworkIdentity = {
35
+ chainId: number
36
+ displayName: string
37
+ usdToken: UsdToken
38
+ }
39
+
40
+ export type EvmNetwork = NetworkIdentity & {
41
+ id: EvmNetworkId
42
+ chainId: EvmChainId
43
+ accent: string
44
+ isEvm: true
45
+ isSvm: false
46
+ machine: 'evm'
47
+ }
48
+
49
+ export type SvmNetwork = NetworkIdentity & {
50
+ id: SvmNetworkId
51
+ chainId: SvmChainId
52
+ accent: string
53
+ isEvm: false
54
+ isSvm: true
55
+ machine: 'svm'
56
+ }
57
+
58
+ /** Relay perps identity only. Settlement fields live on EVM and SVM networks. */
59
+ export type HyperliquidNetwork = NetworkIdentity & {
60
+ id: HyperliquidNetworkId
61
+ chainId: HyperliquidChainId
62
+ }
63
+
64
+ /** Chains ordinary buys, cash balances, and Privy can use. */
65
+ export type Network = EvmNetwork | SvmNetwork
66
+
67
+ /** Every network `getNetwork` can return. */
68
+ export type KnownNetwork = Network | HyperliquidNetwork
69
+
70
+ export const ARBITRUM: EvmNetwork = {
71
+ id: 'arbitrum',
72
+ chainId: 42161,
73
+ displayName: 'Arbitrum',
74
+ isEvm: true,
75
+ isSvm: false,
76
+ machine: 'evm',
77
+ accent: '#28A0F0',
78
+ usdToken: {
79
+ symbol: 'USDC',
80
+ name: 'USD Coin',
81
+ decimals: 6,
82
+ address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
83
+ },
84
+ }
85
+
86
+ export const ROBINHOOD: EvmNetwork = {
87
+ id: 'robinhood',
88
+ chainId: 4663,
89
+ displayName: 'Robinhood',
90
+ isEvm: true,
91
+ isSvm: false,
92
+ machine: 'evm',
93
+ accent: '#00C805',
94
+ usdToken: {
95
+ symbol: 'USDG',
96
+ name: 'Global Dollar',
97
+ decimals: 6,
98
+ address: '0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168',
99
+ },
100
+ }
101
+
102
+ export const BASE: EvmNetwork = {
103
+ id: 'base',
104
+ chainId: 8453,
105
+ displayName: 'Base',
106
+ isEvm: true,
107
+ isSvm: false,
108
+ machine: 'evm',
109
+ accent: '#0052FF',
110
+ usdToken: {
111
+ symbol: 'USDC',
112
+ name: 'USD Coin',
113
+ decimals: 6,
114
+ address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
115
+ },
116
+ }
117
+
118
+ /** Solana USDC mint. Base58 is case-sensitive. */
119
+ export const SOLANA: SvmNetwork = {
120
+ id: 'solana',
121
+ chainId: 1399811149,
122
+ displayName: 'Solana',
123
+ isEvm: false,
124
+ isSvm: true,
125
+ machine: 'svm',
126
+ accent: '#9945FF',
127
+ usdToken: {
128
+ symbol: 'USDC',
129
+ name: 'USD Coin',
130
+ decimals: 6,
131
+ address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
132
+ },
133
+ }
134
+
135
+ /**
136
+ * Relay Hyperliquid perps USDC. Chain 1337, 16-byte zero currency id.
137
+ * Decimals are 8: Relay's quote for 10 USDC posts amount "1000000000".
138
+ */
139
+ export const HYPERLIQUID: HyperliquidNetwork = {
140
+ id: 'hyperliquid',
141
+ chainId: HYPERLIQUID_PERPS_CHAIN_ID,
142
+ displayName: 'Hyperliquid',
143
+ usdToken: {
144
+ symbol: 'USDC',
145
+ name: 'USDC (Perps)',
146
+ decimals: 8,
147
+ address: HYPERLIQUID_PERPS_USDC_ADDRESS,
148
+ },
149
+ }
150
+
151
+ export const EVM_NETWORKS: readonly EvmNetwork[] = [ARBITRUM, ROBINHOOD, BASE]
152
+ export const SVM_NETWORKS: readonly SvmNetwork[] = [SOLANA]
153
+ export const HYPERLIQUID_NETWORKS: readonly HyperliquidNetwork[] = [HYPERLIQUID]
154
+
155
+ /** On-chain networks a buy, balance, or delegation can settle on. */
156
+ export const ALL_NETWORKS: readonly Network[] = [...EVM_NETWORKS, ...SVM_NETWORKS]
157
+
158
+ const knownNetworks: readonly KnownNetwork[] = [...ALL_NETWORKS, ...HYPERLIQUID_NETWORKS]
159
+
160
+ const EVM_NETWORK_IDS = new Set<EvmNetworkId>(EVM_NETWORKS.map((network) => network.id))
161
+ const SVM_NETWORK_IDS = new Set<SvmNetworkId>(SVM_NETWORKS.map((network) => network.id))
162
+ const HYPERLIQUID_NETWORK_IDS = new Set<HyperliquidNetworkId>(
163
+ HYPERLIQUID_NETWORKS.map((network) => network.id),
164
+ )
165
+
166
+ export function isEvmNetwork(network: KnownNetwork): network is EvmNetwork {
167
+ return 'isEvm' in network && network.isEvm
168
+ }
169
+
170
+ export function isSvmNetwork(network: KnownNetwork): network is SvmNetwork {
171
+ return 'isSvm' in network && network.isSvm
172
+ }
173
+
174
+ export function isHyperliquidNetwork(network: KnownNetwork): network is HyperliquidNetwork {
175
+ return network.id === 'hyperliquid'
176
+ }
177
+
178
+ export function isEvmNetworkId(value: string): value is EvmNetworkId {
179
+ return EVM_NETWORK_IDS.has(value as EvmNetworkId)
180
+ }
181
+
182
+ export function isSvmNetworkId(value: string): value is SvmNetworkId {
183
+ return SVM_NETWORK_IDS.has(value as SvmNetworkId)
184
+ }
185
+
186
+ export function isHyperliquidNetworkId(value: string): value is HyperliquidNetworkId {
187
+ return HYPERLIQUID_NETWORK_IDS.has(value as HyperliquidNetworkId)
188
+ }
189
+
190
+ export function getNetwork(id: EvmNetworkId): EvmNetwork
191
+ export function getNetwork(id: EvmChainId): EvmNetwork
192
+ export function getNetwork(id: SvmNetworkId): SvmNetwork
193
+ export function getNetwork(id: SvmChainId): SvmNetwork
194
+ export function getNetwork(id: HyperliquidNetworkId): HyperliquidNetwork
195
+ export function getNetwork(id: HyperliquidChainId): HyperliquidNetwork
196
+ export function getNetwork(id: NetworkId): Network
197
+ export function getNetwork(id: NetworkId | HyperliquidNetworkId): KnownNetwork
198
+ export function getNetwork(id: number): KnownNetwork
199
+ export function getNetwork(chainIdOrId: string | number): KnownNetwork {
200
+ const network =
201
+ typeof chainIdOrId === 'number'
202
+ ? knownNetworks.find((item) => item.chainId === chainIdOrId)
203
+ : knownNetworks.find((item) => item.id === chainIdOrId)
204
+ if (!network) {
205
+ throw new Error(`Unsupported network: ${String(chainIdOrId)}`)
206
+ }
207
+ return network
208
+ }
209
+
210
+ export const NetworkUtils = {
211
+ getNetwork,
212
+ isEvmNetwork,
213
+ isSvmNetwork,
214
+ isHyperliquidNetwork,
215
+ isEvmNetworkId,
216
+ isSvmNetworkId,
217
+ isHyperliquidNetworkId,
218
+ }