@subsquid/evm-typegen 4.5.1 → 4.6.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.
@@ -0,0 +1,3 @@
1
+ export declare const CHAIN_IDS: Record<string, number>;
2
+ export declare function chainIdOption(chainId?: string): number | undefined;
3
+ //# sourceMappingURL=chainIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainIds.d.ts","sourceRoot":"","sources":["../src/chainIds.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+R5C,CAAA;AAED,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBlE"}
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.CHAIN_IDS = void 0;
27
+ exports.chainIdOption = chainIdOption;
28
+ const fastest_levenshtein_1 = require("fastest-levenshtein");
29
+ const validator = __importStar(require("@subsquid/util-internal-commander"));
30
+ const commander_1 = require("commander");
31
+ // ref: https://docs.etherscan.io/supported-chains
32
+ exports.CHAIN_IDS = {
33
+ // Ethereum Mainnet
34
+ 'ethereum-mainnet': 1,
35
+ 'mainnet': 1,
36
+ 'ethereum': 1,
37
+ 'eth': 1,
38
+ // Sepolia Testnet
39
+ 'sepolia-testnet': 11155111,
40
+ 'sepolia': 11155111,
41
+ // Holesky Testnet
42
+ 'holesky-testnet': 17000,
43
+ 'holesky': 17000,
44
+ // Hoodi Testnet
45
+ 'hoodi-testnet': 560048,
46
+ 'hoodi': 560048,
47
+ // BNB Smart Chain Mainnet
48
+ 'bnb-smart-chain-mainnet': 56,
49
+ 'bsc': 56,
50
+ 'bnb': 56,
51
+ // BNB Smart Chain Testnet
52
+ 'bnb-smart-chain-testnet': 97,
53
+ 'bsc-testnet': 97,
54
+ // Polygon Mainnet
55
+ 'polygon-mainnet': 137,
56
+ 'polygon': 137,
57
+ 'matic': 137,
58
+ // Polygon Amoy Testnet
59
+ 'polygon-amoy-testnet': 80002,
60
+ 'amoy': 80002,
61
+ 'polygon-amoy': 80002,
62
+ // Base Mainnet
63
+ 'base-mainnet': 8453,
64
+ 'base': 8453,
65
+ // Base Sepolia Testnet
66
+ 'base-sepolia-testnet': 84532,
67
+ 'base-sepolia': 84532,
68
+ // Arbitrum One Mainnet
69
+ 'arbitrum-one-mainnet': 42161,
70
+ 'arbitrum': 42161,
71
+ 'arb': 42161,
72
+ 'arbitrum-one': 42161,
73
+ // Arbitrum Nova Mainnet
74
+ 'arbitrum-nova-mainnet': 42170,
75
+ 'arbitrum-nova': 42170,
76
+ 'nova': 42170,
77
+ // Arbitrum Sepolia Testnet
78
+ 'arbitrum-sepolia-testnet': 421614,
79
+ 'arbitrum-sepolia': 421614,
80
+ 'arb-sepolia': 421614,
81
+ // Linea Mainnet
82
+ 'linea-mainnet': 59144,
83
+ 'linea': 59144,
84
+ // Linea Sepolia Testnet
85
+ 'linea-sepolia-testnet': 59141,
86
+ 'linea-sepolia': 59141,
87
+ // Blast Mainnet
88
+ 'blast-mainnet': 81457,
89
+ 'blast': 81457,
90
+ // Blast Sepolia Testnet
91
+ 'blast-sepolia-testnet': 168587773,
92
+ 'blast-sepolia': 168587773,
93
+ // OP Mainnet
94
+ 'op-mainnet': 10,
95
+ 'optimism': 10,
96
+ 'op': 10,
97
+ // OP Sepolia Testnet
98
+ 'op-sepolia-testnet': 11155420,
99
+ 'op-sepolia': 11155420,
100
+ 'optimism-sepolia': 11155420,
101
+ // Avalanche C-Chain
102
+ 'avalanche-c-chain': 43114,
103
+ 'avalanche': 43114,
104
+ 'avax': 43114,
105
+ // Avalanche Fuji Testnet
106
+ 'avalanche-fuji-testnet': 43113,
107
+ 'fuji': 43113,
108
+ 'avalanche-fuji': 43113,
109
+ // BitTorrent Chain Mainnet
110
+ 'bittorrent-chain-mainnet': 199,
111
+ 'bittorrent': 199,
112
+ 'btt': 199,
113
+ // BitTorrent Chain Testnet
114
+ 'bittorrent-chain-testnet': 1029,
115
+ 'bittorrent-testnet': 1029,
116
+ 'btt-testnet': 1029,
117
+ // Celo Mainnet
118
+ 'celo-mainnet': 42220,
119
+ 'celo': 42220,
120
+ // Celo Sepolia Testnet
121
+ 'celo-sepolia-testnet': 11142220,
122
+ 'celo-sepolia': 11142220,
123
+ // Fraxtal Mainnet
124
+ 'fraxtal-mainnet': 252,
125
+ 'fraxtal': 252,
126
+ // Fraxtal Hoodi Testnet
127
+ 'fraxtal-hoodi-testnet': 2523,
128
+ 'fraxtal-hoodi': 2523,
129
+ // Gnosis
130
+ 'gnosis': 100,
131
+ 'gno': 100,
132
+ 'xdai': 100,
133
+ // Mantle Mainnet
134
+ 'mantle-mainnet': 5000,
135
+ 'mantle': 5000,
136
+ // Mantle Sepolia Testnet
137
+ 'mantle-sepolia-testnet': 5003,
138
+ 'mantle-sepolia': 5003,
139
+ // Memecore Mainnet
140
+ 'memecore-mainnet': 4352,
141
+ 'memecore': 4352,
142
+ // Memecore Testnet
143
+ 'memecore-testnet': 43521,
144
+ // Moonbeam Mainnet
145
+ 'moonbeam-mainnet': 1284,
146
+ 'moonbeam': 1284,
147
+ // Moonriver Mainnet
148
+ 'moonriver-mainnet': 1285,
149
+ 'moonriver': 1285,
150
+ // Moonbase Alpha Testnet
151
+ 'moonbase-alpha-testnet': 1287,
152
+ 'moonbase': 1287,
153
+ 'moonbase-alpha': 1287,
154
+ // opBNB Mainnet
155
+ 'opbnb-mainnet': 204,
156
+ 'opbnb': 204,
157
+ // opBNB Testnet
158
+ 'opbnb-testnet': 5611,
159
+ // Scroll Mainnet
160
+ 'scroll-mainnet': 534352,
161
+ 'scroll': 534352,
162
+ // Scroll Sepolia Testnet
163
+ 'scroll-sepolia-testnet': 534351,
164
+ 'scroll-sepolia': 534351,
165
+ // Taiko Mainnet
166
+ 'taiko-mainnet': 167000,
167
+ 'taiko': 167000,
168
+ // Taiko Hoodi
169
+ 'taiko-hoodi': 167013,
170
+ // XDC Mainnet
171
+ 'xdc-mainnet': 50,
172
+ 'xdc': 50,
173
+ // XDC Apothem Testnet
174
+ 'xdc-apothem-testnet': 51,
175
+ 'xdc-apothem': 51,
176
+ 'apothem': 51,
177
+ // ApeChain Mainnet
178
+ 'apechain-mainnet': 33139,
179
+ 'apechain': 33139,
180
+ 'ape': 33139,
181
+ // ApeChain Curtis Testnet
182
+ 'apechain-curtis-testnet': 33111,
183
+ 'apechain-curtis': 33111,
184
+ 'curtis': 33111,
185
+ // World Mainnet
186
+ 'world-mainnet': 480,
187
+ 'world': 480,
188
+ // World Sepolia Testnet
189
+ 'world-sepolia-testnet': 4801,
190
+ 'world-sepolia': 4801,
191
+ // Sonic Mainnet
192
+ 'sonic-mainnet': 146,
193
+ 'sonic': 146,
194
+ // Sonic Testnet
195
+ 'sonic-testnet': 14601,
196
+ // Unichain Mainnet
197
+ 'unichain-mainnet': 130,
198
+ 'unichain': 130,
199
+ // Unichain Sepolia Testnet
200
+ 'unichain-sepolia-testnet': 1301,
201
+ 'unichain-sepolia': 1301,
202
+ // Abstract Mainnet
203
+ 'abstract-mainnet': 2741,
204
+ 'abstract': 2741,
205
+ // Abstract Sepolia Testnet
206
+ 'abstract-sepolia-testnet': 11124,
207
+ 'abstract-sepolia': 11124,
208
+ // Berachain Mainnet
209
+ 'berachain-mainnet': 80094,
210
+ 'berachain': 80094,
211
+ 'bera': 80094,
212
+ // Berachain Bepolia Testnet
213
+ 'berachain-bepolia-testnet': 80069,
214
+ 'berachain-bepolia': 80069,
215
+ 'bepolia': 80069,
216
+ // Swellchain Mainnet
217
+ 'swellchain-mainnet': 1923,
218
+ 'swellchain': 1923,
219
+ 'swell': 1923,
220
+ // Swellchain Testnet
221
+ 'swellchain-testnet': 1924,
222
+ 'swell-testnet': 1924,
223
+ // Monad Mainnet
224
+ 'monad-mainnet': 143,
225
+ 'monad': 143,
226
+ // Monad Testnet
227
+ 'monad-testnet': 10143,
228
+ // HyperEVM Mainnet
229
+ 'hyperevm-mainnet': 999,
230
+ 'hyperevm': 999,
231
+ // Katana Mainnet
232
+ 'katana-mainnet': 747474,
233
+ 'katana': 747474,
234
+ // Katana Bokuto
235
+ 'katana-bokuto': 737373,
236
+ 'bokuto': 737373,
237
+ // Sei Mainnet
238
+ 'sei-mainnet': 1329,
239
+ 'sei': 1329,
240
+ // Sei Testnet
241
+ 'sei-testnet': 1328,
242
+ // Stable Mainnet
243
+ 'stable-mainnet': 988,
244
+ 'stable': 988,
245
+ // Stable Testnet
246
+ 'stable-testnet': 2201,
247
+ // Plasma Mainnet
248
+ 'plasma-mainnet': 9745,
249
+ 'plasma': 9745,
250
+ // Plasma Testnet
251
+ 'plasma-testnet': 9746,
252
+ };
253
+ function chainIdOption(chainId) {
254
+ if (chainId == null) {
255
+ return undefined;
256
+ }
257
+ // @ts-expect-error - chainId is a string
258
+ if (!isNaN(chainId)) {
259
+ return validator.positiveInt(chainId);
260
+ }
261
+ const normalizedChainId = chainId.toLowerCase();
262
+ if (normalizedChainId in exports.CHAIN_IDS) {
263
+ return exports.CHAIN_IDS[normalizedChainId];
264
+ }
265
+ const suggestion = (0, fastest_levenshtein_1.closest)(normalizedChainId, Object.keys(exports.CHAIN_IDS));
266
+ throw new commander_1.InvalidOptionArgumentError(`Unknown chain: "${chainId}". Did you mean "${suggestion}"? Alternatively, provide a numeric chain ID.`);
267
+ }
268
+ //# sourceMappingURL=chainIds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainIds.js","sourceRoot":"","sources":["../src/chainIds.ts"],"names":[],"mappings":"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"}
package/lib/main.js CHANGED
@@ -35,7 +35,10 @@ const validator = __importStar(require("@subsquid/util-internal-commander"));
35
35
  const typegen_1 = require("./typegen");
36
36
  const fetch_1 = require("./util/fetch");
37
37
  const util_internal_code_printer_1 = require("@subsquid/util-internal-code-printer");
38
+ const chainIds_1 = require("./chainIds");
38
39
  const LOG = (0, logger_1.createLogger)('sqd:evm-typegen');
40
+ const PROXY_ETHERSCAN = 'https://cloud.sqd.dev/chains/api/v1/evm/abi';
41
+ const ORIGIN_ETHERSCAN = 'https://api.etherscan.io/v2/api';
39
42
  (0, util_internal_1.runProgram)(async function () {
40
43
  commander_1.program
41
44
  .description(`
@@ -47,9 +50,10 @@ The generated facades are assumed to be used by "squids" indexing EVM data.
47
50
  .argument('<output-dir>', 'output directory for generated definitions')
48
51
  .argument('[abi...]', 'ABI file', specArgument)
49
52
  .option('--multicall', 'generate facade for MakerDAO multicall contract')
50
- .option('--etherscan-api <url>', 'etherscan API to fetch contract ABI by a known address', validator.Url(['http:', 'https:']), 'https://api.etherscan.io/v2')
53
+ .option('--etherscan-api <url>', 'etherscan API to fetch contract ABI by a known address\n(if no API token is provided, the default value equals to SQD Proxy service, otherwise equals to Etherscan API)', validator.Url(['http:', 'https:']))
51
54
  .option('--etherscan-api-key <key>', 'etherscan API key')
52
- .option('--etherscan-chain-id <id>', 'the id of the chain to fetch the contract from', validator.positiveInt)
55
+ .option('--chain-id <id>', 'chain ID (numeric or named, e.g., "1" or "ethereum") to fetch the contract from', chainIds_1.chainIdOption, 1)
56
+ .option('--etherscan-chain-id <id>', 'DEPRECATED: use --chain-id instead. Chain ID (numeric or named, e.g., "1" or "ethereum") to fetch the contract from', chainIds_1.chainIdOption)
53
57
  .option('--clean', 'delete output directory before run')
54
58
  .addHelpText('afterAll', `
55
59
  ABI file can be specified in three ways:
@@ -75,6 +79,14 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
75
79
  let opts = commander_1.program.opts();
76
80
  let dest = new util_internal_code_printer_1.OutDir(commander_1.program.processedArgs[0]);
77
81
  let specs = commander_1.program.processedArgs[1];
82
+ if (opts.etherscanChainId) {
83
+ LOG.warn('Option --etherscan-chain-id is deprecated. Please use --chain-id instead');
84
+ if (opts.chainId) {
85
+ throw new commander_1.InvalidOptionArgumentError('Option --chain-id and --etherscan-chain-id cannot be used together');
86
+ }
87
+ opts.chainId = opts.etherscanChainId;
88
+ delete opts.etherscanChainId;
89
+ }
78
90
  if (opts.clean && dest.exists()) {
79
91
  LOG.info(`deleting ${dest.path()}`);
80
92
  dest.del();
@@ -115,16 +127,13 @@ async function read(spec, options) {
115
127
  }
116
128
  }
117
129
  async function fetchFromEtherscan(address, config) {
118
- let api = config.api + (config.api.endsWith('/') ? '' : '/') + 'api';
119
- let url = new URL(api);
130
+ let url = new URL(config.api);
120
131
  let params = new URLSearchParams({
121
132
  module: 'contract',
122
133
  action: 'getabi',
123
134
  address,
135
+ chainid: config.chainId.toString(),
124
136
  });
125
- if (config.chainId) {
126
- params.set('chainid', config.chainId);
127
- }
128
137
  if (config.apiKey) {
129
138
  params.set('apiKey', config.apiKey);
130
139
  }
@@ -205,10 +214,26 @@ function basename(file) {
205
214
  throw new commander_1.InvalidArgumentError(`Can't derive target basename for output files. Use url fragment to specify it, e.g. #erc20`);
206
215
  }
207
216
  function getEtherscanAPIConfig(options) {
217
+ let api;
218
+ if (options.etherscanApi != null) {
219
+ api = normalizeEtherscanAPIUrl(options.etherscanApi);
220
+ }
221
+ else if (options.etherscanApiKey != null) {
222
+ api = ORIGIN_ETHERSCAN;
223
+ }
224
+ else {
225
+ api = PROXY_ETHERSCAN;
226
+ }
208
227
  return {
209
- api: options.etherscanApi || 'https://api.etherscan.io/v2',
228
+ api,
210
229
  apiKey: options.etherscanApiKey || undefined,
211
- chainId: options.etherscanChainId || (options.etherscanApi ? undefined : '1'),
230
+ chainId: options.chainId ?? 1,
212
231
  };
213
232
  }
233
+ function normalizeEtherscanAPIUrl(url) {
234
+ if (url.endsWith('/api')) {
235
+ return url;
236
+ }
237
+ return url.endsWith('/') ? url + 'api' : url + '/api';
238
+ }
214
239
  //# sourceMappingURL=main.js.map
package/lib/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@subsquid/evm-typegen",
3
- "version": "4.5.1",
3
+ "version": "4.6.0",
4
4
  "description": "CLI for generating typescript types and decode implementations for evm logs",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "repository": "git@github.com:subsquid/squid.git",
@@ -23,7 +23,8 @@
23
23
  "@subsquid/util-internal-commander": "^1.4.0",
24
24
  "@subsquid/evm-codec": "^0.3.0",
25
25
  "@subsquid/evm-abi": "^0.3.1",
26
- "commander": "^11.1.0"
26
+ "commander": "^11.1.0",
27
+ "fastest-levenshtein": "^1.0.16"
27
28
  },
28
29
  "devDependencies": {
29
30
  "@types/node": "^18.18.14",
@@ -0,0 +1,315 @@
1
+ import {closest} from 'fastest-levenshtein'
2
+ import * as validator from '@subsquid/util-internal-commander'
3
+ import {InvalidOptionArgumentError} from 'commander'
4
+
5
+ // ref: https://docs.etherscan.io/supported-chains
6
+ export const CHAIN_IDS: Record<string, number> = {
7
+ // Ethereum Mainnet
8
+ 'ethereum-mainnet': 1,
9
+ 'mainnet': 1,
10
+ 'ethereum': 1,
11
+ 'eth': 1,
12
+
13
+ // Sepolia Testnet
14
+ 'sepolia-testnet': 11155111,
15
+ 'sepolia': 11155111,
16
+
17
+ // Holesky Testnet
18
+ 'holesky-testnet': 17000,
19
+ 'holesky': 17000,
20
+
21
+ // Hoodi Testnet
22
+ 'hoodi-testnet': 560048,
23
+ 'hoodi': 560048,
24
+
25
+ // BNB Smart Chain Mainnet
26
+ 'bnb-smart-chain-mainnet': 56,
27
+ 'bsc': 56,
28
+ 'bnb': 56,
29
+
30
+ // BNB Smart Chain Testnet
31
+ 'bnb-smart-chain-testnet': 97,
32
+ 'bsc-testnet': 97,
33
+
34
+ // Polygon Mainnet
35
+ 'polygon-mainnet': 137,
36
+ 'polygon': 137,
37
+ 'matic': 137,
38
+
39
+ // Polygon Amoy Testnet
40
+ 'polygon-amoy-testnet': 80002,
41
+ 'amoy': 80002,
42
+ 'polygon-amoy': 80002,
43
+
44
+ // Base Mainnet
45
+ 'base-mainnet': 8453,
46
+ 'base': 8453,
47
+
48
+ // Base Sepolia Testnet
49
+ 'base-sepolia-testnet': 84532,
50
+ 'base-sepolia': 84532,
51
+
52
+ // Arbitrum One Mainnet
53
+ 'arbitrum-one-mainnet': 42161,
54
+ 'arbitrum': 42161,
55
+ 'arb': 42161,
56
+ 'arbitrum-one': 42161,
57
+
58
+ // Arbitrum Nova Mainnet
59
+ 'arbitrum-nova-mainnet': 42170,
60
+ 'arbitrum-nova': 42170,
61
+ 'nova': 42170,
62
+
63
+ // Arbitrum Sepolia Testnet
64
+ 'arbitrum-sepolia-testnet': 421614,
65
+ 'arbitrum-sepolia': 421614,
66
+ 'arb-sepolia': 421614,
67
+
68
+ // Linea Mainnet
69
+ 'linea-mainnet': 59144,
70
+ 'linea': 59144,
71
+
72
+ // Linea Sepolia Testnet
73
+ 'linea-sepolia-testnet': 59141,
74
+ 'linea-sepolia': 59141,
75
+
76
+ // Blast Mainnet
77
+ 'blast-mainnet': 81457,
78
+ 'blast': 81457,
79
+
80
+ // Blast Sepolia Testnet
81
+ 'blast-sepolia-testnet': 168587773,
82
+ 'blast-sepolia': 168587773,
83
+
84
+ // OP Mainnet
85
+ 'op-mainnet': 10,
86
+ 'optimism': 10,
87
+ 'op': 10,
88
+
89
+ // OP Sepolia Testnet
90
+ 'op-sepolia-testnet': 11155420,
91
+ 'op-sepolia': 11155420,
92
+ 'optimism-sepolia': 11155420,
93
+
94
+ // Avalanche C-Chain
95
+ 'avalanche-c-chain': 43114,
96
+ 'avalanche': 43114,
97
+ 'avax': 43114,
98
+
99
+ // Avalanche Fuji Testnet
100
+ 'avalanche-fuji-testnet': 43113,
101
+ 'fuji': 43113,
102
+ 'avalanche-fuji': 43113,
103
+
104
+ // BitTorrent Chain Mainnet
105
+ 'bittorrent-chain-mainnet': 199,
106
+ 'bittorrent': 199,
107
+ 'btt': 199,
108
+
109
+ // BitTorrent Chain Testnet
110
+ 'bittorrent-chain-testnet': 1029,
111
+ 'bittorrent-testnet': 1029,
112
+ 'btt-testnet': 1029,
113
+
114
+ // Celo Mainnet
115
+ 'celo-mainnet': 42220,
116
+ 'celo': 42220,
117
+
118
+ // Celo Sepolia Testnet
119
+ 'celo-sepolia-testnet': 11142220,
120
+ 'celo-sepolia': 11142220,
121
+
122
+ // Fraxtal Mainnet
123
+ 'fraxtal-mainnet': 252,
124
+ 'fraxtal': 252,
125
+
126
+ // Fraxtal Hoodi Testnet
127
+ 'fraxtal-hoodi-testnet': 2523,
128
+ 'fraxtal-hoodi': 2523,
129
+
130
+ // Gnosis
131
+ 'gnosis': 100,
132
+ 'gno': 100,
133
+ 'xdai': 100,
134
+
135
+ // Mantle Mainnet
136
+ 'mantle-mainnet': 5000,
137
+ 'mantle': 5000,
138
+
139
+ // Mantle Sepolia Testnet
140
+ 'mantle-sepolia-testnet': 5003,
141
+ 'mantle-sepolia': 5003,
142
+
143
+ // Memecore Mainnet
144
+ 'memecore-mainnet': 4352,
145
+ 'memecore': 4352,
146
+
147
+ // Memecore Testnet
148
+ 'memecore-testnet': 43521,
149
+
150
+ // Moonbeam Mainnet
151
+ 'moonbeam-mainnet': 1284,
152
+ 'moonbeam': 1284,
153
+
154
+ // Moonriver Mainnet
155
+ 'moonriver-mainnet': 1285,
156
+ 'moonriver': 1285,
157
+
158
+ // Moonbase Alpha Testnet
159
+ 'moonbase-alpha-testnet': 1287,
160
+ 'moonbase': 1287,
161
+ 'moonbase-alpha': 1287,
162
+
163
+ // opBNB Mainnet
164
+ 'opbnb-mainnet': 204,
165
+ 'opbnb': 204,
166
+
167
+ // opBNB Testnet
168
+ 'opbnb-testnet': 5611,
169
+
170
+ // Scroll Mainnet
171
+ 'scroll-mainnet': 534352,
172
+ 'scroll': 534352,
173
+
174
+ // Scroll Sepolia Testnet
175
+ 'scroll-sepolia-testnet': 534351,
176
+ 'scroll-sepolia': 534351,
177
+
178
+ // Taiko Mainnet
179
+ 'taiko-mainnet': 167000,
180
+ 'taiko': 167000,
181
+
182
+ // Taiko Hoodi
183
+ 'taiko-hoodi': 167013,
184
+
185
+ // XDC Mainnet
186
+ 'xdc-mainnet': 50,
187
+ 'xdc': 50,
188
+
189
+ // XDC Apothem Testnet
190
+ 'xdc-apothem-testnet': 51,
191
+ 'xdc-apothem': 51,
192
+ 'apothem': 51,
193
+
194
+ // ApeChain Mainnet
195
+ 'apechain-mainnet': 33139,
196
+ 'apechain': 33139,
197
+ 'ape': 33139,
198
+
199
+ // ApeChain Curtis Testnet
200
+ 'apechain-curtis-testnet': 33111,
201
+ 'apechain-curtis': 33111,
202
+ 'curtis': 33111,
203
+
204
+ // World Mainnet
205
+ 'world-mainnet': 480,
206
+ 'world': 480,
207
+
208
+ // World Sepolia Testnet
209
+ 'world-sepolia-testnet': 4801,
210
+ 'world-sepolia': 4801,
211
+
212
+ // Sonic Mainnet
213
+ 'sonic-mainnet': 146,
214
+ 'sonic': 146,
215
+
216
+ // Sonic Testnet
217
+ 'sonic-testnet': 14601,
218
+
219
+ // Unichain Mainnet
220
+ 'unichain-mainnet': 130,
221
+ 'unichain': 130,
222
+
223
+ // Unichain Sepolia Testnet
224
+ 'unichain-sepolia-testnet': 1301,
225
+ 'unichain-sepolia': 1301,
226
+
227
+ // Abstract Mainnet
228
+ 'abstract-mainnet': 2741,
229
+ 'abstract': 2741,
230
+
231
+ // Abstract Sepolia Testnet
232
+ 'abstract-sepolia-testnet': 11124,
233
+ 'abstract-sepolia': 11124,
234
+
235
+ // Berachain Mainnet
236
+ 'berachain-mainnet': 80094,
237
+ 'berachain': 80094,
238
+ 'bera': 80094,
239
+
240
+ // Berachain Bepolia Testnet
241
+ 'berachain-bepolia-testnet': 80069,
242
+ 'berachain-bepolia': 80069,
243
+ 'bepolia': 80069,
244
+
245
+ // Swellchain Mainnet
246
+ 'swellchain-mainnet': 1923,
247
+ 'swellchain': 1923,
248
+ 'swell': 1923,
249
+
250
+ // Swellchain Testnet
251
+ 'swellchain-testnet': 1924,
252
+ 'swell-testnet': 1924,
253
+
254
+ // Monad Mainnet
255
+ 'monad-mainnet': 143,
256
+ 'monad': 143,
257
+
258
+ // Monad Testnet
259
+ 'monad-testnet': 10143,
260
+
261
+ // HyperEVM Mainnet
262
+ 'hyperevm-mainnet': 999,
263
+ 'hyperevm': 999,
264
+
265
+ // Katana Mainnet
266
+ 'katana-mainnet': 747474,
267
+ 'katana': 747474,
268
+
269
+ // Katana Bokuto
270
+ 'katana-bokuto': 737373,
271
+ 'bokuto': 737373,
272
+
273
+ // Sei Mainnet
274
+ 'sei-mainnet': 1329,
275
+ 'sei': 1329,
276
+
277
+ // Sei Testnet
278
+ 'sei-testnet': 1328,
279
+
280
+ // Stable Mainnet
281
+ 'stable-mainnet': 988,
282
+ 'stable': 988,
283
+
284
+ // Stable Testnet
285
+ 'stable-testnet': 2201,
286
+
287
+ // Plasma Mainnet
288
+ 'plasma-mainnet': 9745,
289
+ 'plasma': 9745,
290
+
291
+ // Plasma Testnet
292
+ 'plasma-testnet': 9746,
293
+ }
294
+
295
+ export function chainIdOption(chainId?: string): number | undefined {
296
+ if (chainId == null) {
297
+ return undefined
298
+ }
299
+
300
+ // @ts-expect-error - chainId is a string
301
+ if (!isNaN(chainId)) {
302
+ return validator.positiveInt(chainId)
303
+ }
304
+
305
+ const normalizedChainId = chainId.toLowerCase()
306
+
307
+ if (normalizedChainId in CHAIN_IDS) {
308
+ return CHAIN_IDS[normalizedChainId]
309
+ }
310
+
311
+ const suggestion = closest(normalizedChainId, Object.keys(CHAIN_IDS))
312
+ throw new InvalidOptionArgumentError(
313
+ `Unknown chain: "${chainId}". Did you mean "${suggestion}"? Alternatively, provide a numeric chain ID.`
314
+ )
315
+ }
package/src/main.ts CHANGED
@@ -1,14 +1,17 @@
1
1
  import * as fs from 'fs'
2
2
  import path from 'path'
3
- import { InvalidArgumentError, program } from 'commander'
3
+ import { InvalidArgumentError, InvalidOptionArgumentError, program } from 'commander'
4
4
  import { createLogger } from '@subsquid/logger'
5
5
  import { runProgram, wait } from '@subsquid/util-internal'
6
6
  import * as validator from '@subsquid/util-internal-commander'
7
7
  import { Typegen } from './typegen'
8
8
  import { GET } from './util/fetch'
9
9
  import { OutDir } from '@subsquid/util-internal-code-printer'
10
+ import {chainIdOption} from './chainIds'
10
11
 
11
12
  const LOG = createLogger('sqd:evm-typegen')
13
+ const PROXY_ETHERSCAN = 'https://cloud.sqd.dev/chains/api/v1/evm/abi'
14
+ const ORIGIN_ETHERSCAN = 'https://api.etherscan.io/v2/api'
12
15
 
13
16
  runProgram(
14
17
  async function () {
@@ -26,15 +29,20 @@ The generated facades are assumed to be used by "squids" indexing EVM data.
26
29
  .option('--multicall', 'generate facade for MakerDAO multicall contract')
27
30
  .option(
28
31
  '--etherscan-api <url>',
29
- 'etherscan API to fetch contract ABI by a known address',
32
+ 'etherscan API to fetch contract ABI by a known address\n(if no API token is provided, the default value equals to SQD Proxy service, otherwise equals to Etherscan API)',
30
33
  validator.Url(['http:', 'https:']),
31
- 'https://api.etherscan.io/v2'
32
34
  )
33
35
  .option('--etherscan-api-key <key>', 'etherscan API key')
34
36
  .option(
35
- '--etherscan-chain-id <id>',
36
- 'the id of the chain to fetch the contract from',
37
- validator.positiveInt,
37
+ '--chain-id <id>',
38
+ 'chain ID (numeric or named, e.g., "1" or "ethereum") to fetch the contract from',
39
+ chainIdOption,
40
+ 1,
41
+ )
42
+ .option(
43
+ '--etherscan-chain-id <id>',
44
+ 'DEPRECATED: use --chain-id instead. Chain ID (numeric or named, e.g., "1" or "ethereum") to fetch the contract from',
45
+ chainIdOption,
38
46
  )
39
47
  .option('--clean', 'delete output directory before run')
40
48
  .addHelpText(
@@ -66,13 +74,23 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
66
74
  let opts = program.opts() as {
67
75
  clean?: boolean
68
76
  multicall?: boolean
69
- etherscanApi: string
77
+ etherscanApi?: string
70
78
  etherscanApiKey?: string
71
- etherscanChainId?: string
79
+ chainId?: number
80
+ etherscanChainId?: number
72
81
  }
73
82
  let dest = new OutDir(program.processedArgs[0])
74
83
  let specs = program.processedArgs[1] as Spec[]
75
84
 
85
+ if (opts.etherscanChainId) {
86
+ LOG.warn('Option --etherscan-chain-id is deprecated. Please use --chain-id instead')
87
+ if (opts.chainId) {
88
+ throw new InvalidOptionArgumentError('Option --chain-id and --etherscan-chain-id cannot be used together')
89
+ }
90
+ opts.chainId = opts.etherscanChainId
91
+ delete opts.etherscanChainId
92
+ }
93
+
76
94
  if (opts.clean && dest.exists()) {
77
95
  LOG.info(`deleting ${dest.path()}`)
78
96
  dest.del()
@@ -100,8 +118,8 @@ squid-evm-typegen src/abi 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413#contract
100
118
  async function read(
101
119
  spec: Spec,
102
120
  options: {
103
- etherscanApi: string;
104
- etherscanChainId?: string
121
+ etherscanApi?: string;
122
+ chainId?: number
105
123
  etherscanApiKey?: string,
106
124
  },
107
125
  ): Promise<any> {
@@ -127,20 +145,19 @@ async function fetchFromEtherscan(
127
145
  address: string,
128
146
  config: EtherscanAPIConfig,
129
147
  ): Promise<any> {
130
- let api = config.api + (config.api.endsWith('/') ? '' : '/') + 'api'
131
- let url = new URL(api)
148
+ let url = new URL(config.api)
132
149
 
133
150
  let params = new URLSearchParams({
134
151
  module: 'contract',
135
152
  action: 'getabi',
136
153
  address,
154
+ chainid: config.chainId.toString(),
137
155
  })
138
- if (config.chainId) {
139
- params.set('chainid', config.chainId);
140
- }
156
+
141
157
  if (config.apiKey) {
142
158
  params.set('apiKey', config.apiKey);
143
159
  }
160
+
144
161
  url.search = params.toString()
145
162
 
146
163
  let response: { status: string; result: string }
@@ -234,18 +251,35 @@ function basename(file: string): string {
234
251
 
235
252
  interface EtherscanAPIConfig {
236
253
  api: string
254
+ chainId: number
237
255
  apiKey?: string
238
- chainId?: string
239
256
  }
240
257
 
241
258
  function getEtherscanAPIConfig(options: {
242
- etherscanApi: string
259
+ etherscanApi?: string
243
260
  etherscanApiKey?: string
244
- etherscanChainId?: string
261
+ chainId?: number
245
262
  }): EtherscanAPIConfig {
263
+ let api: string
264
+ if (options.etherscanApi != null) {
265
+ api = normalizeEtherscanAPIUrl(options.etherscanApi)
266
+ } else if (options.etherscanApiKey != null) {
267
+ api = ORIGIN_ETHERSCAN
268
+ } else {
269
+ api = PROXY_ETHERSCAN
270
+ }
271
+
246
272
  return {
247
- api: options.etherscanApi || 'https://api.etherscan.io/v2',
273
+ api,
248
274
  apiKey: options.etherscanApiKey || undefined,
249
- chainId: options.etherscanChainId || (options.etherscanApi ? undefined : '1'),
275
+ chainId: options.chainId ?? 1,
250
276
  }
277
+ }
278
+
279
+ function normalizeEtherscanAPIUrl(url: string) {
280
+ if (url.endsWith('/api')) {
281
+ return url
282
+ }
283
+
284
+ return url.endsWith('/') ? url + 'api' : url + '/api'
251
285
  }