@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 CHANGED
@@ -1,15 +1,25 @@
1
1
  # @mixerx/config
2
2
 
3
- Validated, immutable MixerX protocol config for Sepolia only.
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
- This branch deliberately contains no Ethereum mainnet or Tornado Cash catalogue.
11
- Mainnet must not be enabled until MixerX deployment addresses, blocks and a legal
12
- review are supplied and tested as a separate network configuration.
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
 
@@ -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
- assertRecord(network, `networkConfigByNetId.${types_js_1.SEPOLIA_NET_ID}`);
141
- assertRecord(network.contracts, `networkConfigByNetId.${types_js_1.SEPOLIA_NET_ID}.contracts`);
142
- assertRecord(network.tokens, `networkConfigByNetId.${types_js_1.SEPOLIA_NET_ID}.tokens`);
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(`sepolia.contracts contains unsupported key ${unknownContractKey}`);
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], `sepolia.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, `sepolia.contracts.${key}`);
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(`Sepolia contract roles ${key} and ${existingRole} must not share an address`);
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('Sepolia router address must not equal a pool address');
166
+ throw new Error(`${name} router address must not equal a pool address`);
165
167
  }
166
- throw new Error(`Sepolia contract ${key} address must not equal a pool address`);
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, 'sepolia.contracts.relayerRegistryDeploymentBlock');
171
- assertPositiveInteger(network.contracts.ensRegistryDeploymentBlock, 'sepolia.contracts.ensRegistryDeploymentBlock');
172
- assertPositiveInteger(network.contracts.instanceRegistryDeploymentBlock, 'sepolia.contracts.instanceRegistryDeploymentBlock');
173
- assertPositiveInteger(network.contracts.ethPoolFactoryDeploymentBlock, 'sepolia.contracts.ethPoolFactoryDeploymentBlock');
174
- assertPositiveInteger(network.contracts.erc20PoolFactoryDeploymentBlock, 'sepolia.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('Sepolia relayer registry aliases must resolve to the same address');
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, 'sepolia.contracts.mixerXRouter');
181
- assertEvmAddress(network.tokens.mixerXTokenAddress, 'sepolia.tokens.mixerXTokenAddress');
182
- assertEvmAddress(network.tokens.wrappedStablecoinAddress, 'sepolia.tokens.wrappedStablecoinAddress');
183
- assertTokenSymbol(network.tokens.mixerXTokenSymbol, 'sepolia.tokens.mixerXTokenSymbol');
184
- assertDecimals(network.tokens.mixerXTokenDecimals, 'sepolia.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.${types_js_1.SEPOLIA_NET_ID}.fds`);
189
- assertEvmAddress(fdsCurrency.tokenAddress, `instances.${types_js_1.SEPOLIA_NET_ID}.fds.tokenAddress`);
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('Sepolia FDS address aliases must resolve to the same address');
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('Sepolia FDS symbol and decimals aliases must match');
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 configuredNetIds = Object.keys(input.networkConfigByNetId);
209
- if (configuredNetIds.length !== types_js_1.SUPPORTED_NET_IDS.length ||
210
- configuredNetIds[0] !== String(types_js_1.SEPOLIA_NET_ID)) {
211
- throw new Error(`Only Sepolia network ${types_js_1.SEPOLIA_NET_ID} may be configured`);
212
- }
213
- const instanceNetIds = Object.keys(input.instances);
214
- if (instanceNetIds.length !== types_js_1.SUPPORTED_NET_IDS.length ||
215
- instanceNetIds[0] !== String(types_js_1.SEPOLIA_NET_ID)) {
216
- throw new Error(`Only Sepolia network ${types_js_1.SEPOLIA_NET_ID} may define instances`);
217
- }
218
- const currencies = input.instances[types_js_1.SEPOLIA_NET_ID];
219
- assertRecord(currencies, `instances.${types_js_1.SEPOLIA_NET_ID}`);
220
- const currencyEntries = Object.entries(currencies);
221
- if (currencyEntries.length === 0) {
222
- throw new Error(`instances.${types_js_1.SEPOLIA_NET_ID} must define at least one currency`);
223
- }
224
- const poolAddresses = new Set();
225
- for (const [currencyName, currency] of currencyEntries) {
226
- assertCurrency(currency, `instances.${types_js_1.SEPOLIA_NET_ID}.${currencyName}`, poolAddresses);
227
- }
228
- const network = input.networkConfigByNetId[types_js_1.SEPOLIA_NET_ID];
229
- assertNetwork(network, poolAddresses);
230
- assertFdsTokenAliases(network, currencies);
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
@@ -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 eth = frozenRecord({
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 fds = frozenRecord({
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) {
@@ -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.0.0",
4
- "description": "Validated, immutable Sepolia 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
- }
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
+ }