ponder 0.8.12 → 0.8.13
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/bin/ponder.js
CHANGED
|
@@ -454,6 +454,193 @@ function toLowerCase(value) {
|
|
|
454
454
|
return value.toLowerCase();
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
+
// ../common/src/promiseWithResolvers.ts
|
|
458
|
+
var promiseWithResolvers = () => {
|
|
459
|
+
let resolve2;
|
|
460
|
+
let reject;
|
|
461
|
+
const promise = new Promise((_resolve, _reject) => {
|
|
462
|
+
resolve2 = _resolve;
|
|
463
|
+
reject = _reject;
|
|
464
|
+
});
|
|
465
|
+
return { resolve: resolve2, reject, promise };
|
|
466
|
+
};
|
|
467
|
+
|
|
468
|
+
// ../common/src/dedupe.ts
|
|
469
|
+
function dedupe(arr, getId) {
|
|
470
|
+
const seen = /* @__PURE__ */ new Set();
|
|
471
|
+
return arr.filter((x) => {
|
|
472
|
+
if (seen.has(getId ? getId(x) : x))
|
|
473
|
+
return false;
|
|
474
|
+
seen.add(x);
|
|
475
|
+
return true;
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
dedupe(
|
|
479
|
+
[
|
|
480
|
+
{ a: 1, b: 2 },
|
|
481
|
+
{ a: 1, b: 2 },
|
|
482
|
+
{ a: 2, b: 2 }
|
|
483
|
+
],
|
|
484
|
+
(e) => `${e.a}_${e.b}`
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
// ../common/src/queue.ts
|
|
488
|
+
var validateParameters = ({
|
|
489
|
+
concurrency,
|
|
490
|
+
frequency
|
|
491
|
+
}) => {
|
|
492
|
+
if (concurrency === void 0 && frequency === void 0) {
|
|
493
|
+
throw new Error(
|
|
494
|
+
"Invalid queue configuration, must specify either 'concurrency' or 'frequency'."
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
if (concurrency !== void 0 && concurrency <= 0) {
|
|
498
|
+
throw new Error(
|
|
499
|
+
`Invalid value for queue 'concurrency' option. Got ${concurrency}, expected a number greater than zero.`
|
|
500
|
+
);
|
|
501
|
+
}
|
|
502
|
+
if (frequency !== void 0 && frequency <= 0) {
|
|
503
|
+
throw new Error(
|
|
504
|
+
`Invalid value for queue 'frequency' option. Got ${frequency}, expected a number greater than zero.`
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
var createQueue = ({
|
|
509
|
+
worker,
|
|
510
|
+
initialStart = false,
|
|
511
|
+
browser = true,
|
|
512
|
+
..._parameters
|
|
513
|
+
}) => {
|
|
514
|
+
validateParameters(_parameters);
|
|
515
|
+
const parameters = _parameters;
|
|
516
|
+
let queue = new Array();
|
|
517
|
+
let pending = 0;
|
|
518
|
+
let timestamp = 0;
|
|
519
|
+
let requests = 0;
|
|
520
|
+
let isStarted = initialStart;
|
|
521
|
+
let timer;
|
|
522
|
+
let emptyPromiseWithResolvers = void 0;
|
|
523
|
+
let idlePromiseWithResolvers = void 0;
|
|
524
|
+
const next = () => {
|
|
525
|
+
if (!isStarted)
|
|
526
|
+
return;
|
|
527
|
+
const _timestamp = Date.now();
|
|
528
|
+
if (Math.floor(_timestamp / 1e3) !== timestamp) {
|
|
529
|
+
requests = 0;
|
|
530
|
+
timestamp = Math.floor(_timestamp / 1e3);
|
|
531
|
+
}
|
|
532
|
+
if (timer)
|
|
533
|
+
return;
|
|
534
|
+
while ((parameters.frequency !== void 0 ? requests < parameters.frequency : true) && (parameters.concurrency !== void 0 ? pending < parameters.concurrency : true) && queue.length > 0) {
|
|
535
|
+
const { task, resolve: resolve2, reject } = queue.shift();
|
|
536
|
+
requests++;
|
|
537
|
+
pending++;
|
|
538
|
+
worker(task).then(resolve2).catch(reject).finally(() => {
|
|
539
|
+
pending--;
|
|
540
|
+
if (idlePromiseWithResolvers !== void 0 && queue.length === 0 && pending === 0) {
|
|
541
|
+
idlePromiseWithResolvers.resolve();
|
|
542
|
+
idlePromiseWithResolvers.completed = true;
|
|
543
|
+
}
|
|
544
|
+
browser ? next() : process.nextTick(next);
|
|
545
|
+
});
|
|
546
|
+
if (emptyPromiseWithResolvers !== void 0 && queue.length === 0) {
|
|
547
|
+
emptyPromiseWithResolvers.resolve();
|
|
548
|
+
emptyPromiseWithResolvers.completed = true;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
if (parameters.frequency !== void 0 && requests >= parameters.frequency) {
|
|
552
|
+
timer = setTimeout(
|
|
553
|
+
() => {
|
|
554
|
+
timer = void 0;
|
|
555
|
+
next();
|
|
556
|
+
},
|
|
557
|
+
1e3 - _timestamp % 1e3
|
|
558
|
+
);
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
};
|
|
562
|
+
return {
|
|
563
|
+
size: () => queue.length,
|
|
564
|
+
pending: () => {
|
|
565
|
+
if (browser) {
|
|
566
|
+
return new Promise(
|
|
567
|
+
(resolve2) => setTimeout(() => resolve2(pending))
|
|
568
|
+
);
|
|
569
|
+
} else {
|
|
570
|
+
return new Promise(
|
|
571
|
+
(resolve2) => setImmediate(() => resolve2(pending))
|
|
572
|
+
);
|
|
573
|
+
}
|
|
574
|
+
},
|
|
575
|
+
add: (task) => {
|
|
576
|
+
const { promise, resolve: resolve2, reject } = promiseWithResolvers();
|
|
577
|
+
queue.push({ task, resolve: resolve2, reject });
|
|
578
|
+
next();
|
|
579
|
+
return promise.catch((error) => {
|
|
580
|
+
Error.captureStackTrace(error);
|
|
581
|
+
throw error;
|
|
582
|
+
});
|
|
583
|
+
},
|
|
584
|
+
clear: () => {
|
|
585
|
+
queue = new Array();
|
|
586
|
+
clearTimeout(timer);
|
|
587
|
+
timer = void 0;
|
|
588
|
+
},
|
|
589
|
+
isStarted: () => isStarted,
|
|
590
|
+
start: () => {
|
|
591
|
+
if (browser) {
|
|
592
|
+
return new Promise(
|
|
593
|
+
(resolve2) => setTimeout(() => resolve2(pending))
|
|
594
|
+
).then(() => {
|
|
595
|
+
isStarted = true;
|
|
596
|
+
next();
|
|
597
|
+
});
|
|
598
|
+
} else {
|
|
599
|
+
return new Promise(
|
|
600
|
+
(resolve2) => process.nextTick(() => resolve2(pending))
|
|
601
|
+
).then(() => {
|
|
602
|
+
isStarted = true;
|
|
603
|
+
next();
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
pause: () => {
|
|
608
|
+
isStarted = false;
|
|
609
|
+
},
|
|
610
|
+
onIdle: () => {
|
|
611
|
+
if (idlePromiseWithResolvers === void 0 || idlePromiseWithResolvers.completed) {
|
|
612
|
+
if (queue.length === 0 && pending === 0)
|
|
613
|
+
return Promise.resolve();
|
|
614
|
+
idlePromiseWithResolvers = {
|
|
615
|
+
...promiseWithResolvers(),
|
|
616
|
+
completed: false
|
|
617
|
+
};
|
|
618
|
+
}
|
|
619
|
+
return idlePromiseWithResolvers.promise;
|
|
620
|
+
},
|
|
621
|
+
onEmpty: () => {
|
|
622
|
+
if (emptyPromiseWithResolvers === void 0 || emptyPromiseWithResolvers.completed) {
|
|
623
|
+
if (queue.length === 0)
|
|
624
|
+
return Promise.resolve();
|
|
625
|
+
emptyPromiseWithResolvers = {
|
|
626
|
+
...promiseWithResolvers(),
|
|
627
|
+
completed: false
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
return emptyPromiseWithResolvers.promise;
|
|
631
|
+
},
|
|
632
|
+
setParameters: (_parameters2) => {
|
|
633
|
+
validateParameters(_parameters2);
|
|
634
|
+
if ("frequency" in _parameters2) {
|
|
635
|
+
parameters.frequency = _parameters2.frequency;
|
|
636
|
+
}
|
|
637
|
+
if ("concurrency" in _parameters2) {
|
|
638
|
+
parameters.concurrency = _parameters2.concurrency;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
};
|
|
642
|
+
};
|
|
643
|
+
|
|
457
644
|
// src/utils/offset.ts
|
|
458
645
|
import { InvalidAbiDecodingTypeError } from "viem";
|
|
459
646
|
function getBytesConsumedByParam(param) {
|
|
@@ -510,15 +697,15 @@ function getArrayComponents(type) {
|
|
|
510
697
|
}
|
|
511
698
|
|
|
512
699
|
// src/build/factory.ts
|
|
513
|
-
import {
|
|
700
|
+
import { toEventSelector as toEventSelector2 } from "viem";
|
|
514
701
|
function buildLogFactory({
|
|
515
702
|
address: _address,
|
|
516
703
|
event,
|
|
517
704
|
parameter,
|
|
518
705
|
chainId
|
|
519
706
|
}) {
|
|
520
|
-
const address = Array.isArray(_address) ? _address.map(toLowerCase) : toLowerCase(_address);
|
|
521
|
-
const eventSelector =
|
|
707
|
+
const address = Array.isArray(_address) ? dedupe(_address).map(toLowerCase) : toLowerCase(_address);
|
|
708
|
+
const eventSelector = toEventSelector2(event);
|
|
522
709
|
const indexedInputPosition = event.inputs.filter((x) => "indexed" in x && x.indexed).findIndex((input) => input.name === parameter);
|
|
523
710
|
if (indexedInputPosition > -1) {
|
|
524
711
|
return {
|
|
@@ -864,7 +1051,7 @@ async function buildConfigAndIndexingFunctions({
|
|
|
864
1051
|
);
|
|
865
1052
|
}
|
|
866
1053
|
}
|
|
867
|
-
const validatedAddress = Array.isArray(resolvedAddress) ? resolvedAddress.map((r) => toLowerCase(r)) : resolvedAddress !== void 0 ? toLowerCase(resolvedAddress) : void 0;
|
|
1054
|
+
const validatedAddress = Array.isArray(resolvedAddress) ? dedupe(resolvedAddress).map((r) => toLowerCase(r)) : resolvedAddress !== void 0 ? toLowerCase(resolvedAddress) : void 0;
|
|
868
1055
|
const logSource = {
|
|
869
1056
|
...contractMetadata,
|
|
870
1057
|
filter: {
|
|
@@ -1012,7 +1199,7 @@ async function buildConfigAndIndexingFunctions({
|
|
|
1012
1199
|
`Validation failed: Invalid length for address '${address}'. Got ${address.length}, expected 42 characters.`
|
|
1013
1200
|
);
|
|
1014
1201
|
}
|
|
1015
|
-
const validatedAddress = Array.isArray(resolvedAddress) ? resolvedAddress.map((r) => toLowerCase(r)) : resolvedAddress !== void 0 ? toLowerCase(resolvedAddress) : void 0;
|
|
1202
|
+
const validatedAddress = Array.isArray(resolvedAddress) ? dedupe(resolvedAddress).map((r) => toLowerCase(r)) : resolvedAddress !== void 0 ? toLowerCase(resolvedAddress) : void 0;
|
|
1016
1203
|
return [
|
|
1017
1204
|
{
|
|
1018
1205
|
type: "account",
|
|
@@ -2665,174 +2852,6 @@ async function wait(milliseconds) {
|
|
|
2665
2852
|
return new Promise((res) => setTimeout(res, milliseconds));
|
|
2666
2853
|
}
|
|
2667
2854
|
|
|
2668
|
-
// ../common/src/promiseWithResolvers.ts
|
|
2669
|
-
var promiseWithResolvers = () => {
|
|
2670
|
-
let resolve2;
|
|
2671
|
-
let reject;
|
|
2672
|
-
const promise = new Promise((_resolve, _reject) => {
|
|
2673
|
-
resolve2 = _resolve;
|
|
2674
|
-
reject = _reject;
|
|
2675
|
-
});
|
|
2676
|
-
return { resolve: resolve2, reject, promise };
|
|
2677
|
-
};
|
|
2678
|
-
|
|
2679
|
-
// ../common/src/queue.ts
|
|
2680
|
-
var validateParameters = ({
|
|
2681
|
-
concurrency,
|
|
2682
|
-
frequency
|
|
2683
|
-
}) => {
|
|
2684
|
-
if (concurrency === void 0 && frequency === void 0) {
|
|
2685
|
-
throw new Error(
|
|
2686
|
-
"Invalid queue configuration, must specify either 'concurrency' or 'frequency'."
|
|
2687
|
-
);
|
|
2688
|
-
}
|
|
2689
|
-
if (concurrency !== void 0 && concurrency <= 0) {
|
|
2690
|
-
throw new Error(
|
|
2691
|
-
`Invalid value for queue 'concurrency' option. Got ${concurrency}, expected a number greater than zero.`
|
|
2692
|
-
);
|
|
2693
|
-
}
|
|
2694
|
-
if (frequency !== void 0 && frequency <= 0) {
|
|
2695
|
-
throw new Error(
|
|
2696
|
-
`Invalid value for queue 'frequency' option. Got ${frequency}, expected a number greater than zero.`
|
|
2697
|
-
);
|
|
2698
|
-
}
|
|
2699
|
-
};
|
|
2700
|
-
var createQueue = ({
|
|
2701
|
-
worker,
|
|
2702
|
-
initialStart = false,
|
|
2703
|
-
browser = true,
|
|
2704
|
-
..._parameters
|
|
2705
|
-
}) => {
|
|
2706
|
-
validateParameters(_parameters);
|
|
2707
|
-
const parameters = _parameters;
|
|
2708
|
-
let queue = new Array();
|
|
2709
|
-
let pending = 0;
|
|
2710
|
-
let timestamp = 0;
|
|
2711
|
-
let requests = 0;
|
|
2712
|
-
let isStarted = initialStart;
|
|
2713
|
-
let timer;
|
|
2714
|
-
let emptyPromiseWithResolvers = void 0;
|
|
2715
|
-
let idlePromiseWithResolvers = void 0;
|
|
2716
|
-
const next = () => {
|
|
2717
|
-
if (!isStarted)
|
|
2718
|
-
return;
|
|
2719
|
-
const _timestamp = Date.now();
|
|
2720
|
-
if (Math.floor(_timestamp / 1e3) !== timestamp) {
|
|
2721
|
-
requests = 0;
|
|
2722
|
-
timestamp = Math.floor(_timestamp / 1e3);
|
|
2723
|
-
}
|
|
2724
|
-
if (timer)
|
|
2725
|
-
return;
|
|
2726
|
-
while ((parameters.frequency !== void 0 ? requests < parameters.frequency : true) && (parameters.concurrency !== void 0 ? pending < parameters.concurrency : true) && queue.length > 0) {
|
|
2727
|
-
const { task, resolve: resolve2, reject } = queue.shift();
|
|
2728
|
-
requests++;
|
|
2729
|
-
pending++;
|
|
2730
|
-
worker(task).then(resolve2).catch(reject).finally(() => {
|
|
2731
|
-
pending--;
|
|
2732
|
-
if (idlePromiseWithResolvers !== void 0 && queue.length === 0 && pending === 0) {
|
|
2733
|
-
idlePromiseWithResolvers.resolve();
|
|
2734
|
-
idlePromiseWithResolvers.completed = true;
|
|
2735
|
-
}
|
|
2736
|
-
browser ? next() : process.nextTick(next);
|
|
2737
|
-
});
|
|
2738
|
-
if (emptyPromiseWithResolvers !== void 0 && queue.length === 0) {
|
|
2739
|
-
emptyPromiseWithResolvers.resolve();
|
|
2740
|
-
emptyPromiseWithResolvers.completed = true;
|
|
2741
|
-
}
|
|
2742
|
-
}
|
|
2743
|
-
if (parameters.frequency !== void 0 && requests >= parameters.frequency) {
|
|
2744
|
-
timer = setTimeout(
|
|
2745
|
-
() => {
|
|
2746
|
-
timer = void 0;
|
|
2747
|
-
next();
|
|
2748
|
-
},
|
|
2749
|
-
1e3 - _timestamp % 1e3
|
|
2750
|
-
);
|
|
2751
|
-
return;
|
|
2752
|
-
}
|
|
2753
|
-
};
|
|
2754
|
-
return {
|
|
2755
|
-
size: () => queue.length,
|
|
2756
|
-
pending: () => {
|
|
2757
|
-
if (browser) {
|
|
2758
|
-
return new Promise(
|
|
2759
|
-
(resolve2) => setTimeout(() => resolve2(pending))
|
|
2760
|
-
);
|
|
2761
|
-
} else {
|
|
2762
|
-
return new Promise(
|
|
2763
|
-
(resolve2) => setImmediate(() => resolve2(pending))
|
|
2764
|
-
);
|
|
2765
|
-
}
|
|
2766
|
-
},
|
|
2767
|
-
add: (task) => {
|
|
2768
|
-
const { promise, resolve: resolve2, reject } = promiseWithResolvers();
|
|
2769
|
-
queue.push({ task, resolve: resolve2, reject });
|
|
2770
|
-
next();
|
|
2771
|
-
return promise.catch((error) => {
|
|
2772
|
-
Error.captureStackTrace(error);
|
|
2773
|
-
throw error;
|
|
2774
|
-
});
|
|
2775
|
-
},
|
|
2776
|
-
clear: () => {
|
|
2777
|
-
queue = new Array();
|
|
2778
|
-
clearTimeout(timer);
|
|
2779
|
-
timer = void 0;
|
|
2780
|
-
},
|
|
2781
|
-
isStarted: () => isStarted,
|
|
2782
|
-
start: () => {
|
|
2783
|
-
if (browser) {
|
|
2784
|
-
return new Promise(
|
|
2785
|
-
(resolve2) => setTimeout(() => resolve2(pending))
|
|
2786
|
-
).then(() => {
|
|
2787
|
-
isStarted = true;
|
|
2788
|
-
next();
|
|
2789
|
-
});
|
|
2790
|
-
} else {
|
|
2791
|
-
return new Promise(
|
|
2792
|
-
(resolve2) => process.nextTick(() => resolve2(pending))
|
|
2793
|
-
).then(() => {
|
|
2794
|
-
isStarted = true;
|
|
2795
|
-
next();
|
|
2796
|
-
});
|
|
2797
|
-
}
|
|
2798
|
-
},
|
|
2799
|
-
pause: () => {
|
|
2800
|
-
isStarted = false;
|
|
2801
|
-
},
|
|
2802
|
-
onIdle: () => {
|
|
2803
|
-
if (idlePromiseWithResolvers === void 0 || idlePromiseWithResolvers.completed) {
|
|
2804
|
-
if (queue.length === 0 && pending === 0)
|
|
2805
|
-
return Promise.resolve();
|
|
2806
|
-
idlePromiseWithResolvers = {
|
|
2807
|
-
...promiseWithResolvers(),
|
|
2808
|
-
completed: false
|
|
2809
|
-
};
|
|
2810
|
-
}
|
|
2811
|
-
return idlePromiseWithResolvers.promise;
|
|
2812
|
-
},
|
|
2813
|
-
onEmpty: () => {
|
|
2814
|
-
if (emptyPromiseWithResolvers === void 0 || emptyPromiseWithResolvers.completed) {
|
|
2815
|
-
if (queue.length === 0)
|
|
2816
|
-
return Promise.resolve();
|
|
2817
|
-
emptyPromiseWithResolvers = {
|
|
2818
|
-
...promiseWithResolvers(),
|
|
2819
|
-
completed: false
|
|
2820
|
-
};
|
|
2821
|
-
}
|
|
2822
|
-
return emptyPromiseWithResolvers.promise;
|
|
2823
|
-
},
|
|
2824
|
-
setParameters: (_parameters2) => {
|
|
2825
|
-
validateParameters(_parameters2);
|
|
2826
|
-
if ("frequency" in _parameters2) {
|
|
2827
|
-
parameters.frequency = _parameters2.frequency;
|
|
2828
|
-
}
|
|
2829
|
-
if ("concurrency" in _parameters2) {
|
|
2830
|
-
parameters.concurrency = _parameters2.concurrency;
|
|
2831
|
-
}
|
|
2832
|
-
}
|
|
2833
|
-
};
|
|
2834
|
-
};
|
|
2835
|
-
|
|
2836
2855
|
// src/common/telemetry.ts
|
|
2837
2856
|
import Conf from "conf";
|
|
2838
2857
|
import { detect, getNpmVersion } from "detect-package-manager";
|
|
@@ -6774,7 +6793,7 @@ var logFactorySQL = (qb, factory) => qb.select(
|
|
|
6774
6793
|
)} from ${start2}::integer for ${length}::integer)`;
|
|
6775
6794
|
}
|
|
6776
6795
|
})().as("childAddress")
|
|
6777
|
-
).$call((qb2) => {
|
|
6796
|
+
).distinct().$call((qb2) => {
|
|
6778
6797
|
if (Array.isArray(factory.address)) {
|
|
6779
6798
|
return qb2.where("address", "in", factory.address);
|
|
6780
6799
|
}
|
|
@@ -6846,7 +6865,7 @@ var createSyncStore = ({
|
|
|
6846
6865
|
return result;
|
|
6847
6866
|
}),
|
|
6848
6867
|
getChildAddresses: ({ filter, limit }) => db.wrap({ method: "getChildAddresses" }, async () => {
|
|
6849
|
-
return await db.selectFrom("logs").$call((qb) => logFactorySQL(qb, filter))
|
|
6868
|
+
return await db.selectFrom("logs").$call((qb) => logFactorySQL(qb, filter)).$if(limit !== void 0, (qb) => qb.limit(limit)).execute().then((addresses) => addresses.map(({ childAddress }) => childAddress));
|
|
6850
6869
|
}),
|
|
6851
6870
|
filterChildAddresses: ({ filter, addresses }) => db.wrap({ method: "filterChildAddresses" }, async () => {
|
|
6852
6871
|
const result = await db.with(
|