@indexing/jiti 0.0.1 → 0.0.3

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/dist/main.js CHANGED
@@ -22,23 +22,25 @@ function $parcel$exportWildcard(dest, source) {
22
22
  return dest;
23
23
  }
24
24
 
25
+ $parcel$export(module.exports, "templates", () => $882b6d93070905b3$export$a8fc3402335b0b04);
25
26
  $parcel$export(module.exports, "getAllTemplates", () => $882b6d93070905b3$export$cceb5167b935aafb);
26
27
  $parcel$export(module.exports, "getTemplateByKey", () => $882b6d93070905b3$export$a07bfd14bbc36e4b);
27
28
  $parcel$export(module.exports, "utils", () => $d7167569386d0d4c$exports);
28
29
  $parcel$export(module.exports, "types", () => $faefaad95e5fcca0$exports);
29
- const $49a91814dabec06a$var$allBlocks = {
30
- key: "allBlocks",
31
- name: "All Blocks",
30
+ const $59fb8e0333a5d25f$var$rawTemplate = {
31
+ key: "raw",
32
+ name: "Raw Block Data",
32
33
  description: "Get all blocks with all available fields",
33
34
  tags: [
34
35
  "EVM",
35
- "TRANSACTIONS"
36
+ "RAW"
36
37
  ],
37
38
  disabled: false,
38
39
  params: [],
39
- transform: (payload)=>payload
40
+ transform: (payload)=>payload,
41
+ tests: []
40
42
  };
41
- var $49a91814dabec06a$export$2e2bcd8739ae039 = $49a91814dabec06a$var$allBlocks;
43
+ var $59fb8e0333a5d25f$export$2e2bcd8739ae039 = $59fb8e0333a5d25f$var$rawTemplate;
42
44
 
43
45
 
44
46
  var $d7167569386d0d4c$exports = {};
@@ -253,8 +255,8 @@ $parcel$exportWildcard($d7167569386d0d4c$exports, $414c83047563e72e$exports);
253
255
 
254
256
 
255
257
  const $6144a02851f23907$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
256
- const $6144a02851f23907$var$tokenTransfers = {
257
- key: "tokenTransfers",
258
+ const $6144a02851f23907$var$tokenTransfersTemplate = {
259
+ key: "token_transfers",
258
260
  name: "Token Transfers",
259
261
  description: "Get all token transfers for a set of token types.",
260
262
  tags: [
@@ -266,6 +268,24 @@ const $6144a02851f23907$var$tokenTransfers = {
266
268
  ],
267
269
  disabled: false,
268
270
  params: [
271
+ {
272
+ key: "network",
273
+ name: "Network",
274
+ type: "NETWORK",
275
+ optional: false
276
+ },
277
+ {
278
+ key: "tokenAddress",
279
+ name: "Token Address",
280
+ type: "ADDRESS",
281
+ optional: true
282
+ },
283
+ {
284
+ key: "walletAddress",
285
+ name: "Wallet Address",
286
+ type: "ADDRESS",
287
+ optional: true
288
+ },
269
289
  {
270
290
  key: "tokenTypes",
271
291
  name: "Token Types",
@@ -276,7 +296,7 @@ const $6144a02851f23907$var$tokenTransfers = {
276
296
  ],
277
297
  transform: (block, _ctx)=>{
278
298
  const TOKEN_TYPES = _ctx.params.tokenTypes || [];
279
- const transfers = [];
299
+ let transfers = [];
280
300
  switch(block._network){
281
301
  // @TODO: expand to non-EVM
282
302
  // assume EVM as default for now
@@ -287,33 +307,32 @@ const $6144a02851f23907$var$tokenTransfers = {
287
307
  const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
288
308
  // track direct ETH transfers
289
309
  if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
290
- if (tx.value?.length >= 3 || /\d+/.test(tx.value)) {
310
+ // pull from traces, if available
311
+ if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
312
+ const action = trace.action;
313
+ if (!action?.value) continue;
291
314
  transfers.push({
292
- amount: BigInt(tx.value),
315
+ amount: BigInt(action.value),
293
316
  blockNumber: tx.blockNumber,
294
- from: (0, $596a656635c74d50$export$db81f9ea057ab646)(tx.from) || $6144a02851f23907$var$NULL_ADDRESS,
317
+ from: action.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
318
+ index: trace.traceAddress?.join("-"),
295
319
  timestamp: timestamp,
296
- to: (0, $596a656635c74d50$export$db81f9ea057ab646)(tx.to) || $6144a02851f23907$var$NULL_ADDRESS,
320
+ to: action.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
297
321
  tokenType: "NATIVE",
298
322
  transactionGasFee: transactionGasFee,
299
323
  transactionHash: tx.hash
300
324
  });
301
- if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
302
- const action = trace.action;
303
- if (!action?.value) continue;
304
- transfers.push({
305
- amount: BigInt(action.value),
306
- blockNumber: tx.blockNumber,
307
- from: (0, $596a656635c74d50$export$db81f9ea057ab646)(action.from) || $6144a02851f23907$var$NULL_ADDRESS,
308
- index: trace.traceAddress?.join("-"),
309
- timestamp: timestamp,
310
- to: (0, $596a656635c74d50$export$db81f9ea057ab646)(action.to) || $6144a02851f23907$var$NULL_ADDRESS,
311
- tokenType: "NATIVE",
312
- transactionGasFee: transactionGasFee,
313
- transactionHash: tx.hash
314
- });
315
- }
316
325
  }
326
+ else if (tx.value?.length >= 3 || /\d+/.test(tx.value)) transfers.push({
327
+ amount: BigInt(tx.value),
328
+ blockNumber: tx.blockNumber,
329
+ from: tx.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
330
+ timestamp: timestamp,
331
+ to: tx.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
332
+ tokenType: "NATIVE",
333
+ transactionGasFee: transactionGasFee,
334
+ transactionHash: tx.hash
335
+ });
317
336
  }
318
337
  // track ERC20 transfers
319
338
  if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
@@ -323,30 +342,118 @@ const $6144a02851f23907$var$tokenTransfers = {
323
342
  if (txfer) transfers.push({
324
343
  amount: txfer.decoded.value,
325
344
  blockNumber: tx.blockNumber,
326
- from: (0, $596a656635c74d50$export$db81f9ea057ab646)(txfer.decoded.from) || $6144a02851f23907$var$NULL_ADDRESS,
345
+ from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
327
346
  index: log.logIndex,
328
347
  timestamp: timestamp,
329
- to: (0, $596a656635c74d50$export$db81f9ea057ab646)(txfer.decoded.to) || $6144a02851f23907$var$NULL_ADDRESS,
330
- token: (0, $596a656635c74d50$export$db81f9ea057ab646)(log.address),
348
+ to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
349
+ token: log.address.toLowerCase(),
331
350
  tokenType: "TOKEN",
332
351
  transactionGasFee: transactionGasFee,
333
352
  transactionHash: tx.hash
334
353
  });
335
354
  }
336
355
  // @TODO: add NFT transfers
337
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) {
338
- for (const log of tx.receipt.logs);
356
+ if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) for (const log of tx.receipt.logs){
357
+ const txfer = (0, $da55be3e40667945$export$cf548b70626e2eb9)(log, [
358
+ "Transfer(address indexed from, address indexed to, uint256 indexed value)",
359
+ "TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)",
360
+ "TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"
361
+ ]);
362
+ if (!txfer) continue;
363
+ switch(txfer.metadata.name){
364
+ case "Transfer":
365
+ transfers.push({
366
+ amount: 1,
367
+ blockNumber: tx.blockNumber,
368
+ from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
369
+ index: log.logIndex,
370
+ timestamp: timestamp,
371
+ to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
372
+ token: log.address.toLowerCase(),
373
+ tokenId: txfer.decoded.value.toString(),
374
+ tokenType: "NFT",
375
+ transactionGasFee: transactionGasFee,
376
+ transactionHash: tx.hash
377
+ });
378
+ break;
379
+ case "TransferSingle":
380
+ transfers.push({
381
+ amount: txfer.decoded.value,
382
+ blockNumber: tx.blockNumber,
383
+ from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
384
+ index: log.logIndex,
385
+ timestamp: timestamp,
386
+ to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
387
+ token: log.address.toLowerCase(),
388
+ tokenId: txfer.decoded.id.toString(),
389
+ tokenType: "NFT",
390
+ transactionGasFee: transactionGasFee,
391
+ transactionHash: tx.hash
392
+ });
393
+ break;
394
+ case "TransferBatch":
395
+ for(let i = 0; i < txfer.decoded.ids.length; i += 1)transfers.push({
396
+ amount: txfer.decoded.values[i],
397
+ blockNumber: tx.blockNumber,
398
+ from: txfer.decoded.from?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
399
+ index: log.logIndex,
400
+ timestamp: timestamp,
401
+ to: txfer.decoded.to?.toLowerCase() || $6144a02851f23907$var$NULL_ADDRESS,
402
+ token: log.address.toLowerCase(),
403
+ tokenId: txfer.decoded.ids[i].toString(),
404
+ tokenType: "NFT",
405
+ transactionGasFee: transactionGasFee,
406
+ transactionHash: tx.hash
407
+ });
408
+ break;
409
+ }
339
410
  }
340
411
  }
412
+ if (typeof _ctx.params.contractAddress === "string") _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();
413
+ if (typeof _ctx.params.walletAddress === "string") _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();
414
+ break;
341
415
  }
342
- return transfers.filter((txfer)=>txfer.amount > BigInt(0));
343
- }
416
+ transfers = transfers.filter((txfer)=>{
417
+ if (txfer.amount <= BigInt(0)) return false;
418
+ if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) return false;
419
+ if (_ctx.params.walletAddress && ![
420
+ txfer.from,
421
+ txfer.to
422
+ ].includes(_ctx.params.walletAddress)) return false;
423
+ return true;
424
+ });
425
+ return transfers;
426
+ },
427
+ tests: [
428
+ {
429
+ params: {
430
+ network: "BASE",
431
+ walletAddress: "0x4F80864cD68782144e3736626896990acAe15a11",
432
+ contractAddress: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed"
433
+ },
434
+ payload: "https://jiti.indexing.co/networks/base/23507423",
435
+ output: [
436
+ {
437
+ amount: 1000000000000000000000n,
438
+ blockNumber: 23507423,
439
+ from: "0x053002b4b332b422733c9469ddf9990bb6235e3d",
440
+ index: 536,
441
+ timestamp: "2024-12-10T04:16:33.000Z",
442
+ to: "0x4f80864cd68782144e3736626896990acae15a11",
443
+ token: "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
444
+ tokenType: "TOKEN",
445
+ transactionGasFee: 1192354854229n,
446
+ transactionHash: "0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56"
447
+ }
448
+ ]
449
+ }
450
+ ]
344
451
  };
345
- var $6144a02851f23907$export$2e2bcd8739ae039 = $6144a02851f23907$var$tokenTransfers;
452
+ var $6144a02851f23907$export$2e2bcd8739ae039 = $6144a02851f23907$var$tokenTransfersTemplate;
346
453
 
347
454
 
348
455
  const $48f9879a44dd1195$export$a8fc3402335b0b04 = [
349
- (0, $49a91814dabec06a$export$2e2bcd8739ae039),
456
+ (0, $59fb8e0333a5d25f$export$2e2bcd8739ae039),
350
457
  (0, $6144a02851f23907$export$2e2bcd8739ae039)
351
458
  ];
352
459
 
@@ -355,11 +462,15 @@ const $48f9879a44dd1195$export$a8fc3402335b0b04 = [
355
462
  var $faefaad95e5fcca0$exports = {};
356
463
 
357
464
 
465
+ const $882b6d93070905b3$export$a8fc3402335b0b04 = (0, $48f9879a44dd1195$export$a8fc3402335b0b04).reduce((a, b)=>({
466
+ ...a,
467
+ [b.key]: Object.assign({}, b)
468
+ }), {});
358
469
  function $882b6d93070905b3$export$cceb5167b935aafb() {
359
- return 0, $48f9879a44dd1195$export$a8fc3402335b0b04;
470
+ return (0, $48f9879a44dd1195$export$a8fc3402335b0b04).slice();
360
471
  }
361
472
  function $882b6d93070905b3$export$a07bfd14bbc36e4b(key) {
362
- return (0, $48f9879a44dd1195$export$a8fc3402335b0b04).find((template)=>template.key === key);
473
+ return (0, $48f9879a44dd1195$export$a8fc3402335b0b04).slice().find((template)=>template.key === key);
363
474
  }
364
475
 
365
476
 
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/templates/index.ts","src/templates/all-blocks.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 } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { utils, types };\n\nexport function getAllTemplates() {\n return templates;\n}\n\nexport function getTemplateByKey(key: string) {\n return templates.find((template) => template.key === key);\n}\n","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","import { Template } from '../types';\n\nconst allBlocks: Template = {\n key: 'allBlocks',\n name: 'All Blocks',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'TRANSACTIONS'],\n disabled: false,\n params: [],\n transform: (payload) => payload,\n};\n\nexport default allBlocks;\n","import { evmAddressToChecksum, evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: 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 tokenTransfers: Template = {\n key: 'tokenTransfers',\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: [{ key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true }],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n const 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 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: evmAddressToChecksum(tx.from) || NULL_ADDRESS,\n timestamp,\n to: evmAddressToChecksum(tx.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n\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: evmAddressToChecksum(action.from) || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: evmAddressToChecksum(action.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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: evmAddressToChecksum(txfer.decoded.from as string) || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: evmAddressToChecksum(txfer.decoded.to as string) || NULL_ADDRESS,\n token: evmAddressToChecksum(log.address as string),\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 }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\n },\n};\n\nexport default tokenTransfers;\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};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n"],"names":[],"version":3,"file":"main.js.map"}
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: false,\n params: [],\n transform: (payload) => payload,\n tests: [],\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: Record<string, unknown>[];\n};\n"],"names":[],"version":3,"file":"main.js.map"}
package/dist/module.js CHANGED
@@ -21,19 +21,20 @@ function $parcel$exportWildcard(dest, source) {
21
21
  function $parcel$export(e, n, v, s) {
22
22
  Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
23
23
  }
24
- const $8369cdd4433d3a57$var$allBlocks = {
25
- key: "allBlocks",
26
- name: "All Blocks",
24
+ const $a4b307b872b01f44$var$rawTemplate = {
25
+ key: "raw",
26
+ name: "Raw Block Data",
27
27
  description: "Get all blocks with all available fields",
28
28
  tags: [
29
29
  "EVM",
30
- "TRANSACTIONS"
30
+ "RAW"
31
31
  ],
32
32
  disabled: false,
33
33
  params: [],
34
- transform: (payload)=>payload
34
+ transform: (payload)=>payload,
35
+ tests: []
35
36
  };
36
- var $8369cdd4433d3a57$export$2e2bcd8739ae039 = $8369cdd4433d3a57$var$allBlocks;
37
+ var $a4b307b872b01f44$export$2e2bcd8739ae039 = $a4b307b872b01f44$var$rawTemplate;
37
38
 
38
39
 
39
40
  var $fde9406d76ec24a9$exports = {};
@@ -248,8 +249,8 @@ $parcel$exportWildcard($fde9406d76ec24a9$exports, $8f1e0ae1ead9a2a9$exports);
248
249
 
249
250
 
250
251
  const $c18434deda90759d$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
251
- const $c18434deda90759d$var$tokenTransfers = {
252
- key: "tokenTransfers",
252
+ const $c18434deda90759d$var$tokenTransfersTemplate = {
253
+ key: "token_transfers",
253
254
  name: "Token Transfers",
254
255
  description: "Get all token transfers for a set of token types.",
255
256
  tags: [
@@ -261,6 +262,24 @@ const $c18434deda90759d$var$tokenTransfers = {
261
262
  ],
262
263
  disabled: false,
263
264
  params: [
265
+ {
266
+ key: "network",
267
+ name: "Network",
268
+ type: "NETWORK",
269
+ optional: false
270
+ },
271
+ {
272
+ key: "tokenAddress",
273
+ name: "Token Address",
274
+ type: "ADDRESS",
275
+ optional: true
276
+ },
277
+ {
278
+ key: "walletAddress",
279
+ name: "Wallet Address",
280
+ type: "ADDRESS",
281
+ optional: true
282
+ },
264
283
  {
265
284
  key: "tokenTypes",
266
285
  name: "Token Types",
@@ -271,7 +290,7 @@ const $c18434deda90759d$var$tokenTransfers = {
271
290
  ],
272
291
  transform: (block, _ctx)=>{
273
292
  const TOKEN_TYPES = _ctx.params.tokenTypes || [];
274
- const transfers = [];
293
+ let transfers = [];
275
294
  switch(block._network){
276
295
  // @TODO: expand to non-EVM
277
296
  // assume EVM as default for now
@@ -282,33 +301,32 @@ const $c18434deda90759d$var$tokenTransfers = {
282
301
  const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
283
302
  // track direct ETH transfers
284
303
  if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
285
- if (tx.value?.length >= 3 || /\d+/.test(tx.value)) {
304
+ // pull from traces, if available
305
+ if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
306
+ const action = trace.action;
307
+ if (!action?.value) continue;
286
308
  transfers.push({
287
- amount: BigInt(tx.value),
309
+ amount: BigInt(action.value),
288
310
  blockNumber: tx.blockNumber,
289
- from: (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx.from) || $c18434deda90759d$var$NULL_ADDRESS,
311
+ from: action.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
312
+ index: trace.traceAddress?.join("-"),
290
313
  timestamp: timestamp,
291
- to: (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx.to) || $c18434deda90759d$var$NULL_ADDRESS,
314
+ to: action.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
292
315
  tokenType: "NATIVE",
293
316
  transactionGasFee: transactionGasFee,
294
317
  transactionHash: tx.hash
295
318
  });
296
- if (Array.isArray(tx.traces)) for (const trace of tx.traces.filter((t)=>t.action)){
297
- const action = trace.action;
298
- if (!action?.value) continue;
299
- transfers.push({
300
- amount: BigInt(action.value),
301
- blockNumber: tx.blockNumber,
302
- from: (0, $42564d9f228fe302$export$db81f9ea057ab646)(action.from) || $c18434deda90759d$var$NULL_ADDRESS,
303
- index: trace.traceAddress?.join("-"),
304
- timestamp: timestamp,
305
- to: (0, $42564d9f228fe302$export$db81f9ea057ab646)(action.to) || $c18434deda90759d$var$NULL_ADDRESS,
306
- tokenType: "NATIVE",
307
- transactionGasFee: transactionGasFee,
308
- transactionHash: tx.hash
309
- });
310
- }
311
319
  }
320
+ else if (tx.value?.length >= 3 || /\d+/.test(tx.value)) transfers.push({
321
+ amount: BigInt(tx.value),
322
+ blockNumber: tx.blockNumber,
323
+ from: tx.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
324
+ timestamp: timestamp,
325
+ to: tx.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
326
+ tokenType: "NATIVE",
327
+ transactionGasFee: transactionGasFee,
328
+ transactionHash: tx.hash
329
+ });
312
330
  }
313
331
  // track ERC20 transfers
314
332
  if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
@@ -318,30 +336,118 @@ const $c18434deda90759d$var$tokenTransfers = {
318
336
  if (txfer) transfers.push({
319
337
  amount: txfer.decoded.value,
320
338
  blockNumber: tx.blockNumber,
321
- from: (0, $42564d9f228fe302$export$db81f9ea057ab646)(txfer.decoded.from) || $c18434deda90759d$var$NULL_ADDRESS,
339
+ from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
322
340
  index: log.logIndex,
323
341
  timestamp: timestamp,
324
- to: (0, $42564d9f228fe302$export$db81f9ea057ab646)(txfer.decoded.to) || $c18434deda90759d$var$NULL_ADDRESS,
325
- token: (0, $42564d9f228fe302$export$db81f9ea057ab646)(log.address),
342
+ to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
343
+ token: log.address.toLowerCase(),
326
344
  tokenType: "TOKEN",
327
345
  transactionGasFee: transactionGasFee,
328
346
  transactionHash: tx.hash
329
347
  });
330
348
  }
331
349
  // @TODO: add NFT transfers
332
- if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) {
333
- for (const log of tx.receipt.logs);
350
+ if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) for (const log of tx.receipt.logs){
351
+ const txfer = (0, $cfa23334cbdf9391$export$cf548b70626e2eb9)(log, [
352
+ "Transfer(address indexed from, address indexed to, uint256 indexed value)",
353
+ "TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value)",
354
+ "TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values)"
355
+ ]);
356
+ if (!txfer) continue;
357
+ switch(txfer.metadata.name){
358
+ case "Transfer":
359
+ transfers.push({
360
+ amount: 1,
361
+ blockNumber: tx.blockNumber,
362
+ from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
363
+ index: log.logIndex,
364
+ timestamp: timestamp,
365
+ to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
366
+ token: log.address.toLowerCase(),
367
+ tokenId: txfer.decoded.value.toString(),
368
+ tokenType: "NFT",
369
+ transactionGasFee: transactionGasFee,
370
+ transactionHash: tx.hash
371
+ });
372
+ break;
373
+ case "TransferSingle":
374
+ transfers.push({
375
+ amount: txfer.decoded.value,
376
+ blockNumber: tx.blockNumber,
377
+ from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
378
+ index: log.logIndex,
379
+ timestamp: timestamp,
380
+ to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
381
+ token: log.address.toLowerCase(),
382
+ tokenId: txfer.decoded.id.toString(),
383
+ tokenType: "NFT",
384
+ transactionGasFee: transactionGasFee,
385
+ transactionHash: tx.hash
386
+ });
387
+ break;
388
+ case "TransferBatch":
389
+ for(let i = 0; i < txfer.decoded.ids.length; i += 1)transfers.push({
390
+ amount: txfer.decoded.values[i],
391
+ blockNumber: tx.blockNumber,
392
+ from: txfer.decoded.from?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
393
+ index: log.logIndex,
394
+ timestamp: timestamp,
395
+ to: txfer.decoded.to?.toLowerCase() || $c18434deda90759d$var$NULL_ADDRESS,
396
+ token: log.address.toLowerCase(),
397
+ tokenId: txfer.decoded.ids[i].toString(),
398
+ tokenType: "NFT",
399
+ transactionGasFee: transactionGasFee,
400
+ transactionHash: tx.hash
401
+ });
402
+ break;
403
+ }
334
404
  }
335
405
  }
406
+ if (typeof _ctx.params.contractAddress === "string") _ctx.params.contractAddress = _ctx.params.contractAddress.toLowerCase();
407
+ if (typeof _ctx.params.walletAddress === "string") _ctx.params.walletAddress = _ctx.params.walletAddress.toLowerCase();
408
+ break;
336
409
  }
337
- return transfers.filter((txfer)=>txfer.amount > BigInt(0));
338
- }
410
+ transfers = transfers.filter((txfer)=>{
411
+ if (txfer.amount <= BigInt(0)) return false;
412
+ if (_ctx.params.tokenAddress && _ctx.params.tokenAddress !== txfer.token) return false;
413
+ if (_ctx.params.walletAddress && ![
414
+ txfer.from,
415
+ txfer.to
416
+ ].includes(_ctx.params.walletAddress)) return false;
417
+ return true;
418
+ });
419
+ return transfers;
420
+ },
421
+ tests: [
422
+ {
423
+ params: {
424
+ network: "BASE",
425
+ walletAddress: "0x4F80864cD68782144e3736626896990acAe15a11",
426
+ contractAddress: "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed"
427
+ },
428
+ payload: "https://jiti.indexing.co/networks/base/23507423",
429
+ output: [
430
+ {
431
+ amount: 1000000000000000000000n,
432
+ blockNumber: 23507423,
433
+ from: "0x053002b4b332b422733c9469ddf9990bb6235e3d",
434
+ index: 536,
435
+ timestamp: "2024-12-10T04:16:33.000Z",
436
+ to: "0x4f80864cd68782144e3736626896990acae15a11",
437
+ token: "0x4ed4e862860bed51a9570b96d89af5e1b0efefed",
438
+ tokenType: "TOKEN",
439
+ transactionGasFee: 1192354854229n,
440
+ transactionHash: "0x69c9b12ccbe2d4f2f1dfc7c4a8557fc099fc5df276424417815acbc79a06fd56"
441
+ }
442
+ ]
443
+ }
444
+ ]
339
445
  };
340
- var $c18434deda90759d$export$2e2bcd8739ae039 = $c18434deda90759d$var$tokenTransfers;
446
+ var $c18434deda90759d$export$2e2bcd8739ae039 = $c18434deda90759d$var$tokenTransfersTemplate;
341
447
 
342
448
 
343
449
  const $70cb039dbeb3c65a$export$a8fc3402335b0b04 = [
344
- (0, $8369cdd4433d3a57$export$2e2bcd8739ae039),
450
+ (0, $a4b307b872b01f44$export$2e2bcd8739ae039),
345
451
  (0, $c18434deda90759d$export$2e2bcd8739ae039)
346
452
  ];
347
453
 
@@ -350,13 +456,17 @@ const $70cb039dbeb3c65a$export$a8fc3402335b0b04 = [
350
456
  var $81c1b644006d48ec$exports = {};
351
457
 
352
458
 
459
+ const $149c1bd638913645$export$a8fc3402335b0b04 = (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).reduce((a, b)=>({
460
+ ...a,
461
+ [b.key]: Object.assign({}, b)
462
+ }), {});
353
463
  function $149c1bd638913645$export$cceb5167b935aafb() {
354
- return 0, $70cb039dbeb3c65a$export$a8fc3402335b0b04;
464
+ return (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).slice();
355
465
  }
356
466
  function $149c1bd638913645$export$a07bfd14bbc36e4b(key) {
357
- return (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).find((template)=>template.key === key);
467
+ return (0, $70cb039dbeb3c65a$export$a8fc3402335b0b04).slice().find((template)=>template.key === key);
358
468
  }
359
469
 
360
470
 
361
- export {$149c1bd638913645$export$cceb5167b935aafb as getAllTemplates, $149c1bd638913645$export$a07bfd14bbc36e4b as getTemplateByKey};
471
+ export {$149c1bd638913645$export$a8fc3402335b0b04 as templates, $149c1bd638913645$export$cceb5167b935aafb as getAllTemplates, $149c1bd638913645$export$a07bfd14bbc36e4b as getTemplateByKey};
362
472
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/templates/index.ts","src/templates/all-blocks.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 } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { utils, types };\n\nexport function getAllTemplates() {\n return templates;\n}\n\nexport function getTemplateByKey(key: string) {\n return templates.find((template) => template.key === key);\n}\n","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","import { Template } from '../types';\n\nconst allBlocks: Template = {\n key: 'allBlocks',\n name: 'All Blocks',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'TRANSACTIONS'],\n disabled: false,\n params: [],\n transform: (payload) => payload,\n};\n\nexport default allBlocks;\n","import { evmAddressToChecksum, evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: 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 tokenTransfers: Template = {\n key: 'tokenTransfers',\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: [{ key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true }],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n const 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 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: evmAddressToChecksum(tx.from) || NULL_ADDRESS,\n timestamp,\n to: evmAddressToChecksum(tx.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n\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: evmAddressToChecksum(action.from) || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: evmAddressToChecksum(action.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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: evmAddressToChecksum(txfer.decoded.from as string) || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: evmAddressToChecksum(txfer.decoded.to as string) || NULL_ADDRESS,\n token: evmAddressToChecksum(log.address as string),\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 }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\n },\n};\n\nexport default tokenTransfers;\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};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n"],"names":[],"version":3,"file":"module.js.map"}
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: false,\n params: [],\n transform: (payload) => payload,\n tests: [],\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: Record<string, unknown>[];\n};\n"],"names":[],"version":3,"file":"module.js.map"}
package/dist/types.d.ts CHANGED
@@ -8,6 +8,7 @@ type Template = {
8
8
  transform: (payload: Record<string, unknown>, _ctx?: Record<string, unknown> & {
9
9
  params: Record<string, unknown>;
10
10
  }) => unknown;
11
+ tests: TemplateTest[];
11
12
  };
12
13
  type Param = {
13
14
  key: string;
@@ -16,6 +17,12 @@ type Param = {
16
17
  multiple?: boolean;
17
18
  optional?: boolean;
18
19
  };
20
+ type TemplateTest = {
21
+ params: Record<string, unknown>;
22
+ payload: `https://${string}` | Record<string, unknown>;
23
+ output: Record<string, unknown>[];
24
+ };
25
+ export const templates: {};
19
26
  export function getAllTemplates(): Template[];
20
27
  export function getTemplateByKey(key: string): Template;
21
28
 
@@ -1 +1 @@
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;CACd,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;AUbF,8CAEC;AAED,iCAAiC,GAAG,EAAE,MAAM,YAE3C","sources":["src/types.ts","src/templates/all-blocks.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};\n\nexport type Param = {\n key: string;\n name: string;\n type: 'NETWORK' | 'ADDRESS' | 'STRING';\n multiple?: boolean;\n optional?: boolean;\n};\n","import { Template } from '../types';\n\nconst allBlocks: Template = {\n key: 'allBlocks',\n name: 'All Blocks',\n description: 'Get all blocks with all available fields',\n tags: ['EVM', 'TRANSACTIONS'],\n disabled: false,\n params: [],\n transform: (payload) => payload,\n};\n\nexport default allBlocks;\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 { evmAddressToChecksum, evmDecodeLogWithMetadata } from '../utils';\nimport { Template } from '../types';\n\ntype NetworkTransfer = {\n amount: 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 tokenTransfers: Template = {\n key: 'tokenTransfers',\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: [{ key: 'tokenTypes', name: 'Token Types', type: 'STRING', multiple: true, optional: true }],\n\n transform: (block, _ctx) => {\n const TOKEN_TYPES = (_ctx.params.tokenTypes as NetworkTransfer['tokenType'][]) || [];\n const 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 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: evmAddressToChecksum(tx.from) || NULL_ADDRESS,\n timestamp,\n to: evmAddressToChecksum(tx.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n\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: evmAddressToChecksum(action.from) || NULL_ADDRESS,\n index: trace.traceAddress?.join('-'),\n timestamp,\n to: evmAddressToChecksum(action.to) || NULL_ADDRESS,\n tokenType: 'NATIVE',\n transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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: evmAddressToChecksum(txfer.decoded.from as string) || NULL_ADDRESS,\n index: log.logIndex,\n timestamp,\n to: evmAddressToChecksum(txfer.decoded.to as string) || NULL_ADDRESS,\n token: evmAddressToChecksum(log.address as string),\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 }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\n },\n};\n\nexport default tokenTransfers;\n","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","import { templates } from './templates';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { utils, types };\n\nexport function getAllTemplates() {\n return templates;\n}\n\nexport function getTemplateByKey(key: string) {\n return templates.find((template) => template.key === key);\n}\n"],"names":[],"version":3,"file":"types.d.ts.map"}
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,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACnC,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: Record<string, 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: false,\n params: [],\n transform: (payload) => payload,\n tests: [],\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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indexing/jiti",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Just In Time Indexing, for all",
5
5
  "source": "src/index.ts",
6
6
  "main": "dist/main.js",
@@ -9,7 +9,7 @@
9
9
  "scripts": {
10
10
  "build": "rm -rf dist .parcel-cache && parcel build --dist-dir dist",
11
11
  "lint": "prettier --write **.ts && eslint .",
12
- "test": "echo \"Error: no test specified\" && exit 1",
12
+ "test": "npx ts-node tests.ts",
13
13
  "watch": "parcel watch"
14
14
  },
15
15
  "author": "Indexing Co",
@@ -18,6 +18,7 @@
18
18
  "@parcel/packager-ts": "^2.12.0",
19
19
  "@parcel/transformer-typescript-types": "^2.12.0",
20
20
  "@types/isomorphic-fetch": "^0.0.39",
21
+ "@types/node": "^22.10.6",
21
22
  "eslint-config-prettier": "^9.1.0",
22
23
  "eslint-plugin-prettier": "^5.2.1",
23
24
  "husky": "^9.1.5",