ponder 0.13.4 → 0.13.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # ponder
2
2
 
3
+ ## 0.13.5
4
+
5
+ ### Patch Changes
6
+
7
+ - [`54e56d2`](https://github.com/ponder-sh/ponder/commit/54e56d2f4ad24ef7e4e3b81882884e514b19bf60) Thanks [@kyscott18](https://github.com/kyscott18)! - Improved realtime sync error handling.
8
+
3
9
  ## 0.13.4
4
10
 
5
11
  ### Patch Changes
@@ -3,10 +3,9 @@ import { getChildAddress, isAddressFactory, isAddressMatched, isBlockFilterMatch
3
3
  import { createLock } from '../utils/mutex.js';
4
4
  import { range } from '../utils/range.js';
5
5
  import { _debug_traceBlockByHash, _eth_getBlockByHash, _eth_getBlockByNumber, _eth_getBlockReceipts, _eth_getLogs, _eth_getTransactionReceipt, validateLogsAndBlock, validateReceiptsAndBlock, validateTracesAndBlock, validateTransactionsAndBlock, } from '../utils/rpc.js';
6
- import { wait } from '../utils/wait.js';
7
6
  import { hexToNumber, zeroHash } from "viem";
8
7
  import { isFilterInBloom, isInBloom, zeroLogsBloom } from "./bloom.js";
9
- const MAX_LATEST_BLOCK_ATTEMPT_MS = 3 * 60 * 1000; // 3 minutes
8
+ const MAX_LATEST_BLOCK_ATTEMPT_MS = 10 * 60 * 1000; // 10 minutes
10
9
  const ERROR_TIMEOUT = [
11
10
  1, 2, 5, 10, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60,
12
11
  ];
@@ -25,7 +24,6 @@ export const createRealtimeSync = (args) => {
25
24
  */
26
25
  let unfinalizedBlocks = [];
27
26
  let fetchAndReconcileLatestBlockErrorCount = 0;
28
- let reconcileBlockErrorCount = 0;
29
27
  const factories = [];
30
28
  const logFilters = [];
31
29
  const traceFilters = [];
@@ -543,16 +541,8 @@ export const createRealtimeSync = (args) => {
543
541
  * 4) Block is exactly one block ahead of the last processed,
544
542
  * handle this new block (happy path).
545
543
  *
546
- * @dev This mutex only runs one at a time, every block is
547
- * processed serially.
548
- *
549
- * @returns
550
- * - `rejected` for case 1 and 2.
551
- * - `reorg` for case 2 with a promise that resolves once the reorg is applied.
552
- * - `pending` for case 3 with a promise that resolves once the block is
553
- * settled as `rejected`, `accepted`, or `reorg`.
554
- * - `accepted` for case 4 with promises for the "block" and "finalize" events
555
- * that resolve when each event is applied.
544
+ * @dev `blockCallback` is guaranteed to be called exactly once or an error is thrown.
545
+ * @dev It is an invariant that the correct events are generated or an error is thrown.
556
546
  */
557
547
  const reconcileBlock = async function* (blockWithEventData, blockCallback) {
558
548
  const latestBlock = getLatestUnfinalizedBlock();
@@ -566,148 +556,122 @@ export const createRealtimeSync = (args) => {
566
556
  blockCallback?.(false);
567
557
  return;
568
558
  }
569
- try {
570
- // Quickly check for a reorg by comparing block numbers. If the block
571
- // number has not increased, a reorg must have occurred.
572
- if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {
573
- const reorgEvent = await reconcileReorg(block);
574
- blockCallback?.(false);
575
- yield reorgEvent;
576
- return;
577
- }
578
- // Blocks are missing. They should be fetched and enqueued.
579
- if (hexToNumber(latestBlock.number) + 1 < hexToNumber(block.number)) {
580
- // Retrieve missing blocks, but only fetch a certain amount.
581
- const missingBlockRange = range(hexToNumber(latestBlock.number) + 1, Math.min(hexToNumber(block.number), hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS));
582
- const pendingBlocks = await Promise.all(missingBlockRange.map((blockNumber) => _eth_getBlockByNumber(args.rpc, { blockNumber }).then((block) => fetchBlockEventData(block))));
583
- args.common.logger.info({
584
- service: "realtime",
585
- msg: `Fetched ${missingBlockRange.length} missing '${args.chain.name}' blocks [${hexToNumber(latestBlock.number) + 1}, ${Math.min(hexToNumber(block.number), hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS)}]`,
586
- });
587
- for (const pendingBlock of pendingBlocks) {
588
- yield* reconcileBlock(pendingBlock);
589
- }
590
- yield* reconcileBlock(blockWithEventData, blockCallback);
591
- return;
559
+ // Quickly check for a reorg by comparing block numbers. If the block
560
+ // number has not increased, a reorg must have occurred.
561
+ if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {
562
+ const reorgEvent = await reconcileReorg(block);
563
+ blockCallback?.(false);
564
+ yield reorgEvent;
565
+ return;
566
+ }
567
+ // Blocks are missing. They should be fetched and enqueued.
568
+ if (hexToNumber(latestBlock.number) + 1 < hexToNumber(block.number)) {
569
+ // Retrieve missing blocks, but only fetch a certain amount.
570
+ const missingBlockRange = range(hexToNumber(latestBlock.number) + 1, Math.min(hexToNumber(block.number), hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS));
571
+ const pendingBlocks = await Promise.all(missingBlockRange.map((blockNumber) => _eth_getBlockByNumber(args.rpc, { blockNumber }).then((block) => fetchBlockEventData(block))));
572
+ args.common.logger.info({
573
+ service: "realtime",
574
+ msg: `Fetched ${missingBlockRange.length} missing '${args.chain.name}' blocks [${hexToNumber(latestBlock.number) + 1}, ${Math.min(hexToNumber(block.number), hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS)}]`,
575
+ });
576
+ for (const pendingBlock of pendingBlocks) {
577
+ yield* reconcileBlock(pendingBlock);
592
578
  }
593
- // Check if a reorg occurred by validating the chain of block hashes.
594
- if (block.parentHash !== latestBlock.hash) {
595
- const reorgEvent = await reconcileReorg(block);
579
+ if (hexToNumber(block.number) - hexToNumber(latestBlock.number) >
580
+ MAX_QUEUED_BLOCKS) {
596
581
  blockCallback?.(false);
597
- yield reorgEvent;
598
- return;
599
- }
600
- // New block is exactly one block ahead of the local chain.
601
- // Attempt to ingest it.
602
- const blockWithFilteredEventData = filterBlockEventData(blockWithEventData);
603
- if (blockWithFilteredEventData.logs.length > 0 ||
604
- blockWithFilteredEventData.traces.length > 0 ||
605
- blockWithFilteredEventData.transactions.length > 0) {
606
- const _text = [];
607
- if (blockWithFilteredEventData.logs.length === 1) {
608
- _text.push("1 log");
609
- }
610
- else if (blockWithFilteredEventData.logs.length > 1) {
611
- _text.push(`${blockWithFilteredEventData.logs.length} logs`);
612
- }
613
- if (blockWithFilteredEventData.traces.length === 1) {
614
- _text.push("1 trace");
615
- }
616
- else if (blockWithFilteredEventData.traces.length > 1) {
617
- _text.push(`${blockWithFilteredEventData.traces.length} traces`);
618
- }
619
- if (blockWithFilteredEventData.transactions.length === 1) {
620
- _text.push("1 transaction");
621
- }
622
- else if (blockWithFilteredEventData.transactions.length > 1) {
623
- _text.push(`${blockWithFilteredEventData.transactions.length} transactions`);
624
- }
625
- const text = _text.filter((t) => t !== undefined).join(" and ");
626
- args.common.logger.info({
627
- service: "realtime",
628
- msg: `Synced ${text} from '${args.chain.name}' block ${hexToNumber(block.number)}`,
629
- });
630
582
  }
631
583
  else {
632
- args.common.logger.info({
633
- service: "realtime",
634
- msg: `Synced block ${hexToNumber(block.number)} from '${args.chain.name}' `,
635
- });
636
- }
637
- unfinalizedBlocks.push({
638
- hash: block.hash,
639
- parentHash: block.parentHash,
640
- number: block.number,
641
- timestamp: block.timestamp,
642
- });
643
- // Make sure `transactions` can be garbage collected
644
- blockWithEventData.block.transactions =
645
- blockWithFilteredEventData.block.transactions;
646
- yield {
647
- type: "block",
648
- hasMatchedFilter: blockWithFilteredEventData.matchedFilters.size > 0,
649
- block: blockWithFilteredEventData.block,
650
- logs: blockWithFilteredEventData.logs,
651
- transactions: blockWithFilteredEventData.transactions,
652
- transactionReceipts: blockWithFilteredEventData.transactionReceipts,
653
- traces: blockWithFilteredEventData.traces,
654
- childAddresses: blockWithFilteredEventData.childAddresses,
655
- blockCallback,
656
- };
657
- // Determine if a new range has become finalized by evaluating if the
658
- // latest block number is 2 * finalityBlockCount >= finalized block number.
659
- // Essentially, there is a range the width of finalityBlockCount that is entirely
660
- // finalized.
661
- const blockMovesFinality = hexToNumber(block.number) >=
662
- hexToNumber(finalizedBlock.number) + 2 * args.chain.finalityBlockCount;
663
- if (blockMovesFinality) {
664
- const pendingFinalizedBlock = unfinalizedBlocks.find((lb) => hexToNumber(lb.number) ===
665
- hexToNumber(block.number) - args.chain.finalityBlockCount);
666
- args.common.logger.debug({
667
- service: "realtime",
668
- msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${args.chain.name}' blocks [${hexToNumber(finalizedBlock.number) + 1}, ${hexToNumber(pendingFinalizedBlock.number)}]`,
669
- });
670
- const finalizedBlocks = unfinalizedBlocks.filter((lb) => hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number));
671
- unfinalizedBlocks = unfinalizedBlocks.filter((lb) => hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number));
672
- for (const block of finalizedBlocks) {
673
- childAddressesPerBlock.delete(hexToNumber(block.number));
674
- }
675
- finalizedBlock = pendingFinalizedBlock;
676
- yield {
677
- type: "finalize",
678
- block: pendingFinalizedBlock,
679
- };
584
+ yield* reconcileBlock(blockWithEventData, blockCallback);
680
585
  }
681
- // Reset the error state after successfully completing the happy path.
682
- reconcileBlockErrorCount = 0;
586
+ return;
683
587
  }
684
- catch (_error) {
685
- const error = _error;
686
- if (args.common.shutdown.isKilled) {
687
- throw new ShutdownError();
588
+ // Check if a reorg occurred by validating the chain of block hashes.
589
+ if (block.parentHash !== latestBlock.hash) {
590
+ const reorgEvent = await reconcileReorg(block);
591
+ blockCallback?.(false);
592
+ yield reorgEvent;
593
+ return;
594
+ }
595
+ // New block is exactly one block ahead of the local chain.
596
+ // Attempt to ingest it.
597
+ const blockWithFilteredEventData = filterBlockEventData(blockWithEventData);
598
+ if (blockWithFilteredEventData.logs.length > 0 ||
599
+ blockWithFilteredEventData.traces.length > 0 ||
600
+ blockWithFilteredEventData.transactions.length > 0) {
601
+ const _text = [];
602
+ if (blockWithFilteredEventData.logs.length === 1) {
603
+ _text.push("1 log");
688
604
  }
689
- args.common.logger.warn({
605
+ else if (blockWithFilteredEventData.logs.length > 1) {
606
+ _text.push(`${blockWithFilteredEventData.logs.length} logs`);
607
+ }
608
+ if (blockWithFilteredEventData.traces.length === 1) {
609
+ _text.push("1 trace");
610
+ }
611
+ else if (blockWithFilteredEventData.traces.length > 1) {
612
+ _text.push(`${blockWithFilteredEventData.traces.length} traces`);
613
+ }
614
+ if (blockWithFilteredEventData.transactions.length === 1) {
615
+ _text.push("1 transaction");
616
+ }
617
+ else if (blockWithFilteredEventData.transactions.length > 1) {
618
+ _text.push(`${blockWithFilteredEventData.transactions.length} transactions`);
619
+ }
620
+ const text = _text.filter((t) => t !== undefined).join(" and ");
621
+ args.common.logger.info({
690
622
  service: "realtime",
691
- msg: `Failed to process '${args.chain.name}' block ${hexToNumber(block.number)}`,
692
- error,
623
+ msg: `Synced ${text} from '${args.chain.name}' block ${hexToNumber(block.number)}`,
693
624
  });
694
- const duration = ERROR_TIMEOUT[reconcileBlockErrorCount];
695
- args.common.logger.warn({
625
+ }
626
+ else {
627
+ args.common.logger.info({
696
628
  service: "realtime",
697
- msg: `Retrying '${args.chain.name}' sync after ${duration} ${duration === 1 ? "second" : "seconds"}.`,
629
+ msg: `Synced block ${hexToNumber(block.number)} from '${args.chain.name}' `,
698
630
  });
699
- await wait(duration * 1000);
700
- blockCallback?.(false);
701
- reconcileBlockErrorCount += 1;
702
- // After a certain number of attempts, emit a fatal error.
703
- if (reconcileBlockErrorCount === ERROR_TIMEOUT.length) {
704
- args.common.logger.error({
705
- service: "realtime",
706
- msg: `Fatal error: Unable to process '${args.chain.name}' block ${hexToNumber(block.number)} after ${ERROR_TIMEOUT.length} attempts.`,
707
- error,
708
- });
709
- throw error;
631
+ }
632
+ unfinalizedBlocks.push({
633
+ hash: block.hash,
634
+ parentHash: block.parentHash,
635
+ number: block.number,
636
+ timestamp: block.timestamp,
637
+ });
638
+ // Make sure `transactions` can be garbage collected
639
+ blockWithEventData.block.transactions =
640
+ blockWithFilteredEventData.block.transactions;
641
+ yield {
642
+ type: "block",
643
+ hasMatchedFilter: blockWithFilteredEventData.matchedFilters.size > 0,
644
+ block: blockWithFilteredEventData.block,
645
+ logs: blockWithFilteredEventData.logs,
646
+ transactions: blockWithFilteredEventData.transactions,
647
+ transactionReceipts: blockWithFilteredEventData.transactionReceipts,
648
+ traces: blockWithFilteredEventData.traces,
649
+ childAddresses: blockWithFilteredEventData.childAddresses,
650
+ blockCallback,
651
+ };
652
+ // Determine if a new range has become finalized by evaluating if the
653
+ // latest block number is 2 * finalityBlockCount >= finalized block number.
654
+ // Essentially, there is a range the width of finalityBlockCount that is entirely
655
+ // finalized.
656
+ const blockMovesFinality = hexToNumber(block.number) >=
657
+ hexToNumber(finalizedBlock.number) + 2 * args.chain.finalityBlockCount;
658
+ if (blockMovesFinality) {
659
+ const pendingFinalizedBlock = unfinalizedBlocks.find((lb) => hexToNumber(lb.number) ===
660
+ hexToNumber(block.number) - args.chain.finalityBlockCount);
661
+ args.common.logger.debug({
662
+ service: "realtime",
663
+ msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${args.chain.name}' blocks [${hexToNumber(finalizedBlock.number) + 1}, ${hexToNumber(pendingFinalizedBlock.number)}]`,
664
+ });
665
+ const finalizedBlocks = unfinalizedBlocks.filter((lb) => hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number));
666
+ unfinalizedBlocks = unfinalizedBlocks.filter((lb) => hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number));
667
+ for (const block of finalizedBlocks) {
668
+ childAddressesPerBlock.delete(hexToNumber(block.number));
710
669
  }
670
+ finalizedBlock = pendingFinalizedBlock;
671
+ yield {
672
+ type: "finalize",
673
+ block: pendingFinalizedBlock,
674
+ };
711
675
  }
712
676
  };
713
677
  const onError = (error) => {
@@ -716,13 +680,14 @@ export const createRealtimeSync = (args) => {
716
680
  }
717
681
  args.common.logger.warn({
718
682
  service: "realtime",
719
- msg: `Failed to fetch latest '${args.chain.name}' block`,
683
+ msg: `Failed to fetch and reconcile '${args.chain.name}' block`,
720
684
  error,
721
685
  });
722
686
  fetchAndReconcileLatestBlockErrorCount += 1;
723
- // After a certain number of attempts, emit a fatal error.
724
- if (fetchAndReconcileLatestBlockErrorCount * args.chain.pollingInterval >
725
- MAX_LATEST_BLOCK_ATTEMPT_MS) {
687
+ // Number of retries is max(10, `MAX_LATEST_BLOCK_ATTEMPT_MS` / `args.chain.pollingInterval`)
688
+ if (fetchAndReconcileLatestBlockErrorCount >= 10 &&
689
+ fetchAndReconcileLatestBlockErrorCount * args.chain.pollingInterval >
690
+ MAX_LATEST_BLOCK_ATTEMPT_MS) {
726
691
  args.common.logger.error({
727
692
  service: "realtime",
728
693
  msg: `Fatal error: Unable to fetch latest '${args.chain.name}' block after ${ERROR_TIMEOUT.length} attempts.`,
@@ -750,11 +715,15 @@ export const createRealtimeSync = (args) => {
750
715
  return;
751
716
  }
752
717
  const blockWithEventData = await fetchBlockEventData(block);
753
- fetchAndReconcileLatestBlockErrorCount = 0;
754
718
  // Note: `reconcileBlock` must be called serially.
755
719
  await realtimeSyncLock.lock();
756
- yield* reconcileBlock(blockWithEventData, blockCallback);
757
- realtimeSyncLock.unlock();
720
+ try {
721
+ yield* reconcileBlock(blockWithEventData, blockCallback);
722
+ }
723
+ finally {
724
+ realtimeSyncLock.unlock();
725
+ }
726
+ fetchAndReconcileLatestBlockErrorCount = 0;
758
727
  }
759
728
  catch (_error) {
760
729
  blockCallback?.(false);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync-realtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync-realtime/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sync-realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAEV,KAAK,EACL,OAAO,EACP,SAAS,EAET,UAAU,EAEV,MAAM,EACN,SAAS,EACT,eAAe,EACf,OAAO,EACP,SAAS,EACT,eAAe,EACf,sBAAsB,EAIvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAY1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgBvD,OAAO,EAAE,KAAK,OAAO,EAAoC,MAAM,MAAM,CAAC;AAGtE,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,IAAI,CACF,KAAK,EAAE,SAAS,GAAG,eAAe,EAClC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAC5C,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,iBAAiB,EAAE,UAAU,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,SAAS,GAAG,eAAe,CAAC;IACnC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,CAAC;IACC,IAAI,EAAE,OAAO,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,GAAG,kBAAkB,CAAC,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEtE,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC9C,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,CAAC;AASF,eAAO,MAAM,kBAAkB,SACvB,4BAA4B,KACjC,YA49BF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sync-realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAEV,KAAK,EACL,OAAO,EACP,SAAS,EAET,UAAU,EAEV,MAAM,EACN,SAAS,EACT,eAAe,EACf,OAAO,EACP,SAAS,EACT,eAAe,EACf,sBAAsB,EAIvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAY1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAevD,OAAO,EAAE,KAAK,OAAO,EAAoC,MAAM,MAAM,CAAC;AAGtE,MAAM,MAAM,YAAY,GAAG;IACzB;;;;OAIG;IACH,IAAI,CACF,KAAK,EAAE,SAAS,GAAG,eAAe,EAClC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,GAC5C,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,iBAAiB,EAAE,UAAU,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,SAAS,GAAG,eAAe,CAAC;IACnC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB,CAAC;IACC,IAAI,EAAE,OAAO,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C,GAAG,kBAAkB,CAAC,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,aAAa,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEtE,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC9C,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,CAAC;AASF,eAAO,MAAM,kBAAkB,SACvB,4BAA4B,KACjC,YAk7BF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ponder",
3
- "version": "0.13.4",
3
+ "version": "0.13.5",
4
4
  "description": "An open-source framework for crypto application backends",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -99,7 +99,7 @@
99
99
  "rimraf": "^5.0.5",
100
100
  "tsx": "^4.19.2",
101
101
  "vitest": "^1.0.2",
102
- "@ponder/client": "0.13.4"
102
+ "@ponder/client": "0.13.5"
103
103
  },
104
104
  "engines": {
105
105
  "node": ">=18.14"
@@ -46,7 +46,6 @@ import {
46
46
  validateTracesAndBlock,
47
47
  validateTransactionsAndBlock,
48
48
  } from "@/utils/rpc.js";
49
- import { wait } from "@/utils/wait.js";
50
49
  import { type Address, type Hash, hexToNumber, zeroHash } from "viem";
51
50
  import { isFilterInBloom, isInBloom, zeroLogsBloom } from "./bloom.js";
52
51
 
@@ -92,7 +91,7 @@ type CreateRealtimeSyncParameters = {
92
91
  childAddresses: Map<FactoryId, Map<Address, number>>;
93
92
  };
94
93
 
95
- const MAX_LATEST_BLOCK_ATTEMPT_MS = 3 * 60 * 1000; // 3 minutes
94
+ const MAX_LATEST_BLOCK_ATTEMPT_MS = 10 * 60 * 1000; // 10 minutes
96
95
 
97
96
  const ERROR_TIMEOUT = [
98
97
  1, 2, 5, 10, 30, 60, 60, 60, 60, 60, 60, 60, 60, 60,
@@ -118,7 +117,6 @@ export const createRealtimeSync = (
118
117
  */
119
118
  let unfinalizedBlocks: LightBlock[] = [];
120
119
  let fetchAndReconcileLatestBlockErrorCount = 0;
121
- let reconcileBlockErrorCount = 0;
122
120
 
123
121
  const factories: Factory[] = [];
124
122
  const logFilters: LogFilter[] = [];
@@ -777,16 +775,8 @@ export const createRealtimeSync = (
777
775
  * 4) Block is exactly one block ahead of the last processed,
778
776
  * handle this new block (happy path).
779
777
  *
780
- * @dev This mutex only runs one at a time, every block is
781
- * processed serially.
782
- *
783
- * @returns
784
- * - `rejected` for case 1 and 2.
785
- * - `reorg` for case 2 with a promise that resolves once the reorg is applied.
786
- * - `pending` for case 3 with a promise that resolves once the block is
787
- * settled as `rejected`, `accepted`, or `reorg`.
788
- * - `accepted` for case 4 with promises for the "block" and "finalize" events
789
- * that resolve when each event is applied.
778
+ * @dev `blockCallback` is guaranteed to be called exactly once or an error is thrown.
779
+ * @dev It is an invariant that the correct events are generated or an error is thrown.
790
780
  */
791
781
  const reconcileBlock = async function* (
792
782
  blockWithEventData: BlockWithEventData,
@@ -806,214 +796,178 @@ export const createRealtimeSync = (
806
796
  return;
807
797
  }
808
798
 
809
- try {
810
- // Quickly check for a reorg by comparing block numbers. If the block
811
- // number has not increased, a reorg must have occurred.
812
- if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {
813
- const reorgEvent = await reconcileReorg(block);
799
+ // Quickly check for a reorg by comparing block numbers. If the block
800
+ // number has not increased, a reorg must have occurred.
801
+ if (hexToNumber(latestBlock.number) >= hexToNumber(block.number)) {
802
+ const reorgEvent = await reconcileReorg(block);
814
803
 
815
- blockCallback?.(false);
816
- yield reorgEvent;
817
- return;
818
- }
804
+ blockCallback?.(false);
805
+ yield reorgEvent;
806
+ return;
807
+ }
819
808
 
820
- // Blocks are missing. They should be fetched and enqueued.
821
- if (hexToNumber(latestBlock.number) + 1 < hexToNumber(block.number)) {
822
- // Retrieve missing blocks, but only fetch a certain amount.
823
- const missingBlockRange = range(
824
- hexToNumber(latestBlock.number) + 1,
825
- Math.min(
826
- hexToNumber(block.number),
827
- hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,
828
- ),
829
- );
809
+ // Blocks are missing. They should be fetched and enqueued.
810
+ if (hexToNumber(latestBlock.number) + 1 < hexToNumber(block.number)) {
811
+ // Retrieve missing blocks, but only fetch a certain amount.
812
+ const missingBlockRange = range(
813
+ hexToNumber(latestBlock.number) + 1,
814
+ Math.min(
815
+ hexToNumber(block.number),
816
+ hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,
817
+ ),
818
+ );
830
819
 
831
- const pendingBlocks = await Promise.all(
832
- missingBlockRange.map((blockNumber) =>
833
- _eth_getBlockByNumber(args.rpc, { blockNumber }).then((block) =>
834
- fetchBlockEventData(block),
835
- ),
820
+ const pendingBlocks = await Promise.all(
821
+ missingBlockRange.map((blockNumber) =>
822
+ _eth_getBlockByNumber(args.rpc, { blockNumber }).then((block) =>
823
+ fetchBlockEventData(block),
836
824
  ),
837
- );
838
-
839
- args.common.logger.info({
840
- service: "realtime",
841
- msg: `Fetched ${missingBlockRange.length} missing '${
842
- args.chain.name
843
- }' blocks [${hexToNumber(latestBlock.number) + 1}, ${Math.min(
844
- hexToNumber(block.number),
845
- hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,
846
- )}]`,
847
- });
848
-
849
- for (const pendingBlock of pendingBlocks) {
850
- yield* reconcileBlock(pendingBlock);
851
- }
852
- yield* reconcileBlock(blockWithEventData, blockCallback);
853
- return;
854
- }
825
+ ),
826
+ );
855
827
 
856
- // Check if a reorg occurred by validating the chain of block hashes.
857
- if (block.parentHash !== latestBlock.hash) {
858
- const reorgEvent = await reconcileReorg(block);
828
+ args.common.logger.info({
829
+ service: "realtime",
830
+ msg: `Fetched ${missingBlockRange.length} missing '${
831
+ args.chain.name
832
+ }' blocks [${hexToNumber(latestBlock.number) + 1}, ${Math.min(
833
+ hexToNumber(block.number),
834
+ hexToNumber(latestBlock.number) + MAX_QUEUED_BLOCKS,
835
+ )}]`,
836
+ });
859
837
 
860
- blockCallback?.(false);
861
- yield reorgEvent;
862
- return;
838
+ for (const pendingBlock of pendingBlocks) {
839
+ yield* reconcileBlock(pendingBlock);
863
840
  }
864
841
 
865
- // New block is exactly one block ahead of the local chain.
866
- // Attempt to ingest it.
867
-
868
- const blockWithFilteredEventData =
869
- filterBlockEventData(blockWithEventData);
870
-
871
842
  if (
872
- blockWithFilteredEventData.logs.length > 0 ||
873
- blockWithFilteredEventData.traces.length > 0 ||
874
- blockWithFilteredEventData.transactions.length > 0
843
+ hexToNumber(block.number) - hexToNumber(latestBlock.number) >
844
+ MAX_QUEUED_BLOCKS
875
845
  ) {
876
- const _text: string[] = [];
877
-
878
- if (blockWithFilteredEventData.logs.length === 1) {
879
- _text.push("1 log");
880
- } else if (blockWithFilteredEventData.logs.length > 1) {
881
- _text.push(`${blockWithFilteredEventData.logs.length} logs`);
882
- }
883
-
884
- if (blockWithFilteredEventData.traces.length === 1) {
885
- _text.push("1 trace");
886
- } else if (blockWithFilteredEventData.traces.length > 1) {
887
- _text.push(`${blockWithFilteredEventData.traces.length} traces`);
888
- }
889
-
890
- if (blockWithFilteredEventData.transactions.length === 1) {
891
- _text.push("1 transaction");
892
- } else if (blockWithFilteredEventData.transactions.length > 1) {
893
- _text.push(
894
- `${blockWithFilteredEventData.transactions.length} transactions`,
895
- );
896
- }
897
-
898
- const text = _text.filter((t) => t !== undefined).join(" and ");
899
- args.common.logger.info({
900
- service: "realtime",
901
- msg: `Synced ${text} from '${args.chain.name}' block ${hexToNumber(block.number)}`,
902
- });
846
+ blockCallback?.(false);
903
847
  } else {
904
- args.common.logger.info({
905
- service: "realtime",
906
- msg: `Synced block ${hexToNumber(block.number)} from '${args.chain.name}' `,
907
- });
848
+ yield* reconcileBlock(blockWithEventData, blockCallback);
908
849
  }
850
+ return;
851
+ }
909
852
 
910
- unfinalizedBlocks.push({
911
- hash: block.hash,
912
- parentHash: block.parentHash,
913
- number: block.number,
914
- timestamp: block.timestamp,
915
- });
916
-
917
- // Make sure `transactions` can be garbage collected
918
- blockWithEventData.block.transactions =
919
- blockWithFilteredEventData.block.transactions;
920
-
921
- yield {
922
- type: "block",
923
- hasMatchedFilter: blockWithFilteredEventData.matchedFilters.size > 0,
924
- block: blockWithFilteredEventData.block,
925
- logs: blockWithFilteredEventData.logs,
926
- transactions: blockWithFilteredEventData.transactions,
927
- transactionReceipts: blockWithFilteredEventData.transactionReceipts,
928
- traces: blockWithFilteredEventData.traces,
929
- childAddresses: blockWithFilteredEventData.childAddresses,
930
- blockCallback,
931
- };
932
-
933
- // Determine if a new range has become finalized by evaluating if the
934
- // latest block number is 2 * finalityBlockCount >= finalized block number.
935
- // Essentially, there is a range the width of finalityBlockCount that is entirely
936
- // finalized.
937
-
938
- const blockMovesFinality =
939
- hexToNumber(block.number) >=
940
- hexToNumber(finalizedBlock.number) + 2 * args.chain.finalityBlockCount;
941
- if (blockMovesFinality) {
942
- const pendingFinalizedBlock = unfinalizedBlocks.find(
943
- (lb) =>
944
- hexToNumber(lb.number) ===
945
- hexToNumber(block.number) - args.chain.finalityBlockCount,
946
- )!;
853
+ // Check if a reorg occurred by validating the chain of block hashes.
854
+ if (block.parentHash !== latestBlock.hash) {
855
+ const reorgEvent = await reconcileReorg(block);
947
856
 
948
- args.common.logger.debug({
949
- service: "realtime",
950
- msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${
951
- args.chain.name
952
- }' blocks [${hexToNumber(finalizedBlock.number) + 1}, ${hexToNumber(pendingFinalizedBlock.number)}]`,
953
- });
857
+ blockCallback?.(false);
858
+ yield reorgEvent;
859
+ return;
860
+ }
954
861
 
955
- const finalizedBlocks = unfinalizedBlocks.filter(
956
- (lb) =>
957
- hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number),
958
- );
862
+ // New block is exactly one block ahead of the local chain.
863
+ // Attempt to ingest it.
959
864
 
960
- unfinalizedBlocks = unfinalizedBlocks.filter(
961
- (lb) =>
962
- hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number),
963
- );
865
+ const blockWithFilteredEventData = filterBlockEventData(blockWithEventData);
964
866
 
965
- for (const block of finalizedBlocks) {
966
- childAddressesPerBlock.delete(hexToNumber(block.number));
967
- }
968
-
969
- finalizedBlock = pendingFinalizedBlock;
867
+ if (
868
+ blockWithFilteredEventData.logs.length > 0 ||
869
+ blockWithFilteredEventData.traces.length > 0 ||
870
+ blockWithFilteredEventData.transactions.length > 0
871
+ ) {
872
+ const _text: string[] = [];
970
873
 
971
- yield {
972
- type: "finalize",
973
- block: pendingFinalizedBlock,
974
- };
874
+ if (blockWithFilteredEventData.logs.length === 1) {
875
+ _text.push("1 log");
876
+ } else if (blockWithFilteredEventData.logs.length > 1) {
877
+ _text.push(`${blockWithFilteredEventData.logs.length} logs`);
975
878
  }
976
879
 
977
- // Reset the error state after successfully completing the happy path.
978
- reconcileBlockErrorCount = 0;
979
- } catch (_error) {
980
- const error = _error as Error;
880
+ if (blockWithFilteredEventData.traces.length === 1) {
881
+ _text.push("1 trace");
882
+ } else if (blockWithFilteredEventData.traces.length > 1) {
883
+ _text.push(`${blockWithFilteredEventData.traces.length} traces`);
884
+ }
981
885
 
982
- if (args.common.shutdown.isKilled) {
983
- throw new ShutdownError();
886
+ if (blockWithFilteredEventData.transactions.length === 1) {
887
+ _text.push("1 transaction");
888
+ } else if (blockWithFilteredEventData.transactions.length > 1) {
889
+ _text.push(
890
+ `${blockWithFilteredEventData.transactions.length} transactions`,
891
+ );
984
892
  }
985
893
 
986
- args.common.logger.warn({
894
+ const text = _text.filter((t) => t !== undefined).join(" and ");
895
+ args.common.logger.info({
987
896
  service: "realtime",
988
- msg: `Failed to process '${args.chain.name}' block ${hexToNumber(block.number)}`,
989
- error,
897
+ msg: `Synced ${text} from '${args.chain.name}' block ${hexToNumber(block.number)}`,
898
+ });
899
+ } else {
900
+ args.common.logger.info({
901
+ service: "realtime",
902
+ msg: `Synced block ${hexToNumber(block.number)} from '${args.chain.name}' `,
990
903
  });
904
+ }
991
905
 
992
- const duration = ERROR_TIMEOUT[reconcileBlockErrorCount]!;
906
+ unfinalizedBlocks.push({
907
+ hash: block.hash,
908
+ parentHash: block.parentHash,
909
+ number: block.number,
910
+ timestamp: block.timestamp,
911
+ });
993
912
 
994
- args.common.logger.warn({
913
+ // Make sure `transactions` can be garbage collected
914
+ blockWithEventData.block.transactions =
915
+ blockWithFilteredEventData.block.transactions;
916
+
917
+ yield {
918
+ type: "block",
919
+ hasMatchedFilter: blockWithFilteredEventData.matchedFilters.size > 0,
920
+ block: blockWithFilteredEventData.block,
921
+ logs: blockWithFilteredEventData.logs,
922
+ transactions: blockWithFilteredEventData.transactions,
923
+ transactionReceipts: blockWithFilteredEventData.transactionReceipts,
924
+ traces: blockWithFilteredEventData.traces,
925
+ childAddresses: blockWithFilteredEventData.childAddresses,
926
+ blockCallback,
927
+ };
928
+
929
+ // Determine if a new range has become finalized by evaluating if the
930
+ // latest block number is 2 * finalityBlockCount >= finalized block number.
931
+ // Essentially, there is a range the width of finalityBlockCount that is entirely
932
+ // finalized.
933
+
934
+ const blockMovesFinality =
935
+ hexToNumber(block.number) >=
936
+ hexToNumber(finalizedBlock.number) + 2 * args.chain.finalityBlockCount;
937
+ if (blockMovesFinality) {
938
+ const pendingFinalizedBlock = unfinalizedBlocks.find(
939
+ (lb) =>
940
+ hexToNumber(lb.number) ===
941
+ hexToNumber(block.number) - args.chain.finalityBlockCount,
942
+ )!;
943
+
944
+ args.common.logger.debug({
995
945
  service: "realtime",
996
- msg: `Retrying '${args.chain.name}' sync after ${duration} ${
997
- duration === 1 ? "second" : "seconds"
998
- }.`,
946
+ msg: `Finalized ${hexToNumber(pendingFinalizedBlock.number) - hexToNumber(finalizedBlock.number) + 1} '${
947
+ args.chain.name
948
+ }' blocks [${hexToNumber(finalizedBlock.number) + 1}, ${hexToNumber(pendingFinalizedBlock.number)}]`,
999
949
  });
1000
950
 
1001
- await wait(duration * 1_000);
951
+ const finalizedBlocks = unfinalizedBlocks.filter(
952
+ (lb) =>
953
+ hexToNumber(lb.number) <= hexToNumber(pendingFinalizedBlock.number),
954
+ );
1002
955
 
1003
- blockCallback?.(false);
956
+ unfinalizedBlocks = unfinalizedBlocks.filter(
957
+ (lb) =>
958
+ hexToNumber(lb.number) > hexToNumber(pendingFinalizedBlock.number),
959
+ );
1004
960
 
1005
- reconcileBlockErrorCount += 1;
961
+ for (const block of finalizedBlocks) {
962
+ childAddressesPerBlock.delete(hexToNumber(block.number));
963
+ }
1006
964
 
1007
- // After a certain number of attempts, emit a fatal error.
1008
- if (reconcileBlockErrorCount === ERROR_TIMEOUT.length) {
1009
- args.common.logger.error({
1010
- service: "realtime",
1011
- msg: `Fatal error: Unable to process '${args.chain.name}' block ${hexToNumber(block.number)} after ${ERROR_TIMEOUT.length} attempts.`,
1012
- error,
1013
- });
965
+ finalizedBlock = pendingFinalizedBlock;
1014
966
 
1015
- throw error;
1016
- }
967
+ yield {
968
+ type: "finalize",
969
+ block: pendingFinalizedBlock,
970
+ };
1017
971
  }
1018
972
  };
1019
973
 
@@ -1024,16 +978,17 @@ export const createRealtimeSync = (
1024
978
 
1025
979
  args.common.logger.warn({
1026
980
  service: "realtime",
1027
- msg: `Failed to fetch latest '${args.chain.name}' block`,
981
+ msg: `Failed to fetch and reconcile '${args.chain.name}' block`,
1028
982
  error,
1029
983
  });
1030
984
 
1031
985
  fetchAndReconcileLatestBlockErrorCount += 1;
1032
986
 
1033
- // After a certain number of attempts, emit a fatal error.
987
+ // Number of retries is max(10, `MAX_LATEST_BLOCK_ATTEMPT_MS` / `args.chain.pollingInterval`)
1034
988
  if (
989
+ fetchAndReconcileLatestBlockErrorCount >= 10 &&
1035
990
  fetchAndReconcileLatestBlockErrorCount * args.chain.pollingInterval >
1036
- MAX_LATEST_BLOCK_ATTEMPT_MS
991
+ MAX_LATEST_BLOCK_ATTEMPT_MS
1037
992
  ) {
1038
993
  args.common.logger.error({
1039
994
  service: "realtime",
@@ -1070,15 +1025,17 @@ export const createRealtimeSync = (
1070
1025
 
1071
1026
  const blockWithEventData = await fetchBlockEventData(block);
1072
1027
 
1073
- fetchAndReconcileLatestBlockErrorCount = 0;
1074
-
1075
1028
  // Note: `reconcileBlock` must be called serially.
1076
1029
 
1077
1030
  await realtimeSyncLock.lock();
1078
1031
 
1079
- yield* reconcileBlock(blockWithEventData, blockCallback);
1032
+ try {
1033
+ yield* reconcileBlock(blockWithEventData, blockCallback);
1034
+ } finally {
1035
+ realtimeSyncLock.unlock();
1036
+ }
1080
1037
 
1081
- realtimeSyncLock.unlock();
1038
+ fetchAndReconcileLatestBlockErrorCount = 0;
1082
1039
  } catch (_error) {
1083
1040
  blockCallback?.(false);
1084
1041
  onError(_error as Error);