@getpara/shared 1.6.0 → 1.8.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.
@@ -25,22 +25,124 @@ export function formatCurrency(value, { fallback = '' } = {}) {
25
25
  }
26
26
  export function formatAssetQuantity({ quantity, symbol = '', decimals, fallback = '', }) {
27
27
  try {
28
- if (quantity == null) {
28
+ if (quantity === undefined || isNaN(Number(quantity))) {
29
29
  return fallback;
30
30
  }
31
+ const num = Number(quantity);
31
32
  const formatter = new Intl.NumberFormat('en-US', {
32
33
  style: 'decimal',
33
- maximumFractionDigits: decimals ?? (Math.abs(quantity) < 0.001 ? 6 : 3),
34
- minimumFractionDigits: decimals ?? 3,
34
+ maximumFractionDigits: decimals ?? (Math.abs(num) < 0.001 ? 6 : 3),
35
+ minimumFractionDigits: 0,
35
36
  });
36
37
  const formattedQuantity = quantity === 0
37
38
  ? '0'
38
- : Math.abs(quantity) < 10 ** (-1 * (decimals ?? 6))
39
+ : Math.abs(num) < 10 ** (-1 * (decimals ?? 6))
39
40
  ? zeroAssetFormatter.format(0)
40
- : formatter.format(quantity);
41
+ : formatter.format(num);
41
42
  return `${formattedQuantity}${symbol && symbol.length > 0 ? ` ${symbol}` : ''}`;
42
43
  }
43
44
  catch (_e) {
44
45
  return fallback;
45
46
  }
46
47
  }
48
+ const buildCustomAssetId = (symbol) => `custom_${symbol}`;
49
+ const isNonNullable = (value) => value !== null;
50
+ export function filterWalletBalance(balance, config) {
51
+ if (config.isComprehensive) {
52
+ return balance;
53
+ }
54
+ const requestType = config.requestType ?? 'MAINNET';
55
+ let filteredAssets = balance.assets;
56
+ let filteredNetworks = balance.networks;
57
+ if (requestType !== 'MAINNET_AND_TESTNET') {
58
+ const includeTestnet = requestType === 'TESTNET';
59
+ filteredAssets = balance.assets
60
+ .map((asset) => {
61
+ const filteredAssetNetworks = asset.networks.filter((network) => {
62
+ const networkIsTestnet = network.metadata?.isTestnet ?? false;
63
+ return includeTestnet ? networkIsTestnet : !networkIsTestnet;
64
+ });
65
+ if (filteredAssetNetworks.length === 0) {
66
+ return null;
67
+ }
68
+ const quantity = filteredAssetNetworks.reduce((sum, n) => sum + n.quantity, 0);
69
+ const value = filteredAssetNetworks.reduce((sum, n) => sum + (n.value?.value ?? 0), 0);
70
+ return {
71
+ ...asset,
72
+ quantity,
73
+ networks: filteredAssetNetworks,
74
+ ...(asset.value ? { value: { value, currency: asset.value.currency } } : {}),
75
+ };
76
+ })
77
+ .filter(isNonNullable);
78
+ filteredNetworks = balance.networks
79
+ .map((network) => {
80
+ const networkIsTestnet = network.metadata?.isTestnet ?? false;
81
+ if (includeTestnet !== networkIsTestnet) {
82
+ return null;
83
+ }
84
+ const value = network.assets.reduce((sum, a) => sum + (a.value?.value ?? 0), 0);
85
+ return {
86
+ ...network,
87
+ assets: network.assets,
88
+ ...(network.value ? { value: { value, currency: network.value.currency } } : {}),
89
+ };
90
+ })
91
+ .filter(isNonNullable);
92
+ }
93
+ if (config.displayType === 'AGGREGATED' && config.excludeStandardAssets) {
94
+ filteredAssets = filteredAssets.filter((asset) => asset.metadata?.customAssetId !== undefined);
95
+ filteredNetworks = filteredNetworks
96
+ .map((network) => {
97
+ const filteredNetworkAssets = network.assets.filter((asset) => asset.metadata?.customAssetId !== undefined);
98
+ if (filteredNetworkAssets.length === 0) {
99
+ return null;
100
+ }
101
+ const value = filteredNetworkAssets.reduce((sum, a) => sum + (a.value?.value ?? 0), 0);
102
+ return {
103
+ ...network,
104
+ assets: filteredNetworkAssets,
105
+ ...(network.value ? { value: { value, currency: network.value.currency } } : {}),
106
+ };
107
+ })
108
+ .filter(isNonNullable);
109
+ }
110
+ if (config.displayType === 'CUSTOM_ASSET') {
111
+ const targetCustomAssetId = buildCustomAssetId(config.asset.symbol);
112
+ const matchesCustomAsset = (metadata) => {
113
+ if (metadata?.customAssetId) {
114
+ return metadata.customAssetId === targetCustomAssetId;
115
+ }
116
+ return metadata?.symbol === config.asset.symbol;
117
+ };
118
+ filteredAssets = filteredAssets.filter((asset) => matchesCustomAsset(asset.metadata));
119
+ filteredNetworks = filteredNetworks
120
+ .map((network) => {
121
+ const matchingAssets = network.assets.filter((asset) => matchesCustomAsset(asset.metadata));
122
+ if (matchingAssets.length === 0) {
123
+ return null;
124
+ }
125
+ return {
126
+ ...network,
127
+ assets: matchingAssets,
128
+ };
129
+ })
130
+ .filter(isNonNullable);
131
+ }
132
+ const totalValue = filteredAssets.reduce((sum, asset) => sum + (asset.value?.value ?? 0), 0);
133
+ return {
134
+ ...balance,
135
+ assets: filteredAssets,
136
+ networks: filteredNetworks,
137
+ ...(balance.value ? { value: { value: totalValue, currency: balance.value.currency } } : {}),
138
+ };
139
+ }
140
+ export function filterProfileBalance(balance, config) {
141
+ const filteredWallets = balance.wallets.map((wallet) => filterWalletBalance(wallet, config));
142
+ const totalValue = filteredWallets.reduce((sum, wallet) => sum + (wallet.value?.value ?? 0), 0);
143
+ return {
144
+ ...balance,
145
+ wallets: filteredWallets,
146
+ ...(balance.value ? { value: { value: totalValue, currency: balance.value.currency } } : {}),
147
+ };
148
+ }
@@ -1,15 +1,425 @@
1
1
  export const NETWORK_METADATA = [
2
- { evmChainId: '11155111', internalId: 'SEPOLIA', zerionId: 'ethereum-sepolia', name: 'Sepolia' },
3
- { evmChainId: '1', internalId: 'ETHEREUM', zerionId: 'ethereum', name: 'Ethereum' },
4
- { evmChainId: '137', internalId: 'POLYGON', zerionId: 'polygon', name: 'Polygon' },
5
- { evmChainId: '42220', internalId: 'CELO', zerionId: 'celo', name: 'Celo' },
6
- { evmChainId: '8453', internalId: 'BASE', zerionId: 'base', name: 'Base' },
7
- { evmChainId: '42161', internalId: 'ARBITRUM', zerionId: 'arbitrum', name: 'Arbitrum' },
8
- { evmChainId: '10', internalId: 'OPTIMISM', zerionId: 'optimism', name: 'Optimism' },
9
- { evmChainId: '80094', internalId: 'BERACHAIN', zerionId: 'berachain', name: 'Berachain' },
10
- { internalId: 'SOLANA', name: 'Solana' },
11
- { internalId: 'SOLANA_DEVNET', name: 'Solana Devnet' },
12
- { internalId: 'COSMOS', name: 'Cosmos' },
2
+ {
3
+ type: 'EVM',
4
+ evmChainId: '11155111',
5
+ internalId: 'SEPOLIA',
6
+ zerionId: 'ethereum-sepolia',
7
+ name: 'Ethereum Sepolia',
8
+ alchemySlug: 'eth-sepolia',
9
+ },
10
+ {
11
+ type: 'EVM',
12
+ evmChainId: '1',
13
+ internalId: 'ETHEREUM',
14
+ zerionId: 'ethereum',
15
+ name: 'Ethereum',
16
+ alchemySlug: 'eth-mainnet',
17
+ },
18
+ {
19
+ type: 'EVM',
20
+ evmChainId: '137',
21
+ internalId: 'POLYGON',
22
+ zerionId: 'polygon',
23
+ name: 'Polygon',
24
+ alchemySlug: 'polygon-mainnet',
25
+ },
26
+ {
27
+ type: 'EVM',
28
+ evmChainId: '42220',
29
+ internalId: 'CELO',
30
+ zerionId: 'celo',
31
+ name: 'Celo',
32
+ alchemySlug: 'celo-mainnet',
33
+ },
34
+ {
35
+ type: 'EVM',
36
+ evmChainId: '8453',
37
+ internalId: 'BASE',
38
+ zerionId: 'base',
39
+ name: 'Base',
40
+ alchemySlug: 'base-mainnet',
41
+ },
42
+ {
43
+ type: 'EVM',
44
+ evmChainId: '42161',
45
+ internalId: 'ARBITRUM',
46
+ zerionId: 'arbitrum',
47
+ name: 'Arbitrum',
48
+ alchemySlug: 'arb-mainnet',
49
+ },
50
+ {
51
+ type: 'EVM',
52
+ evmChainId: '10',
53
+ internalId: 'OPTIMISM',
54
+ zerionId: 'optimism',
55
+ name: 'Optimism',
56
+ alchemySlug: 'opt-mainnet',
57
+ },
58
+ {
59
+ type: 'EVM',
60
+ evmChainId: '80094',
61
+ internalId: 'BERACHAIN',
62
+ zerionId: 'berachain',
63
+ name: 'Berachain',
64
+ alchemySlug: 'bera-mainnet',
65
+ },
66
+ {
67
+ type: 'EVM',
68
+ zerionId: 'binance-smart-chain',
69
+ evmChainId: '56',
70
+ name: 'Binance Smart Chain',
71
+ alchemySlug: 'bsc-mainnet',
72
+ },
73
+ {
74
+ type: 'EVM',
75
+ zerionId: 'tron',
76
+ evmChainId: '728126428',
77
+ name: 'Tron',
78
+ alchemySlug: 'tron-mainnet',
79
+ },
80
+ {
81
+ type: 'EVM',
82
+ zerionId: 'blast',
83
+ evmChainId: '81457',
84
+ name: 'Blast',
85
+ alchemySlug: 'blast-mainnet',
86
+ },
87
+ {
88
+ type: 'EVM',
89
+ zerionId: 'ape',
90
+ evmChainId: '33139',
91
+ name: 'Ape',
92
+ alchemySlug: 'ape-mainnet',
93
+ },
94
+ {
95
+ type: 'EVM',
96
+ zerionId: 'cronos-zkevm',
97
+ evmChainId: '388',
98
+ name: 'Cronos ZK-EVM',
99
+ },
100
+ {
101
+ type: 'EVM',
102
+ zerionId: '0g',
103
+ evmChainId: '16661',
104
+ name: 'Harmony',
105
+ },
106
+ {
107
+ type: 'EVM',
108
+ zerionId: 'opbnb',
109
+ evmChainId: '204',
110
+ alchemySlug: 'opbnb-mainnet',
111
+ name: 'Optimism Nova',
112
+ },
113
+ {
114
+ type: 'EVM',
115
+ zerionId: 'abstract',
116
+ evmChainId: '2741',
117
+ alchemySlug: 'abstract-mainnet',
118
+ name: 'Abstract',
119
+ },
120
+ {
121
+ type: 'EVM',
122
+ zerionId: 'avalanche',
123
+ evmChainId: '43114',
124
+ alchemySlug: 'avax-mainnet',
125
+ name: 'Avalanche',
126
+ },
127
+ {
128
+ type: 'EVM',
129
+ zerionId: 'zksync-era',
130
+ evmChainId: '324',
131
+ alchemySlug: 'zksync-mainnet',
132
+ name: 'ZKSync Era',
133
+ },
134
+ {
135
+ type: 'EVM',
136
+ zerionId: 'mantle',
137
+ evmChainId: '5000',
138
+ alchemySlug: 'mantle-mainnet',
139
+ name: 'Mantle',
140
+ },
141
+ {
142
+ type: 'EVM',
143
+ zerionId: 'bob',
144
+ evmChainId: '60808',
145
+ alchemySlug: 'bob-mainnet',
146
+ name: 'Bob',
147
+ },
148
+ { type: 'EVM', zerionId: 'cyber', evmChainId: '7560' },
149
+ {
150
+ type: 'EVM',
151
+ zerionId: 'degen',
152
+ evmChainId: '666666666',
153
+ alchemySlug: 'degen-mainnet',
154
+ name: 'Degen',
155
+ },
156
+ {
157
+ type: 'EVM',
158
+ zerionId: 'manta-pacific',
159
+ evmChainId: '169',
160
+ name: 'Manta Pacific',
161
+ },
162
+ { type: 'EVM', zerionId: 'fantom', evmChainId: '250', name: 'Fantom' },
163
+ {
164
+ type: 'EVM',
165
+ zerionId: 'ronin',
166
+ evmChainId: '2020',
167
+ alchemySlug: 'ronin-mainnet',
168
+ name: 'Ronin',
169
+ },
170
+ {
171
+ type: 'EVM',
172
+ zerionId: 'linea',
173
+ evmChainId: '59144',
174
+ alchemySlug: 'linea-mainnet',
175
+ name: 'Linea',
176
+ },
177
+ {
178
+ type: 'EVM',
179
+ zerionId: 'metis-andromeda',
180
+ evmChainId: '1088',
181
+ alchemySlug: 'metis-mainnet',
182
+ name: 'Metis Andromeda',
183
+ },
184
+ {
185
+ type: 'EVM',
186
+ zerionId: 'aurora',
187
+ evmChainId: '1313161554',
188
+ name: 'Aurora',
189
+ },
190
+ { type: 'EVM', zerionId: 'xinfin-xdc', evmChainId: '50' },
191
+ {
192
+ type: 'EVM',
193
+ zerionId: 'fraxtal',
194
+ evmChainId: '252',
195
+ alchemySlug: 'frax-mainnet',
196
+ name: 'Frax',
197
+ },
198
+ {
199
+ type: 'EVM',
200
+ zerionId: 'gravity-alpha',
201
+ evmChainId: '1625',
202
+ name: 'Gravity Alpha',
203
+ },
204
+ {
205
+ type: 'EVM',
206
+ zerionId: 'hyperevm',
207
+ evmChainId: '999',
208
+ alchemySlug: 'hyperliquid-mainnet',
209
+ name: 'Hyperliquid',
210
+ },
211
+ {
212
+ type: 'EVM',
213
+ zerionId: 'ink',
214
+ evmChainId: '57073',
215
+ alchemySlug: 'ink-mainnet',
216
+ name: 'Ink',
217
+ },
218
+ {
219
+ type: 'EVM',
220
+ zerionId: 'lens',
221
+ evmChainId: '232',
222
+ alchemySlug: 'lens-mainnet',
223
+ name: 'Lens',
224
+ },
225
+ {
226
+ type: 'EVM',
227
+ zerionId: 'lisk',
228
+ evmChainId: '1135',
229
+ name: 'Lisk',
230
+ },
231
+ {
232
+ type: 'EVM',
233
+ zerionId: 'mode',
234
+ evmChainId: '34443',
235
+ alchemySlug: 'mode-mainnet',
236
+ name: 'Mode',
237
+ },
238
+ {
239
+ type: 'EVM',
240
+ zerionId: 'plasma',
241
+ evmChainId: '9745',
242
+ alchemySlug: 'plasma-mainnet',
243
+ name: 'Plasma',
244
+ },
245
+ {
246
+ type: 'EVM',
247
+ zerionId: 'polygon-zkevm',
248
+ evmChainId: '1101',
249
+ alchemySlug: 'polygonzkevm-mainnet',
250
+ name: 'Polygon ZK-EVM',
251
+ },
252
+ {
253
+ type: 'EVM',
254
+ zerionId: 'polynomial',
255
+ evmChainId: '8008',
256
+ name: 'Polynomial',
257
+ },
258
+ {
259
+ type: 'EVM',
260
+ zerionId: 'rari',
261
+ evmChainId: '1380012617',
262
+ name: 'Rari',
263
+ },
264
+ {
265
+ type: 'EVM',
266
+ zerionId: 'redstone',
267
+ evmChainId: '690',
268
+ name: 'Redstone',
269
+ },
270
+ {
271
+ type: 'EVM',
272
+ zerionId: 'scroll',
273
+ evmChainId: '534352',
274
+ alchemySlug: 'scroll-mainnet',
275
+ name: 'Scroll',
276
+ },
277
+ {
278
+ type: 'EVM',
279
+ zerionId: 'sei',
280
+ evmChainId: '1329',
281
+ alchemySlug: 'sei-mainnet',
282
+ name: 'Sei',
283
+ },
284
+ {
285
+ type: 'EVM',
286
+ zerionId: 'somnia',
287
+ evmChainId: '5031',
288
+ },
289
+ {
290
+ type: 'EVM',
291
+ zerionId: 'soneium',
292
+ evmChainId: '1868',
293
+ alchemySlug: 'soneium-mainnet',
294
+ name: 'Soneium',
295
+ },
296
+ {
297
+ type: 'EVM',
298
+ zerionId: 'sonic',
299
+ evmChainId: '146',
300
+ alchemySlug: 'sonic-mainnet',
301
+ name: 'Sonic',
302
+ },
303
+ {
304
+ type: 'EVM',
305
+ zerionId: 'swellchain',
306
+ evmChainId: '1923',
307
+ name: 'Swellchain',
308
+ },
309
+ {
310
+ type: 'EVM',
311
+ zerionId: 'taiko',
312
+ evmChainId: '167000',
313
+ alchemySlug: 'taiko-mainnet',
314
+ name: 'Taiko',
315
+ },
316
+ {
317
+ type: 'EVM',
318
+ zerionId: 'unichain',
319
+ evmChainId: '130',
320
+ alchemySlug: 'uni-mainnet',
321
+ name: 'Unichain',
322
+ },
323
+ {
324
+ type: 'EVM',
325
+ zerionId: 'wonder',
326
+ evmChainId: '9637',
327
+ name: 'Wonder',
328
+ },
329
+ {
330
+ type: 'EVM',
331
+ zerionId: 'tomochain',
332
+ evmChainId: '88',
333
+ name: 'Tomochain',
334
+ },
335
+ {
336
+ type: 'EVM',
337
+ zerionId: 'world',
338
+ evmChainId: '480',
339
+ alchemySlug: 'world-mainnet',
340
+ name: 'Worldchain',
341
+ },
342
+ {
343
+ type: 'EVM',
344
+ zerionId: 'zero',
345
+ evmChainId: '543210',
346
+ name: 'Zero',
347
+ },
348
+ {
349
+ type: 'EVM',
350
+ zerionId: 'okbchain',
351
+ evmChainId: '196',
352
+ name: 'OKBChain',
353
+ },
354
+ {
355
+ type: 'EVM',
356
+ zerionId: 'zkcandy',
357
+ evmChainId: '320',
358
+ name: 'ZKCandy',
359
+ },
360
+ {
361
+ type: 'EVM',
362
+ zerionId: 'zklink-nova',
363
+ evmChainId: '810180',
364
+ name: 'ZKLink Nova',
365
+ },
366
+ {
367
+ type: 'EVM',
368
+ zerionId: 'zora',
369
+ evmChainId: '7777777',
370
+ alchemySlug: 'zora-mainnet',
371
+ name: 'Zora',
372
+ },
373
+ {
374
+ type: 'EVM',
375
+ zerionId: 're-al',
376
+ evmChainId: '111188',
377
+ name: 'Re-Al',
378
+ },
379
+ {
380
+ type: 'EVM',
381
+ zerionId: 'katana',
382
+ evmChainId: '747474',
383
+ name: 'Katana',
384
+ },
385
+ {
386
+ type: 'EVM',
387
+ zerionId: 'monad-test-v2',
388
+ evmChainId: '10143',
389
+ name: 'Monad Testnet',
390
+ },
391
+ {
392
+ type: 'EVM',
393
+ zerionId: 'unichain-sepolia',
394
+ evmChainId: '1301',
395
+ name: 'Unichain Sepolia',
396
+ },
397
+ {
398
+ type: 'EVM',
399
+ zerionId: 'zero-sepolia-v2',
400
+ evmChainId: '43210',
401
+ name: 'Zero Sepolia V2',
402
+ },
403
+ {
404
+ type: 'SOLANA',
405
+ internalId: 'SOLANA',
406
+ zerionId: 'solana',
407
+ alchemySlug: 'solana-mainnet',
408
+ name: 'Solana',
409
+ },
410
+ {
411
+ type: 'SOLANA',
412
+ internalId: 'SOLANA_DEVNET',
413
+ alchemySlug: 'solana-devnet',
414
+ logoUrl: 'https://cdn.zerion.io/11111111111111111111111111111111.png',
415
+ explorer: {
416
+ name: 'Solana Explorer',
417
+ url: 'https://explorer.solana.com/?cluster=devnet',
418
+ txUrlFormat: 'https://explorer.solana.com/tx/{HASH}?cluster=devnet',
419
+ },
420
+ name: 'Solana Devnet',
421
+ },
422
+ { type: 'COSMOS', internalId: 'COSMOS', name: 'Cosmos' },
13
423
  ];
14
424
  export function getChainId(network) {
15
425
  return NETWORK_METADATA.find(({ internalId: n }) => n === network)?.evmChainId ?? undefined;
@@ -1,3 +1,5 @@
1
1
  export * from './types/index.js';
2
2
  export * from './utils/index.js';
3
+ import * as transactionTypes from './types/transaction.js';
4
+ export { transactionTypes };
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AAEjC,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -120,7 +120,7 @@ export type AssetMetadata<Currency extends string = 'USD'> = {
120
120
  */
121
121
  symbol: string;
122
122
  /**
123
- * The URL for the asset's icon logo.
123
+ * The URL for the asset's icon logo image.
124
124
  */
125
125
  logoUrl?: string;
126
126
  /**
@@ -150,10 +150,26 @@ export type NetworkMetadata = {
150
150
  * The display name for the network.
151
151
  */
152
152
  name?: string;
153
+ /**
154
+ * The URL for the network's logo image.
155
+ */
156
+ logoUrl?: string;
153
157
  /**
154
158
  * The EVM chain ID for the network, if applicable.
155
159
  */
156
160
  evmChainId?: `${number}`;
161
+ /**
162
+ * The RPC URL for the network.
163
+ */
164
+ rpcUrl?: string;
165
+ /**
166
+ * Template Explorer URL for transactions with {HASH} placeholder.
167
+ */
168
+ explorer?: BlockchainExplorer;
169
+ /**
170
+ * Whether the network is a testnet.
171
+ */
172
+ isTestnet?: boolean;
157
173
  };
158
174
  type WithAssetMetadata = {
159
175
  /**
@@ -225,6 +241,20 @@ export type ProfileBalance<Currency extends string = 'USD'> = WithAssetValue<Cur
225
241
  */
226
242
  formattedValue: string;
227
243
  };
244
+ export type BlockchainExplorer = {
245
+ /**
246
+ * The name of the blockchain explorer.
247
+ */
248
+ name: string;
249
+ /**
250
+ * The homepage URL of the blockchain explorer.
251
+ */
252
+ url: string;
253
+ /**
254
+ * An explorer URL template for broadcast transactions, using `{HASH}` as the placeholder for the transaction hash. Example: `https://etherscan.io/tx/{HASH}`
255
+ */
256
+ txUrlFormat?: string;
257
+ };
228
258
  export type CustomNetwork = Omit<NetworkMetadata, 'internalId' | 'zerionId' | 'evmChainId'> & {
229
259
  /**
230
260
  * The EVM chain ID for the network.
@@ -234,13 +264,17 @@ export type CustomNetwork = Omit<NetworkMetadata, 'internalId' | 'zerionId' | 'e
234
264
  * The EVM RPC URL for the network.
235
265
  */
236
266
  rpcUrl: string;
267
+ /**
268
+ * An explorer URL template for broadcast transactions, using `{HASH}` as the placeholder for the transaction hash. Example: `https://etherscan.io/tx/{HASH}`
269
+ */
270
+ explorer?: string;
237
271
  };
238
272
  export type NativeImplementation = {
239
273
  contractAddress?: undefined;
240
274
  /**
241
275
  * The custom network definition.
242
276
  */
243
- network: CustomNetwork;
277
+ network: TNetwork | CustomNetwork;
244
278
  };
245
279
  export type NonNativeImplementation = Required<WithContractAddress> & {
246
280
  /**
@@ -265,6 +299,7 @@ export type CustomAsset<Currency extends string = 'USD'> = Omit<AssetMetadata<Cu
265
299
  price?: AssetValue<Currency>;
266
300
  };
267
301
  export type BalanceDisplayType = 'AGGREGATED' | 'CUSTOM_TOKEN';
302
+ export type BalancesRequestType = 'MAINNET' | 'TESTNET' | 'MAINNET_AND_TESTNET';
268
303
  export type BalancesConfig<Currency extends string = 'USD'> = {
269
304
  /**
270
305
  * The type of balance data to display.
@@ -273,6 +308,14 @@ export type BalancesConfig<Currency extends string = 'USD'> = {
273
308
  * - `'CUSTOM_ASSET'` will display only the quantities of the asset you specify, without any currency conversion.
274
309
  */
275
310
  displayType: 'AGGREGATED' | 'CUSTOM_ASSET';
311
+ /**
312
+ * The type of assets to include in the balance calculation. Defaults to 'MAINNET'.
313
+ *
314
+ * - `'MAINNET'` will include all available mainnet assets only.
315
+ * - `'TESTNET'` will include all available testnet assets only. They will be treated as having zero fiat value.
316
+ * - `'MAINNET_AND_TESTNET'` will include both mainnet and testnet assets.
317
+ */
318
+ requestType?: BalancesRequestType;
276
319
  } & ({
277
320
  displayType: 'AGGREGATED';
278
321
  /**