@instadapp/interop-x 0.0.0-dev.d71f27e → 0.0.0-dev.e33810b

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.
@@ -9,6 +9,12 @@ const _abi = [
9
9
  {
10
10
  anonymous: false,
11
11
  inputs: [
12
+ {
13
+ indexed: false,
14
+ internalType: "string",
15
+ name: "actionId",
16
+ type: "string",
17
+ },
12
18
  {
13
19
  indexed: true,
14
20
  internalType: "address",
@@ -98,6 +104,12 @@ const _abi = [
98
104
  {
99
105
  anonymous: false,
100
106
  inputs: [
107
+ {
108
+ indexed: false,
109
+ internalType: "string",
110
+ name: "actionId",
111
+ type: "string",
112
+ },
101
113
  {
102
114
  indexed: true,
103
115
  internalType: "address",
@@ -193,6 +205,12 @@ const _abi = [
193
205
  {
194
206
  anonymous: false,
195
207
  inputs: [
208
+ {
209
+ indexed: false,
210
+ internalType: "string",
211
+ name: "actionId",
212
+ type: "string",
213
+ },
196
214
  {
197
215
  indexed: true,
198
216
  internalType: "address",
@@ -276,6 +294,12 @@ const _abi = [
276
294
  {
277
295
  anonymous: false,
278
296
  inputs: [
297
+ {
298
+ indexed: false,
299
+ internalType: "string",
300
+ name: "actionId",
301
+ type: "string",
302
+ },
279
303
  {
280
304
  indexed: true,
281
305
  internalType: "address",
@@ -363,20 +387,12 @@ const _abi = [
363
387
  type: "event",
364
388
  },
365
389
  {
366
- inputs: [],
367
- name: "_vnonce",
368
- outputs: [
390
+ inputs: [
369
391
  {
370
- internalType: "uint256",
371
- name: "",
372
- type: "uint256",
392
+ internalType: "string",
393
+ name: "actionId",
394
+ type: "string",
373
395
  },
374
- ],
375
- stateMutability: "view",
376
- type: "function",
377
- },
378
- {
379
- inputs: [
380
396
  {
381
397
  internalType: "address",
382
398
  name: "to_",
@@ -399,7 +415,7 @@ const _abi = [
399
415
  },
400
416
  {
401
417
  internalType: "uint32",
402
- name: "targetChainId_",
418
+ name: "sourceChainId_",
403
419
  type: "uint32",
404
420
  },
405
421
  {
@@ -420,6 +436,47 @@ const _abi = [
420
436
  },
421
437
  {
422
438
  inputs: [
439
+ {
440
+ internalType: "address",
441
+ name: "user",
442
+ type: "address",
443
+ },
444
+ {
445
+ internalType: "address[]",
446
+ name: "tokens",
447
+ type: "address[]",
448
+ },
449
+ ],
450
+ name: "getBridgeAmounts",
451
+ outputs: [
452
+ {
453
+ components: [
454
+ {
455
+ internalType: "uint256",
456
+ name: "deposit",
457
+ type: "uint256",
458
+ },
459
+ {
460
+ internalType: "uint256",
461
+ name: "withdraw",
462
+ type: "uint256",
463
+ },
464
+ ],
465
+ internalType: "struct InteropXContractBeta.UserData[]",
466
+ name: "userData",
467
+ type: "tuple[]",
468
+ },
469
+ ],
470
+ stateMutability: "view",
471
+ type: "function",
472
+ },
473
+ {
474
+ inputs: [
475
+ {
476
+ internalType: "string",
477
+ name: "actionId",
478
+ type: "string",
479
+ },
423
480
  {
424
481
  internalType: "address",
425
482
  name: "sourceToken_",
@@ -451,6 +508,24 @@ const _abi = [
451
508
  stateMutability: "nonpayable",
452
509
  type: "function",
453
510
  },
511
+ {
512
+ inputs: [
513
+ {
514
+ internalType: "address",
515
+ name: "token",
516
+ type: "address",
517
+ },
518
+ {
519
+ internalType: "bool",
520
+ name: "toggle",
521
+ type: "bool",
522
+ },
523
+ ],
524
+ name: "toggleWhitelist",
525
+ outputs: [],
526
+ stateMutability: "nonpayable",
527
+ type: "function",
528
+ },
454
529
  {
455
530
  inputs: [
456
531
  {
@@ -458,20 +533,54 @@ const _abi = [
458
533
  name: "",
459
534
  type: "address",
460
535
  },
536
+ {
537
+ internalType: "address",
538
+ name: "",
539
+ type: "address",
540
+ },
461
541
  ],
462
- name: "whitelistedMapping",
542
+ name: "userMapping",
463
543
  outputs: [
464
544
  {
465
545
  internalType: "uint256",
466
- name: "",
546
+ name: "deposit",
467
547
  type: "uint256",
468
548
  },
549
+ {
550
+ internalType: "uint256",
551
+ name: "withdraw",
552
+ type: "uint256",
553
+ },
554
+ ],
555
+ stateMutability: "view",
556
+ type: "function",
557
+ },
558
+ {
559
+ inputs: [
560
+ {
561
+ internalType: "address",
562
+ name: "",
563
+ type: "address",
564
+ },
565
+ ],
566
+ name: "whitelistedTokens",
567
+ outputs: [
568
+ {
569
+ internalType: "bool",
570
+ name: "",
571
+ type: "bool",
572
+ },
469
573
  ],
470
574
  stateMutability: "view",
471
575
  type: "function",
472
576
  },
473
577
  {
474
578
  inputs: [
579
+ {
580
+ internalType: "string",
581
+ name: "actionId",
582
+ type: "string",
583
+ },
475
584
  {
476
585
  internalType: "address",
477
586
  name: "user_",
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.generateGnosisTransaction = exports.getContract = exports.generateInteropTransactionHash = exports.asyncCallWithTimeout = exports.buildSignatureBytes = exports.getRpcProviderUrl = exports.signGnosisSafeTx = exports.short = exports.shortenHash = exports.http = void 0;
6
+ exports.generateGnosisTransaction = exports.getContract = exports.ContractError = exports.generateInteropTransactionHash = exports.asyncCallWithTimeout = exports.buildSignatureBytes = exports.getRpcProviderUrl = exports.signGnosisSafeTx = exports.short = exports.shortenHash = exports.http = void 0;
7
7
  /**
8
8
  * @module util
9
9
  */
@@ -11,6 +11,7 @@ const axios_1 = __importDefault(require("axios"));
11
11
  const axios_retry_1 = __importDefault(require("axios-retry"));
12
12
  const constants_1 = require("@/constants");
13
13
  const ethers_1 = require("ethers");
14
+ const async_retry_1 = __importDefault(require("async-retry"));
14
15
  exports.http = axios_1.default.create();
15
16
  (0, axios_retry_1.default)(exports.http, { retries: 3, retryDelay: axios_retry_1.default.exponentialDelay });
16
17
  function shortenHash(hash, length = 4) {
@@ -102,7 +103,7 @@ const asyncCallWithTimeout = async (asyncPromise, timeout) => {
102
103
  exports.asyncCallWithTimeout = asyncCallWithTimeout;
103
104
  const generateInteropTransactionHash = (data) => {
104
105
  return ethers_1.ethers.utils.solidityKeccak256(['string', 'string', 'string', 'string', 'string'], [
105
- String(data.action),
106
+ String(data.actionId),
106
107
  String(data.bridger),
107
108
  String(data.requestTransactionHash),
108
109
  String(data.sourceChainId),
@@ -110,6 +111,9 @@ const generateInteropTransactionHash = (data) => {
110
111
  ]);
111
112
  };
112
113
  exports.generateInteropTransactionHash = generateInteropTransactionHash;
114
+ class ContractError extends Error {
115
+ }
116
+ exports.ContractError = ContractError;
113
117
  function getContract(address, contractInterface, signerOrProvider) {
114
118
  if (!ethers_1.ethers.utils.getAddress(address) || address === ethers_1.ethers.constants.AddressZero) {
115
119
  throw Error(`Invalid 'address' parameter '${address}'.`);
@@ -124,12 +128,22 @@ function getContract(address, contractInterface, signerOrProvider) {
124
128
  get(target, prop, receiver) {
125
129
  const value = Reflect.get(target, prop, receiver);
126
130
  if (typeof value === 'function' && (contract.functions.hasOwnProperty(prop) || ['queryFilter'].includes(String(prop)))) {
131
+ let isConstant = false;
132
+ try {
133
+ isConstant = contract.interface.getFunction(String(prop)).constant;
134
+ }
135
+ catch (error) {
136
+ }
127
137
  return async (...args) => {
128
138
  try {
129
- return await value.bind(contract)(...args);
139
+ return await (0, async_retry_1.default)(async () => await value.bind(contract)(...args), { retries: isConstant ? 1 : 3 });
130
140
  }
131
141
  catch (error) {
132
- throw new Error(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`);
142
+ const err = new ContractError(`Error calling "${String(prop)}" on "${address}": ${error.reason || error.message}`);
143
+ err.method = String(prop);
144
+ err.address = address;
145
+ err.args = [...args];
146
+ throw err;
133
147
  }
134
148
  };
135
149
  }
@@ -141,10 +155,14 @@ function getContract(address, contractInterface, signerOrProvider) {
141
155
  if (typeof value === 'function') {
142
156
  return async (...args) => {
143
157
  try {
144
- return await value.bind(contract)(...args);
158
+ return await (0, async_retry_1.default)(async () => await value.bind(contract)(...args), { retries: parentProp === 'callStatic' ? 3 : 1 });
145
159
  }
146
160
  catch (error) {
147
- throw new Error(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`);
161
+ const err = new ContractError(`Error calling "${String(prop)}" using "${parentProp}" on "${address}": ${error.reason || error.message}`);
162
+ err.method = String(prop);
163
+ err.address = address;
164
+ err.args = [...args];
165
+ throw err;
148
166
  }
149
167
  };
150
168
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@instadapp/interop-x",
3
- "version": "0.0.0-dev.d71f27e",
3
+ "version": "0.0.0-dev.e33810b",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "engines": {
@@ -25,16 +25,17 @@
25
25
  "dependencies": {
26
26
  "@achingbrain/libp2p-gossipsub": "^0.12.2",
27
27
  "@fastify/cors": "^7.0.0",
28
+ "async-retry": "^1.3.3",
28
29
  "await-spawn": "^4.0.2",
29
- "axios": "^0.27.1",
30
- "axios-retry": "^3.2.4",
30
+ "axios": "^0.27.2",
31
+ "axios-retry": "^3.2.5",
31
32
  "chalk": "4.1.2",
32
- "dotenv": "^16.0.0",
33
+ "dotenv": "^16.0.1",
33
34
  "ethereumjs-util": "^7.1.4",
34
- "ethers": "^5.6.4",
35
+ "ethers": "^5.6.5",
35
36
  "ethers-multisend": "^2.1.1",
36
37
  "expand-home-dir": "^0.0.3",
37
- "fastify": "^3.28.0",
38
+ "fastify": "^3.29.0",
38
39
  "fs-extra": "^10.1.0",
39
40
  "libp2p": "^0.36.2",
40
41
  "libp2p-bootstrap": "^0.14.0",
@@ -45,12 +46,12 @@
45
46
  "libp2p-pubsub-peer-discovery": "^4.0.0",
46
47
  "libp2p-tcp": "^0.17.2",
47
48
  "libp2p-websockets": "^0.16.2",
48
- "luxon": "^2.3.2",
49
+ "luxon": "^2.4.0",
49
50
  "module-alias": "^2.2.2",
50
51
  "patch-package": "^6.4.7",
51
52
  "postinstall-postinstall": "^2.1.0",
52
53
  "sequelize": "6.18.0",
53
- "sqlite3": "^5.0.5",
54
+ "sqlite3": "^5.0.8",
54
55
  "waait": "^1.0.5"
55
56
  },
56
57
  "bin": {
@@ -61,13 +62,13 @@
61
62
  "@typechain/ethers-v5": "^10.0.0",
62
63
  "@types/bn.js": "^5.1.0",
63
64
  "@types/fs-extra": "^9.0.13",
64
- "@types/node": "^17.0.17",
65
- "nodemon": "^2.0.15",
65
+ "@types/node": "^17.0.33",
66
+ "nodemon": "^2.0.16",
66
67
  "replace-in-file": "^6.3.2",
67
68
  "rimraf": "^3.0.2",
68
69
  "ts-node": "^10.5.0",
69
70
  "tsconfig-paths": "^3.12.0",
70
71
  "typechain": "^8.0.0",
71
- "typescript": "^4.5.5"
72
+ "typescript": "^4.6.4"
72
73
  }
73
74
  }
@@ -2,6 +2,12 @@
2
2
  {
3
3
  "anonymous": false,
4
4
  "inputs": [
5
+ {
6
+ "indexed": false,
7
+ "internalType": "string",
8
+ "name": "actionId",
9
+ "type": "string"
10
+ },
5
11
  {
6
12
  "indexed": true,
7
13
  "internalType": "address",
@@ -83,6 +89,12 @@
83
89
  {
84
90
  "anonymous": false,
85
91
  "inputs": [
92
+ {
93
+ "indexed": false,
94
+ "internalType": "string",
95
+ "name": "actionId",
96
+ "type": "string"
97
+ },
86
98
  {
87
99
  "indexed": true,
88
100
  "internalType": "address",
@@ -170,6 +182,12 @@
170
182
  {
171
183
  "anonymous": false,
172
184
  "inputs": [
185
+ {
186
+ "indexed": false,
187
+ "internalType": "string",
188
+ "name": "actionId",
189
+ "type": "string"
190
+ },
173
191
  {
174
192
  "indexed": true,
175
193
  "internalType": "address",
@@ -245,6 +263,12 @@
245
263
  {
246
264
  "anonymous": false,
247
265
  "inputs": [
266
+ {
267
+ "indexed": false,
268
+ "internalType": "string",
269
+ "name": "actionId",
270
+ "type": "string"
271
+ },
248
272
  {
249
273
  "indexed": true,
250
274
  "internalType": "address",
@@ -323,20 +347,14 @@
323
347
  "name": "LogBridgeRequestSent",
324
348
  "type": "event"
325
349
  },
326
- {
327
- "inputs": [],
328
- "name": "_vnonce",
329
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
330
- "stateMutability": "view",
331
- "type": "function"
332
- },
333
350
  {
334
351
  "inputs": [
352
+ { "internalType": "string", "name": "actionId", "type": "string" },
335
353
  { "internalType": "address", "name": "to_", "type": "address" },
336
354
  { "internalType": "address", "name": "sourceToken_", "type": "address" },
337
355
  { "internalType": "address", "name": "targetToken_", "type": "address" },
338
356
  { "internalType": "uint256", "name": "amount_", "type": "uint256" },
339
- { "internalType": "uint32", "name": "targetChainId_", "type": "uint32" },
357
+ { "internalType": "uint32", "name": "sourceChainId_", "type": "uint32" },
340
358
  {
341
359
  "internalType": "bytes32",
342
360
  "name": "transactionHash_",
@@ -351,6 +369,27 @@
351
369
  },
352
370
  {
353
371
  "inputs": [
372
+ { "internalType": "address", "name": "user", "type": "address" },
373
+ { "internalType": "address[]", "name": "tokens", "type": "address[]" }
374
+ ],
375
+ "name": "getBridgeAmounts",
376
+ "outputs": [
377
+ {
378
+ "components": [
379
+ { "internalType": "uint256", "name": "deposit", "type": "uint256" },
380
+ { "internalType": "uint256", "name": "withdraw", "type": "uint256" }
381
+ ],
382
+ "internalType": "struct InteropXContractBeta.UserData[]",
383
+ "name": "userData",
384
+ "type": "tuple[]"
385
+ }
386
+ ],
387
+ "stateMutability": "view",
388
+ "type": "function"
389
+ },
390
+ {
391
+ "inputs": [
392
+ { "internalType": "string", "name": "actionId", "type": "string" },
354
393
  { "internalType": "address", "name": "sourceToken_", "type": "address" },
355
394
  { "internalType": "address", "name": "targetToken_", "type": "address" },
356
395
  { "internalType": "uint256", "name": "amount_", "type": "uint256" },
@@ -362,15 +401,39 @@
362
401
  "stateMutability": "nonpayable",
363
402
  "type": "function"
364
403
  },
404
+ {
405
+ "inputs": [
406
+ { "internalType": "address", "name": "token", "type": "address" },
407
+ { "internalType": "bool", "name": "toggle", "type": "bool" }
408
+ ],
409
+ "name": "toggleWhitelist",
410
+ "outputs": [],
411
+ "stateMutability": "nonpayable",
412
+ "type": "function"
413
+ },
414
+ {
415
+ "inputs": [
416
+ { "internalType": "address", "name": "", "type": "address" },
417
+ { "internalType": "address", "name": "", "type": "address" }
418
+ ],
419
+ "name": "userMapping",
420
+ "outputs": [
421
+ { "internalType": "uint256", "name": "deposit", "type": "uint256" },
422
+ { "internalType": "uint256", "name": "withdraw", "type": "uint256" }
423
+ ],
424
+ "stateMutability": "view",
425
+ "type": "function"
426
+ },
365
427
  {
366
428
  "inputs": [{ "internalType": "address", "name": "", "type": "address" }],
367
- "name": "whitelistedMapping",
368
- "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
429
+ "name": "whitelistedTokens",
430
+ "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
369
431
  "stateMutability": "view",
370
432
  "type": "function"
371
433
  },
372
434
  {
373
435
  "inputs": [
436
+ { "internalType": "string", "name": "actionId", "type": "string" },
374
437
  { "internalType": "address", "name": "user_", "type": "address" },
375
438
  { "internalType": "address", "name": "sourceToken_", "type": "address" },
376
439
  { "internalType": "address", "name": "targetToken_", "type": "address" },
@@ -7,11 +7,11 @@ export const addresses = {
7
7
  137: {
8
8
  gnosisSafe: '0x5635d2910e51da33d9DC0422c893CF4F28B69A25',
9
9
  multisend: '0xA238CBeb142c10Ef7Ad8442C6D1f9E89e07e7761',
10
- interopXContract: '0x2189741c8cAc1cf51570932817A7d6390646C80e',
10
+ interopXContract: '0x41bd77583674B3a5c073FBb4922C0C8dA91C43cF',
11
11
  },
12
12
  43114: {
13
13
  gnosisSafe: '0x31d7a5194Fe60AC209Cf1Ce2d539C9A60662Ed6b',
14
14
  multisend: '0x998739BFdAAdde7C933B942a68053933098f9EDa',
15
- interopXContract: '0x1867DF97Ec24bb0bbD4AD464F0Be9C6713422EAE',
15
+ interopXContract: '0xCF391A3057eDba541c80307aC5E3Bc1E4a9471b7',
16
16
  }
17
17
  }
@@ -1,30 +1,42 @@
1
1
  export const tokens = {
2
2
  1: [
3
3
  {
4
+ aliases: ['eth'],
4
5
  symbol: "ETH",
5
6
  name: "Ethereum",
6
7
  address: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
7
8
  decimals: 18,
8
9
  },
9
10
  {
11
+ aliases: ['weth'],
12
+ symbol: "WETH",
13
+ name: "Wrapped Ethereum",
14
+ address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
15
+ decimals: 18,
16
+ },
17
+ {
18
+ aliases: ['dai'],
10
19
  symbol: "DAI",
11
20
  name: "DAI Stable",
12
21
  address: "0x6B175474E89094C44Da98b954EedeAC495271d0F",
13
22
  decimals: 18,
14
23
  },
15
24
  {
25
+ aliases: ['usdc'],
16
26
  symbol: "USDC",
17
27
  name: "USD Coin",
18
28
  address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
19
29
  decimals: 6,
20
30
  },
21
31
  {
32
+ aliases: ['usdt'],
22
33
  symbol: "USDT",
23
34
  name: "Tether USD Coin",
24
35
  address: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
25
36
  decimals: 6,
26
37
  },
27
38
  {
39
+ aliases: ['wbtc'],
28
40
  symbol: "WBTC",
29
41
  name: "Wrapped BTC",
30
42
  address: "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
@@ -33,36 +45,42 @@ export const tokens = {
33
45
  ],
34
46
  137: [
35
47
  {
48
+ aliases: ['eth', 'weth'],
36
49
  symbol: "ETH",
37
50
  name: "Ethereum",
38
51
  address: "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619",
39
52
  decimals: 18,
40
53
  },
41
54
  {
55
+ aliases: ['dai'],
42
56
  symbol: "DAI",
43
57
  name: "DAI Stable",
44
58
  address: "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063",
45
59
  decimals: 18,
46
60
  },
47
61
  {
62
+ aliases: ['usdc'],
48
63
  symbol: "USDC",
49
64
  name: "USD Coin",
50
65
  address: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
51
66
  decimals: 6,
52
67
  },
53
68
  {
69
+ aliases: ['usdt'],
54
70
  symbol: "USDT",
55
71
  name: "Tether USD Coin",
56
72
  address: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F",
57
73
  decimals: 6,
58
74
  },
59
75
  {
76
+ aliases: ['wbtc'],
60
77
  symbol: "WBTC",
61
78
  name: "Wrapped BTC",
62
79
  address: "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6",
63
80
  decimals: 8,
64
81
  },
65
82
  {
83
+ aliases: ['avax'],
66
84
  symbol: "AVAX",
67
85
  name: "Avalanche Token",
68
86
  address: "0x2C89bbc92BD86F8075d1DEcc58C7F4E0107f286b",
@@ -71,34 +89,46 @@ export const tokens = {
71
89
  ],
72
90
  43114: [
73
91
  {
92
+ aliases: ['eth', 'weth'],
74
93
  symbol: "ETH",
75
94
  name: "Ethereum",
76
95
  address: "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB",
77
96
  decimals: 18,
78
97
  },
79
98
  {
99
+ aliases: ['dai'],
80
100
  symbol: "DAI",
81
101
  name: "DAI Stable",
82
102
  address: "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70",
83
103
  decimals: 18,
84
104
  },
85
105
  {
106
+ aliases: ['usdc'],
86
107
  symbol: "USDC",
87
108
  name: "USD Coin",
88
109
  address: "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664",
89
110
  decimals: 6,
90
111
  },
91
112
  {
92
- symbol: "USDT",
113
+ aliases: ['usdt'],
114
+ symbol: "USDt",
93
115
  name: "Tether USD Coin",
116
+ address: "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
117
+ decimals: 6,
118
+ },
119
+ {
120
+ aliases: ['usdt'],
121
+ symbol: "USDT.e",
122
+ name: "Tether USD",
94
123
  address: "0xc7198437980c041c805A1EDcbA50c1Ce5db95118",
95
124
  decimals: 6,
96
125
  },
97
126
  {
127
+ aliases: ["wbtc"],
98
128
  symbol: "WBTC",
99
129
  name: "Wrapped BTC",
100
130
  address: "0x50b7545627a5162F82A992c33b87aDc75187B218",
101
131
  decimals: 8,
102
132
  },
103
133
  ],
104
- };
134
+ } as Record<number, { aliases: string[], symbol: string, name: string, address: string, decimals: number }[]>;