-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathenvironment.ts
More file actions
193 lines (169 loc) · 6 KB
/
environment.ts
File metadata and controls
193 lines (169 loc) · 6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
* Environment configuration for different networks
*/
import { BillingEnvironmentConfig, EnvironmentConfig } from "../types";
// Chain IDs
export const SEPOLIA_CHAIN_ID = 11155111;
export const MAINNET_CHAIN_ID = 1;
// Common addresses across all chains
export const CommonAddresses: Record<string, string> = {
ERC7702Delegator: "0x63c0c19a282a1b52b07dd5a65b58948a07dae32b",
};
// Addresses specific to each chain
export const ChainAddresses: Record<number, Record<string, string>> = {
[MAINNET_CHAIN_ID]: {
PermissionController: "0x25E5F8B1E7aDf44518d35D5B2271f114e081f0E5",
},
[SEPOLIA_CHAIN_ID]: {
PermissionController: "0x44632dfBdCb6D3E21EF613B0ca8A6A0c618F5a37",
},
};
// Billing environment configurations (separate from chain environments)
const BILLING_ENVIRONMENTS: Record<"dev" | "prod", BillingEnvironmentConfig> = {
dev: {
billingApiServerURL: "https://billingapi-dev.eigencloud.xyz",
},
prod: {
billingApiServerURL: "https://billingapi.eigencloud.xyz",
},
};
// Chain environment configurations
const ENVIRONMENTS: Record<string, Omit<EnvironmentConfig, "chainID">> = {
"sepolia-dev": {
name: "sepolia",
build: "dev",
appControllerAddress: "0xa86DC1C47cb2518327fB4f9A1627F51966c83B92",
permissionControllerAddress: ChainAddresses[SEPOLIA_CHAIN_ID].PermissionController,
erc7702DelegatorAddress: CommonAddresses.ERC7702Delegator,
kmsServerURL: "http://10.128.0.57:8080",
userApiServerURL: "https://userapi-compute-sepolia-dev.eigencloud.xyz",
defaultRPCURL: "https://ethereum-sepolia-rpc.publicnode.com",
avsAddress: "0x47c9806e7DC4e6fE9a0a2399831F32d06DaE5730",
operatorSetId: 0,
},
sepolia: {
name: "sepolia",
build: "prod",
appControllerAddress: "0x0dd810a6ffba6a9820a10d97b659f07d8d23d4E2",
permissionControllerAddress: ChainAddresses[SEPOLIA_CHAIN_ID].PermissionController,
erc7702DelegatorAddress: CommonAddresses.ERC7702Delegator,
kmsServerURL: "http://10.128.15.203:8080",
userApiServerURL: "https://userapi-compute-sepolia-prod.eigencloud.xyz",
defaultRPCURL: "https://ethereum-sepolia-rpc.publicnode.com",
avsAddress: "",
operatorSetId: 0,
},
"mainnet-alpha": {
name: "mainnet-alpha",
build: "prod",
appControllerAddress: "0xc38d35Fc995e75342A21CBd6D770305b142Fbe67",
permissionControllerAddress: ChainAddresses[MAINNET_CHAIN_ID].PermissionController,
erc7702DelegatorAddress: CommonAddresses.ERC7702Delegator,
kmsServerURL: "http://10.128.0.2:8080",
userApiServerURL: "https://userapi-compute.eigencloud.xyz",
defaultRPCURL: "https://ethereum-rpc.publicnode.com",
avsAddress: "",
operatorSetId: 0,
},
};
const CHAIN_ID_TO_ENVIRONMENT: Record<string, string> = {
[SEPOLIA_CHAIN_ID.toString()]: "sepolia",
[MAINNET_CHAIN_ID.toString()]: "mainnet-alpha",
};
/**
* Get environment configuration
*/
export function getEnvironmentConfig(environment: string, chainID?: bigint): EnvironmentConfig {
const env = ENVIRONMENTS[environment];
if (!env) {
throw new Error(`Unknown environment: ${environment}`);
}
// Check if environment is available in current build
if (!isEnvironmentAvailable(environment)) {
throw new Error(
`Environment ${environment} is not available in this build type. ` +
`Available environments: ${getAvailableEnvironments().join(", ")}`,
);
}
// If chainID provided, validate it matches
if (chainID) {
const expectedEnv = CHAIN_ID_TO_ENVIRONMENT[chainID.toString()];
if (expectedEnv && expectedEnv !== environment) {
throw new Error(`Environment ${environment} does not match chain ID ${chainID}`);
}
}
// Determine chain ID from environment if not provided
// Both "sepolia" and "sepolia-dev" use Sepolia chain ID
const resolvedChainID =
chainID ||
(environment === "sepolia" || environment === "sepolia-dev"
? SEPOLIA_CHAIN_ID
: MAINNET_CHAIN_ID);
return {
...env,
chainID: BigInt(resolvedChainID),
};
}
/**
* Get billing environment configuration
* @param build - The build type ("dev" or "prod")
*/
export function getBillingEnvironmentConfig(build: "dev" | "prod"): {
billingApiServerURL: string;
} {
const config = BILLING_ENVIRONMENTS[build];
if (!config) {
throw new Error(`Unknown billing environment: ${build}`);
}
return config;
}
/**
* Detect environment from chain ID
*/
export function detectEnvironmentFromChainID(chainID: bigint): string | undefined {
return CHAIN_ID_TO_ENVIRONMENT[chainID.toString()];
}
/**
* Get build type from environment variable or build-time constant (defaults to 'prod')
* BUILD_TYPE_BUILD_TIME is replaced at build time by tsup's define option
*/
// @ts-ignore - BUILD_TYPE_BUILD_TIME is injected at build time by tsup
declare const BUILD_TYPE_BUILD_TIME: string | undefined;
export function getBuildType(): "dev" | "prod" {
// First check build-time constant (set by tsup define)
// @ts-ignore - BUILD_TYPE_BUILD_TIME is injected at build time
const buildTimeType =
typeof BUILD_TYPE_BUILD_TIME !== "undefined" ? BUILD_TYPE_BUILD_TIME?.toLowerCase() : undefined;
// Fall back to runtime environment variable
const runtimeType = process.env.BUILD_TYPE?.toLowerCase();
const buildType = buildTimeType || runtimeType;
if (buildType === "dev") {
return "dev";
}
return "prod";
}
/**
* Get available environments based on build type
* - dev: only "sepolia-dev"
* - prod: "sepolia" and "mainnet-alpha"
*/
export function getAvailableEnvironments(): string[] {
const buildType = getBuildType();
if (buildType === "dev") {
return ["sepolia-dev"];
}
// prod build
return ["sepolia", "mainnet-alpha"];
}
/**
* Check if an environment is available in the current build
*/
export function isEnvironmentAvailable(environment: string): boolean {
return getAvailableEnvironments().includes(environment);
}
/**
* Check if environment is mainnet (chain ID 1)
*/
export function isMainnet(environmentConfig: EnvironmentConfig): boolean {
return environmentConfig.chainID === BigInt(MAINNET_CHAIN_ID);
}