@mixerx/config 1.0.0 → 1.1.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/README.md +19 -9
- package/dist/assertions.js +55 -49
- package/dist/assertions.js.map +1 -1
- package/dist/config.js +81 -3
- package/dist/config.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -1
- package/package.json +47 -47
package/README.md
CHANGED
|
@@ -1,15 +1,25 @@
|
|
|
1
1
|
# @mixerx/config
|
|
2
2
|
|
|
3
|
-
Validated, immutable MixerX protocol config for Sepolia
|
|
3
|
+
Validated, immutable MixerX protocol config for Sepolia and a provisional Ethereum mainnet catalogue.
|
|
4
4
|
|
|
5
5
|
Supported network ids are exported from `SUPPORTED_NET_IDS`. Resolve data through
|
|
6
6
|
`getNetworkConfig(chainId)` and `getInstancesForNetId(chainId)` so unsupported
|
|
7
7
|
or prototype-derived keys fail closed. `instances` and `networkConfigByNetId`
|
|
8
8
|
remain exported for current consumers, but every exported object is frozen.
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
Mainnet (`1`) has its own immutable catalogue with provisional address and block values that currently match Sepolia
|
|
11
|
+
to allow backend configuration before the new MixerX contracts are deployed, as
|
|
12
|
+
agreed for the develop environment. These values do not describe a mainnet
|
|
13
|
+
deployment and do not provide on-chain readiness. Replace them with verified
|
|
14
|
+
mainnet addresses and deployment blocks when available.
|
|
15
|
+
|
|
16
|
+
A mainnet fork with chain ID `1` uses this same catalogue. Other chain IDs are
|
|
17
|
+
rejected; configure the actual node ID, never disguise mainnet as Sepolia.
|
|
18
|
+
Legacy Tornado Cash contracts and event layouts are not part of this catalogue.
|
|
19
|
+
|
|
20
|
+
The mainnet and Sepolia records are independently defined and maintained. This
|
|
21
|
+
package does not read environment variables or load an `.env` file: callers
|
|
22
|
+
select the catalogue explicitly by passing the network ID to the lookup APIs.
|
|
13
23
|
|
|
14
24
|
## Sepolia status
|
|
15
25
|
|
|
@@ -26,12 +36,12 @@ protocol token and wrapped stablecoin roles. Consumers must treat these as roles
|
|
|
26
36
|
not as proof that two independent assets exist. A future deployment that separates
|
|
27
37
|
the assets must update both addresses and the contract tests together.
|
|
28
38
|
|
|
29
|
-
The catalogue exposes only the eight fixed-denomination pools currently enabled
|
|
30
|
-
in the Sepolia `InstanceRegistry`. Disabled custom-pool deployments are omitted
|
|
31
|
-
until their on-chain registry metadata and state are valid.
|
|
39
|
+
The catalogue exposes only the eight fixed-denomination pools currently enabled
|
|
40
|
+
in the Sepolia `InstanceRegistry`. Disabled custom-pool deployments are omitted
|
|
41
|
+
until their on-chain registry metadata and state are valid.
|
|
32
42
|
|
|
33
|
-
Each currency declares `assetType` as `native` or `erc20`. ERC20 currencies also
|
|
34
|
-
declare `tokenAddress`.
|
|
43
|
+
Each currency declares `assetType` as `native` or `erc20`. ERC20 currencies also
|
|
44
|
+
declare `tokenAddress`.
|
|
35
45
|
Use each currency's `denominations` array when order matters; JavaScript object-key
|
|
36
46
|
ordering is not a protocol ordering guarantee.
|
|
37
47
|
|
package/dist/assertions.js
CHANGED
|
@@ -136,16 +136,18 @@ function assertCurrency(currency, label, poolAddresses) {
|
|
|
136
136
|
throw new Error(`${label}.denominations must be in ascending numeric order with custom last`);
|
|
137
137
|
}
|
|
138
138
|
}
|
|
139
|
-
function assertNetwork(network, poolAddresses) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
assertRecord(network
|
|
139
|
+
function assertNetwork(network, poolAddresses, netId) {
|
|
140
|
+
const label = netId === types_js_1.SEPOLIA_NET_ID ? 'sepolia' : `network ${netId}`;
|
|
141
|
+
const name = netId === types_js_1.SEPOLIA_NET_ID ? 'Sepolia' : `Network ${netId}`;
|
|
142
|
+
assertRecord(network, `networkConfigByNetId.${netId}`);
|
|
143
|
+
assertRecord(network.contracts, `networkConfigByNetId.${netId}.contracts`);
|
|
144
|
+
assertRecord(network.tokens, `networkConfigByNetId.${netId}.tokens`);
|
|
143
145
|
const unknownContractKey = Object.keys(network.contracts).find((key) => !SUPPORTED_CONTRACT_KEYS.has(key));
|
|
144
146
|
if (unknownContractKey) {
|
|
145
|
-
throw new Error(
|
|
147
|
+
throw new Error(`${label}.contracts contains unsupported key ${unknownContractKey}`);
|
|
146
148
|
}
|
|
147
149
|
for (const key of CONTRACT_KEYS) {
|
|
148
|
-
assertEvmAddress(network.contracts[key],
|
|
150
|
+
assertEvmAddress(network.contracts[key], `${label}.contracts.${key}`);
|
|
149
151
|
}
|
|
150
152
|
const contractAddressRoles = new Map();
|
|
151
153
|
for (const key of CONTRACT_KEYS) {
|
|
@@ -153,40 +155,41 @@ function assertNetwork(network, poolAddresses) {
|
|
|
153
155
|
continue;
|
|
154
156
|
}
|
|
155
157
|
const contractAddress = network.contracts[key];
|
|
156
|
-
assertEvmAddress(contractAddress,
|
|
158
|
+
assertEvmAddress(contractAddress, `${label}.contracts.${key}`);
|
|
157
159
|
const normalizedAddress = contractAddress.toLowerCase();
|
|
158
160
|
const existingRole = contractAddressRoles.get(normalizedAddress);
|
|
159
161
|
if (existingRole) {
|
|
160
|
-
throw new Error(
|
|
162
|
+
throw new Error(`${name} contract roles ${key} and ${existingRole} must not share an address`);
|
|
161
163
|
}
|
|
162
164
|
if (poolAddresses.has(normalizedAddress)) {
|
|
163
165
|
if (key === 'mixerXRouter') {
|
|
164
|
-
throw new Error(
|
|
166
|
+
throw new Error(`${name} router address must not equal a pool address`);
|
|
165
167
|
}
|
|
166
|
-
throw new Error(
|
|
168
|
+
throw new Error(`${name} contract ${key} address must not equal a pool address`);
|
|
167
169
|
}
|
|
168
170
|
contractAddressRoles.set(normalizedAddress, key);
|
|
169
171
|
}
|
|
170
|
-
assertPositiveInteger(network.contracts.relayerRegistryDeploymentBlock,
|
|
171
|
-
assertPositiveInteger(network.contracts.ensRegistryDeploymentBlock,
|
|
172
|
-
assertPositiveInteger(network.contracts.instanceRegistryDeploymentBlock,
|
|
173
|
-
assertPositiveInteger(network.contracts.ethPoolFactoryDeploymentBlock,
|
|
174
|
-
assertPositiveInteger(network.contracts.erc20PoolFactoryDeploymentBlock,
|
|
172
|
+
assertPositiveInteger(network.contracts.relayerRegistryDeploymentBlock, `${label}.contracts.relayerRegistryDeploymentBlock`);
|
|
173
|
+
assertPositiveInteger(network.contracts.ensRegistryDeploymentBlock, `${label}.contracts.ensRegistryDeploymentBlock`);
|
|
174
|
+
assertPositiveInteger(network.contracts.instanceRegistryDeploymentBlock, `${label}.contracts.instanceRegistryDeploymentBlock`);
|
|
175
|
+
assertPositiveInteger(network.contracts.ethPoolFactoryDeploymentBlock, `${label}.contracts.ethPoolFactoryDeploymentBlock`);
|
|
176
|
+
assertPositiveInteger(network.contracts.erc20PoolFactoryDeploymentBlock, `${label}.contracts.erc20PoolFactoryDeploymentBlock`);
|
|
175
177
|
if (String(network.contracts.relayerRegistry).toLowerCase() !==
|
|
176
178
|
String(network.contracts.relayerRegistryAddress).toLowerCase()) {
|
|
177
|
-
throw new Error(
|
|
179
|
+
throw new Error(`${name} relayer registry aliases must resolve to the same address`);
|
|
178
180
|
}
|
|
179
181
|
const routerAddress = network.contracts.mixerXRouter;
|
|
180
|
-
assertEvmAddress(routerAddress,
|
|
181
|
-
assertEvmAddress(network.tokens.mixerXTokenAddress,
|
|
182
|
-
assertEvmAddress(network.tokens.wrappedStablecoinAddress,
|
|
183
|
-
assertTokenSymbol(network.tokens.mixerXTokenSymbol,
|
|
184
|
-
assertDecimals(network.tokens.mixerXTokenDecimals,
|
|
182
|
+
assertEvmAddress(routerAddress, `${label}.contracts.mixerXRouter`);
|
|
183
|
+
assertEvmAddress(network.tokens.mixerXTokenAddress, `${label}.tokens.mixerXTokenAddress`);
|
|
184
|
+
assertEvmAddress(network.tokens.wrappedStablecoinAddress, `${label}.tokens.wrappedStablecoinAddress`);
|
|
185
|
+
assertTokenSymbol(network.tokens.mixerXTokenSymbol, `${label}.tokens.mixerXTokenSymbol`);
|
|
186
|
+
assertDecimals(network.tokens.mixerXTokenDecimals, `${label}.tokens.mixerXTokenDecimals`);
|
|
185
187
|
}
|
|
186
|
-
function assertFdsTokenAliases(network, currencies) {
|
|
188
|
+
function assertFdsTokenAliases(network, currencies, netId) {
|
|
189
|
+
const name = netId === types_js_1.SEPOLIA_NET_ID ? 'Sepolia' : `Network ${netId}`;
|
|
187
190
|
const fdsCurrency = currencies.fds;
|
|
188
|
-
assertRecord(fdsCurrency, `instances.${
|
|
189
|
-
assertEvmAddress(fdsCurrency.tokenAddress, `instances.${
|
|
191
|
+
assertRecord(fdsCurrency, `instances.${netId}.fds`);
|
|
192
|
+
assertEvmAddress(fdsCurrency.tokenAddress, `instances.${netId}.fds.tokenAddress`);
|
|
190
193
|
const addresses = [
|
|
191
194
|
network.contracts.fds,
|
|
192
195
|
network.tokens.mixerXTokenAddress,
|
|
@@ -194,39 +197,42 @@ function assertFdsTokenAliases(network, currencies) {
|
|
|
194
197
|
fdsCurrency.tokenAddress,
|
|
195
198
|
];
|
|
196
199
|
if (new Set(addresses.map((address) => address.toLowerCase())).size !== 1) {
|
|
197
|
-
throw new Error(
|
|
200
|
+
throw new Error(`${name} FDS address aliases must resolve to the same address`);
|
|
198
201
|
}
|
|
199
202
|
if (fdsCurrency.symbol !== network.tokens.mixerXTokenSymbol ||
|
|
200
203
|
fdsCurrency.decimals !== network.tokens.mixerXTokenDecimals) {
|
|
201
|
-
throw new Error(
|
|
204
|
+
throw new Error(`${name} FDS symbol and decimals aliases must match`);
|
|
202
205
|
}
|
|
203
206
|
}
|
|
204
207
|
function assertValidConfigShape(input) {
|
|
205
208
|
assertRecord(input, 'config');
|
|
206
209
|
assertRecord(input.instances, 'instances');
|
|
207
210
|
assertRecord(input.networkConfigByNetId, 'networkConfigByNetId');
|
|
208
|
-
const
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
211
|
+
const expectedNetIds = types_js_1.SUPPORTED_NET_IDS.map(String);
|
|
212
|
+
for (const [label, catalogue] of [
|
|
213
|
+
['networkConfigByNetId', input.networkConfigByNetId],
|
|
214
|
+
['instances', input.instances],
|
|
215
|
+
]) {
|
|
216
|
+
const configuredNetIds = Object.keys(catalogue);
|
|
217
|
+
if (configuredNetIds.length !== expectedNetIds.length ||
|
|
218
|
+
configuredNetIds.some((netId) => !expectedNetIds.includes(netId))) {
|
|
219
|
+
throw new Error(`${label} must configure exactly networks ${expectedNetIds.join(', ')}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
for (const netId of types_js_1.SUPPORTED_NET_IDS) {
|
|
223
|
+
const currencies = input.instances[netId];
|
|
224
|
+
assertRecord(currencies, `instances.${netId}`);
|
|
225
|
+
const currencyEntries = Object.entries(currencies);
|
|
226
|
+
if (currencyEntries.length === 0) {
|
|
227
|
+
throw new Error(`instances.${netId} must define at least one currency`);
|
|
228
|
+
}
|
|
229
|
+
const poolAddresses = new Set();
|
|
230
|
+
for (const [currencyName, currency] of currencyEntries) {
|
|
231
|
+
assertCurrency(currency, `instances.${netId}.${currencyName}`, poolAddresses);
|
|
232
|
+
}
|
|
233
|
+
const network = input.networkConfigByNetId[netId];
|
|
234
|
+
assertNetwork(network, poolAddresses, netId);
|
|
235
|
+
assertFdsTokenAliases(network, currencies, netId);
|
|
236
|
+
}
|
|
231
237
|
}
|
|
232
238
|
//# sourceMappingURL=assertions.js.map
|
package/dist/assertions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n SEPOLIA_NET_ID,\r\n SUPPORTED_NET_IDS,\r\n type InstanceCurrency,\r\n type MixerXConfig,\r\n type NetworkConfig,\r\n type NetworkContractsConfig,\r\n} from './types.js';\r\n\r\nconst EVM_ADDRESS_PATTERN = /^0x[0-9a-fA-F]{40}$/u;\nconst ZERO_EVM_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst DECIMAL_DENOMINATION_PATTERN = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\r\nconst TOKEN_SYMBOL_PATTERN = /^[A-Za-z0-9._-]{1,16}$/u;\nconst MAX_TOKEN_DECIMALS = 36;\nconst CONTRACT_KEYS = [\n 'aggregator',\r\n 'config',\r\n 'erc20PoolFactory',\r\n 'ensRegistryAddress',\r\n 'ethPoolFactory',\r\n 'fds',\r\n 'feeManager',\r\n 'hasher',\r\n 'huffVerifier',\r\n 'instanceRegistry',\r\n 'mixerXRouter',\r\n 'noteBackup',\r\n 'offchainOracleAddress',\r\n 'pauser',\r\n 'relayerRegistry',\r\n 'relayerRegistryAddress',\r\n 'roles',\r\n 'verifier',\r\n] as const satisfies readonly (keyof NetworkContractsConfig)[];\nconst CONTRACT_DEPLOYMENT_BLOCK_KEYS = [\n 'erc20PoolFactoryDeploymentBlock',\n 'ensRegistryDeploymentBlock',\n 'ethPoolFactoryDeploymentBlock',\n 'instanceRegistryDeploymentBlock',\n 'relayerRegistryDeploymentBlock',\n] as const satisfies readonly (keyof NetworkContractsConfig)[];\nconst SUPPORTED_CONTRACT_KEYS = new Set<string>([\n ...CONTRACT_KEYS,\n ...CONTRACT_DEPLOYMENT_BLOCK_KEYS,\n]);\n\r\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\r\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\r\n throw new Error(`${label} must be an object`);\r\n }\r\n}\r\n\r\nfunction assertEvmAddress(value: unknown, label: string): asserts value is `0x${string}` {\n if (typeof value !== 'string' || !EVM_ADDRESS_PATTERN.test(value)) {\n throw new Error(`${label} must be a 20-byte EVM address`);\n }\n if (value.toLowerCase() === ZERO_EVM_ADDRESS) {\n throw new Error(`${label} must not be the zero address`);\n }\n}\n\r\nfunction assertPositiveInteger(value: unknown, label: string): asserts value is number {\r\n if (!Number.isSafeInteger(value) || (value as number) <= 0) {\r\n throw new Error(`${label} must be a positive integer`);\r\n }\r\n}\r\n\r\nfunction assertDecimals(value: unknown, label: string): asserts value is number {\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_TOKEN_DECIMALS) {\n throw new Error(`${label} must be an integer from 0 to ${MAX_TOKEN_DECIMALS}`);\n }\n}\n\nfunction assertTokenSymbol(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || !TOKEN_SYMBOL_PATTERN.test(value)) {\n throw new Error(`${label} must be a 1 to 16 character token symbol`);\n }\n}\n\nfunction compareDecimalDenominations(left: string, right: string): number {\n const [leftInteger = '', leftFraction = ''] = left.split('.');\n const [rightInteger = '', rightFraction = ''] = right.split('.');\n if (leftInteger.length !== rightInteger.length) {\n return leftInteger.length - rightInteger.length;\n }\n if (leftInteger !== rightInteger) {\n return leftInteger < rightInteger ? -1 : 1;\n }\n\n const fractionLength = Math.max(leftFraction.length, rightFraction.length);\n const normalizedLeftFraction = leftFraction.padEnd(fractionLength, '0');\n const normalizedRightFraction = rightFraction.padEnd(fractionLength, '0');\n if (normalizedLeftFraction === normalizedRightFraction) {\n return 0;\n }\n return normalizedLeftFraction < normalizedRightFraction ? -1 : 1;\n}\n\r\nfunction assertCurrency(\r\n currency: unknown,\r\n label: string,\r\n poolAddresses: Set<string>,\r\n): asserts currency is InstanceCurrency {\r\n assertRecord(currency, label);\r\n if (currency.assetType !== 'native' && currency.assetType !== 'erc20') {\r\n throw new Error(`${label}.assetType must be native or erc20`);\r\n }\r\n assertTokenSymbol(currency.symbol, `${label}.symbol`);\n assertDecimals(currency.decimals, `${label}.decimals`);\r\n if (!Array.isArray(currency.denominations) || currency.denominations.length === 0) {\r\n throw new Error(`${label}.denominations must be a non-empty array`);\r\n }\r\n assertRecord(currency.instanceAddress, `${label}.instanceAddress`);\r\n assertRecord(currency.deploymentBlock, `${label}.deploymentBlock`);\r\n const pools = Object.entries(currency.instanceAddress);\r\n if (pools.length === 0) {\r\n throw new Error(`${label} must define at least one pool`);\r\n }\r\n if (currency.assetType === 'erc20') {\r\n assertEvmAddress(currency.tokenAddress, `${label}.tokenAddress`);\r\n } else if ('tokenAddress' in currency) {\r\n throw new Error(`${label} native currency cannot define tokenAddress`);\r\n }\r\n\r\n const denominationKeys = new Set(pools.map(([denomination]) => denomination));\r\n if (\r\n new Set(currency.denominations).size !== currency.denominations.length ||\r\n currency.denominations.some((denomination) => !denominationKeys.has(denomination)) ||\r\n currency.denominations.length !== denominationKeys.size\r\n ) {\r\n throw new Error(`${label}.denominations must list each configured pool exactly once`);\r\n }\r\n\r\n for (const [denomination, address] of pools) {\n if (denomination !== 'custom' && !DECIMAL_DENOMINATION_PATTERN.test(denomination)) {\r\n throw new Error(`${label}.${denomination} is not a valid denomination`);\r\n }\r\n assertEvmAddress(address, `${label}.instanceAddress.${denomination}`);\r\n const normalized = address.toLowerCase();\r\n if (poolAddresses.has(normalized)) {\r\n throw new Error(`Duplicate pool address ${address}`);\r\n }\r\n poolAddresses.add(normalized);\r\n assertPositiveInteger(\n currency.deploymentBlock[denomination],\n `${label}.deploymentBlock.${denomination}`,\n );\n }\n\n const expectedOrder = [...denominationKeys].sort((left, right) => {\n if (left === 'custom') {\n return 1;\n }\n if (right === 'custom') {\n return -1;\n }\n return compareDecimalDenominations(left, right);\n });\n if (currency.denominations.some((denomination, index) => denomination !== expectedOrder[index])) {\n throw new Error(`${label}.denominations must be in ascending numeric order with custom last`);\n }\n}\n\r\nfunction assertNetwork(\n network: unknown,\r\n poolAddresses: Set<string>,\r\n): asserts network is NetworkConfig {\r\n assertRecord(network, `networkConfigByNetId.${SEPOLIA_NET_ID}`);\n assertRecord(network.contracts, `networkConfigByNetId.${SEPOLIA_NET_ID}.contracts`);\n assertRecord(network.tokens, `networkConfigByNetId.${SEPOLIA_NET_ID}.tokens`);\n const unknownContractKey = Object.keys(network.contracts).find(\n (key) => !SUPPORTED_CONTRACT_KEYS.has(key),\n );\n if (unknownContractKey) {\n throw new Error(`sepolia.contracts contains unsupported key ${unknownContractKey}`);\n }\n for (const key of CONTRACT_KEYS) {\n assertEvmAddress(network.contracts[key], `sepolia.contracts.${key}`);\n }\n const contractAddressRoles = new Map<string, string>();\n for (const key of CONTRACT_KEYS) {\n if (key === 'relayerRegistryAddress') {\n continue;\n }\n const contractAddress = network.contracts[key];\n assertEvmAddress(contractAddress, `sepolia.contracts.${key}`);\n const normalizedAddress = contractAddress.toLowerCase();\n const existingRole = contractAddressRoles.get(normalizedAddress);\n if (existingRole) {\n throw new Error(`Sepolia contract roles ${key} and ${existingRole} must not share an address`);\n }\n if (poolAddresses.has(normalizedAddress)) {\n if (key === 'mixerXRouter') {\n throw new Error('Sepolia router address must not equal a pool address');\n }\n throw new Error(`Sepolia contract ${key} address must not equal a pool address`);\n }\n contractAddressRoles.set(normalizedAddress, key);\n }\n assertPositiveInteger(\r\n network.contracts.relayerRegistryDeploymentBlock,\r\n 'sepolia.contracts.relayerRegistryDeploymentBlock',\r\n );\r\n assertPositiveInteger(\r\n network.contracts.ensRegistryDeploymentBlock,\r\n 'sepolia.contracts.ensRegistryDeploymentBlock',\r\n );\r\n assertPositiveInteger(\r\n network.contracts.instanceRegistryDeploymentBlock,\r\n 'sepolia.contracts.instanceRegistryDeploymentBlock',\r\n );\r\n assertPositiveInteger(\r\n network.contracts.ethPoolFactoryDeploymentBlock,\r\n 'sepolia.contracts.ethPoolFactoryDeploymentBlock',\r\n );\r\n assertPositiveInteger(\r\n network.contracts.erc20PoolFactoryDeploymentBlock,\r\n 'sepolia.contracts.erc20PoolFactoryDeploymentBlock',\r\n );\r\n if (\r\n String(network.contracts.relayerRegistry).toLowerCase() !==\r\n String(network.contracts.relayerRegistryAddress).toLowerCase()\r\n ) {\r\n throw new Error('Sepolia relayer registry aliases must resolve to the same address');\r\n }\r\n const routerAddress = network.contracts.mixerXRouter;\r\n assertEvmAddress(routerAddress, 'sepolia.contracts.mixerXRouter');\r\n assertEvmAddress(network.tokens.mixerXTokenAddress, 'sepolia.tokens.mixerXTokenAddress');\r\n assertEvmAddress(\r\n network.tokens.wrappedStablecoinAddress,\r\n 'sepolia.tokens.wrappedStablecoinAddress',\r\n );\r\n assertTokenSymbol(network.tokens.mixerXTokenSymbol, 'sepolia.tokens.mixerXTokenSymbol');\n assertDecimals(network.tokens.mixerXTokenDecimals, 'sepolia.tokens.mixerXTokenDecimals');\n}\n\nfunction assertFdsTokenAliases(\n network: NetworkConfig,\n currencies: Record<string, unknown>,\n): void {\n const fdsCurrency = currencies.fds;\n assertRecord(fdsCurrency, `instances.${SEPOLIA_NET_ID}.fds`);\n assertEvmAddress(fdsCurrency.tokenAddress, `instances.${SEPOLIA_NET_ID}.fds.tokenAddress`);\n\n const addresses = [\n network.contracts.fds,\n network.tokens.mixerXTokenAddress,\n network.tokens.wrappedStablecoinAddress,\n fdsCurrency.tokenAddress,\n ];\n if (new Set(addresses.map((address) => address.toLowerCase())).size !== 1) {\n throw new Error('Sepolia FDS address aliases must resolve to the same address');\n }\n if (\n fdsCurrency.symbol !== network.tokens.mixerXTokenSymbol ||\n fdsCurrency.decimals !== network.tokens.mixerXTokenDecimals\n ) {\n throw new Error('Sepolia FDS symbol and decimals aliases must match');\n }\n}\n\r\nexport function assertValidConfigShape(input: unknown): asserts input is MixerXConfig {\r\n assertRecord(input, 'config');\r\n assertRecord(input.instances, 'instances');\r\n assertRecord(input.networkConfigByNetId, 'networkConfigByNetId');\r\n\r\n const configuredNetIds = Object.keys(input.networkConfigByNetId);\r\n if (\r\n configuredNetIds.length !== SUPPORTED_NET_IDS.length ||\r\n configuredNetIds[0] !== String(SEPOLIA_NET_ID)\r\n ) {\r\n throw new Error(`Only Sepolia network ${SEPOLIA_NET_ID} may be configured`);\r\n }\r\n const instanceNetIds = Object.keys(input.instances);\r\n if (\r\n instanceNetIds.length !== SUPPORTED_NET_IDS.length ||\r\n instanceNetIds[0] !== String(SEPOLIA_NET_ID)\r\n ) {\r\n throw new Error(`Only Sepolia network ${SEPOLIA_NET_ID} may define instances`);\r\n }\r\n const currencies = input.instances[SEPOLIA_NET_ID];\r\n assertRecord(currencies, `instances.${SEPOLIA_NET_ID}`);\r\n const currencyEntries = Object.entries(currencies);\r\n if (currencyEntries.length === 0) {\r\n throw new Error(`instances.${SEPOLIA_NET_ID} must define at least one currency`);\r\n }\r\n const poolAddresses = new Set<string>();\r\n for (const [currencyName, currency] of currencyEntries) {\r\n assertCurrency(currency, `instances.${SEPOLIA_NET_ID}.${currencyName}`, poolAddresses);\r\n }\r\n const network = input.networkConfigByNetId[SEPOLIA_NET_ID];\n assertNetwork(network, poolAddresses);\n assertFdsTokenAliases(network, currencies);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SEPOLIA_NET_ID,\n SUPPORTED_NET_IDS,\n type InstanceCurrency,\n type MixerXConfig,\n type NetworkConfig,\n type NetworkContractsConfig,\n} from './types.js';\n\nconst EVM_ADDRESS_PATTERN = /^0x[0-9a-fA-F]{40}$/u;\nconst ZERO_EVM_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst DECIMAL_DENOMINATION_PATTERN = /^(?:0|[1-9]\\d*)(?:\\.\\d+)?$/u;\nconst TOKEN_SYMBOL_PATTERN = /^[A-Za-z0-9._-]{1,16}$/u;\nconst MAX_TOKEN_DECIMALS = 36;\nconst CONTRACT_KEYS = [\n 'aggregator',\n 'config',\n 'erc20PoolFactory',\n 'ensRegistryAddress',\n 'ethPoolFactory',\n 'fds',\n 'feeManager',\n 'hasher',\n 'huffVerifier',\n 'instanceRegistry',\n 'mixerXRouter',\n 'noteBackup',\n 'offchainOracleAddress',\n 'pauser',\n 'relayerRegistry',\n 'relayerRegistryAddress',\n 'roles',\n 'verifier',\n] as const satisfies readonly (keyof NetworkContractsConfig)[];\nconst CONTRACT_DEPLOYMENT_BLOCK_KEYS = [\n 'erc20PoolFactoryDeploymentBlock',\n 'ensRegistryDeploymentBlock',\n 'ethPoolFactoryDeploymentBlock',\n 'instanceRegistryDeploymentBlock',\n 'relayerRegistryDeploymentBlock',\n] as const satisfies readonly (keyof NetworkContractsConfig)[];\nconst SUPPORTED_CONTRACT_KEYS = new Set<string>([\n ...CONTRACT_KEYS,\n ...CONTRACT_DEPLOYMENT_BLOCK_KEYS,\n]);\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${label} must be an object`);\n }\n}\n\nfunction assertEvmAddress(value: unknown, label: string): asserts value is `0x${string}` {\n if (typeof value !== 'string' || !EVM_ADDRESS_PATTERN.test(value)) {\n throw new Error(`${label} must be a 20-byte EVM address`);\n }\n if (value.toLowerCase() === ZERO_EVM_ADDRESS) {\n throw new Error(`${label} must not be the zero address`);\n }\n}\n\nfunction assertPositiveInteger(value: unknown, label: string): asserts value is number {\n if (!Number.isSafeInteger(value) || (value as number) <= 0) {\n throw new Error(`${label} must be a positive integer`);\n }\n}\n\nfunction assertDecimals(value: unknown, label: string): asserts value is number {\n if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > MAX_TOKEN_DECIMALS) {\n throw new Error(`${label} must be an integer from 0 to ${MAX_TOKEN_DECIMALS}`);\n }\n}\n\nfunction assertTokenSymbol(value: unknown, label: string): asserts value is string {\n if (typeof value !== 'string' || !TOKEN_SYMBOL_PATTERN.test(value)) {\n throw new Error(`${label} must be a 1 to 16 character token symbol`);\n }\n}\n\nfunction compareDecimalDenominations(left: string, right: string): number {\n const [leftInteger = '', leftFraction = ''] = left.split('.');\n const [rightInteger = '', rightFraction = ''] = right.split('.');\n if (leftInteger.length !== rightInteger.length) {\n return leftInteger.length - rightInteger.length;\n }\n if (leftInteger !== rightInteger) {\n return leftInteger < rightInteger ? -1 : 1;\n }\n\n const fractionLength = Math.max(leftFraction.length, rightFraction.length);\n const normalizedLeftFraction = leftFraction.padEnd(fractionLength, '0');\n const normalizedRightFraction = rightFraction.padEnd(fractionLength, '0');\n if (normalizedLeftFraction === normalizedRightFraction) {\n return 0;\n }\n return normalizedLeftFraction < normalizedRightFraction ? -1 : 1;\n}\n\nfunction assertCurrency(\n currency: unknown,\n label: string,\n poolAddresses: Set<string>,\n): asserts currency is InstanceCurrency {\n assertRecord(currency, label);\n if (currency.assetType !== 'native' && currency.assetType !== 'erc20') {\n throw new Error(`${label}.assetType must be native or erc20`);\n }\n assertTokenSymbol(currency.symbol, `${label}.symbol`);\n assertDecimals(currency.decimals, `${label}.decimals`);\n if (!Array.isArray(currency.denominations) || currency.denominations.length === 0) {\n throw new Error(`${label}.denominations must be a non-empty array`);\n }\n assertRecord(currency.instanceAddress, `${label}.instanceAddress`);\n assertRecord(currency.deploymentBlock, `${label}.deploymentBlock`);\n const pools = Object.entries(currency.instanceAddress);\n if (pools.length === 0) {\n throw new Error(`${label} must define at least one pool`);\n }\n if (currency.assetType === 'erc20') {\n assertEvmAddress(currency.tokenAddress, `${label}.tokenAddress`);\n } else if ('tokenAddress' in currency) {\n throw new Error(`${label} native currency cannot define tokenAddress`);\n }\n\n const denominationKeys = new Set(pools.map(([denomination]) => denomination));\n if (\n new Set(currency.denominations).size !== currency.denominations.length ||\n currency.denominations.some((denomination) => !denominationKeys.has(denomination)) ||\n currency.denominations.length !== denominationKeys.size\n ) {\n throw new Error(`${label}.denominations must list each configured pool exactly once`);\n }\n\n for (const [denomination, address] of pools) {\n if (denomination !== 'custom' && !DECIMAL_DENOMINATION_PATTERN.test(denomination)) {\n throw new Error(`${label}.${denomination} is not a valid denomination`);\n }\n assertEvmAddress(address, `${label}.instanceAddress.${denomination}`);\n const normalized = address.toLowerCase();\n if (poolAddresses.has(normalized)) {\n throw new Error(`Duplicate pool address ${address}`);\n }\n poolAddresses.add(normalized);\n assertPositiveInteger(\n currency.deploymentBlock[denomination],\n `${label}.deploymentBlock.${denomination}`,\n );\n }\n\n const expectedOrder = [...denominationKeys].sort((left, right) => {\n if (left === 'custom') {\n return 1;\n }\n if (right === 'custom') {\n return -1;\n }\n return compareDecimalDenominations(left, right);\n });\n if (currency.denominations.some((denomination, index) => denomination !== expectedOrder[index])) {\n throw new Error(`${label}.denominations must be in ascending numeric order with custom last`);\n }\n}\n\nfunction assertNetwork(\n network: unknown,\n poolAddresses: Set<string>,\n netId: number,\n): asserts network is NetworkConfig {\n const label = netId === SEPOLIA_NET_ID ? 'sepolia' : `network ${netId}`;\n const name = netId === SEPOLIA_NET_ID ? 'Sepolia' : `Network ${netId}`;\n assertRecord(network, `networkConfigByNetId.${netId}`);\n assertRecord(network.contracts, `networkConfigByNetId.${netId}.contracts`);\n assertRecord(network.tokens, `networkConfigByNetId.${netId}.tokens`);\n const unknownContractKey = Object.keys(network.contracts).find(\n (key) => !SUPPORTED_CONTRACT_KEYS.has(key),\n );\n if (unknownContractKey) {\n throw new Error(`${label}.contracts contains unsupported key ${unknownContractKey}`);\n }\n for (const key of CONTRACT_KEYS) {\n assertEvmAddress(network.contracts[key], `${label}.contracts.${key}`);\n }\n const contractAddressRoles = new Map<string, string>();\n for (const key of CONTRACT_KEYS) {\n if (key === 'relayerRegistryAddress') {\n continue;\n }\n const contractAddress = network.contracts[key];\n assertEvmAddress(contractAddress, `${label}.contracts.${key}`);\n const normalizedAddress = contractAddress.toLowerCase();\n const existingRole = contractAddressRoles.get(normalizedAddress);\n if (existingRole) {\n throw new Error(`${name} contract roles ${key} and ${existingRole} must not share an address`);\n }\n if (poolAddresses.has(normalizedAddress)) {\n if (key === 'mixerXRouter') {\n throw new Error(`${name} router address must not equal a pool address`);\n }\n throw new Error(`${name} contract ${key} address must not equal a pool address`);\n }\n contractAddressRoles.set(normalizedAddress, key);\n }\n assertPositiveInteger(\n network.contracts.relayerRegistryDeploymentBlock,\n `${label}.contracts.relayerRegistryDeploymentBlock`,\n );\n assertPositiveInteger(\n network.contracts.ensRegistryDeploymentBlock,\n `${label}.contracts.ensRegistryDeploymentBlock`,\n );\n assertPositiveInteger(\n network.contracts.instanceRegistryDeploymentBlock,\n `${label}.contracts.instanceRegistryDeploymentBlock`,\n );\n assertPositiveInteger(\n network.contracts.ethPoolFactoryDeploymentBlock,\n `${label}.contracts.ethPoolFactoryDeploymentBlock`,\n );\n assertPositiveInteger(\n network.contracts.erc20PoolFactoryDeploymentBlock,\n `${label}.contracts.erc20PoolFactoryDeploymentBlock`,\n );\n if (\n String(network.contracts.relayerRegistry).toLowerCase() !==\n String(network.contracts.relayerRegistryAddress).toLowerCase()\n ) {\n throw new Error(`${name} relayer registry aliases must resolve to the same address`);\n }\n const routerAddress = network.contracts.mixerXRouter;\n assertEvmAddress(routerAddress, `${label}.contracts.mixerXRouter`);\n assertEvmAddress(network.tokens.mixerXTokenAddress, `${label}.tokens.mixerXTokenAddress`);\n assertEvmAddress(\n network.tokens.wrappedStablecoinAddress,\n `${label}.tokens.wrappedStablecoinAddress`,\n );\n assertTokenSymbol(network.tokens.mixerXTokenSymbol, `${label}.tokens.mixerXTokenSymbol`);\n assertDecimals(network.tokens.mixerXTokenDecimals, `${label}.tokens.mixerXTokenDecimals`);\n}\n\nfunction assertFdsTokenAliases(\n network: NetworkConfig,\n currencies: Record<string, unknown>,\n netId: number,\n): void {\n const name = netId === SEPOLIA_NET_ID ? 'Sepolia' : `Network ${netId}`;\n const fdsCurrency = currencies.fds;\n assertRecord(fdsCurrency, `instances.${netId}.fds`);\n assertEvmAddress(fdsCurrency.tokenAddress, `instances.${netId}.fds.tokenAddress`);\n\n const addresses = [\n network.contracts.fds,\n network.tokens.mixerXTokenAddress,\n network.tokens.wrappedStablecoinAddress,\n fdsCurrency.tokenAddress,\n ];\n if (new Set(addresses.map((address) => address.toLowerCase())).size !== 1) {\n throw new Error(`${name} FDS address aliases must resolve to the same address`);\n }\n if (\n fdsCurrency.symbol !== network.tokens.mixerXTokenSymbol ||\n fdsCurrency.decimals !== network.tokens.mixerXTokenDecimals\n ) {\n throw new Error(`${name} FDS symbol and decimals aliases must match`);\n }\n}\n\nexport function assertValidConfigShape(input: unknown): asserts input is MixerXConfig {\n assertRecord(input, 'config');\n assertRecord(input.instances, 'instances');\n assertRecord(input.networkConfigByNetId, 'networkConfigByNetId');\n\n const expectedNetIds = SUPPORTED_NET_IDS.map(String);\n for (const [label, catalogue] of [\n ['networkConfigByNetId', input.networkConfigByNetId],\n ['instances', input.instances],\n ] as const) {\n const configuredNetIds = Object.keys(catalogue);\n if (\n configuredNetIds.length !== expectedNetIds.length ||\n configuredNetIds.some((netId) => !expectedNetIds.includes(netId))\n ) {\n throw new Error(`${label} must configure exactly networks ${expectedNetIds.join(', ')}`);\n }\n }\n for (const netId of SUPPORTED_NET_IDS) {\n const currencies = input.instances[netId];\n assertRecord(currencies, `instances.${netId}`);\n const currencyEntries = Object.entries(currencies);\n if (currencyEntries.length === 0) {\n throw new Error(`instances.${netId} must define at least one currency`);\n }\n const poolAddresses = new Set<string>();\n for (const [currencyName, currency] of currencyEntries) {\n assertCurrency(currency, `instances.${netId}.${currencyName}`, poolAddresses);\n }\n const network = input.networkConfigByNetId[netId];\n assertNetwork(network, poolAddresses, netId);\n assertFdsTokenAliases(network, currencies, netId);\n }\n}\n"]}
|
package/dist/config.js
CHANGED
|
@@ -7,7 +7,7 @@ const guards_js_1 = require("./guards.js");
|
|
|
7
7
|
const types_js_1 = require("./types.js");
|
|
8
8
|
const frozenRecord = (value) => Object.freeze(Object.assign(Object.create(null), value));
|
|
9
9
|
const address = (value) => value;
|
|
10
|
-
const
|
|
10
|
+
const sepoliaEth = frozenRecord({
|
|
11
11
|
assetType: 'native',
|
|
12
12
|
decimals: 18,
|
|
13
13
|
denominations: Object.freeze(['0.1', '1', '10', '100']),
|
|
@@ -25,7 +25,7 @@ const eth = frozenRecord({
|
|
|
25
25
|
}),
|
|
26
26
|
symbol: 'ETH',
|
|
27
27
|
});
|
|
28
|
-
const
|
|
28
|
+
const sepoliaFds = frozenRecord({
|
|
29
29
|
assetType: 'erc20',
|
|
30
30
|
decimals: 18,
|
|
31
31
|
denominations: Object.freeze(['100', '1000', '10000', '100000']),
|
|
@@ -44,8 +44,50 @@ const fds = frozenRecord({
|
|
|
44
44
|
symbol: 'FDS',
|
|
45
45
|
tokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
46
46
|
});
|
|
47
|
-
const sepoliaInstances = frozenRecord({ eth, fds });
|
|
47
|
+
const sepoliaInstances = frozenRecord({ eth: sepoliaEth, fds: sepoliaFds });
|
|
48
|
+
// Mainnet owns separate placeholder records. Replace their values when verified
|
|
49
|
+
// deployments exist; changes to the Sepolia records must not alter this catalogue.
|
|
50
|
+
const mainnetEth = frozenRecord({
|
|
51
|
+
assetType: 'native',
|
|
52
|
+
decimals: 18,
|
|
53
|
+
denominations: Object.freeze(['0.1', '1', '10', '100']),
|
|
54
|
+
deploymentBlock: frozenRecord({
|
|
55
|
+
'0.1': 11_432_594,
|
|
56
|
+
'1': 11_432_595,
|
|
57
|
+
'10': 11_432_596,
|
|
58
|
+
'100': 11_432_597,
|
|
59
|
+
}),
|
|
60
|
+
instanceAddress: frozenRecord({
|
|
61
|
+
'0.1': address('0xAFE89CA19074E51c14a2BA007964942E2Ba80411'),
|
|
62
|
+
'1': address('0xd6D56d7a7057fEcE0cF62870e7D54f7699Cdd4c6'),
|
|
63
|
+
'10': address('0x2130be75E060f4888b9B1d26E76B6Cf54Da746cd'),
|
|
64
|
+
'100': address('0x40D77F4D922515eC56f211662AEDe755a5711652'),
|
|
65
|
+
}),
|
|
66
|
+
symbol: 'ETH',
|
|
67
|
+
});
|
|
68
|
+
const mainnetFds = frozenRecord({
|
|
69
|
+
assetType: 'erc20',
|
|
70
|
+
decimals: 18,
|
|
71
|
+
denominations: Object.freeze(['100', '1000', '10000', '100000']),
|
|
72
|
+
deploymentBlock: frozenRecord({
|
|
73
|
+
'100': 11_432_598,
|
|
74
|
+
'1000': 11_432_599,
|
|
75
|
+
'10000': 11_432_600,
|
|
76
|
+
'100000': 11_432_601,
|
|
77
|
+
}),
|
|
78
|
+
instanceAddress: frozenRecord({
|
|
79
|
+
'100': address('0x286eDD82b6B710f50b1e3f2b638632ADf6A6AD1F'),
|
|
80
|
+
'1000': address('0xdC83d464F7C9cB0f4EbDA7De466Be5B91DacE2Cd'),
|
|
81
|
+
'10000': address('0x5C8da61018405c6de62bED7BB7347381EF2c2E04'),
|
|
82
|
+
'100000': address('0x7734799a883373578FA821341c10a1117da3558c'),
|
|
83
|
+
}),
|
|
84
|
+
symbol: 'FDS',
|
|
85
|
+
tokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
86
|
+
});
|
|
87
|
+
const mainnetInstances = frozenRecord({ eth: mainnetEth, fds: mainnetFds });
|
|
48
88
|
exports.instances = frozenRecord({
|
|
89
|
+
// Provisional mainnet catalogue: contracts are not deployed there yet.
|
|
90
|
+
[types_js_1.MAINNET_NET_ID]: mainnetInstances,
|
|
49
91
|
[types_js_1.SEPOLIA_NET_ID]: sepoliaInstances,
|
|
50
92
|
});
|
|
51
93
|
const sepoliaNetworkConfig = frozenRecord({
|
|
@@ -81,7 +123,43 @@ const sepoliaNetworkConfig = frozenRecord({
|
|
|
81
123
|
wrappedStablecoinAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
82
124
|
}),
|
|
83
125
|
});
|
|
126
|
+
// Independent mainnet placeholders, not aliases of the Sepolia network object.
|
|
127
|
+
const mainnetNetworkConfig = frozenRecord({
|
|
128
|
+
contracts: frozenRecord({
|
|
129
|
+
aggregator: address('0x3BA62b05179EBa79E0DFD41b160C29c901550D23'),
|
|
130
|
+
config: address('0x1D038b72Db729BBaC35f3cc5eFBCf8417c377909'),
|
|
131
|
+
erc20PoolFactory: address('0x5c1F8A3185b563799FfAF27429209d55D3d32cF5'),
|
|
132
|
+
erc20PoolFactoryDeploymentBlock: 11_472_901,
|
|
133
|
+
ensRegistryAddress: address('0x0b7EBb6ACE899Fcb22Df0742Bd9F830192E8a3e4'),
|
|
134
|
+
ensRegistryDeploymentBlock: 11_003_084,
|
|
135
|
+
ethPoolFactory: address('0x63D6aE1924d21A3Ae401063dd95D46C052E1328C'),
|
|
136
|
+
ethPoolFactoryDeploymentBlock: 11_472_900,
|
|
137
|
+
fds: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
138
|
+
feeManager: address('0x97856926A518a5CB1852445d43255A8BbeAE48d6'),
|
|
139
|
+
hasher: address('0xd7BA55CEbf2E06D8f67A8c30236D85d65aFA8612'),
|
|
140
|
+
huffVerifier: address('0x0d01b5B3a43ce89F7f076BE2b72f259Bc422312c'),
|
|
141
|
+
instanceRegistry: address('0x380312c818615C44984679623fb66d8f250e5A2f'),
|
|
142
|
+
instanceRegistryDeploymentBlock: 11_472_886,
|
|
143
|
+
mixerXRouter: address('0x2DB055DC5EDE42592A943e4ce430E18A85605506'),
|
|
144
|
+
noteBackup: address('0xb76f473f27CcbbacEd401dDb788dDa527F47ac46'),
|
|
145
|
+
offchainOracleAddress: address('0xF9c08FF64d019466EBaD54D5AACdEedEB6E564B8'),
|
|
146
|
+
pauser: address('0x4764F8698bb55C917F59d101b03799AF7131ffE4'),
|
|
147
|
+
relayerRegistry: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),
|
|
148
|
+
relayerRegistryAddress: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),
|
|
149
|
+
relayerRegistryDeploymentBlock: 11_432_581,
|
|
150
|
+
roles: address('0xE2e96273089589bdC8A4cd1f4d9A6F55744dB226'),
|
|
151
|
+
verifier: address('0x9D9bb12960e4E1640B78353ea1de488Af276a5A0'),
|
|
152
|
+
}),
|
|
153
|
+
tokens: frozenRecord({
|
|
154
|
+
mixerXTokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
155
|
+
mixerXTokenDecimals: 18,
|
|
156
|
+
mixerXTokenSymbol: 'FDS',
|
|
157
|
+
wrappedStablecoinAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),
|
|
158
|
+
}),
|
|
159
|
+
});
|
|
84
160
|
exports.networkConfigByNetId = frozenRecord({
|
|
161
|
+
// Addresses and blocks are placeholders copied from Sepolia, not deployment evidence.
|
|
162
|
+
[types_js_1.MAINNET_NET_ID]: mainnetNetworkConfig,
|
|
85
163
|
[types_js_1.SEPOLIA_NET_ID]: sepoliaNetworkConfig,
|
|
86
164
|
});
|
|
87
165
|
function getNetworkConfig(netId) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { isSupportedNetId } from './guards.js';\r\nimport {\r\n SEPOLIA_NET_ID,\r\n type EvmAddress,\r\n type InstanceCurrency,\r\n type Instances,\r\n type MixerXConfig,\r\n type NetworkConfig,\r\n} from './types.js';\r\n\r\nconst frozenRecord = <T extends object>(value: T): Readonly<T> =>\r\n Object.freeze(Object.assign(Object.create(null) as T, value));\r\n\r\nconst address = (value: string): EvmAddress => value as EvmAddress;\r\n\r\nconst eth = frozenRecord({\n assetType: 'native',\r\n decimals: 18,\r\n denominations: Object.freeze(['0.1', '1', '10', '100']),\n deploymentBlock: frozenRecord({\r\n '0.1': 11_432_594,\r\n '1': 11_432_595,\r\n '10': 11_432_596,\r\n '100': 11_432_597,\n }),\r\n instanceAddress: frozenRecord({\r\n '0.1': address('0xAFE89CA19074E51c14a2BA007964942E2Ba80411'),\r\n '1': address('0xd6D56d7a7057fEcE0cF62870e7D54f7699Cdd4c6'),\r\n '10': address('0x2130be75E060f4888b9B1d26E76B6Cf54Da746cd'),\r\n '100': address('0x40D77F4D922515eC56f211662AEDe755a5711652'),\n }),\r\n symbol: 'ETH',\r\n} as const satisfies InstanceCurrency);\r\n\r\nconst fds = frozenRecord({\n assetType: 'erc20',\r\n decimals: 18,\r\n denominations: Object.freeze(['100', '1000', '10000', '100000']),\n deploymentBlock: frozenRecord({\r\n '100': 11_432_598,\r\n '1000': 11_432_599,\r\n '10000': 11_432_600,\r\n '100000': 11_432_601,\n }),\r\n instanceAddress: frozenRecord({\r\n '100': address('0x286eDD82b6B710f50b1e3f2b638632ADf6A6AD1F'),\r\n '1000': address('0xdC83d464F7C9cB0f4EbDA7De466Be5B91DacE2Cd'),\r\n '10000': address('0x5C8da61018405c6de62bED7BB7347381EF2c2E04'),\r\n '100000': address('0x7734799a883373578FA821341c10a1117da3558c'),\n }),\r\n symbol: 'FDS',\r\n tokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\r\n} as const satisfies InstanceCurrency);\r\n\r\nconst sepoliaInstances = frozenRecord({ eth, fds });\r\n\r\nexport const instances: Instances = frozenRecord({\r\n [SEPOLIA_NET_ID]: sepoliaInstances,\r\n});\r\n\r\nconst sepoliaNetworkConfig: NetworkConfig = frozenRecord({\n contracts: frozenRecord({\n aggregator: address('0x3BA62b05179EBa79E0DFD41b160C29c901550D23'),\r\n config: address('0x1D038b72Db729BBaC35f3cc5eFBCf8417c377909'),\r\n erc20PoolFactory: address('0x5c1F8A3185b563799FfAF27429209d55D3d32cF5'),\r\n erc20PoolFactoryDeploymentBlock: 11_472_901,\r\n ensRegistryAddress: address('0x0b7EBb6ACE899Fcb22Df0742Bd9F830192E8a3e4'),\r\n ensRegistryDeploymentBlock: 11_003_084,\r\n ethPoolFactory: address('0x63D6aE1924d21A3Ae401063dd95D46C052E1328C'),\r\n ethPoolFactoryDeploymentBlock: 11_472_900,\r\n fds: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\r\n feeManager: address('0x97856926A518a5CB1852445d43255A8BbeAE48d6'),\r\n hasher: address('0xd7BA55CEbf2E06D8f67A8c30236D85d65aFA8612'),\r\n huffVerifier: address('0x0d01b5B3a43ce89F7f076BE2b72f259Bc422312c'),\r\n instanceRegistry: address('0x380312c818615C44984679623fb66d8f250e5A2f'),\r\n instanceRegistryDeploymentBlock: 11_472_886,\r\n mixerXRouter: address('0x2DB055DC5EDE42592A943e4ce430E18A85605506'),\r\n noteBackup: address('0xb76f473f27CcbbacEd401dDb788dDa527F47ac46'),\r\n offchainOracleAddress: address('0xF9c08FF64d019466EBaD54D5AACdEedEB6E564B8'),\r\n pauser: address('0x4764F8698bb55C917F59d101b03799AF7131ffE4'),\r\n relayerRegistry: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\r\n relayerRegistryAddress: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\r\n relayerRegistryDeploymentBlock: 11_432_581,\r\n roles: address('0xE2e96273089589bdC8A4cd1f4d9A6F55744dB226'),\r\n verifier: address('0x9D9bb12960e4E1640B78353ea1de488Af276a5A0'),\r\n }),\r\n tokens: frozenRecord({\n mixerXTokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\r\n mixerXTokenDecimals: 18,\r\n mixerXTokenSymbol: 'FDS',\r\n wrappedStablecoinAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\r\n }),\r\n});\r\n\r\nexport const networkConfigByNetId: MixerXConfig['networkConfigByNetId'] = frozenRecord({\r\n [SEPOLIA_NET_ID]: sepoliaNetworkConfig,\r\n});\r\n\r\nexport function getNetworkConfig(netId: number): NetworkConfig | undefined {\r\n return isSupportedNetId(netId) ? networkConfigByNetId[netId] : undefined;\r\n}\r\n\r\nexport function getInstancesForNetId(\r\n netId: number,\r\n): Readonly<Record<string, InstanceCurrency>> | undefined {\r\n return isSupportedNetId(netId) ? instances[netId] : undefined;\r\n}\r\n\r\nexport const config: MixerXConfig = frozenRecord({ instances, networkConfigByNetId });\n"]}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { isSupportedNetId } from './guards.js';\nimport {\n MAINNET_NET_ID,\n SEPOLIA_NET_ID,\n type EvmAddress,\n type InstanceCurrency,\n type Instances,\n type MixerXConfig,\n type NetworkConfig,\n} from './types.js';\n\nconst frozenRecord = <T extends object>(value: T): Readonly<T> =>\n Object.freeze(Object.assign(Object.create(null) as T, value));\n\nconst address = (value: string): EvmAddress => value as EvmAddress;\n\nconst sepoliaEth = frozenRecord({\n assetType: 'native',\n decimals: 18,\n denominations: Object.freeze(['0.1', '1', '10', '100']),\n deploymentBlock: frozenRecord({\n '0.1': 11_432_594,\n '1': 11_432_595,\n '10': 11_432_596,\n '100': 11_432_597,\n }),\n instanceAddress: frozenRecord({\n '0.1': address('0xAFE89CA19074E51c14a2BA007964942E2Ba80411'),\n '1': address('0xd6D56d7a7057fEcE0cF62870e7D54f7699Cdd4c6'),\n '10': address('0x2130be75E060f4888b9B1d26E76B6Cf54Da746cd'),\n '100': address('0x40D77F4D922515eC56f211662AEDe755a5711652'),\n }),\n symbol: 'ETH',\n} as const satisfies InstanceCurrency);\n\nconst sepoliaFds = frozenRecord({\n assetType: 'erc20',\n decimals: 18,\n denominations: Object.freeze(['100', '1000', '10000', '100000']),\n deploymentBlock: frozenRecord({\n '100': 11_432_598,\n '1000': 11_432_599,\n '10000': 11_432_600,\n '100000': 11_432_601,\n }),\n instanceAddress: frozenRecord({\n '100': address('0x286eDD82b6B710f50b1e3f2b638632ADf6A6AD1F'),\n '1000': address('0xdC83d464F7C9cB0f4EbDA7De466Be5B91DacE2Cd'),\n '10000': address('0x5C8da61018405c6de62bED7BB7347381EF2c2E04'),\n '100000': address('0x7734799a883373578FA821341c10a1117da3558c'),\n }),\n symbol: 'FDS',\n tokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n} as const satisfies InstanceCurrency);\n\nconst sepoliaInstances = frozenRecord({ eth: sepoliaEth, fds: sepoliaFds });\n\n// Mainnet owns separate placeholder records. Replace their values when verified\n// deployments exist; changes to the Sepolia records must not alter this catalogue.\nconst mainnetEth = frozenRecord({\n assetType: 'native',\n decimals: 18,\n denominations: Object.freeze(['0.1', '1', '10', '100']),\n deploymentBlock: frozenRecord({\n '0.1': 11_432_594,\n '1': 11_432_595,\n '10': 11_432_596,\n '100': 11_432_597,\n }),\n instanceAddress: frozenRecord({\n '0.1': address('0xAFE89CA19074E51c14a2BA007964942E2Ba80411'),\n '1': address('0xd6D56d7a7057fEcE0cF62870e7D54f7699Cdd4c6'),\n '10': address('0x2130be75E060f4888b9B1d26E76B6Cf54Da746cd'),\n '100': address('0x40D77F4D922515eC56f211662AEDe755a5711652'),\n }),\n symbol: 'ETH',\n} as const satisfies InstanceCurrency);\n\nconst mainnetFds = frozenRecord({\n assetType: 'erc20',\n decimals: 18,\n denominations: Object.freeze(['100', '1000', '10000', '100000']),\n deploymentBlock: frozenRecord({\n '100': 11_432_598,\n '1000': 11_432_599,\n '10000': 11_432_600,\n '100000': 11_432_601,\n }),\n instanceAddress: frozenRecord({\n '100': address('0x286eDD82b6B710f50b1e3f2b638632ADf6A6AD1F'),\n '1000': address('0xdC83d464F7C9cB0f4EbDA7De466Be5B91DacE2Cd'),\n '10000': address('0x5C8da61018405c6de62bED7BB7347381EF2c2E04'),\n '100000': address('0x7734799a883373578FA821341c10a1117da3558c'),\n }),\n symbol: 'FDS',\n tokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n} as const satisfies InstanceCurrency);\n\nconst mainnetInstances = frozenRecord({ eth: mainnetEth, fds: mainnetFds });\n\nexport const instances: Instances = frozenRecord({\n // Provisional mainnet catalogue: contracts are not deployed there yet.\n [MAINNET_NET_ID]: mainnetInstances,\n [SEPOLIA_NET_ID]: sepoliaInstances,\n});\n\nconst sepoliaNetworkConfig: NetworkConfig = frozenRecord({\n contracts: frozenRecord({\n aggregator: address('0x3BA62b05179EBa79E0DFD41b160C29c901550D23'),\n config: address('0x1D038b72Db729BBaC35f3cc5eFBCf8417c377909'),\n erc20PoolFactory: address('0x5c1F8A3185b563799FfAF27429209d55D3d32cF5'),\n erc20PoolFactoryDeploymentBlock: 11_472_901,\n ensRegistryAddress: address('0x0b7EBb6ACE899Fcb22Df0742Bd9F830192E8a3e4'),\n ensRegistryDeploymentBlock: 11_003_084,\n ethPoolFactory: address('0x63D6aE1924d21A3Ae401063dd95D46C052E1328C'),\n ethPoolFactoryDeploymentBlock: 11_472_900,\n fds: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n feeManager: address('0x97856926A518a5CB1852445d43255A8BbeAE48d6'),\n hasher: address('0xd7BA55CEbf2E06D8f67A8c30236D85d65aFA8612'),\n huffVerifier: address('0x0d01b5B3a43ce89F7f076BE2b72f259Bc422312c'),\n instanceRegistry: address('0x380312c818615C44984679623fb66d8f250e5A2f'),\n instanceRegistryDeploymentBlock: 11_472_886,\n mixerXRouter: address('0x2DB055DC5EDE42592A943e4ce430E18A85605506'),\n noteBackup: address('0xb76f473f27CcbbacEd401dDb788dDa527F47ac46'),\n offchainOracleAddress: address('0xF9c08FF64d019466EBaD54D5AACdEedEB6E564B8'),\n pauser: address('0x4764F8698bb55C917F59d101b03799AF7131ffE4'),\n relayerRegistry: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\n relayerRegistryAddress: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\n relayerRegistryDeploymentBlock: 11_432_581,\n roles: address('0xE2e96273089589bdC8A4cd1f4d9A6F55744dB226'),\n verifier: address('0x9D9bb12960e4E1640B78353ea1de488Af276a5A0'),\n }),\n tokens: frozenRecord({\n mixerXTokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n mixerXTokenDecimals: 18,\n mixerXTokenSymbol: 'FDS',\n wrappedStablecoinAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n }),\n});\n\n// Independent mainnet placeholders, not aliases of the Sepolia network object.\nconst mainnetNetworkConfig: NetworkConfig = frozenRecord({\n contracts: frozenRecord({\n aggregator: address('0x3BA62b05179EBa79E0DFD41b160C29c901550D23'),\n config: address('0x1D038b72Db729BBaC35f3cc5eFBCf8417c377909'),\n erc20PoolFactory: address('0x5c1F8A3185b563799FfAF27429209d55D3d32cF5'),\n erc20PoolFactoryDeploymentBlock: 11_472_901,\n ensRegistryAddress: address('0x0b7EBb6ACE899Fcb22Df0742Bd9F830192E8a3e4'),\n ensRegistryDeploymentBlock: 11_003_084,\n ethPoolFactory: address('0x63D6aE1924d21A3Ae401063dd95D46C052E1328C'),\n ethPoolFactoryDeploymentBlock: 11_472_900,\n fds: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n feeManager: address('0x97856926A518a5CB1852445d43255A8BbeAE48d6'),\n hasher: address('0xd7BA55CEbf2E06D8f67A8c30236D85d65aFA8612'),\n huffVerifier: address('0x0d01b5B3a43ce89F7f076BE2b72f259Bc422312c'),\n instanceRegistry: address('0x380312c818615C44984679623fb66d8f250e5A2f'),\n instanceRegistryDeploymentBlock: 11_472_886,\n mixerXRouter: address('0x2DB055DC5EDE42592A943e4ce430E18A85605506'),\n noteBackup: address('0xb76f473f27CcbbacEd401dDb788dDa527F47ac46'),\n offchainOracleAddress: address('0xF9c08FF64d019466EBaD54D5AACdEedEB6E564B8'),\n pauser: address('0x4764F8698bb55C917F59d101b03799AF7131ffE4'),\n relayerRegistry: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\n relayerRegistryAddress: address('0x486f1E74B0D907f1A50b3914E6D3709a71A017b7'),\n relayerRegistryDeploymentBlock: 11_432_581,\n roles: address('0xE2e96273089589bdC8A4cd1f4d9A6F55744dB226'),\n verifier: address('0x9D9bb12960e4E1640B78353ea1de488Af276a5A0'),\n }),\n tokens: frozenRecord({\n mixerXTokenAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n mixerXTokenDecimals: 18,\n mixerXTokenSymbol: 'FDS',\n wrappedStablecoinAddress: address('0xC1D4F78a8253943255a81eA9eAE14B3F12223B98'),\n }),\n});\n\nexport const networkConfigByNetId: MixerXConfig['networkConfigByNetId'] = frozenRecord({\n // Addresses and blocks are placeholders copied from Sepolia, not deployment evidence.\n [MAINNET_NET_ID]: mainnetNetworkConfig,\n [SEPOLIA_NET_ID]: sepoliaNetworkConfig,\n});\n\nexport function getNetworkConfig(netId: number): NetworkConfig | undefined {\n return isSupportedNetId(netId) ? networkConfigByNetId[netId] : undefined;\n}\n\nexport function getInstancesForNetId(\n netId: number,\n): Readonly<Record<string, InstanceCurrency>> | undefined {\n return isSupportedNetId(netId) ? instances[netId] : undefined;\n}\n\nexport const config: MixerXConfig = frozenRecord({ instances, networkConfigByNetId });\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export declare const MAINNET_NET_ID: 1;
|
|
1
2
|
export declare const SEPOLIA_NET_ID: 11155111;
|
|
2
|
-
export declare const SUPPORTED_NET_IDS: readonly [11155111];
|
|
3
|
+
export declare const SUPPORTED_NET_IDS: readonly [1, 11155111];
|
|
3
4
|
export type availableIds = (typeof SUPPORTED_NET_IDS)[number];
|
|
4
5
|
export type AvailableId = availableIds;
|
|
5
6
|
export type EvmAddress = `0x${string}`;
|
package/dist/types.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SUPPORTED_NET_IDS = exports.SEPOLIA_NET_ID = void 0;
|
|
3
|
+
exports.SUPPORTED_NET_IDS = exports.SEPOLIA_NET_ID = exports.MAINNET_NET_ID = void 0;
|
|
4
|
+
exports.MAINNET_NET_ID = 1;
|
|
4
5
|
exports.SEPOLIA_NET_ID = 11_155_111;
|
|
5
|
-
exports.SUPPORTED_NET_IDS = Object.freeze([exports.SEPOLIA_NET_ID]);
|
|
6
|
+
exports.SUPPORTED_NET_IDS = Object.freeze([exports.MAINNET_NET_ID, exports.SEPOLIA_NET_ID]);
|
|
6
7
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,UAAmB,CAAC;AACrC,QAAA,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAc,CAAU,CAAC,CAAC","sourcesContent":["export const SEPOLIA_NET_ID = 11_155_111 as const;\r\nexport const SUPPORTED_NET_IDS = Object.freeze([SEPOLIA_NET_ID] as const);\r\n\r\nexport type availableIds = (typeof SUPPORTED_NET_IDS)[number];\r\nexport type AvailableId = availableIds;\r\nexport type EvmAddress = `0x${string}`;\r\nexport type PoolKind = 'fixed' | 'custom';\r\nexport type PoolAssetType = 'native' | 'erc20';\r\n\r\nexport type NativeInstanceCurrency = Readonly<{\r\n assetType: 'native';\r\n decimals: number;\r\n denominations: readonly string[];\r\n deploymentBlock: Readonly<Record<string, number>>;\r\n instanceAddress: Readonly<Record<string, EvmAddress>>;\r\n symbol: string;\r\n}>;\r\n\r\nexport type Erc20InstanceCurrency = Readonly<{\r\n assetType: 'erc20';\r\n decimals: number;\r\n denominations: readonly string[];\r\n deploymentBlock: Readonly<Record<string, number>>;\r\n instanceAddress: Readonly<Record<string, EvmAddress>>;\r\n symbol: string;\r\n tokenAddress: EvmAddress;\r\n}>;\r\n\r\nexport type InstanceCurrency = NativeInstanceCurrency | Erc20InstanceCurrency;\r\nexport type CurrencyConfig = InstanceCurrency;\r\nexport type Instances = Readonly<Partial<Record<availableIds, Readonly<Record<string, InstanceCurrency>>>>>;\r\n\r\nexport type NetworkContractsConfig = Readonly<{\r\n aggregator: EvmAddress;\r\n config: EvmAddress;\r\n erc20PoolFactory: EvmAddress;\r\n erc20PoolFactoryDeploymentBlock: number;\r\n ensRegistryAddress: EvmAddress;\r\n ensRegistryDeploymentBlock: number;\r\n ethPoolFactory: EvmAddress;\r\n ethPoolFactoryDeploymentBlock: number;\r\n fds: EvmAddress;\r\n feeManager: EvmAddress;\r\n hasher: EvmAddress;\r\n huffVerifier: EvmAddress;\r\n instanceRegistry: EvmAddress;\r\n instanceRegistryDeploymentBlock: number;\r\n mixerXRouter: EvmAddress;\r\n noteBackup: EvmAddress;\r\n offchainOracleAddress: EvmAddress;\r\n pauser: EvmAddress;\r\n relayerRegistry: EvmAddress;\r\n relayerRegistryAddress: EvmAddress;\r\n relayerRegistryDeploymentBlock: number;\r\n roles: EvmAddress;\r\n verifier: EvmAddress;\r\n}>;\r\n\r\nexport type NetworkTokensConfig = Readonly<{\r\n mixerXTokenAddress: EvmAddress;\r\n mixerXTokenDecimals: number;\r\n mixerXTokenSymbol: string;\r\n wrappedStablecoinAddress: EvmAddress;\r\n}>;\r\n\r\nexport type NetworkConfig = Readonly<{\r\n contracts: NetworkContractsConfig;\r\n tokens: NetworkTokensConfig;\r\n}>;\r\n\r\nexport type MixerXConfig = Readonly<{\r\n instances: Instances;\r\n networkConfigByNetId: Readonly<Partial<Record<availableIds, NetworkConfig>>>;\r\n}>;\r\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,CAAU,CAAC;AAC5B,QAAA,cAAc,GAAG,UAAmB,CAAC;AACrC,QAAA,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAc,EAAE,sBAAc,CAAU,CAAC,CAAC","sourcesContent":["export const MAINNET_NET_ID = 1 as const;\r\nexport const SEPOLIA_NET_ID = 11_155_111 as const;\r\nexport const SUPPORTED_NET_IDS = Object.freeze([MAINNET_NET_ID, SEPOLIA_NET_ID] as const);\r\n\r\nexport type availableIds = (typeof SUPPORTED_NET_IDS)[number];\r\nexport type AvailableId = availableIds;\r\nexport type EvmAddress = `0x${string}`;\r\nexport type PoolKind = 'fixed' | 'custom';\r\nexport type PoolAssetType = 'native' | 'erc20';\r\n\r\nexport type NativeInstanceCurrency = Readonly<{\r\n assetType: 'native';\r\n decimals: number;\r\n denominations: readonly string[];\r\n deploymentBlock: Readonly<Record<string, number>>;\r\n instanceAddress: Readonly<Record<string, EvmAddress>>;\r\n symbol: string;\r\n}>;\r\n\r\nexport type Erc20InstanceCurrency = Readonly<{\r\n assetType: 'erc20';\r\n decimals: number;\r\n denominations: readonly string[];\r\n deploymentBlock: Readonly<Record<string, number>>;\r\n instanceAddress: Readonly<Record<string, EvmAddress>>;\r\n symbol: string;\r\n tokenAddress: EvmAddress;\r\n}>;\r\n\r\nexport type InstanceCurrency = NativeInstanceCurrency | Erc20InstanceCurrency;\r\nexport type CurrencyConfig = InstanceCurrency;\r\nexport type Instances = Readonly<Partial<Record<availableIds, Readonly<Record<string, InstanceCurrency>>>>>;\r\n\r\nexport type NetworkContractsConfig = Readonly<{\r\n aggregator: EvmAddress;\r\n config: EvmAddress;\r\n erc20PoolFactory: EvmAddress;\r\n erc20PoolFactoryDeploymentBlock: number;\r\n ensRegistryAddress: EvmAddress;\r\n ensRegistryDeploymentBlock: number;\r\n ethPoolFactory: EvmAddress;\r\n ethPoolFactoryDeploymentBlock: number;\r\n fds: EvmAddress;\r\n feeManager: EvmAddress;\r\n hasher: EvmAddress;\r\n huffVerifier: EvmAddress;\r\n instanceRegistry: EvmAddress;\r\n instanceRegistryDeploymentBlock: number;\r\n mixerXRouter: EvmAddress;\r\n noteBackup: EvmAddress;\r\n offchainOracleAddress: EvmAddress;\r\n pauser: EvmAddress;\r\n relayerRegistry: EvmAddress;\r\n relayerRegistryAddress: EvmAddress;\r\n relayerRegistryDeploymentBlock: number;\r\n roles: EvmAddress;\r\n verifier: EvmAddress;\r\n}>;\r\n\r\nexport type NetworkTokensConfig = Readonly<{\r\n mixerXTokenAddress: EvmAddress;\r\n mixerXTokenDecimals: number;\r\n mixerXTokenSymbol: string;\r\n wrappedStablecoinAddress: EvmAddress;\r\n}>;\r\n\r\nexport type NetworkConfig = Readonly<{\r\n contracts: NetworkContractsConfig;\r\n tokens: NetworkTokensConfig;\r\n}>;\r\n\r\nexport type MixerXConfig = Readonly<{\r\n instances: Instances;\r\n networkConfigByNetId: Readonly<Partial<Record<availableIds, NetworkConfig>>>;\r\n}>;\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@mixerx/config",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Validated, immutable
|
|
5
|
-
"license": "GPL-3.0-only",
|
|
6
|
-
"packageManager": "yarn@4.12.0",
|
|
7
|
-
"type": "commonjs",
|
|
8
|
-
"main": "dist/index.js",
|
|
9
|
-
"types": "dist/index.d.ts",
|
|
10
|
-
"sideEffects": [
|
|
11
|
-
"./dist/index.js",
|
|
12
|
-
"./dist/check-shape.js"
|
|
13
|
-
],
|
|
14
|
-
"engines": {
|
|
15
|
-
"node": ">=24.12.0"
|
|
16
|
-
},
|
|
17
|
-
"repository": {
|
|
18
|
-
"type": "git",
|
|
19
|
-
"url": "https://github.com/zkusd-mixerx/mixerx-config.git"
|
|
20
|
-
},
|
|
21
|
-
"keywords": [
|
|
22
|
-
"mixerx",
|
|
23
|
-
"sepolia",
|
|
24
|
-
"ethereum",
|
|
25
|
-
"configuration"
|
|
26
|
-
],
|
|
27
|
-
"exports": {
|
|
28
|
-
".": {
|
|
29
|
-
"types": "./dist/index.d.ts",
|
|
30
|
-
"default": "./dist/index.js"
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
"files": [
|
|
34
|
-
"dist"
|
|
35
|
-
],
|
|
36
|
-
"scripts": {
|
|
37
|
-
"test": "yarn build && yarn check:shape && node --test tests/*.test.mjs",
|
|
38
|
-
"build": "tsc -p tsconfig.json",
|
|
39
|
-
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
|
-
"check:shape": "node dist/check-shape.js",
|
|
41
|
-
"prepack": "yarn test"
|
|
42
|
-
},
|
|
43
|
-
"devDependencies": {
|
|
44
|
-
"@types/node": "^24.0.0",
|
|
45
|
-
"typescript": "^5.3.0"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@mixerx/config",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Validated, immutable MixerX contract and pool configuration for MixerX",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"packageManager": "yarn@4.12.0",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"sideEffects": [
|
|
11
|
+
"./dist/index.js",
|
|
12
|
+
"./dist/check-shape.js"
|
|
13
|
+
],
|
|
14
|
+
"engines": {
|
|
15
|
+
"node": ">=24.12.0"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/zkusd-mixerx/mixerx-config.git"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mixerx",
|
|
23
|
+
"sepolia",
|
|
24
|
+
"ethereum",
|
|
25
|
+
"configuration"
|
|
26
|
+
],
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"default": "./dist/index.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"test": "yarn build && yarn check:shape && node --test tests/*.test.mjs",
|
|
38
|
+
"build": "tsc -p tsconfig.json",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
|
+
"check:shape": "node dist/check-shape.js",
|
|
41
|
+
"prepack": "yarn test"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/node": "^24.0.0",
|
|
45
|
+
"typescript": "^5.3.0"
|
|
46
|
+
}
|
|
47
|
+
}
|