@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 +7 -0
- package/README.md +6 -2
- package/dist/index.d.ts +98 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/package.json +30 -3
- package/src/index.test.ts +39 -0
- package/src/index.ts +218 -0
package/CHANGELOG.md
ADDED
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@rallycash/networks`
|
|
2
2
|
|
|
3
|
-
|
|
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`.
|
package/dist/index.d.ts
ADDED
|
@@ -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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
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
|
+
}
|