@indexing/jiti 0.0.5 → 0.0.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indexing/jiti",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "Just In Time Indexing, for all",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",
package/dist/main.js DELETED
@@ -1,495 +0,0 @@
1
- var $8zHUo$viem = require("viem");
2
-
3
-
4
- function $parcel$export(e, n, v, s) {
5
- Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
6
- }
7
-
8
- function $parcel$exportWildcard(dest, source) {
9
- Object.keys(source).forEach(function(key) {
10
- if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {
11
- return;
12
- }
13
-
14
- Object.defineProperty(dest, key, {
15
- enumerable: true,
16
- get: function get() {
17
- return source[key];
18
- }
19
- });
20
- });
21
-
22
- return dest;
23
- }
24
-
25
- $parcel$export(module.exports, "templates", () => $882b6d93070905b3$export$a8fc3402335b0b04);
26
- $parcel$export(module.exports, "getAllTemplates", () => $882b6d93070905b3$export$cceb5167b935aafb);
27
- $parcel$export(module.exports, "getTemplateByKey", () => $882b6d93070905b3$export$a07bfd14bbc36e4b);
28
- $parcel$export(module.exports, "utils", () => $d7167569386d0d4c$exports);
29
- $parcel$export(module.exports, "types", () => $faefaad95e5fcca0$exports);
30
- const $59fb8e0333a5d25f$var$rawTemplate = {
31
- key: "raw",
32
- name: "Raw Block Data",
33
- description: "Get all blocks with all available fields",
34
- tags: [
35
- "EVM",
36
- "RAW"
37
- ],
38
- disabled: true,
39
- params: [],
40
- transform: (payload)=>payload,
41
- tests: [
42
- {
43
- params: {},
44
- payload: {
45
- a: "b",
46
- c: 1,
47
- d: {
48
- e: true
49
- }
50
- },
51
- output: {
52
- a: "b",
53
- c: 1,
54
- d: {
55
- e: true
56
- }
57
- }
58
- }
59
- ]
60
- };
61
- var $59fb8e0333a5d25f$export$2e2bcd8739ae039 = $59fb8e0333a5d25f$var$rawTemplate;
62
-
63
-
64
- var $d7167569386d0d4c$exports = {};
65
- var $596a656635c74d50$exports = {};
66
-
67
- $parcel$export($596a656635c74d50$exports, "evmAddressToChecksum", () => $596a656635c74d50$export$db81f9ea057ab646);
68
-
69
- function $596a656635c74d50$export$db81f9ea057ab646(address) {
70
- if (!address || !/^(0x)?[0-9a-f]{40}$/i.test(address)) return null;
71
- const stripAddress = address.slice(2).toLowerCase();
72
- const keccakHash = (0, $8zHUo$viem.keccak256)(stripAddress);
73
- let checksumAddress = "0x";
74
- for(let i = 0; i < stripAddress.length; i++)checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? stripAddress[i].toUpperCase() : stripAddress[i];
75
- return checksumAddress;
76
- }
77
-
78
-
79
- var $e5566e47593dc3e2$exports = {};
80
-
81
- $parcel$export($e5566e47593dc3e2$exports, "evmChainToId", () => $e5566e47593dc3e2$export$f93b8abed77a4120);
82
- const $e5566e47593dc3e2$var$CHAIN_ID = {
83
- ARBITRUM: 42161,
84
- AVALANCHE: 43114,
85
- BASE: 8453,
86
- BASE_SEPOLIA: 84532,
87
- BERACHAIN_BARTIO: 80084,
88
- BLAST: 81457,
89
- BSC: 56,
90
- CELO: 42220,
91
- CYBER: 7560,
92
- DEGEN: 666666666,
93
- ETHEREUM: 1,
94
- ETH_HOLESKY: 17000,
95
- ETH_SEPOLIA: 11155111,
96
- FRAXTAL: 252,
97
- FRAXTAL_SEPOLIA: 2522,
98
- FUSE: 122,
99
- GNOSIS: 100,
100
- GOLD: 4653,
101
- HAM: 5112,
102
- HEMI_TESTNET: 743111,
103
- LINEA: 59144,
104
- LINEA_SEPOLIA: 59141,
105
- LISK_SEPOLIA: 4202,
106
- LYRA: 957,
107
- LYRA_SEPOLIA: 901,
108
- MODE: 34443,
109
- MODE_SEPOLIA: 919,
110
- NEON: 245022934,
111
- OASIS_SAPPHIRE: 23294,
112
- OPTIMISM: 10,
113
- OP_SEPOLIA: 11155420,
114
- ORDERLY: 291,
115
- ORDERLY_SEPOLIA: 4460,
116
- PGN_SEPOLIA: 58008,
117
- POLYGON: 137,
118
- POLYGON_AMOY: 80002,
119
- POLYGON_ZKEVM: 1101,
120
- PUBLIC_GOODS_NETWORK: 424,
121
- SCROLL: 534352,
122
- SCROLL_SEPOLIA: 534351,
123
- STACK: 78225,
124
- SYNDICATE_FRAME_CHAIN: 5101,
125
- TRON: 728126428,
126
- ZER0: 543210,
127
- ZK_LINK: 810180,
128
- ZORA: 7777777,
129
- ZORA_SEPOLIA: 999999999
130
- };
131
- function $e5566e47593dc3e2$export$f93b8abed77a4120(chain) {
132
- return $e5566e47593dc3e2$var$CHAIN_ID[chain?.toUpperCase()];
133
- }
134
-
135
-
136
- var $da55be3e40667945$exports = {};
137
-
138
- $parcel$export($da55be3e40667945$exports, "evmDecodeLog", () => $da55be3e40667945$export$18467e329ea485c9);
139
- $parcel$export($da55be3e40667945$exports, "evmDecodeLogWithMetadata", () => $da55be3e40667945$export$cf548b70626e2eb9);
140
-
141
- var $f7a3fb164436c9c3$exports = {};
142
-
143
- $parcel$export($f7a3fb164436c9c3$exports, "evmMethodSignatureToHex", () => $f7a3fb164436c9c3$export$49d5c9473f8f70f2);
144
-
145
- function $f7a3fb164436c9c3$export$49d5c9473f8f70f2(sig) {
146
- const [method, rest] = sig.split("(");
147
- const params = rest.split(")")[0].split(",").map((p)=>p.trim());
148
- const topic0 = (0, $8zHUo$viem.keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
149
- return topic0;
150
- }
151
-
152
-
153
- function $da55be3e40667945$export$18467e329ea485c9(log, signatures) {
154
- if (Array.isArray(signatures)) {
155
- for (const sig of signatures){
156
- const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
157
- if (decoded) return decoded;
158
- }
159
- return null;
160
- }
161
- if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
162
- const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
163
- if (!addresses.includes(log.address.toLowerCase())) return null;
164
- }
165
- let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
166
- if (!sig.startsWith("event ")) sig = "event " + sig;
167
- const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f7a3fb164436c9c3$export$49d5c9473f8f70f2)(sig);
168
- if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
169
- if (log.topics[0] === topic0) try {
170
- const result = (0, $8zHUo$viem.decodeEventLog)({
171
- abi: (0, $8zHUo$viem.parseAbi)([
172
- sig
173
- ]),
174
- data: log.data,
175
- topics: log.topics
176
- });
177
- return result.args;
178
- } catch (e) {
179
- // ignore this
180
- }
181
- }
182
- return null;
183
- }
184
- function $da55be3e40667945$export$cf548b70626e2eb9(log, signatures) {
185
- for (const sig of [
186
- signatures
187
- ].flat()){
188
- const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
189
- if (decoded) return {
190
- decoded: decoded,
191
- metadata: {
192
- name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
193
- }
194
- };
195
- }
196
- return null;
197
- }
198
-
199
-
200
-
201
- var $414c83047563e72e$exports = {};
202
-
203
- $parcel$export($414c83047563e72e$exports, "normalizeEVMBlock", () => $414c83047563e72e$export$685b7dc2197cd06c);
204
-
205
- function $414c83047563e72e$export$685b7dc2197cd06c(rawBlock) {
206
- for (const k of [
207
- "baseFeePerGas",
208
- "gasLimit",
209
- "gasUsed",
210
- "number",
211
- "size",
212
- "timestamp"
213
- ])if (typeof rawBlock[k] === "string") rawBlock[k] = parseInt(rawBlock[k]);
214
- for (const k of [
215
- "difficulty",
216
- "totalDifficulty"
217
- ])if (typeof rawBlock[k] === "string") rawBlock[k] = BigInt(rawBlock[k]).toString();
218
- for (const k of [
219
- "miner"
220
- ])rawBlock[k] = (0, $596a656635c74d50$export$db81f9ea057ab646)(rawBlock[k]);
221
- rawBlock.transactions = rawBlock.transactions.map((tx)=>{
222
- for (const k of [
223
- "blockNumber",
224
- "cumulativeGasUsed",
225
- "effectiveGasPrice",
226
- "gas",
227
- "gasUsed",
228
- "nonce",
229
- "status",
230
- "transactionIndex"
231
- ]){
232
- if (typeof tx[k] === "string") tx[k] = parseInt(tx[k]);
233
- if (typeof tx.receipt[k] === "string") tx.receipt[k] = parseInt(tx.receipt[k]);
234
- }
235
- for (const k of [
236
- "gasPrice",
237
- "maxFeePerGas",
238
- "maxPriorityFeePerGas",
239
- "value"
240
- ]){
241
- if (typeof tx[k] === "string") tx[k] = BigInt(tx[k]).toString();
242
- if (typeof tx.receipt[k] === "string") tx.receipt[k] = BigInt(tx.receipt[k]).toString();
243
- }
244
- for (const k of [
245
- "from",
246
- "to"
247
- ])if (typeof tx[k] === "string") tx[k] = (0, $596a656635c74d50$export$db81f9ea057ab646)(tx[k]);
248
- for (const k of [
249
- "contractAddress"
250
- ])if (typeof tx.receipt[k] === "string") tx.receipt[k] = (0, $596a656635c74d50$export$db81f9ea057ab646)(tx.receipt[k]);
251
- tx.type = parseInt(tx.type);
252
- tx.receipt["status"] = Boolean(tx.receipt["status"]);
253
- tx.receipt["logs"] = tx.receipt["logs"]?.map((log)=>{
254
- for (const k of [
255
- "blockNumber",
256
- "logIndex",
257
- "transactionIndex"
258
- ])if (typeof log[k] === "string") log[k] = parseInt(log[k]);
259
- log["address"] = (0, $596a656635c74d50$export$db81f9ea057ab646)(log["address"]);
260
- return log;
261
- });
262
- return tx;
263
- });
264
- return rawBlock;
265
- }
266
-
267
-
268
- $parcel$exportWildcard($d7167569386d0d4c$exports, $596a656635c74d50$exports);
269
- $parcel$exportWildcard($d7167569386d0d4c$exports, $e5566e47593dc3e2$exports);
270
- $parcel$exportWildcard($d7167569386d0d4c$exports, $da55be3e40667945$exports);
271
- $parcel$exportWildcard($d7167569386d0d4c$exports, $f7a3fb164436c9c3$exports);
272
- $parcel$exportWildcard($d7167569386d0d4c$exports, $414c83047563e72e$exports);
273
-
274
-
275
- const $6144a02851f23907$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
276
- const $6144a02851f23907$var$tokenTransfersTemplate = {
277
- key: "token_transfers",
278
- name: "Token Transfers",
279
- description: "Get all token transfers for a set of token types.",
280
- tags: [
281
- "EVM",
282
- "ERC20",
283
- "ERC721",
284
- "NFT",
285
- "TOKEN"
286
- ],
287
- disabled: false,
288
- params: [
289
- {
290
- key: "network",
291
- name: "Network",
292
- type: "NETWORK",
293
- optional: false
294
- },
295
- {
296
- key: "tokenAddress",
297
- name: "Token Address",
298
- type: "ADDRESS",
299
- optional: true
300
- },
301
- {
302
- key: "walletAddress",
303
- name: "Wallet Address",
304
- type: "ADDRESS",
305
- optional: true
306
- },
307
- {
308
- key: "tokenTypes",
309
- name: "Token Types",
310
- type: "STRING",
311
- multiple: true,
312
- optional: true
313
- }
314
- ],
315
- transform: (block, _ctx)=>{
316
- const TOKEN_TYPES = _ctx.params.tokenTypes || [];
317
- let transfers = [];
318
- switch(block._network){
319
- // @TODO: expand to non-EVM
320
- // assume EVM as default for now
321
- default:
322
- for (const tx of block.transactions){
323
- if (!tx.receipt) continue;
324
- const timestamp = new Date(block.timestamp * 1000).toISOString();
325
- const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
326
- // track direct ETH transfers
327
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
328
- // pull from traces, if available
329
- if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
330
- const action = trace.action;
331
- if (!action?.value) continue;
332
- transfers.push({
333
- amount: BigInt(action.value),
334
- blockNumber: tx.blockNumber,
335
- from: action.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
336
- index: trace.traceAddress?.join("-"),
337
- timestamp: timestamp,
338
- to: action.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
339
- tokenType: "NATIVE",
340
- transactionGasFee: transactionGasFee,
341
- transactionHash: tx.hash
342
- });
343
- }
344
- else if (tx.value?.length >= 3 || /\d+/.test(tx.value)) transfers.push({
345
- amount: BigInt(tx.value),
346
- blockNumber: tx.blockNumber,
347
- from: tx.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
348
- timestamp: timestamp,
349
- to: tx.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
350
- tokenType: "NATIVE",
351
- transactionGasFee: transactionGasFee,
352
- transactionHash: tx.hash
353
- });
354
- }
355
- // track ERC20 transfers
356
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
357
- const txfer = (0, $da55be3e40667945$export$cf548b70626e2eb9)(log, [
358
- "Transfer(address indexed from, address indexed to, uint256 value)"
359
- ]);
360
- if (txfer) transfers.push({
361
- amount: txfer.decoded.value,
362
- blockNumber: tx.blockNumber,
363
- from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
364
- index: log.logIndex,
365
- timestamp: timestamp,
366
- to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
367
- token: log.address.toLowerCase(),
368
- tokenType: "TOKEN",
369
- transactionGasFee: transactionGasFee,
370
- transactionHash: tx.hash
371
- });
372
- }
373
- // @TODO: add NFT transfers
374
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) for (const log of tx.receipt.logs){
375
- const txfer = (0, $da55be3e40667945$export$cf548b70626e2eb9)(log, [
376
- "Transfer(address indexed from, address indexed to, uint256 indexed value)",
377
- "TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)",
378
- "TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"
379
- ]);
380
- if (!txfer) continue;
381
- switch(txfer.metadata.name){
382
- case "Transfer":
383
- transfers.push({
384
- amount: 1,
385
- blockNumber: tx.blockNumber,
386
- from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
387
- index: log.logIndex,
388
- timestamp: timestamp,
389
- to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
390
- token: log.address.toLowerCase(),
391
- tokenId: txfer.decoded.value.toString(),
392
- tokenType: "NFT",
393
- transactionGasFee: transactionGasFee,
394
- transactionHash: tx.hash
395
- });
396
- break;
397
- case "TransferSingle":
398
- transfers.push({
399
- amount: txfer.decoded.value,
400
- blockNumber: tx.blockNumber,
401
- from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
402
- index: log.logIndex,
403
- timestamp: timestamp,
404
- to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
405
- token: log.address.toLowerCase(),
406
- tokenId: txfer.decoded.id.toString(),
407
- tokenType: "NFT",
408
- transactionGasFee: transactionGasFee,
409
- transactionHash: tx.hash
410
- });
411
- break;
412
- case "TransferBatch":
413
- for(let i = 0; i < txfer.decoded.ids.length; i += 1)transfers.push({
414
- amount: txfer.decoded.values[i],
415
- blockNumber: tx.blockNumber,
416
- from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
417
- index: log.logIndex,
418
- timestamp: timestamp,
419
- to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
420
- token: log.address.toLowerCase(),
421
- tokenId: txfer.decoded.ids[i].toString(),
422
- tokenType: "NFT",
423
- transactionGasFee: transactionGasFee,
424
- transactionHash: tx.hash
425
- });
426
- break;
427
- }
428
- }
429
- }
430
- if (typeof _ctx.params.contractAddress === "string") _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();
431
- if (typeof _ctx.params.walletAddress === "string") _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();
432
- break;
433
- }
434
- transfers = transfers.filter((txfer)=>{
435
- if (txfer.amount <= BigInt(0)) return false;
436
- if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) return false;
437
- if (_ctx.params.walletAddress && ![
438
- txfer.from,
439
- txfer.to
440
- ].includes(_ctx.params.walletAddress)) return false;
441
- return true;
442
- });
443
- return transfers;
444
- },
445
- tests: [
446
- {
447
- params: {
448
- network: "BASE",
449
- walletAddress: "0x4F80864cD68782144e3736626896990acAe15a11",
450
- contractAddress: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed"
451
- },
452
- payload: "https://jiti.indexing.co/networks/base/23507423",
453
- output: [
454
- {
455
- amount: 1000000000000000000000n,
456
- blockNumber: 23507423,
457
- from: "0x053002b4b332b422733c9469ddf9990bb6235e3d",
458
- index: 536,
459
- timestamp: "2024-12-10T04:16:33.000Z",
460
- to: "0x4f80864cd68782144e3736626896990acae15a11",
461
- token: "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
462
- tokenType: "TOKEN",
463
- transactionGasFee: 1192354854229n,
464
- transactionHash: "0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56"
465
- }
466
- ]
467
- }
468
- ]
469
- };
470
- var $6144a02851f23907$export$2e2bcd8739ae039 = $6144a02851f23907$var$tokenTransfersTemplate;
471
-
472
-
473
- const $48f9879a44dd1195$export$a8fc3402335b0b04 = [
474
- (0, $59fb8e0333a5d25f$export$2e2bcd8739ae039),
475
- (0, $6144a02851f23907$export$2e2bcd8739ae039)
476
- ];
477
-
478
-
479
-
480
- var $faefaad95e5fcca0$exports = {};
481
-
482
-
483
- const $882b6d93070905b3$export$a8fc3402335b0b04 = (0, $48f9879a44dd1195$export$a8fc3402335b0b04).reduce((a, b)=>({
484
- ...a,
485
- [b.key]: Object.assign({}, b)
486
- }), {});
487
- function $882b6d93070905b3$export$cceb5167b935aafb() {
488
- return (0, $48f9879a44dd1195$export$a8fc3402335b0b04).slice();
489
- }
490
- function $882b6d93070905b3$export$a07bfd14bbc36e4b(key) {
491
- return (0, $48f9879a44dd1195$export$a8fc3402335b0b04).slice().find((template)=>template.key === key);
492
- }
493
-
494
-
495
- //# sourceMappingURL=main.js.map
package/dist/main.js.map DELETED
@@ -1 +0,0 @@
1
- {"mappings":"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","sources":["src/index.ts","src/templates/index.ts","src/templates/raw.ts","src/templates/token-transfers.ts","src/utils/index.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-decode-log.ts","src/utils/evm-method-signature-to-hex.ts","src/utils/evm-normalize-raw-block.ts","src/types.ts"],"sourcesContent":["import { templates as templateList } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nconst templates = templateList.reduce((a, b) => ({ ...a, [b.key]: Object.assign({}, b) }), {});\n\nexport { utils, templates, types };\n\nexport function getAllTemplates() {\n return templateList.slice();\n}\n\nexport function getTemplateByKey(key: string) {\n return templateList.slice().find((template) => template.key === key);\n}\n","import rawTemplate from './raw';\nimport tokenTransfersTemplate from './token-transfers';\n\nexport const templates = [rawTemplate, tokenTransfersTemplate];\n","import { Template } from '../types';\n\nconst rawTemplate: Template = {\n key: 'raw',\n name: 'Raw Block Data',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'RAW'],\n disabled: true,\n params: [],\n transform: (payload) => payload,\n tests: [\n {\n params: {},\n payload: { a: 'b', c: 1, d: { e: true } },\n output: { a: 'b', c: 1, d: { e: true } },\n },\n ],\n};\n\nexport default rawTemplate;\n","import { evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: number | bigint;\n blockNumber: number;\n from: string;\n index?: string;\n timestamp: string;\n to: string;\n token?: string;\n tokenId?: string;\n tokenType: 'NATIVE' | 'TOKEN' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst tokenTransfersTemplate: Template = {\n key: 'token_transfers',\n name: 'Token Transfers',\n description: 'Get all token transfers for a set of token types.',\n tags: ['EVM', 'ERC20', 'ERC721', 'NFT', 'TOKEN'],\n disabled: false,\n params: [\n { key: 'network', name: 'Network', type: 'NETWORK', optional: false },\n { key: 'tokenAddress', name: 'Token Address', type: 'ADDRESS', optional: true },\n { key: 'walletAddress', name: 'Wallet Address', type: 'ADDRESS', optional: true },\n { key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true },\n ],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n let transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: expand to non-EVM\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions as any[]) {\n if (!tx.receipt) {\n continue;\n }\n\n const timestamp = new Date((block.timestamp as number) * 1000).toISOString();\n const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);\n\n // track direct ETH transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NATIVE')) {\n // pull from traces, if available\n if (Array.isArray(tx.traces)) {\n for (const trace of tx.traces.filter((t) => t.action)) {\n const action = trace.action as unknown as { from: string; to: string; value: string };\n if (!action?.value) continue;\n\n transfers.push({\n amount: BigInt(action.value),\n blockNumber: tx.blockNumber as number,\n from: action.from?.toLowerCase() || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: action.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n } else if ((tx.value as string)?.length >= 3 || /\\d+/.test(tx.value as string)) {\n transfers.push({\n amount: BigInt(tx.value as string),\n blockNumber: tx.blockNumber as number,\n from: tx.from?.toLowerCase() || NULL_ADDRESS,\n timestamp,\n to: tx.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n\n // track ERC20 transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('TOKEN')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 value)',\n ]);\n if (txfer) {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenType: 'TOKEN',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n\n // @TODO: add NFT transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NFT')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 indexed value)',\n 'TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)',\n 'TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)',\n ]);\n\n if (!txfer) continue;\n\n switch (txfer.metadata.name) {\n case 'Transfer': {\n transfers.push({\n amount: 1,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.value as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferSingle': {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.id as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferBatch': {\n for (let i = 0; i < (txfer.decoded.ids as bigint[]).length; i += 1) {\n transfers.push({\n amount: txfer.decoded.values[i] as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.ids[i] as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n break;\n }\n }\n }\n }\n }\n if (typeof _ctx.params.contractAddress === 'string') {\n _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();\n }\n if (typeof _ctx.params.walletAddress === 'string') {\n _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();\n }\n break;\n }\n }\n\n transfers = transfers.filter((txfer) => {\n if (txfer.amount <= BigInt(0)) {\n return false;\n }\n if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) {\n return false;\n }\n if (_ctx.params.walletAddress && ![txfer.from, txfer.to].includes(_ctx.params.walletAddress as string)) {\n return false;\n }\n return true;\n });\n\n return transfers;\n },\n\n tests: [\n {\n params: {\n network: 'BASE',\n walletAddress: '0x4F80864cD68782144e3736626896990acAe15a11',\n contractAddress: '0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed',\n },\n payload: 'https://jiti.indexing.co/networks/base/23507423',\n output: [\n {\n amount: 1000000000000000000000n,\n blockNumber: 23507423,\n from: '0x053002b4b332b422733c9469ddf9990bb6235e3d',\n index: 536,\n timestamp: '2024-12-10T04:16:33.000Z',\n to: '0x4f80864cd68782144e3736626896990acae15a11',\n token: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed',\n tokenType: 'TOKEN',\n transactionGasFee: 1192354854229n,\n transactionHash: '0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56',\n },\n ],\n },\n ],\n};\n\nexport default tokenTransfersTemplate;\n","export * from './evm-address-to-checksum';\nexport * from './evm-chain-to-id';\nexport * from './evm-decode-log';\nexport * from './evm-method-signature-to-hex';\nexport * from './evm-normalize-raw-block';\n","import { keccak256 } from 'viem';\n\nexport function evmAddressToChecksum(address: string) {\n if (!address || !/^(0x)?[0-9a-f]{40}$/i.test(address)) {\n return null;\n }\n\n const stripAddress = address.slice(2).toLowerCase();\n const keccakHash = keccak256(stripAddress as `0x${string}`);\n let checksumAddress = '0x';\n\n for (let i = 0; i < stripAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? stripAddress[i].toUpperCase() : stripAddress[i];\n }\n\n return checksumAddress;\n}\n","const CHAIN_ID = {\n ARBITRUM: 42161,\n AVALANCHE: 43114,\n BASE: 8453,\n BASE_SEPOLIA: 84532,\n BERACHAIN_BARTIO: 80084,\n BLAST: 81457,\n BSC: 56,\n CELO: 42220,\n CYBER: 7560,\n DEGEN: 666666666,\n ETHEREUM: 1,\n ETH_HOLESKY: 17000,\n ETH_SEPOLIA: 11155111,\n FRAXTAL: 252,\n FRAXTAL_SEPOLIA: 2522,\n FUSE: 122,\n GNOSIS: 100,\n GOLD: 4653,\n HAM: 5112,\n HEMI_TESTNET: 743111,\n LINEA: 59144,\n LINEA_SEPOLIA: 59141,\n LISK_SEPOLIA: 4202,\n LYRA: 957,\n LYRA_SEPOLIA: 901,\n MODE: 34443,\n MODE_SEPOLIA: 919,\n NEON: 245022934,\n OASIS_SAPPHIRE: 23294,\n OPTIMISM: 10,\n OP_SEPOLIA: 11155420,\n ORDERLY: 291,\n ORDERLY_SEPOLIA: 4460,\n PGN_SEPOLIA: 58008,\n POLYGON: 137,\n POLYGON_AMOY: 80002,\n POLYGON_ZKEVM: 1101,\n PUBLIC_GOODS_NETWORK: 424,\n SCROLL: 534352,\n SCROLL_SEPOLIA: 534351,\n STACK: 78225,\n SYNDICATE_FRAME_CHAIN: 5101,\n TRON: 728126428,\n ZER0: 543210,\n ZK_LINK: 810180,\n ZORA: 7777777,\n ZORA_SEPOLIA: 999999999,\n};\n\nexport function evmChainToId(chain: string) {\n return CHAIN_ID[chain?.toUpperCase()];\n}\n","import { decodeEventLog, parseAbi } from 'viem';\n\nimport { evmMethodSignatureToHex } from './evm-method-signature-to-hex';\n\ntype BasicLog = Record<string, unknown> & { address: string; topics: string[] };\ntype SignaturesToDecode = string | { addresses?: string[]; signature: string; topic0?: string };\n\nexport function evmDecodeLog(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): Record<string, unknown> {\n if (Array.isArray(signatures)) {\n for (const sig of signatures) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return decoded;\n }\n }\n\n return null;\n }\n\n if (typeof signatures !== 'string' && Array.isArray(signatures.addresses) && signatures.addresses.length) {\n const addresses = signatures.addresses.map((a) => a?.toLowerCase());\n if (!addresses.includes(log.address.toLowerCase())) {\n return null;\n }\n }\n\n let sig = (typeof signatures === 'string' ? signatures : signatures.signature).trim();\n if (!sig.startsWith('event ')) {\n sig = 'event ' + sig;\n }\n const topic0 = typeof signatures !== 'string' && signatures.topic0 ? signatures.topic0 : evmMethodSignatureToHex(sig);\n if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {\n if (log.topics[0] === topic0) {\n try {\n const result = decodeEventLog({\n abi: parseAbi([sig]),\n data: log.data as `0x${string}`,\n topics: log.topics as [],\n });\n return result.args as unknown as Record<string, unknown>;\n } catch (e) {\n // ignore this\n }\n }\n }\n\n return null;\n}\n\nexport function evmDecodeLogWithMetadata(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): { decoded: Record<string, unknown>; metadata: { name: string } } {\n for (const sig of [signatures].flat()) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return {\n decoded,\n metadata: {\n name: (typeof sig === 'string' ? sig : sig.signature).split('(')[0],\n },\n };\n }\n }\n\n return null;\n}\n","import { keccak256 } from 'viem';\n\nexport function evmMethodSignatureToHex(sig: string): string {\n const [method, rest] = sig.split('(');\n const params = rest\n .split(')')[0]\n .split(',')\n .map((p) => p.trim());\n const topic0 = keccak256(\n `${method.split(' ').pop()}(${params.map((p) => p.split(' ')[0]).join(',')})` as `0x${string}`\n );\n return topic0;\n}\n","import { evmAddressToChecksum } from './evm-address-to-checksum';\n\nexport function normalizeEVMBlock(rawBlock: Record<string, unknown>): Record<string, unknown> {\n for (const k of ['baseFeePerGas', 'gasLimit', 'gasUsed', 'number', 'size', 'timestamp']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = parseInt(rawBlock[k] as string);\n }\n }\n\n for (const k of ['difficulty', 'totalDifficulty']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = BigInt(rawBlock[k] as string).toString();\n }\n }\n for (const k of ['miner']) {\n rawBlock[k] = evmAddressToChecksum(rawBlock[k] as string);\n }\n\n rawBlock.transactions = (\n rawBlock.transactions as { receipt: Record<string, unknown>; traces: Record<string, unknown>[] } & Record<\n string,\n unknown\n >[]\n ).map((tx) => {\n for (const k of [\n 'blockNumber',\n 'cumulativeGasUsed',\n 'effectiveGasPrice',\n 'gas',\n 'gasUsed',\n 'nonce',\n 'status',\n 'transactionIndex',\n ]) {\n if (typeof tx[k] === 'string') {\n tx[k] = parseInt(tx[k] as string);\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = parseInt(tx.receipt[k] as string);\n }\n }\n\n for (const k of ['gasPrice', 'maxFeePerGas', 'maxPriorityFeePerGas', 'value']) {\n if (typeof tx[k] === 'string') {\n tx[k] = BigInt(tx[k] as string).toString();\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = BigInt(tx.receipt[k] as string).toString();\n }\n }\n\n for (const k of ['from', 'to']) {\n if (typeof tx[k] === 'string') {\n tx[k] = evmAddressToChecksum(tx[k] as string);\n }\n }\n for (const k of ['contractAddress']) {\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = evmAddressToChecksum(tx.receipt[k] as string);\n }\n }\n\n tx.type = parseInt(tx.type as string);\n tx.receipt['status'] = Boolean(tx.receipt['status'] as string);\n\n tx.receipt['logs'] = (tx.receipt['logs'] as Record<string, unknown>[])?.map((log) => {\n for (const k of ['blockNumber', 'logIndex', 'transactionIndex']) {\n if (typeof log[k] === 'string') {\n log[k] = parseInt(log[k] as string);\n }\n }\n log['address'] = evmAddressToChecksum(log['address'] as string);\n return log;\n });\n\n return tx;\n });\n\n return rawBlock;\n}\n","export type Template = {\n key: string;\n name: string;\n description: string;\n disabled: boolean;\n tags: string[];\n params: Param[];\n transform: (\n payload: Record<string, unknown>,\n _ctx?: Record<string, unknown> & { params: Record<string, unknown> }\n ) => unknown;\n tests: TemplateTest[];\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n\nexport type TemplateTest = {\n params: Record<string, unknown>;\n payload: `https://${string}` | Record<string, unknown>;\n output: unknown;\n};\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/module.js DELETED
@@ -1,490 +0,0 @@
1
- import {keccak256 as $hgUW1$keccak256, decodeEventLog as $hgUW1$decodeEventLog, parseAbi as $hgUW1$parseAbi} from "viem";
2
-
3
-
4
- function $parcel$exportWildcard(dest, source) {
5
- Object.keys(source).forEach(function(key) {
6
- if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) {
7
- return;
8
- }
9
-
10
- Object.defineProperty(dest, key, {
11
- enumerable: true,
12
- get: function get() {
13
- return source[key];
14
- }
15
- });
16
- });
17
-
18
- return dest;
19
- }
20
-
21
- function $parcel$export(e, n, v, s) {
22
- Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
23
- }
24
- const $a4b307b872b01f44$var$rawTemplate = {
25
- key: "raw",
26
- name: "Raw Block Data",
27
- description: "Get all blocks with all available fields",
28
- tags: [
29
- "EVM",
30
- "RAW"
31
- ],
32
- disabled: true,
33
- params: [],
34
- transform: (payload)=>payload,
35
- tests: [
36
- {
37
- params: {},
38
- payload: {
39
- a: "b",
40
- c: 1,
41
- d: {
42
- e: true
43
- }
44
- },
45
- output: {
46
- a: "b",
47
- c: 1,
48
- d: {
49
- e: true
50
- }
51
- }
52
- }
53
- ]
54
- };
55
- var $a4b307b872b01f44$export$2e2bcd8739ae039 = $a4b307b872b01f44$var$rawTemplate;
56
-
57
-
58
- var $fde9406d76ec24a9$exports = {};
59
- var $42564d9f228fe302$exports = {};
60
-
61
- $parcel$export($42564d9f228fe302$exports, "evmAddressToChecksum", () => $42564d9f228fe302$export$db81f9ea057ab646);
62
-
63
- function $42564d9f228fe302$export$db81f9ea057ab646(address) {
64
- if (!address || !/^(0x)?[0-9a-f]{40}$/i.test(address)) return null;
65
- const stripAddress = address.slice(2).toLowerCase();
66
- const keccakHash = (0, $hgUW1$keccak256)(stripAddress);
67
- let checksumAddress = "0x";
68
- for(let i = 0; i < stripAddress.length; i++)checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? stripAddress[i].toUpperCase() : stripAddress[i];
69
- return checksumAddress;
70
- }
71
-
72
-
73
- var $68871103c7bc00cf$exports = {};
74
-
75
- $parcel$export($68871103c7bc00cf$exports, "evmChainToId", () => $68871103c7bc00cf$export$f93b8abed77a4120);
76
- const $68871103c7bc00cf$var$CHAIN_ID = {
77
- ARBITRUM: 42161,
78
- AVALANCHE: 43114,
79
- BASE: 8453,
80
- BASE_SEPOLIA: 84532,
81
- BERACHAIN_BARTIO: 80084,
82
- BLAST: 81457,
83
- BSC: 56,
84
- CELO: 42220,
85
- CYBER: 7560,
86
- DEGEN: 666666666,
87
- ETHEREUM: 1,
88
- ETH_HOLESKY: 17000,
89
- ETH_SEPOLIA: 11155111,
90
- FRAXTAL: 252,
91
- FRAXTAL_SEPOLIA: 2522,
92
- FUSE: 122,
93
- GNOSIS: 100,
94
- GOLD: 4653,
95
- HAM: 5112,
96
- HEMI_TESTNET: 743111,
97
- LINEA: 59144,
98
- LINEA_SEPOLIA: 59141,
99
- LISK_SEPOLIA: 4202,
100
- LYRA: 957,
101
- LYRA_SEPOLIA: 901,
102
- MODE: 34443,
103
- MODE_SEPOLIA: 919,
104
- NEON: 245022934,
105
- OASIS_SAPPHIRE: 23294,
106
- OPTIMISM: 10,
107
- OP_SEPOLIA: 11155420,
108
- ORDERLY: 291,
109
- ORDERLY_SEPOLIA: 4460,
110
- PGN_SEPOLIA: 58008,
111
- POLYGON: 137,
112
- POLYGON_AMOY: 80002,
113
- POLYGON_ZKEVM: 1101,
114
- PUBLIC_GOODS_NETWORK: 424,
115
- SCROLL: 534352,
116
- SCROLL_SEPOLIA: 534351,
117
- STACK: 78225,
118
- SYNDICATE_FRAME_CHAIN: 5101,
119
- TRON: 728126428,
120
- ZER0: 543210,
121
- ZK_LINK: 810180,
122
- ZORA: 7777777,
123
- ZORA_SEPOLIA: 999999999
124
- };
125
- function $68871103c7bc00cf$export$f93b8abed77a4120(chain) {
126
- return $68871103c7bc00cf$var$CHAIN_ID[chain?.toUpperCase()];
127
- }
128
-
129
-
130
- var $cfa23334cbdf9391$exports = {};
131
-
132
- $parcel$export($cfa23334cbdf9391$exports, "evmDecodeLog", () => $cfa23334cbdf9391$export$18467e329ea485c9);
133
- $parcel$export($cfa23334cbdf9391$exports, "evmDecodeLogWithMetadata", () => $cfa23334cbdf9391$export$cf548b70626e2eb9);
134
-
135
- var $f6a81337d3532e59$exports = {};
136
-
137
- $parcel$export($f6a81337d3532e59$exports, "evmMethodSignatureToHex", () => $f6a81337d3532e59$export$49d5c9473f8f70f2);
138
-
139
- function $f6a81337d3532e59$export$49d5c9473f8f70f2(sig) {
140
- const [method, rest] = sig.split("(");
141
- const params = rest.split(")")[0].split(",").map((p)=>p.trim());
142
- const topic0 = (0, $hgUW1$keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
143
- return topic0;
144
- }
145
-
146
-
147
- function $cfa23334cbdf9391$export$18467e329ea485c9(log, signatures) {
148
- if (Array.isArray(signatures)) {
149
- for (const sig of signatures){
150
- const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
151
- if (decoded) return decoded;
152
- }
153
- return null;
154
- }
155
- if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
156
- const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
157
- if (!addresses.includes(log.address.toLowerCase())) return null;
158
- }
159
- let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
160
- if (!sig.startsWith("event ")) sig = "event " + sig;
161
- const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f6a81337d3532e59$export$49d5c9473f8f70f2)(sig);
162
- if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
163
- if (log.topics[0] === topic0) try {
164
- const result = (0, $hgUW1$decodeEventLog)({
165
- abi: (0, $hgUW1$parseAbi)([
166
- sig
167
- ]),
168
- data: log.data,
169
- topics: log.topics
170
- });
171
- return result.args;
172
- } catch (e) {
173
- // ignore this
174
- }
175
- }
176
- return null;
177
- }
178
- function $cfa23334cbdf9391$export$cf548b70626e2eb9(log, signatures) {
179
- for (const sig of [
180
- signatures
181
- ].flat()){
182
- const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
183
- if (decoded) return {
184
- decoded: decoded,
185
- metadata: {
186
- name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
187
- }
188
- };
189
- }
190
- return null;
191
- }
192
-
193
-
194
-
195
- var $8f1e0ae1ead9a2a9$exports = {};
196
-
197
- $parcel$export($8f1e0ae1ead9a2a9$exports, "normalizeEVMBlock", () => $8f1e0ae1ead9a2a9$export$685b7dc2197cd06c);
198
-
199
- function $8f1e0ae1ead9a2a9$export$685b7dc2197cd06c(rawBlock) {
200
- for (const k of [
201
- "baseFeePerGas",
202
- "gasLimit",
203
- "gasUsed",
204
- "number",
205
- "size",
206
- "timestamp"
207
- ])if (typeof rawBlock[k] === "string") rawBlock[k] = parseInt(rawBlock[k]);
208
- for (const k of [
209
- "difficulty",
210
- "totalDifficulty"
211
- ])if (typeof rawBlock[k] === "string") rawBlock[k] = BigInt(rawBlock[k]).toString();
212
- for (const k of [
213
- "miner"
214
- ])rawBlock[k] = (0, $42564d9f228fe302$export$db81f9ea057ab646)(rawBlock[k]);
215
- rawBlock.transactions = rawBlock.transactions.map((tx)=>{
216
- for (const k of [
217
- "blockNumber",
218
- "cumulativeGasUsed",
219
- "effectiveGasPrice",
220
- "gas",
221
- "gasUsed",
222
- "nonce",
223
- "status",
224
- "transactionIndex"
225
- ]){
226
- if (typeof tx[k] === "string") tx[k] = parseInt(tx[k]);
227
- if (typeof tx.receipt[k] === "string") tx.receipt[k] = parseInt(tx.receipt[k]);
228
- }
229
- for (const k of [
230
- "gasPrice",
231
- "maxFeePerGas",
232
- "maxPriorityFeePerGas",
233
- "value"
234
- ]){
235
- if (typeof tx[k] === "string") tx[k] = BigInt(tx[k]).toString();
236
- if (typeof tx.receipt[k] === "string") tx.receipt[k] = BigInt(tx.receipt[k]).toString();
237
- }
238
- for (const k of [
239
- "from",
240
- "to"
241
- ])if (typeof tx[k] === "string") tx[k] = (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx[k]);
242
- for (const k of [
243
- "contractAddress"
244
- ])if (typeof tx.receipt[k] === "string") tx.receipt[k] = (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx.receipt[k]);
245
- tx.type = parseInt(tx.type);
246
- tx.receipt["status"] = Boolean(tx.receipt["status"]);
247
- tx.receipt["logs"] = tx.receipt["logs"]?.map((log)=>{
248
- for (const k of [
249
- "blockNumber",
250
- "logIndex",
251
- "transactionIndex"
252
- ])if (typeof log[k] === "string") log[k] = parseInt(log[k]);
253
- log["address"] = (0, $42564d9f228fe302$export$db81f9ea057ab646)(log["address"]);
254
- return log;
255
- });
256
- return tx;
257
- });
258
- return rawBlock;
259
- }
260
-
261
-
262
- $parcel$exportWildcard($fde9406d76ec24a9$exports, $42564d9f228fe302$exports);
263
- $parcel$exportWildcard($fde9406d76ec24a9$exports, $68871103c7bc00cf$exports);
264
- $parcel$exportWildcard($fde9406d76ec24a9$exports, $cfa23334cbdf9391$exports);
265
- $parcel$exportWildcard($fde9406d76ec24a9$exports, $f6a81337d3532e59$exports);
266
- $parcel$exportWildcard($fde9406d76ec24a9$exports, $8f1e0ae1ead9a2a9$exports);
267
-
268
-
269
- const $c18434deda90759d$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
270
- const $c18434deda90759d$var$tokenTransfersTemplate = {
271
- key: "token_transfers",
272
- name: "Token Transfers",
273
- description: "Get all token transfers for a set of token types.",
274
- tags: [
275
- "EVM",
276
- "ERC20",
277
- "ERC721",
278
- "NFT",
279
- "TOKEN"
280
- ],
281
- disabled: false,
282
- params: [
283
- {
284
- key: "network",
285
- name: "Network",
286
- type: "NETWORK",
287
- optional: false
288
- },
289
- {
290
- key: "tokenAddress",
291
- name: "Token Address",
292
- type: "ADDRESS",
293
- optional: true
294
- },
295
- {
296
- key: "walletAddress",
297
- name: "Wallet Address",
298
- type: "ADDRESS",
299
- optional: true
300
- },
301
- {
302
- key: "tokenTypes",
303
- name: "Token Types",
304
- type: "STRING",
305
- multiple: true,
306
- optional: true
307
- }
308
- ],
309
- transform: (block, _ctx)=>{
310
- const TOKEN_TYPES = _ctx.params.tokenTypes || [];
311
- let transfers = [];
312
- switch(block._network){
313
- // @TODO: expand to non-EVM
314
- // assume EVM as default for now
315
- default:
316
- for (const tx of block.transactions){
317
- if (!tx.receipt) continue;
318
- const timestamp = new Date(block.timestamp * 1000).toISOString();
319
- const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
320
- // track direct ETH transfers
321
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
322
- // pull from traces, if available
323
- if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
324
- const action = trace.action;
325
- if (!action?.value) continue;
326
- transfers.push({
327
- amount: BigInt(action.value),
328
- blockNumber: tx.blockNumber,
329
- from: action.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
330
- index: trace.traceAddress?.join("-"),
331
- timestamp: timestamp,
332
- to: action.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
333
- tokenType: "NATIVE",
334
- transactionGasFee: transactionGasFee,
335
- transactionHash: tx.hash
336
- });
337
- }
338
- else if (tx.value?.length >= 3 || /\d+/.test(tx.value)) transfers.push({
339
- amount: BigInt(tx.value),
340
- blockNumber: tx.blockNumber,
341
- from: tx.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
342
- timestamp: timestamp,
343
- to: tx.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
344
- tokenType: "NATIVE",
345
- transactionGasFee: transactionGasFee,
346
- transactionHash: tx.hash
347
- });
348
- }
349
- // track ERC20 transfers
350
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
351
- const txfer = (0, $cfa23334cbdf9391$export$cf548b70626e2eb9)(log, [
352
- "Transfer(address indexed from, address indexed to, uint256 value)"
353
- ]);
354
- if (txfer) transfers.push({
355
- amount: txfer.decoded.value,
356
- blockNumber: tx.blockNumber,
357
- from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
358
- index: log.logIndex,
359
- timestamp: timestamp,
360
- to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
361
- token: log.address.toLowerCase(),
362
- tokenType: "TOKEN",
363
- transactionGasFee: transactionGasFee,
364
- transactionHash: tx.hash
365
- });
366
- }
367
- // @TODO: add NFT transfers
368
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) for (const log of tx.receipt.logs){
369
- const txfer = (0, $cfa23334cbdf9391$export$cf548b70626e2eb9)(log, [
370
- "Transfer(address indexed from, address indexed to, uint256 indexed value)",
371
- "TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)",
372
- "TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"
373
- ]);
374
- if (!txfer) continue;
375
- switch(txfer.metadata.name){
376
- case "Transfer":
377
- transfers.push({
378
- amount: 1,
379
- blockNumber: tx.blockNumber,
380
- from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
381
- index: log.logIndex,
382
- timestamp: timestamp,
383
- to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
384
- token: log.address.toLowerCase(),
385
- tokenId: txfer.decoded.value.toString(),
386
- tokenType: "NFT",
387
- transactionGasFee: transactionGasFee,
388
- transactionHash: tx.hash
389
- });
390
- break;
391
- case "TransferSingle":
392
- transfers.push({
393
- amount: txfer.decoded.value,
394
- blockNumber: tx.blockNumber,
395
- from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
396
- index: log.logIndex,
397
- timestamp: timestamp,
398
- to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
399
- token: log.address.toLowerCase(),
400
- tokenId: txfer.decoded.id.toString(),
401
- tokenType: "NFT",
402
- transactionGasFee: transactionGasFee,
403
- transactionHash: tx.hash
404
- });
405
- break;
406
- case "TransferBatch":
407
- for(let i = 0; i < txfer.decoded.ids.length; i += 1)transfers.push({
408
- amount: txfer.decoded.values[i],
409
- blockNumber: tx.blockNumber,
410
- from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
411
- index: log.logIndex,
412
- timestamp: timestamp,
413
- to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
414
- token: log.address.toLowerCase(),
415
- tokenId: txfer.decoded.ids[i].toString(),
416
- tokenType: "NFT",
417
- transactionGasFee: transactionGasFee,
418
- transactionHash: tx.hash
419
- });
420
- break;
421
- }
422
- }
423
- }
424
- if (typeof _ctx.params.contractAddress === "string") _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();
425
- if (typeof _ctx.params.walletAddress === "string") _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();
426
- break;
427
- }
428
- transfers = transfers.filter((txfer)=>{
429
- if (txfer.amount <= BigInt(0)) return false;
430
- if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) return false;
431
- if (_ctx.params.walletAddress && ![
432
- txfer.from,
433
- txfer.to
434
- ].includes(_ctx.params.walletAddress)) return false;
435
- return true;
436
- });
437
- return transfers;
438
- },
439
- tests: [
440
- {
441
- params: {
442
- network: "BASE",
443
- walletAddress: "0x4F80864cD68782144e3736626896990acAe15a11",
444
- contractAddress: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed"
445
- },
446
- payload: "https://jiti.indexing.co/networks/base/23507423",
447
- output: [
448
- {
449
- amount: 1000000000000000000000n,
450
- blockNumber: 23507423,
451
- from: "0x053002b4b332b422733c9469ddf9990bb6235e3d",
452
- index: 536,
453
- timestamp: "2024-12-10T04:16:33.000Z",
454
- to: "0x4f80864cd68782144e3736626896990acae15a11",
455
- token: "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
456
- tokenType: "TOKEN",
457
- transactionGasFee: 1192354854229n,
458
- transactionHash: "0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56"
459
- }
460
- ]
461
- }
462
- ]
463
- };
464
- var $c18434deda90759d$export$2e2bcd8739ae039 = $c18434deda90759d$var$tokenTransfersTemplate;
465
-
466
-
467
- const $70cb039dbeb3c65a$export$a8fc3402335b0b04 = [
468
- (0, $a4b307b872b01f44$export$2e2bcd8739ae039),
469
- (0, $c18434deda90759d$export$2e2bcd8739ae039)
470
- ];
471
-
472
-
473
-
474
- var $81c1b644006d48ec$exports = {};
475
-
476
-
477
- const $149c1bd638913645$export$a8fc3402335b0b04 = (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).reduce((a, b)=>({
478
- ...a,
479
- [b.key]: Object.assign({}, b)
480
- }), {});
481
- function $149c1bd638913645$export$cceb5167b935aafb() {
482
- return (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).slice();
483
- }
484
- function $149c1bd638913645$export$a07bfd14bbc36e4b(key) {
485
- return (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).slice().find((template)=>template.key === key);
486
- }
487
-
488
-
489
- export {$149c1bd638913645$export$a8fc3402335b0b04 as templates, $149c1bd638913645$export$cceb5167b935aafb as getAllTemplates, $149c1bd638913645$export$a07bfd14bbc36e4b as getTemplateByKey};
490
- //# sourceMappingURL=module.js.map
@@ -1 +0,0 @@
1
- {"mappings":"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","sources":["src/index.ts","src/templates/index.ts","src/templates/raw.ts","src/templates/token-transfers.ts","src/utils/index.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-decode-log.ts","src/utils/evm-method-signature-to-hex.ts","src/utils/evm-normalize-raw-block.ts","src/types.ts"],"sourcesContent":["import { templates as templateList } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nconst templates = templateList.reduce((a, b) => ({ ...a, [b.key]: Object.assign({}, b) }), {});\n\nexport { utils, templates, types };\n\nexport function getAllTemplates() {\n return templateList.slice();\n}\n\nexport function getTemplateByKey(key: string) {\n return templateList.slice().find((template) => template.key === key);\n}\n","import rawTemplate from './raw';\nimport tokenTransfersTemplate from './token-transfers';\n\nexport const templates = [rawTemplate, tokenTransfersTemplate];\n","import { Template } from '../types';\n\nconst rawTemplate: Template = {\n key: 'raw',\n name: 'Raw Block Data',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'RAW'],\n disabled: true,\n params: [],\n transform: (payload) => payload,\n tests: [\n {\n params: {},\n payload: { a: 'b', c: 1, d: { e: true } },\n output: { a: 'b', c: 1, d: { e: true } },\n },\n ],\n};\n\nexport default rawTemplate;\n","import { evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: number | bigint;\n blockNumber: number;\n from: string;\n index?: string;\n timestamp: string;\n to: string;\n token?: string;\n tokenId?: string;\n tokenType: 'NATIVE' | 'TOKEN' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst tokenTransfersTemplate: Template = {\n key: 'token_transfers',\n name: 'Token Transfers',\n description: 'Get all token transfers for a set of token types.',\n tags: ['EVM', 'ERC20', 'ERC721', 'NFT', 'TOKEN'],\n disabled: false,\n params: [\n { key: 'network', name: 'Network', type: 'NETWORK', optional: false },\n { key: 'tokenAddress', name: 'Token Address', type: 'ADDRESS', optional: true },\n { key: 'walletAddress', name: 'Wallet Address', type: 'ADDRESS', optional: true },\n { key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true },\n ],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n let transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: expand to non-EVM\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions as any[]) {\n if (!tx.receipt) {\n continue;\n }\n\n const timestamp = new Date((block.timestamp as number) * 1000).toISOString();\n const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);\n\n // track direct ETH transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NATIVE')) {\n // pull from traces, if available\n if (Array.isArray(tx.traces)) {\n for (const trace of tx.traces.filter((t) => t.action)) {\n const action = trace.action as unknown as { from: string; to: string; value: string };\n if (!action?.value) continue;\n\n transfers.push({\n amount: BigInt(action.value),\n blockNumber: tx.blockNumber as number,\n from: action.from?.toLowerCase() || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: action.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n } else if ((tx.value as string)?.length >= 3 || /\\d+/.test(tx.value as string)) {\n transfers.push({\n amount: BigInt(tx.value as string),\n blockNumber: tx.blockNumber as number,\n from: tx.from?.toLowerCase() || NULL_ADDRESS,\n timestamp,\n to: tx.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n\n // track ERC20 transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('TOKEN')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 value)',\n ]);\n if (txfer) {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenType: 'TOKEN',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n\n // @TODO: add NFT transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NFT')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 indexed value)',\n 'TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)',\n 'TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)',\n ]);\n\n if (!txfer) continue;\n\n switch (txfer.metadata.name) {\n case 'Transfer': {\n transfers.push({\n amount: 1,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.value as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferSingle': {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.id as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferBatch': {\n for (let i = 0; i < (txfer.decoded.ids as bigint[]).length; i += 1) {\n transfers.push({\n amount: txfer.decoded.values[i] as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.ids[i] as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n break;\n }\n }\n }\n }\n }\n if (typeof _ctx.params.contractAddress === 'string') {\n _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();\n }\n if (typeof _ctx.params.walletAddress === 'string') {\n _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();\n }\n break;\n }\n }\n\n transfers = transfers.filter((txfer) => {\n if (txfer.amount <= BigInt(0)) {\n return false;\n }\n if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) {\n return false;\n }\n if (_ctx.params.walletAddress && ![txfer.from, txfer.to].includes(_ctx.params.walletAddress as string)) {\n return false;\n }\n return true;\n });\n\n return transfers;\n },\n\n tests: [\n {\n params: {\n network: 'BASE',\n walletAddress: '0x4F80864cD68782144e3736626896990acAe15a11',\n contractAddress: '0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed',\n },\n payload: 'https://jiti.indexing.co/networks/base/23507423',\n output: [\n {\n amount: 1000000000000000000000n,\n blockNumber: 23507423,\n from: '0x053002b4b332b422733c9469ddf9990bb6235e3d',\n index: 536,\n timestamp: '2024-12-10T04:16:33.000Z',\n to: '0x4f80864cd68782144e3736626896990acae15a11',\n token: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed',\n tokenType: 'TOKEN',\n transactionGasFee: 1192354854229n,\n transactionHash: '0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56',\n },\n ],\n },\n ],\n};\n\nexport default tokenTransfersTemplate;\n","export * from './evm-address-to-checksum';\nexport * from './evm-chain-to-id';\nexport * from './evm-decode-log';\nexport * from './evm-method-signature-to-hex';\nexport * from './evm-normalize-raw-block';\n","import { keccak256 } from 'viem';\n\nexport function evmAddressToChecksum(address: string) {\n if (!address || !/^(0x)?[0-9a-f]{40}$/i.test(address)) {\n return null;\n }\n\n const stripAddress = address.slice(2).toLowerCase();\n const keccakHash = keccak256(stripAddress as `0x${string}`);\n let checksumAddress = '0x';\n\n for (let i = 0; i < stripAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? stripAddress[i].toUpperCase() : stripAddress[i];\n }\n\n return checksumAddress;\n}\n","const CHAIN_ID = {\n ARBITRUM: 42161,\n AVALANCHE: 43114,\n BASE: 8453,\n BASE_SEPOLIA: 84532,\n BERACHAIN_BARTIO: 80084,\n BLAST: 81457,\n BSC: 56,\n CELO: 42220,\n CYBER: 7560,\n DEGEN: 666666666,\n ETHEREUM: 1,\n ETH_HOLESKY: 17000,\n ETH_SEPOLIA: 11155111,\n FRAXTAL: 252,\n FRAXTAL_SEPOLIA: 2522,\n FUSE: 122,\n GNOSIS: 100,\n GOLD: 4653,\n HAM: 5112,\n HEMI_TESTNET: 743111,\n LINEA: 59144,\n LINEA_SEPOLIA: 59141,\n LISK_SEPOLIA: 4202,\n LYRA: 957,\n LYRA_SEPOLIA: 901,\n MODE: 34443,\n MODE_SEPOLIA: 919,\n NEON: 245022934,\n OASIS_SAPPHIRE: 23294,\n OPTIMISM: 10,\n OP_SEPOLIA: 11155420,\n ORDERLY: 291,\n ORDERLY_SEPOLIA: 4460,\n PGN_SEPOLIA: 58008,\n POLYGON: 137,\n POLYGON_AMOY: 80002,\n POLYGON_ZKEVM: 1101,\n PUBLIC_GOODS_NETWORK: 424,\n SCROLL: 534352,\n SCROLL_SEPOLIA: 534351,\n STACK: 78225,\n SYNDICATE_FRAME_CHAIN: 5101,\n TRON: 728126428,\n ZER0: 543210,\n ZK_LINK: 810180,\n ZORA: 7777777,\n ZORA_SEPOLIA: 999999999,\n};\n\nexport function evmChainToId(chain: string) {\n return CHAIN_ID[chain?.toUpperCase()];\n}\n","import { decodeEventLog, parseAbi } from 'viem';\n\nimport { evmMethodSignatureToHex } from './evm-method-signature-to-hex';\n\ntype BasicLog = Record<string, unknown> & { address: string; topics: string[] };\ntype SignaturesToDecode = string | { addresses?: string[]; signature: string; topic0?: string };\n\nexport function evmDecodeLog(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): Record<string, unknown> {\n if (Array.isArray(signatures)) {\n for (const sig of signatures) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return decoded;\n }\n }\n\n return null;\n }\n\n if (typeof signatures !== 'string' && Array.isArray(signatures.addresses) && signatures.addresses.length) {\n const addresses = signatures.addresses.map((a) => a?.toLowerCase());\n if (!addresses.includes(log.address.toLowerCase())) {\n return null;\n }\n }\n\n let sig = (typeof signatures === 'string' ? signatures : signatures.signature).trim();\n if (!sig.startsWith('event ')) {\n sig = 'event ' + sig;\n }\n const topic0 = typeof signatures !== 'string' && signatures.topic0 ? signatures.topic0 : evmMethodSignatureToHex(sig);\n if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {\n if (log.topics[0] === topic0) {\n try {\n const result = decodeEventLog({\n abi: parseAbi([sig]),\n data: log.data as `0x${string}`,\n topics: log.topics as [],\n });\n return result.args as unknown as Record<string, unknown>;\n } catch (e) {\n // ignore this\n }\n }\n }\n\n return null;\n}\n\nexport function evmDecodeLogWithMetadata(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): { decoded: Record<string, unknown>; metadata: { name: string } } {\n for (const sig of [signatures].flat()) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return {\n decoded,\n metadata: {\n name: (typeof sig === 'string' ? sig : sig.signature).split('(')[0],\n },\n };\n }\n }\n\n return null;\n}\n","import { keccak256 } from 'viem';\n\nexport function evmMethodSignatureToHex(sig: string): string {\n const [method, rest] = sig.split('(');\n const params = rest\n .split(')')[0]\n .split(',')\n .map((p) => p.trim());\n const topic0 = keccak256(\n `${method.split(' ').pop()}(${params.map((p) => p.split(' ')[0]).join(',')})` as `0x${string}`\n );\n return topic0;\n}\n","import { evmAddressToChecksum } from './evm-address-to-checksum';\n\nexport function normalizeEVMBlock(rawBlock: Record<string, unknown>): Record<string, unknown> {\n for (const k of ['baseFeePerGas', 'gasLimit', 'gasUsed', 'number', 'size', 'timestamp']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = parseInt(rawBlock[k] as string);\n }\n }\n\n for (const k of ['difficulty', 'totalDifficulty']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = BigInt(rawBlock[k] as string).toString();\n }\n }\n for (const k of ['miner']) {\n rawBlock[k] = evmAddressToChecksum(rawBlock[k] as string);\n }\n\n rawBlock.transactions = (\n rawBlock.transactions as { receipt: Record<string, unknown>; traces: Record<string, unknown>[] } & Record<\n string,\n unknown\n >[]\n ).map((tx) => {\n for (const k of [\n 'blockNumber',\n 'cumulativeGasUsed',\n 'effectiveGasPrice',\n 'gas',\n 'gasUsed',\n 'nonce',\n 'status',\n 'transactionIndex',\n ]) {\n if (typeof tx[k] === 'string') {\n tx[k] = parseInt(tx[k] as string);\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = parseInt(tx.receipt[k] as string);\n }\n }\n\n for (const k of ['gasPrice', 'maxFeePerGas', 'maxPriorityFeePerGas', 'value']) {\n if (typeof tx[k] === 'string') {\n tx[k] = BigInt(tx[k] as string).toString();\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = BigInt(tx.receipt[k] as string).toString();\n }\n }\n\n for (const k of ['from', 'to']) {\n if (typeof tx[k] === 'string') {\n tx[k] = evmAddressToChecksum(tx[k] as string);\n }\n }\n for (const k of ['contractAddress']) {\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = evmAddressToChecksum(tx.receipt[k] as string);\n }\n }\n\n tx.type = parseInt(tx.type as string);\n tx.receipt['status'] = Boolean(tx.receipt['status'] as string);\n\n tx.receipt['logs'] = (tx.receipt['logs'] as Record<string, unknown>[])?.map((log) => {\n for (const k of ['blockNumber', 'logIndex', 'transactionIndex']) {\n if (typeof log[k] === 'string') {\n log[k] = parseInt(log[k] as string);\n }\n }\n log['address'] = evmAddressToChecksum(log['address'] as string);\n return log;\n });\n\n return tx;\n });\n\n return rawBlock;\n}\n","export type Template = {\n key: string;\n name: string;\n description: string;\n disabled: boolean;\n tags: string[];\n params: Param[];\n transform: (\n payload: Record<string, unknown>,\n _ctx?: Record<string, unknown> & { params: Record<string, unknown> }\n ) => unknown;\n tests: TemplateTest[];\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n\nexport type TemplateTest = {\n params: Record<string, unknown>;\n payload: `https://${string}` | Record<string, unknown>;\n output: unknown;\n};\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts DELETED
@@ -1,29 +0,0 @@
1
- type Template = {
2
- key: string;
3
- name: string;
4
- description: string;
5
- disabled: boolean;
6
- tags: string[];
7
- params: Param[];
8
- transform: (payload: Record<string, unknown>, _ctx?: Record<string, unknown> & {
9
- params: Record<string, unknown>;
10
- }) => unknown;
11
- tests: TemplateTest[];
12
- };
13
- type Param = {
14
- key: string;
15
- name: string;
16
- type: 'NETWORK' | 'ADDRESS' | 'STRING';
17
- multiple?: boolean;
18
- optional?: boolean;
19
- };
20
- type TemplateTest = {
21
- params: Record<string, unknown>;
22
- payload: `https://${string}` | Record<string, unknown>;
23
- output: unknown;
24
- };
25
- export const templates: {};
26
- export function getAllTemplates(): Template[];
27
- export function getTemplateByKey(key: string): Template;
28
-
29
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,gBAAuB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,EAAE,CACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KACjE,OAAO,CAAC;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB,CAAC;AAEF,aAAoB;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,oBAA2B;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,WAAW,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AUtBF,OAAA,MAAM,aAAwF,CAAC;AAI/F,8CAEC;AAED,iCAAiC,GAAG,EAAE,MAAM,YAE3C","sources":["src/types.ts","src/templates/raw.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-method-signature-to-hex.ts","src/utils/evm-decode-log.ts","src/utils/evm-normalize-raw-block.ts","src/utils/index.ts","src/templates/token-transfers.ts","src/templates/index.ts","src/index.ts"],"sourcesContent":["export type Template = {\n key: string;\n name: string;\n description: string;\n disabled: boolean;\n tags: string[];\n params: Param[];\n transform: (\n payload: Record<string, unknown>,\n _ctx?: Record<string, unknown> & { params: Record<string, unknown> }\n ) => unknown;\n tests: TemplateTest[];\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n\nexport type TemplateTest = {\n params: Record<string, unknown>;\n payload: `https://${string}` | Record<string, unknown>;\n output: unknown;\n};\n","import { Template } from '../types';\n\nconst rawTemplate: Template = {\n key: 'raw',\n name: 'Raw Block Data',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'RAW'],\n disabled: true,\n params: [],\n transform: (payload) => payload,\n tests: [\n {\n params: {},\n payload: { a: 'b', c: 1, d: { e: true } },\n output: { a: 'b', c: 1, d: { e: true } },\n },\n ],\n};\n\nexport default rawTemplate;\n","import { keccak256 } from 'viem';\n\nexport function evmAddressToChecksum(address: string) {\n if (!address || !/^(0x)?[0-9a-f]{40}$/i.test(address)) {\n return null;\n }\n\n const stripAddress = address.slice(2).toLowerCase();\n const keccakHash = keccak256(stripAddress as `0x${string}`);\n let checksumAddress = '0x';\n\n for (let i = 0; i < stripAddress.length; i++) {\n checksumAddress += parseInt(keccakHash[i], 16) >= 8 ? stripAddress[i].toUpperCase() : stripAddress[i];\n }\n\n return checksumAddress;\n}\n","const CHAIN_ID = {\n ARBITRUM: 42161,\n AVALANCHE: 43114,\n BASE: 8453,\n BASE_SEPOLIA: 84532,\n BERACHAIN_BARTIO: 80084,\n BLAST: 81457,\n BSC: 56,\n CELO: 42220,\n CYBER: 7560,\n DEGEN: 666666666,\n ETHEREUM: 1,\n ETH_HOLESKY: 17000,\n ETH_SEPOLIA: 11155111,\n FRAXTAL: 252,\n FRAXTAL_SEPOLIA: 2522,\n FUSE: 122,\n GNOSIS: 100,\n GOLD: 4653,\n HAM: 5112,\n HEMI_TESTNET: 743111,\n LINEA: 59144,\n LINEA_SEPOLIA: 59141,\n LISK_SEPOLIA: 4202,\n LYRA: 957,\n LYRA_SEPOLIA: 901,\n MODE: 34443,\n MODE_SEPOLIA: 919,\n NEON: 245022934,\n OASIS_SAPPHIRE: 23294,\n OPTIMISM: 10,\n OP_SEPOLIA: 11155420,\n ORDERLY: 291,\n ORDERLY_SEPOLIA: 4460,\n PGN_SEPOLIA: 58008,\n POLYGON: 137,\n POLYGON_AMOY: 80002,\n POLYGON_ZKEVM: 1101,\n PUBLIC_GOODS_NETWORK: 424,\n SCROLL: 534352,\n SCROLL_SEPOLIA: 534351,\n STACK: 78225,\n SYNDICATE_FRAME_CHAIN: 5101,\n TRON: 728126428,\n ZER0: 543210,\n ZK_LINK: 810180,\n ZORA: 7777777,\n ZORA_SEPOLIA: 999999999,\n};\n\nexport function evmChainToId(chain: string) {\n return CHAIN_ID[chain?.toUpperCase()];\n}\n","import { keccak256 } from 'viem';\n\nexport function evmMethodSignatureToHex(sig: string): string {\n const [method, rest] = sig.split('(');\n const params = rest\n .split(')')[0]\n .split(',')\n .map((p) => p.trim());\n const topic0 = keccak256(\n `${method.split(' ').pop()}(${params.map((p) => p.split(' ')[0]).join(',')})` as `0x${string}`\n );\n return topic0;\n}\n","import { decodeEventLog, parseAbi } from 'viem';\n\nimport { evmMethodSignatureToHex } from './evm-method-signature-to-hex';\n\ntype BasicLog = Record<string, unknown> & { address: string; topics: string[] };\ntype SignaturesToDecode = string | { addresses?: string[]; signature: string; topic0?: string };\n\nexport function evmDecodeLog(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): Record<string, unknown> {\n if (Array.isArray(signatures)) {\n for (const sig of signatures) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return decoded;\n }\n }\n\n return null;\n }\n\n if (typeof signatures !== 'string' && Array.isArray(signatures.addresses) && signatures.addresses.length) {\n const addresses = signatures.addresses.map((a) => a?.toLowerCase());\n if (!addresses.includes(log.address.toLowerCase())) {\n return null;\n }\n }\n\n let sig = (typeof signatures === 'string' ? signatures : signatures.signature).trim();\n if (!sig.startsWith('event ')) {\n sig = 'event ' + sig;\n }\n const topic0 = typeof signatures !== 'string' && signatures.topic0 ? signatures.topic0 : evmMethodSignatureToHex(sig);\n if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {\n if (log.topics[0] === topic0) {\n try {\n const result = decodeEventLog({\n abi: parseAbi([sig]),\n data: log.data as `0x${string}`,\n topics: log.topics as [],\n });\n return result.args as unknown as Record<string, unknown>;\n } catch (e) {\n // ignore this\n }\n }\n }\n\n return null;\n}\n\nexport function evmDecodeLogWithMetadata(\n log: BasicLog,\n signatures: SignaturesToDecode | SignaturesToDecode[]\n): { decoded: Record<string, unknown>; metadata: { name: string } } {\n for (const sig of [signatures].flat()) {\n const decoded = evmDecodeLog(log, sig);\n if (decoded) {\n return {\n decoded,\n metadata: {\n name: (typeof sig === 'string' ? sig : sig.signature).split('(')[0],\n },\n };\n }\n }\n\n return null;\n}\n","import { evmAddressToChecksum } from './evm-address-to-checksum';\n\nexport function normalizeEVMBlock(rawBlock: Record<string, unknown>): Record<string, unknown> {\n for (const k of ['baseFeePerGas', 'gasLimit', 'gasUsed', 'number', 'size', 'timestamp']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = parseInt(rawBlock[k] as string);\n }\n }\n\n for (const k of ['difficulty', 'totalDifficulty']) {\n if (typeof rawBlock[k] === 'string') {\n rawBlock[k] = BigInt(rawBlock[k] as string).toString();\n }\n }\n for (const k of ['miner']) {\n rawBlock[k] = evmAddressToChecksum(rawBlock[k] as string);\n }\n\n rawBlock.transactions = (\n rawBlock.transactions as { receipt: Record<string, unknown>; traces: Record<string, unknown>[] } & Record<\n string,\n unknown\n >[]\n ).map((tx) => {\n for (const k of [\n 'blockNumber',\n 'cumulativeGasUsed',\n 'effectiveGasPrice',\n 'gas',\n 'gasUsed',\n 'nonce',\n 'status',\n 'transactionIndex',\n ]) {\n if (typeof tx[k] === 'string') {\n tx[k] = parseInt(tx[k] as string);\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = parseInt(tx.receipt[k] as string);\n }\n }\n\n for (const k of ['gasPrice', 'maxFeePerGas', 'maxPriorityFeePerGas', 'value']) {\n if (typeof tx[k] === 'string') {\n tx[k] = BigInt(tx[k] as string).toString();\n }\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = BigInt(tx.receipt[k] as string).toString();\n }\n }\n\n for (const k of ['from', 'to']) {\n if (typeof tx[k] === 'string') {\n tx[k] = evmAddressToChecksum(tx[k] as string);\n }\n }\n for (const k of ['contractAddress']) {\n if (typeof tx.receipt[k] === 'string') {\n tx.receipt[k] = evmAddressToChecksum(tx.receipt[k] as string);\n }\n }\n\n tx.type = parseInt(tx.type as string);\n tx.receipt['status'] = Boolean(tx.receipt['status'] as string);\n\n tx.receipt['logs'] = (tx.receipt['logs'] as Record<string, unknown>[])?.map((log) => {\n for (const k of ['blockNumber', 'logIndex', 'transactionIndex']) {\n if (typeof log[k] === 'string') {\n log[k] = parseInt(log[k] as string);\n }\n }\n log['address'] = evmAddressToChecksum(log['address'] as string);\n return log;\n });\n\n return tx;\n });\n\n return rawBlock;\n}\n","export * from './evm-address-to-checksum';\nexport * from './evm-chain-to-id';\nexport * from './evm-decode-log';\nexport * from './evm-method-signature-to-hex';\nexport * from './evm-normalize-raw-block';\n","import { evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: number | bigint;\n blockNumber: number;\n from: string;\n index?: string;\n timestamp: string;\n to: string;\n token?: string;\n tokenId?: string;\n tokenType: 'NATIVE' | 'TOKEN' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nconst tokenTransfersTemplate: Template = {\n key: 'token_transfers',\n name: 'Token Transfers',\n description: 'Get all token transfers for a set of token types.',\n tags: ['EVM', 'ERC20', 'ERC721', 'NFT', 'TOKEN'],\n disabled: false,\n params: [\n { key: 'network', name: 'Network', type: 'NETWORK', optional: false },\n { key: 'tokenAddress', name: 'Token Address', type: 'ADDRESS', optional: true },\n { key: 'walletAddress', name: 'Wallet Address', type: 'ADDRESS', optional: true },\n { key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true },\n ],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n let transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: expand to non-EVM\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions as any[]) {\n if (!tx.receipt) {\n continue;\n }\n\n const timestamp = new Date((block.timestamp as number) * 1000).toISOString();\n const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);\n\n // track direct ETH transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NATIVE')) {\n // pull from traces, if available\n if (Array.isArray(tx.traces)) {\n for (const trace of tx.traces.filter((t) => t.action)) {\n const action = trace.action as unknown as { from: string; to: string; value: string };\n if (!action?.value) continue;\n\n transfers.push({\n amount: BigInt(action.value),\n blockNumber: tx.blockNumber as number,\n from: action.from?.toLowerCase() || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: action.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n } else if ((tx.value as string)?.length >= 3 || /\\d+/.test(tx.value as string)) {\n transfers.push({\n amount: BigInt(tx.value as string),\n blockNumber: tx.blockNumber as number,\n from: tx.from?.toLowerCase() || NULL_ADDRESS,\n timestamp,\n to: tx.to?.toLowerCase() || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n\n // track ERC20 transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('TOKEN')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 value)',\n ]);\n if (txfer) {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenType: 'TOKEN',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n\n // @TODO: add NFT transfers\n if (!TOKEN_TYPES.length || TOKEN_TYPES.includes('NFT')) {\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLogWithMetadata(log, [\n 'Transfer(address indexed from, address indexed to, uint256 indexed value)',\n 'TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)',\n 'TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)',\n ]);\n\n if (!txfer) continue;\n\n switch (txfer.metadata.name) {\n case 'Transfer': {\n transfers.push({\n amount: 1,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.value as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferSingle': {\n transfers.push({\n amount: txfer.decoded.value as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.id as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n break;\n }\n case 'TransferBatch': {\n for (let i = 0; i < (txfer.decoded.ids as bigint[]).length; i += 1) {\n transfers.push({\n amount: txfer.decoded.values[i] as bigint,\n blockNumber: tx.blockNumber as number,\n from: (txfer.decoded.from as string)?.toLowerCase() || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: (txfer.decoded.to as string)?.toLowerCase() || NULL_ADDRESS,\n token: (log.address as string).toLowerCase(),\n tokenId: (txfer.decoded.ids[i] as bigint).toString(),\n tokenType: 'NFT',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n break;\n }\n }\n }\n }\n }\n if (typeof _ctx.params.contractAddress === 'string') {\n _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();\n }\n if (typeof _ctx.params.walletAddress === 'string') {\n _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();\n }\n break;\n }\n }\n\n transfers = transfers.filter((txfer) => {\n if (txfer.amount <= BigInt(0)) {\n return false;\n }\n if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) {\n return false;\n }\n if (_ctx.params.walletAddress && ![txfer.from, txfer.to].includes(_ctx.params.walletAddress as string)) {\n return false;\n }\n return true;\n });\n\n return transfers;\n },\n\n tests: [\n {\n params: {\n network: 'BASE',\n walletAddress: '0x4F80864cD68782144e3736626896990acAe15a11',\n contractAddress: '0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed',\n },\n payload: 'https://jiti.indexing.co/networks/base/23507423',\n output: [\n {\n amount: 1000000000000000000000n,\n blockNumber: 23507423,\n from: '0x053002b4b332b422733c9469ddf9990bb6235e3d',\n index: 536,\n timestamp: '2024-12-10T04:16:33.000Z',\n to: '0x4f80864cd68782144e3736626896990acae15a11',\n token: '0x4ed4e862860bed51a9570b96d89af5e1b0efefed',\n tokenType: 'TOKEN',\n transactionGasFee: 1192354854229n,\n transactionHash: '0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56',\n },\n ],\n },\n ],\n};\n\nexport default tokenTransfersTemplate;\n","import rawTemplate from './raw';\nimport tokenTransfersTemplate from './token-transfers';\n\nexport const templates = [rawTemplate, tokenTransfersTemplate];\n","import { templates as templateList } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nconst templates = templateList.reduce((a, b) => ({ ...a, [b.key]: Object.assign({}, b) }), {});\n\nexport { utils, templates, types };\n\nexport function getAllTemplates() {\n return templateList.slice();\n}\n\nexport function getTemplateByKey(key: string) {\n return templateList.slice().find((template) => template.key === key);\n}\n"],"names":[],"version":3,"file":"types.d.ts.map"}