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.
@@ -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 { getEventSelector } from "viem";
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 = getEventSelector(event);
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)).orderBy("id asc").$if(limit !== void 0, (qb) => qb.limit(limit)).execute().then((addresses) => addresses.map(({ childAddress }) => childAddress));
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(