@indexing/jiti 1.0.1 → 1.0.2
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 +158 -197
- package/dist/main.js.map +1 -1
- package/dist/module.js +159 -193
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
var $8zHUo$viem = require("viem");
|
|
2
|
-
var $8zHUo$isomorphicfetch = require("isomorphic-fetch");
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
function $parcel$export(e, n, v, s) {
|
|
@@ -23,13 +22,8 @@ function $parcel$exportWildcard(dest, source) {
|
|
|
23
22
|
return dest;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
function $parcel$interopDefault(a) {
|
|
27
|
-
return a && a.__esModule ? a.default : a;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
25
|
$parcel$export(module.exports, "getAllTemplates", () => $882b6d93070905b3$export$cceb5167b935aafb);
|
|
31
26
|
$parcel$export(module.exports, "getTemplateByKey", () => $882b6d93070905b3$export$a07bfd14bbc36e4b);
|
|
32
|
-
$parcel$export(module.exports, "presets", () => $14cf6f53e99b3d5b$exports);
|
|
33
27
|
$parcel$export(module.exports, "utils", () => $d7167569386d0d4c$exports);
|
|
34
28
|
$parcel$export(module.exports, "types", () => $faefaad95e5fcca0$exports);
|
|
35
29
|
const $49a91814dabec06a$var$allBlocks = {
|
|
@@ -42,144 +36,11 @@ const $49a91814dabec06a$var$allBlocks = {
|
|
|
42
36
|
],
|
|
43
37
|
disabled: false,
|
|
44
38
|
params: [],
|
|
45
|
-
|
|
46
|
-
return `
|
|
47
|
-
function allBlocks(block, _ctx) {
|
|
48
|
-
return block;
|
|
49
|
-
}`;
|
|
50
|
-
}
|
|
39
|
+
transform: (payload)=>payload
|
|
51
40
|
};
|
|
52
41
|
var $49a91814dabec06a$export$2e2bcd8739ae039 = $49a91814dabec06a$var$allBlocks;
|
|
53
42
|
|
|
54
43
|
|
|
55
|
-
const $6144a02851f23907$var$tokenTransfers = {
|
|
56
|
-
key: "tokenTransfers",
|
|
57
|
-
name: "Token Transfers",
|
|
58
|
-
description: "Get all blocks for a set of token types.",
|
|
59
|
-
tags: [
|
|
60
|
-
"EVM",
|
|
61
|
-
"NFTs",
|
|
62
|
-
"ERC20",
|
|
63
|
-
"ERC721"
|
|
64
|
-
],
|
|
65
|
-
disabled: false,
|
|
66
|
-
params: [],
|
|
67
|
-
function: ()=>{
|
|
68
|
-
return `
|
|
69
|
-
function tokenTransfers(block, _ctx) {
|
|
70
|
-
return block;
|
|
71
|
-
}`;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
var $6144a02851f23907$export$2e2bcd8739ae039 = $6144a02851f23907$var$tokenTransfers;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const $48f9879a44dd1195$export$a8fc3402335b0b04 = [
|
|
78
|
-
(0, $49a91814dabec06a$export$2e2bcd8739ae039),
|
|
79
|
-
(0, $6144a02851f23907$export$2e2bcd8739ae039)
|
|
80
|
-
];
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
var $14cf6f53e99b3d5b$exports = {};
|
|
84
|
-
var $9c8abe84804d9e5d$exports = {};
|
|
85
|
-
|
|
86
|
-
$parcel$export($9c8abe84804d9e5d$exports, "erc20Transfers", () => $9c8abe84804d9e5d$export$b830a1966711a4f4);
|
|
87
|
-
var $da55be3e40667945$exports = {};
|
|
88
|
-
|
|
89
|
-
$parcel$export($da55be3e40667945$exports, "evmDecodeLog", () => $da55be3e40667945$export$18467e329ea485c9);
|
|
90
|
-
$parcel$export($da55be3e40667945$exports, "evmDecodeLogWithMetadata", () => $da55be3e40667945$export$cf548b70626e2eb9);
|
|
91
|
-
|
|
92
|
-
var $f7a3fb164436c9c3$exports = {};
|
|
93
|
-
|
|
94
|
-
$parcel$export($f7a3fb164436c9c3$exports, "evmMethodSignatureToHex", () => $f7a3fb164436c9c3$export$49d5c9473f8f70f2);
|
|
95
|
-
|
|
96
|
-
function $f7a3fb164436c9c3$export$49d5c9473f8f70f2(sig) {
|
|
97
|
-
const [method, rest] = sig.split("(");
|
|
98
|
-
const params = rest.split(")")[0].split(",").map((p)=>p.trim());
|
|
99
|
-
const topic0 = (0, $8zHUo$viem.keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
|
|
100
|
-
return topic0;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
function $da55be3e40667945$export$18467e329ea485c9(log, signatures) {
|
|
105
|
-
if (Array.isArray(signatures)) {
|
|
106
|
-
for (const sig of signatures){
|
|
107
|
-
const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
|
|
108
|
-
if (decoded) return decoded;
|
|
109
|
-
}
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
|
|
113
|
-
const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
|
|
114
|
-
if (!addresses.includes(log.address.toLowerCase())) return null;
|
|
115
|
-
}
|
|
116
|
-
let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
|
|
117
|
-
if (!sig.startsWith("event ")) sig = "event " + sig;
|
|
118
|
-
const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f7a3fb164436c9c3$export$49d5c9473f8f70f2)(sig);
|
|
119
|
-
if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
|
|
120
|
-
if (log.topics[0] === topic0) try {
|
|
121
|
-
const result = (0, $8zHUo$viem.decodeEventLog)({
|
|
122
|
-
abi: (0, $8zHUo$viem.parseAbi)([
|
|
123
|
-
sig
|
|
124
|
-
]),
|
|
125
|
-
data: log.data,
|
|
126
|
-
topics: log.topics
|
|
127
|
-
});
|
|
128
|
-
return result.args;
|
|
129
|
-
} catch (e) {
|
|
130
|
-
// ignore this
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
function $da55be3e40667945$export$cf548b70626e2eb9(log, signatures) {
|
|
136
|
-
for (const sig of [
|
|
137
|
-
signatures
|
|
138
|
-
].flat()){
|
|
139
|
-
const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
|
|
140
|
-
if (decoded) return {
|
|
141
|
-
decoded: decoded,
|
|
142
|
-
metadata: {
|
|
143
|
-
name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
function $9c8abe84804d9e5d$export$b830a1966711a4f4(block) {
|
|
152
|
-
const txfers = [];
|
|
153
|
-
for (const tx of block.transactions){
|
|
154
|
-
if (!tx.receipt) continue;
|
|
155
|
-
for (const log of tx.receipt.logs){
|
|
156
|
-
const txfer = (0, $da55be3e40667945$export$18467e329ea485c9)(log, "Transfer(address indexed from, address indexed to, uint256 value)");
|
|
157
|
-
if (txfer) txfers.push({
|
|
158
|
-
blockNumber: block.number,
|
|
159
|
-
timestamp: new Date(block.timestamp * 1000).toISOString(),
|
|
160
|
-
transactionHash: tx.hash,
|
|
161
|
-
...txfer
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return txfers;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
var $2bc08226e0d6a193$exports = {};
|
|
170
|
-
|
|
171
|
-
$parcel$export($2bc08226e0d6a193$exports, "tokenPrice", () => $2bc08226e0d6a193$export$e8386b633cdbc2d7);
|
|
172
|
-
|
|
173
|
-
function $2bc08226e0d6a193$export$e8386b633cdbc2d7(tokenAddress, opts) {
|
|
174
|
-
let url = `https://jiti.indexing.co/presets/token-price/${opts?.network || "ethereum"}?tokenAddress=${tokenAddress}`;
|
|
175
|
-
if (opts?.timestamp) url += "&priceTimestamp=" + new Date(opts.timestamp).toISOString();
|
|
176
|
-
return (0, ($parcel$interopDefault($8zHUo$isomorphicfetch)))(url).then((r)=>r.json()).then((r)=>r.data);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
var $32af5abe02e3405e$exports = {};
|
|
181
|
-
|
|
182
|
-
$parcel$export($32af5abe02e3405e$exports, "tokenTransfers", () => $32af5abe02e3405e$export$b62520a34e11070c);
|
|
183
44
|
var $d7167569386d0d4c$exports = {};
|
|
184
45
|
var $596a656635c74d50$exports = {};
|
|
185
46
|
|
|
@@ -242,6 +103,7 @@ const $e5566e47593dc3e2$var$CHAIN_ID = {
|
|
|
242
103
|
STACK: 78225,
|
|
243
104
|
SYNDICATE_FRAME_CHAIN: 5101,
|
|
244
105
|
TRON: 728126428,
|
|
106
|
+
ZER0: 543210,
|
|
245
107
|
ZK_LINK: 810180,
|
|
246
108
|
ZORA: 7777777,
|
|
247
109
|
ZORA_SEPOLIA: 999999999
|
|
@@ -251,6 +113,69 @@ function $e5566e47593dc3e2$export$f93b8abed77a4120(chain) {
|
|
|
251
113
|
}
|
|
252
114
|
|
|
253
115
|
|
|
116
|
+
var $da55be3e40667945$exports = {};
|
|
117
|
+
|
|
118
|
+
$parcel$export($da55be3e40667945$exports, "evmDecodeLog", () => $da55be3e40667945$export$18467e329ea485c9);
|
|
119
|
+
$parcel$export($da55be3e40667945$exports, "evmDecodeLogWithMetadata", () => $da55be3e40667945$export$cf548b70626e2eb9);
|
|
120
|
+
|
|
121
|
+
var $f7a3fb164436c9c3$exports = {};
|
|
122
|
+
|
|
123
|
+
$parcel$export($f7a3fb164436c9c3$exports, "evmMethodSignatureToHex", () => $f7a3fb164436c9c3$export$49d5c9473f8f70f2);
|
|
124
|
+
|
|
125
|
+
function $f7a3fb164436c9c3$export$49d5c9473f8f70f2(sig) {
|
|
126
|
+
const [method, rest] = sig.split("(");
|
|
127
|
+
const params = rest.split(")")[0].split(",").map((p)=>p.trim());
|
|
128
|
+
const topic0 = (0, $8zHUo$viem.keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
|
|
129
|
+
return topic0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
function $da55be3e40667945$export$18467e329ea485c9(log, signatures) {
|
|
134
|
+
if (Array.isArray(signatures)) {
|
|
135
|
+
for (const sig of signatures){
|
|
136
|
+
const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
|
|
137
|
+
if (decoded) return decoded;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
|
|
142
|
+
const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
|
|
143
|
+
if (!addresses.includes(log.address.toLowerCase())) return null;
|
|
144
|
+
}
|
|
145
|
+
let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
|
|
146
|
+
if (!sig.startsWith("event ")) sig = "event " + sig;
|
|
147
|
+
const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f7a3fb164436c9c3$export$49d5c9473f8f70f2)(sig);
|
|
148
|
+
if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
|
|
149
|
+
if (log.topics[0] === topic0) try {
|
|
150
|
+
const result = (0, $8zHUo$viem.decodeEventLog)({
|
|
151
|
+
abi: (0, $8zHUo$viem.parseAbi)([
|
|
152
|
+
sig
|
|
153
|
+
]),
|
|
154
|
+
data: log.data,
|
|
155
|
+
topics: log.topics
|
|
156
|
+
});
|
|
157
|
+
return result.args;
|
|
158
|
+
} catch (e) {
|
|
159
|
+
// ignore this
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
function $da55be3e40667945$export$cf548b70626e2eb9(log, signatures) {
|
|
165
|
+
for (const sig of [
|
|
166
|
+
signatures
|
|
167
|
+
].flat()){
|
|
168
|
+
const decoded = $da55be3e40667945$export$18467e329ea485c9(log, sig);
|
|
169
|
+
if (decoded) return {
|
|
170
|
+
decoded: decoded,
|
|
171
|
+
metadata: {
|
|
172
|
+
name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
|
|
254
179
|
|
|
255
180
|
|
|
256
181
|
var $414c83047563e72e$exports = {};
|
|
@@ -327,67 +252,103 @@ $parcel$exportWildcard($d7167569386d0d4c$exports, $f7a3fb164436c9c3$exports);
|
|
|
327
252
|
$parcel$exportWildcard($d7167569386d0d4c$exports, $414c83047563e72e$exports);
|
|
328
253
|
|
|
329
254
|
|
|
330
|
-
const $
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
255
|
+
const $6144a02851f23907$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
256
|
+
const $6144a02851f23907$var$tokenTransfers = {
|
|
257
|
+
key: "tokenTransfers",
|
|
258
|
+
name: "Token Transfers",
|
|
259
|
+
description: "Get all token transfers for a set of token types.",
|
|
260
|
+
tags: [
|
|
261
|
+
"EVM",
|
|
262
|
+
"ERC20",
|
|
263
|
+
"ERC721",
|
|
264
|
+
"NFT",
|
|
265
|
+
"TOKEN"
|
|
266
|
+
],
|
|
267
|
+
disabled: false,
|
|
268
|
+
params: [
|
|
269
|
+
{
|
|
270
|
+
key: "tokenTypes",
|
|
271
|
+
name: "Token Types",
|
|
272
|
+
type: "STRING",
|
|
273
|
+
multiple: true,
|
|
274
|
+
optional: true
|
|
275
|
+
}
|
|
276
|
+
],
|
|
277
|
+
transform: (block, _ctx)=>{
|
|
278
|
+
const TOKEN_TYPES = _ctx.params.tokenTypes || [];
|
|
279
|
+
const transfers = [];
|
|
280
|
+
switch(block._network){
|
|
281
|
+
// @TODO: expand to non-EVM
|
|
282
|
+
// assume EVM as default for now
|
|
283
|
+
default:
|
|
284
|
+
for (const tx of block.transactions){
|
|
285
|
+
if (!tx.receipt) continue;
|
|
286
|
+
const timestamp = new Date(block.timestamp * 1000).toISOString();
|
|
287
|
+
const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
|
|
288
|
+
// track direct ETH transfers
|
|
289
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
|
|
290
|
+
if (tx.value?.length >= 3 || /\d+/.test(tx.value)) {
|
|
291
|
+
transfers.push({
|
|
292
|
+
amount: BigInt(tx.value),
|
|
293
|
+
blockNumber: tx.blockNumber,
|
|
294
|
+
from: (0, $596a656635c74d50$export$db81f9ea057ab646)(tx.from) || $6144a02851f23907$var$NULL_ADDRESS,
|
|
295
|
+
timestamp: timestamp,
|
|
296
|
+
to: (0, $596a656635c74d50$export$db81f9ea057ab646)(tx.to) || $6144a02851f23907$var$NULL_ADDRESS,
|
|
297
|
+
tokenType: "NATIVE",
|
|
298
|
+
transactionGasFee: transactionGasFee,
|
|
299
|
+
transactionHash: tx.hash
|
|
300
|
+
});
|
|
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
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// track ERC20 transfers
|
|
319
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
|
|
320
|
+
const txfer = (0, $da55be3e40667945$export$cf548b70626e2eb9)(log, [
|
|
321
|
+
"Transfer(address indexed from, address indexed to, uint256 value)"
|
|
322
|
+
]);
|
|
323
|
+
if (txfer) transfers.push({
|
|
324
|
+
amount: txfer.decoded.value,
|
|
325
|
+
blockNumber: tx.blockNumber,
|
|
326
|
+
from: (0, $596a656635c74d50$export$db81f9ea057ab646)(txfer.decoded.from) || $6144a02851f23907$var$NULL_ADDRESS,
|
|
327
|
+
index: log.logIndex,
|
|
328
|
+
timestamp: timestamp,
|
|
329
|
+
to: (0, $596a656635c74d50$export$db81f9ea057ab646)(txfer.decoded.to) || $6144a02851f23907$var$NULL_ADDRESS,
|
|
330
|
+
token: (0, $596a656635c74d50$export$db81f9ea057ab646)(log.address),
|
|
331
|
+
tokenType: "TOKEN",
|
|
332
|
+
transactionGasFee: transactionGasFee,
|
|
333
|
+
transactionHash: tx.hash
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
// @TODO: add NFT transfers
|
|
337
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) {
|
|
338
|
+
for (const log of tx.receipt.logs);
|
|
339
|
+
}
|
|
381
340
|
}
|
|
382
|
-
|
|
341
|
+
}
|
|
342
|
+
return transfers.filter((txfer)=>txfer.amount > BigInt(0));
|
|
383
343
|
}
|
|
384
|
-
|
|
385
|
-
|
|
344
|
+
};
|
|
345
|
+
var $6144a02851f23907$export$2e2bcd8739ae039 = $6144a02851f23907$var$tokenTransfers;
|
|
386
346
|
|
|
387
347
|
|
|
388
|
-
$
|
|
389
|
-
|
|
390
|
-
|
|
348
|
+
const $48f9879a44dd1195$export$a8fc3402335b0b04 = [
|
|
349
|
+
(0, $49a91814dabec06a$export$2e2bcd8739ae039),
|
|
350
|
+
(0, $6144a02851f23907$export$2e2bcd8739ae039)
|
|
351
|
+
];
|
|
391
352
|
|
|
392
353
|
|
|
393
354
|
|
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/presets/index.ts","src/presets/erc20-transfers.ts","src/utils/evm-decode-log.ts","src/utils/evm-method-signature-to-hex.ts","src/presets/token-price.ts","src/presets/token-transfers.ts","src/utils/index.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-normalize-raw-block.ts","src/types.ts"],"sourcesContent":["import { templates } from './templates';\nimport * as presets from './presets';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { presets, 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 }","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","import { Template, Param } 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 function: () => {\n return `\n function allBlocks(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default allBlocks;","import { Template, Param } from \"../types\";\n\nconst tokenTransfers: Template = {\n key: \"tokenTransfers\",\n name: \"Token Transfers\",\n description: \"Get all blocks for a set of token types.\",\n tags: [\"EVM\", \"NFTs\", \"ERC20\", \"ERC721\"],\n disabled: false,\n params: [],\n function: () => {\n return `\n function tokenTransfers(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default tokenTransfers;","export * from './erc20-transfers';\nexport * from './token-price';\nexport * from './token-transfers';\n","import { evmDecodeLog } from '../utils/evm-decode-log';\n\nexport function erc20Transfers(block) {\n const txfers = [];\n\n for (const tx of block.transactions) {\n if (!tx.receipt) continue;\n\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLog(log, 'Transfer(address indexed from, address indexed to, uint256 value)');\n if (txfer) {\n txfers.push({\n blockNumber: block.number,\n timestamp: new Date(block.timestamp * 1000).toISOString(),\n transactionHash: tx.hash,\n ...txfer,\n });\n }\n }\n }\n\n return txfers;\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 _fetch from 'isomorphic-fetch';\n\nexport function tokenPrice(tokenAddress: string, opts?: { network?: string; timestamp?: string }) {\n let url = `https://jiti.indexing.co/presets/token-price/${opts?.network || 'ethereum'}?tokenAddress=${tokenAddress}`;\n if (opts?.timestamp) {\n url += '&priceTimestamp=' + new Date(opts.timestamp).toISOString();\n }\n\n return _fetch(url)\n .then((r) => r.json())\n .then((r) => r.data);\n}\n","import { evmAddressToChecksum, evmDecodeLogWithMetadata } from '../utils';\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 // @TODO: tokenType: 'CURRENCY' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport function tokenTransfers(block) {\n const transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: port non-EVM handlers over\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions) {\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 ((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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n\n // track ERC20 transfers\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\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 { 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 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 { 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 function: (params: Record<string, unknown>) => string;\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: \"NETWORK\" | \"ADDRESS\";\n multiple?: boolean;\n optional?: boolean;\n};"],"names":[],"version":3,"file":"main.js.map"}
|
|
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"}
|
package/dist/module.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import $hgUW1$isomorphicfetch from "isomorphic-fetch";
|
|
1
|
+
import {keccak256 as $hgUW1$keccak256, decodeEventLog as $hgUW1$decodeEventLog, parseAbi as $hgUW1$parseAbi} from "viem";
|
|
3
2
|
|
|
4
3
|
|
|
5
4
|
function $parcel$exportWildcard(dest, source) {
|
|
@@ -32,144 +31,11 @@ const $8369cdd4433d3a57$var$allBlocks = {
|
|
|
32
31
|
],
|
|
33
32
|
disabled: false,
|
|
34
33
|
params: [],
|
|
35
|
-
|
|
36
|
-
return `
|
|
37
|
-
function allBlocks(block, _ctx) {
|
|
38
|
-
return block;
|
|
39
|
-
}`;
|
|
40
|
-
}
|
|
34
|
+
transform: (payload)=>payload
|
|
41
35
|
};
|
|
42
36
|
var $8369cdd4433d3a57$export$2e2bcd8739ae039 = $8369cdd4433d3a57$var$allBlocks;
|
|
43
37
|
|
|
44
38
|
|
|
45
|
-
const $c18434deda90759d$var$tokenTransfers = {
|
|
46
|
-
key: "tokenTransfers",
|
|
47
|
-
name: "Token Transfers",
|
|
48
|
-
description: "Get all blocks for a set of token types.",
|
|
49
|
-
tags: [
|
|
50
|
-
"EVM",
|
|
51
|
-
"NFTs",
|
|
52
|
-
"ERC20",
|
|
53
|
-
"ERC721"
|
|
54
|
-
],
|
|
55
|
-
disabled: false,
|
|
56
|
-
params: [],
|
|
57
|
-
function: ()=>{
|
|
58
|
-
return `
|
|
59
|
-
function tokenTransfers(block, _ctx) {
|
|
60
|
-
return block;
|
|
61
|
-
}`;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
var $c18434deda90759d$export$2e2bcd8739ae039 = $c18434deda90759d$var$tokenTransfers;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const $70cb039dbeb3c65a$export$a8fc3402335b0b04 = [
|
|
68
|
-
(0, $8369cdd4433d3a57$export$2e2bcd8739ae039),
|
|
69
|
-
(0, $c18434deda90759d$export$2e2bcd8739ae039)
|
|
70
|
-
];
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
var $aedb69bdc766818f$exports = {};
|
|
74
|
-
var $2b06dfb983c1c46f$exports = {};
|
|
75
|
-
|
|
76
|
-
$parcel$export($2b06dfb983c1c46f$exports, "erc20Transfers", () => $2b06dfb983c1c46f$export$b830a1966711a4f4);
|
|
77
|
-
var $cfa23334cbdf9391$exports = {};
|
|
78
|
-
|
|
79
|
-
$parcel$export($cfa23334cbdf9391$exports, "evmDecodeLog", () => $cfa23334cbdf9391$export$18467e329ea485c9);
|
|
80
|
-
$parcel$export($cfa23334cbdf9391$exports, "evmDecodeLogWithMetadata", () => $cfa23334cbdf9391$export$cf548b70626e2eb9);
|
|
81
|
-
|
|
82
|
-
var $f6a81337d3532e59$exports = {};
|
|
83
|
-
|
|
84
|
-
$parcel$export($f6a81337d3532e59$exports, "evmMethodSignatureToHex", () => $f6a81337d3532e59$export$49d5c9473f8f70f2);
|
|
85
|
-
|
|
86
|
-
function $f6a81337d3532e59$export$49d5c9473f8f70f2(sig) {
|
|
87
|
-
const [method, rest] = sig.split("(");
|
|
88
|
-
const params = rest.split(")")[0].split(",").map((p)=>p.trim());
|
|
89
|
-
const topic0 = (0, $hgUW1$keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
|
|
90
|
-
return topic0;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
function $cfa23334cbdf9391$export$18467e329ea485c9(log, signatures) {
|
|
95
|
-
if (Array.isArray(signatures)) {
|
|
96
|
-
for (const sig of signatures){
|
|
97
|
-
const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
|
|
98
|
-
if (decoded) return decoded;
|
|
99
|
-
}
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
|
|
103
|
-
const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
|
|
104
|
-
if (!addresses.includes(log.address.toLowerCase())) return null;
|
|
105
|
-
}
|
|
106
|
-
let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
|
|
107
|
-
if (!sig.startsWith("event ")) sig = "event " + sig;
|
|
108
|
-
const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f6a81337d3532e59$export$49d5c9473f8f70f2)(sig);
|
|
109
|
-
if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
|
|
110
|
-
if (log.topics[0] === topic0) try {
|
|
111
|
-
const result = (0, $hgUW1$decodeEventLog)({
|
|
112
|
-
abi: (0, $hgUW1$parseAbi)([
|
|
113
|
-
sig
|
|
114
|
-
]),
|
|
115
|
-
data: log.data,
|
|
116
|
-
topics: log.topics
|
|
117
|
-
});
|
|
118
|
-
return result.args;
|
|
119
|
-
} catch (e) {
|
|
120
|
-
// ignore this
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
function $cfa23334cbdf9391$export$cf548b70626e2eb9(log, signatures) {
|
|
126
|
-
for (const sig of [
|
|
127
|
-
signatures
|
|
128
|
-
].flat()){
|
|
129
|
-
const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
|
|
130
|
-
if (decoded) return {
|
|
131
|
-
decoded: decoded,
|
|
132
|
-
metadata: {
|
|
133
|
-
name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return null;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
function $2b06dfb983c1c46f$export$b830a1966711a4f4(block) {
|
|
142
|
-
const txfers = [];
|
|
143
|
-
for (const tx of block.transactions){
|
|
144
|
-
if (!tx.receipt) continue;
|
|
145
|
-
for (const log of tx.receipt.logs){
|
|
146
|
-
const txfer = (0, $cfa23334cbdf9391$export$18467e329ea485c9)(log, "Transfer(address indexed from, address indexed to, uint256 value)");
|
|
147
|
-
if (txfer) txfers.push({
|
|
148
|
-
blockNumber: block.number,
|
|
149
|
-
timestamp: new Date(block.timestamp * 1000).toISOString(),
|
|
150
|
-
transactionHash: tx.hash,
|
|
151
|
-
...txfer
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return txfers;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
var $8a3c50b8cb33d9fb$exports = {};
|
|
160
|
-
|
|
161
|
-
$parcel$export($8a3c50b8cb33d9fb$exports, "tokenPrice", () => $8a3c50b8cb33d9fb$export$e8386b633cdbc2d7);
|
|
162
|
-
|
|
163
|
-
function $8a3c50b8cb33d9fb$export$e8386b633cdbc2d7(tokenAddress, opts) {
|
|
164
|
-
let url = `https://jiti.indexing.co/presets/token-price/${opts?.network || "ethereum"}?tokenAddress=${tokenAddress}`;
|
|
165
|
-
if (opts?.timestamp) url += "&priceTimestamp=" + new Date(opts.timestamp).toISOString();
|
|
166
|
-
return (0, $hgUW1$isomorphicfetch)(url).then((r)=>r.json()).then((r)=>r.data);
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
var $8dd8a21b1d9a9d2a$exports = {};
|
|
171
|
-
|
|
172
|
-
$parcel$export($8dd8a21b1d9a9d2a$exports, "tokenTransfers", () => $8dd8a21b1d9a9d2a$export$b62520a34e11070c);
|
|
173
39
|
var $fde9406d76ec24a9$exports = {};
|
|
174
40
|
var $42564d9f228fe302$exports = {};
|
|
175
41
|
|
|
@@ -232,6 +98,7 @@ const $68871103c7bc00cf$var$CHAIN_ID = {
|
|
|
232
98
|
STACK: 78225,
|
|
233
99
|
SYNDICATE_FRAME_CHAIN: 5101,
|
|
234
100
|
TRON: 728126428,
|
|
101
|
+
ZER0: 543210,
|
|
235
102
|
ZK_LINK: 810180,
|
|
236
103
|
ZORA: 7777777,
|
|
237
104
|
ZORA_SEPOLIA: 999999999
|
|
@@ -241,6 +108,69 @@ function $68871103c7bc00cf$export$f93b8abed77a4120(chain) {
|
|
|
241
108
|
}
|
|
242
109
|
|
|
243
110
|
|
|
111
|
+
var $cfa23334cbdf9391$exports = {};
|
|
112
|
+
|
|
113
|
+
$parcel$export($cfa23334cbdf9391$exports, "evmDecodeLog", () => $cfa23334cbdf9391$export$18467e329ea485c9);
|
|
114
|
+
$parcel$export($cfa23334cbdf9391$exports, "evmDecodeLogWithMetadata", () => $cfa23334cbdf9391$export$cf548b70626e2eb9);
|
|
115
|
+
|
|
116
|
+
var $f6a81337d3532e59$exports = {};
|
|
117
|
+
|
|
118
|
+
$parcel$export($f6a81337d3532e59$exports, "evmMethodSignatureToHex", () => $f6a81337d3532e59$export$49d5c9473f8f70f2);
|
|
119
|
+
|
|
120
|
+
function $f6a81337d3532e59$export$49d5c9473f8f70f2(sig) {
|
|
121
|
+
const [method, rest] = sig.split("(");
|
|
122
|
+
const params = rest.split(")")[0].split(",").map((p)=>p.trim());
|
|
123
|
+
const topic0 = (0, $hgUW1$keccak256)(`${method.split(" ").pop()}(${params.map((p)=>p.split(" ")[0]).join(",")})`);
|
|
124
|
+
return topic0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
function $cfa23334cbdf9391$export$18467e329ea485c9(log, signatures) {
|
|
129
|
+
if (Array.isArray(signatures)) {
|
|
130
|
+
for (const sig of signatures){
|
|
131
|
+
const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
|
|
132
|
+
if (decoded) return decoded;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
if (typeof signatures !== "string" && Array.isArray(signatures.addresses) && signatures.addresses.length) {
|
|
137
|
+
const addresses = signatures.addresses.map((a)=>a?.toLowerCase());
|
|
138
|
+
if (!addresses.includes(log.address.toLowerCase())) return null;
|
|
139
|
+
}
|
|
140
|
+
let sig = (typeof signatures === "string" ? signatures : signatures.signature).trim();
|
|
141
|
+
if (!sig.startsWith("event ")) sig = "event " + sig;
|
|
142
|
+
const topic0 = typeof signatures !== "string" && signatures.topic0 ? signatures.topic0 : (0, $f6a81337d3532e59$export$49d5c9473f8f70f2)(sig);
|
|
143
|
+
if ((sig.match(/ indexed /g)?.length || 0) === log.topics.length - 1) {
|
|
144
|
+
if (log.topics[0] === topic0) try {
|
|
145
|
+
const result = (0, $hgUW1$decodeEventLog)({
|
|
146
|
+
abi: (0, $hgUW1$parseAbi)([
|
|
147
|
+
sig
|
|
148
|
+
]),
|
|
149
|
+
data: log.data,
|
|
150
|
+
topics: log.topics
|
|
151
|
+
});
|
|
152
|
+
return result.args;
|
|
153
|
+
} catch (e) {
|
|
154
|
+
// ignore this
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
function $cfa23334cbdf9391$export$cf548b70626e2eb9(log, signatures) {
|
|
160
|
+
for (const sig of [
|
|
161
|
+
signatures
|
|
162
|
+
].flat()){
|
|
163
|
+
const decoded = $cfa23334cbdf9391$export$18467e329ea485c9(log, sig);
|
|
164
|
+
if (decoded) return {
|
|
165
|
+
decoded: decoded,
|
|
166
|
+
metadata: {
|
|
167
|
+
name: (typeof sig === "string" ? sig : sig.signature).split("(")[0]
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
|
|
244
174
|
|
|
245
175
|
|
|
246
176
|
var $8f1e0ae1ead9a2a9$exports = {};
|
|
@@ -317,67 +247,103 @@ $parcel$exportWildcard($fde9406d76ec24a9$exports, $f6a81337d3532e59$exports);
|
|
|
317
247
|
$parcel$exportWildcard($fde9406d76ec24a9$exports, $8f1e0ae1ead9a2a9$exports);
|
|
318
248
|
|
|
319
249
|
|
|
320
|
-
const $
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
250
|
+
const $c18434deda90759d$var$NULL_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
251
|
+
const $c18434deda90759d$var$tokenTransfers = {
|
|
252
|
+
key: "tokenTransfers",
|
|
253
|
+
name: "Token Transfers",
|
|
254
|
+
description: "Get all token transfers for a set of token types.",
|
|
255
|
+
tags: [
|
|
256
|
+
"EVM",
|
|
257
|
+
"ERC20",
|
|
258
|
+
"ERC721",
|
|
259
|
+
"NFT",
|
|
260
|
+
"TOKEN"
|
|
261
|
+
],
|
|
262
|
+
disabled: false,
|
|
263
|
+
params: [
|
|
264
|
+
{
|
|
265
|
+
key: "tokenTypes",
|
|
266
|
+
name: "Token Types",
|
|
267
|
+
type: "STRING",
|
|
268
|
+
multiple: true,
|
|
269
|
+
optional: true
|
|
270
|
+
}
|
|
271
|
+
],
|
|
272
|
+
transform: (block, _ctx)=>{
|
|
273
|
+
const TOKEN_TYPES = _ctx.params.tokenTypes || [];
|
|
274
|
+
const transfers = [];
|
|
275
|
+
switch(block._network){
|
|
276
|
+
// @TODO: expand to non-EVM
|
|
277
|
+
// assume EVM as default for now
|
|
278
|
+
default:
|
|
279
|
+
for (const tx of block.transactions){
|
|
280
|
+
if (!tx.receipt) continue;
|
|
281
|
+
const timestamp = new Date(block.timestamp * 1000).toISOString();
|
|
282
|
+
const transactionGasFee = BigInt(tx.receipt.gasUsed) * BigInt(tx.receipt.effectiveGasPrice);
|
|
283
|
+
// track direct ETH transfers
|
|
284
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NATIVE")) {
|
|
285
|
+
if (tx.value?.length >= 3 || /\d+/.test(tx.value)) {
|
|
286
|
+
transfers.push({
|
|
287
|
+
amount: BigInt(tx.value),
|
|
288
|
+
blockNumber: tx.blockNumber,
|
|
289
|
+
from: (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx.from) || $c18434deda90759d$var$NULL_ADDRESS,
|
|
290
|
+
timestamp: timestamp,
|
|
291
|
+
to: (0, $42564d9f228fe302$export$db81f9ea057ab646)(tx.to) || $c18434deda90759d$var$NULL_ADDRESS,
|
|
292
|
+
tokenType: "NATIVE",
|
|
293
|
+
transactionGasFee: transactionGasFee,
|
|
294
|
+
transactionHash: tx.hash
|
|
295
|
+
});
|
|
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
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// track ERC20 transfers
|
|
314
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("TOKEN")) for (const log of tx.receipt.logs){
|
|
315
|
+
const txfer = (0, $cfa23334cbdf9391$export$cf548b70626e2eb9)(log, [
|
|
316
|
+
"Transfer(address indexed from, address indexed to, uint256 value)"
|
|
317
|
+
]);
|
|
318
|
+
if (txfer) transfers.push({
|
|
319
|
+
amount: txfer.decoded.value,
|
|
320
|
+
blockNumber: tx.blockNumber,
|
|
321
|
+
from: (0, $42564d9f228fe302$export$db81f9ea057ab646)(txfer.decoded.from) || $c18434deda90759d$var$NULL_ADDRESS,
|
|
322
|
+
index: log.logIndex,
|
|
323
|
+
timestamp: timestamp,
|
|
324
|
+
to: (0, $42564d9f228fe302$export$db81f9ea057ab646)(txfer.decoded.to) || $c18434deda90759d$var$NULL_ADDRESS,
|
|
325
|
+
token: (0, $42564d9f228fe302$export$db81f9ea057ab646)(log.address),
|
|
326
|
+
tokenType: "TOKEN",
|
|
327
|
+
transactionGasFee: transactionGasFee,
|
|
328
|
+
transactionHash: tx.hash
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
// @TODO: add NFT transfers
|
|
332
|
+
if (!TOKEN_TYPES.length || TOKEN_TYPES.includes("NFT")) {
|
|
333
|
+
for (const log of tx.receipt.logs);
|
|
334
|
+
}
|
|
371
335
|
}
|
|
372
|
-
|
|
336
|
+
}
|
|
337
|
+
return transfers.filter((txfer)=>txfer.amount > BigInt(0));
|
|
373
338
|
}
|
|
374
|
-
|
|
375
|
-
|
|
339
|
+
};
|
|
340
|
+
var $c18434deda90759d$export$2e2bcd8739ae039 = $c18434deda90759d$var$tokenTransfers;
|
|
376
341
|
|
|
377
342
|
|
|
378
|
-
$
|
|
379
|
-
|
|
380
|
-
|
|
343
|
+
const $70cb039dbeb3c65a$export$a8fc3402335b0b04 = [
|
|
344
|
+
(0, $8369cdd4433d3a57$export$2e2bcd8739ae039),
|
|
345
|
+
(0, $c18434deda90759d$export$2e2bcd8739ae039)
|
|
346
|
+
];
|
|
381
347
|
|
|
382
348
|
|
|
383
349
|
|
package/dist/module.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/presets/index.ts","src/presets/erc20-transfers.ts","src/utils/evm-decode-log.ts","src/utils/evm-method-signature-to-hex.ts","src/presets/token-price.ts","src/presets/token-transfers.ts","src/utils/index.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-normalize-raw-block.ts","src/types.ts"],"sourcesContent":["import { templates } from './templates';\nimport * as presets from './presets';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { presets, 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 }","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","import { Template, Param } 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 function: () => {\n return `\n function allBlocks(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default allBlocks;","import { Template, Param } from \"../types\";\n\nconst tokenTransfers: Template = {\n key: \"tokenTransfers\",\n name: \"Token Transfers\",\n description: \"Get all blocks for a set of token types.\",\n tags: [\"EVM\", \"NFTs\", \"ERC20\", \"ERC721\"],\n disabled: false,\n params: [],\n function: () => {\n return `\n function tokenTransfers(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default tokenTransfers;","export * from './erc20-transfers';\nexport * from './token-price';\nexport * from './token-transfers';\n","import { evmDecodeLog } from '../utils/evm-decode-log';\n\nexport function erc20Transfers(block) {\n const txfers = [];\n\n for (const tx of block.transactions) {\n if (!tx.receipt) continue;\n\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLog(log, 'Transfer(address indexed from, address indexed to, uint256 value)');\n if (txfer) {\n txfers.push({\n blockNumber: block.number,\n timestamp: new Date(block.timestamp * 1000).toISOString(),\n transactionHash: tx.hash,\n ...txfer,\n });\n }\n }\n }\n\n return txfers;\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 _fetch from 'isomorphic-fetch';\n\nexport function tokenPrice(tokenAddress: string, opts?: { network?: string; timestamp?: string }) {\n let url = `https://jiti.indexing.co/presets/token-price/${opts?.network || 'ethereum'}?tokenAddress=${tokenAddress}`;\n if (opts?.timestamp) {\n url += '&priceTimestamp=' + new Date(opts.timestamp).toISOString();\n }\n\n return _fetch(url)\n .then((r) => r.json())\n .then((r) => r.data);\n}\n","import { evmAddressToChecksum, evmDecodeLogWithMetadata } from '../utils';\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 // @TODO: tokenType: 'CURRENCY' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport function tokenTransfers(block) {\n const transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: port non-EVM handlers over\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions) {\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 ((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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n\n // track ERC20 transfers\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\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 { 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 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 { 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 function: (params: Record<string, unknown>) => string;\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: \"NETWORK\" | \"ADDRESS\";\n multiple?: boolean;\n optional?: boolean;\n};"],"names":[],"version":3,"file":"module.js.map"}
|
|
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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -5,12 +5,14 @@ type Template = {
|
|
|
5
5
|
disabled: boolean;
|
|
6
6
|
tags: string[];
|
|
7
7
|
params: Param[];
|
|
8
|
-
|
|
8
|
+
transform: (payload: Record<string, unknown>, _ctx?: Record<string, unknown> & {
|
|
9
|
+
params: Record<string, unknown>;
|
|
10
|
+
}) => unknown;
|
|
9
11
|
};
|
|
10
12
|
type Param = {
|
|
11
13
|
key: string;
|
|
12
14
|
name: string;
|
|
13
|
-
type:
|
|
15
|
+
type: 'NETWORK' | 'ADDRESS' | 'STRING';
|
|
14
16
|
multiple?: boolean;
|
|
15
17
|
optional?: boolean;
|
|
16
18
|
};
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,gBAAuB;IACnB,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,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;CACzD,CAAC;AAEF,aAAoB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AcTF,8CAEG;AAEH,iCAAiC,GAAG,EAAE,MAAM,YAEzC","sources":["src/types.ts","src/templates/all-blocks.ts","src/templates/token-transfers.ts","src/templates/index.ts","src/utils/evm-method-signature-to-hex.ts","src/utils/evm-decode-log.ts","src/presets/erc20-transfers.ts","src/presets/token-price.ts","src/utils/evm-address-to-checksum.ts","src/utils/evm-chain-to-id.ts","src/utils/evm-normalize-raw-block.ts","src/utils/index.ts","src/presets/token-transfers.ts","src/presets/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 function: (params: Record<string, unknown>) => string;\n};\n\nexport type Param = {\n key: string;\n name: string;\n type: \"NETWORK\" | \"ADDRESS\";\n multiple?: boolean;\n optional?: boolean;\n};","import { Template, Param } 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 function: () => {\n return `\n function allBlocks(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default allBlocks;","import { Template, Param } from \"../types\";\n\nconst tokenTransfers: Template = {\n key: \"tokenTransfers\",\n name: \"Token Transfers\",\n description: \"Get all blocks for a set of token types.\",\n tags: [\"EVM\", \"NFTs\", \"ERC20\", \"ERC721\"],\n disabled: false,\n params: [],\n function: () => {\n return `\n function tokenTransfers(block, _ctx) {\n return block;\n }`;\n },\n};\n\nexport default tokenTransfers;","import allBlocks from './all-blocks';\nimport tokenTransfers from './token-transfers';\n\nexport const templates = [allBlocks, tokenTransfers];","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 { evmDecodeLog } from '../utils/evm-decode-log';\n\nexport function erc20Transfers(block) {\n const txfers = [];\n\n for (const tx of block.transactions) {\n if (!tx.receipt) continue;\n\n for (const log of tx.receipt.logs) {\n const txfer = evmDecodeLog(log, 'Transfer(address indexed from, address indexed to, uint256 value)');\n if (txfer) {\n txfers.push({\n blockNumber: block.number,\n timestamp: new Date(block.timestamp * 1000).toISOString(),\n transactionHash: tx.hash,\n ...txfer,\n });\n }\n }\n }\n\n return txfers;\n}\n","import _fetch from 'isomorphic-fetch';\n\nexport function tokenPrice(tokenAddress: string, opts?: { network?: string; timestamp?: string }) {\n let url = `https://jiti.indexing.co/presets/token-price/${opts?.network || 'ethereum'}?tokenAddress=${tokenAddress}`;\n if (opts?.timestamp) {\n url += '&priceTimestamp=' + new Date(opts.timestamp).toISOString();\n }\n\n return _fetch(url)\n .then((r) => r.json())\n .then((r) => r.data);\n}\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 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 { 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';\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 // @TODO: tokenType: 'CURRENCY' | 'NFT';\n transactionGasFee: bigint;\n transactionHash: string;\n};\n\nconst NULL_ADDRESS = '0x0000000000000000000000000000000000000000';\n\nexport function tokenTransfers(block) {\n const transfers: NetworkTransfer[] = [];\n\n switch (block._network) {\n // @TODO: port non-EVM handlers over\n\n // assume EVM as default for now\n default: {\n for (const tx of block.transactions) {\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 ((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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n\n // track ERC20 transfers\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\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 transactionGasFee,\n transactionHash: tx.hash,\n });\n }\n }\n }\n }\n }\n\n return transfers.filter((txfer) => txfer.amount > BigInt(0));\n}\n","export * from './erc20-transfers';\nexport * from './token-price';\nexport * from './token-transfers';\n","import { templates } from './templates';\nimport * as presets from './presets';\nimport * as utils from './utils';\nimport * as types from './types';\n\nexport { presets, 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 }"],"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;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"}
|