ponder 0.8.23 → 0.8.25

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.
@@ -6102,6 +6102,8 @@ var processSetupEvents = async (indexingService, {
6102
6102
  const source = sources.find(
6103
6103
  (s) => s.type === "contract" && s.name === contractName && s.filter.chainId === network.chainId
6104
6104
  );
6105
+ if (source === void 0)
6106
+ continue;
6105
6107
  if (indexingService.isKilled)
6106
6108
  return { status: "killed" };
6107
6109
  indexingService.eventCount[eventName]++;
@@ -6376,74 +6378,93 @@ var methods = {
6376
6378
  var createIndexingService = extend(create, methods);
6377
6379
 
6378
6380
  // src/sync/fragments.ts
6379
- var getFragmentIds = (filter) => {
6381
+ var getFragments = (filter) => {
6380
6382
  switch (filter.type) {
6381
6383
  case "block":
6382
- return getBlockFilterFragmentId(filter);
6384
+ return getBlockFilterFragment(filter);
6383
6385
  case "transaction":
6384
- return getTransactionFilterFragmentIds(filter);
6386
+ return getTransactionFilterFragments(filter);
6385
6387
  case "trace":
6386
- return getTraceFilterFragmentIds(filter);
6388
+ return getTraceFilterFragments(filter);
6387
6389
  case "log":
6388
- return getLogFilterFragmentIds(filter);
6390
+ return getLogFilterFragments(filter);
6389
6391
  case "transfer":
6390
- return getTransferFilterFragmentIds(filter);
6392
+ return getTransferFilterFragments(filter);
6391
6393
  }
6392
6394
  };
6393
- var getAddressFragmentIds = (address) => {
6395
+ var getAddressFragments = (address) => {
6394
6396
  const fragments = [];
6395
6397
  if (isAddressFactory(address)) {
6396
6398
  for (const fragmentAddress of Array.isArray(address.address) ? address.address : [address.address]) {
6397
- const id = `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}`;
6398
- fragments.push({ id, adjacent: [id] });
6399
+ const fragment = {
6400
+ address: fragmentAddress,
6401
+ eventSelector: address.eventSelector,
6402
+ childAddressLocation: address.childAddressLocation
6403
+ };
6404
+ fragments.push({
6405
+ fragment,
6406
+ adjacentIds: [
6407
+ `${fragmentAddress}_${address.eventSelector}_${address.childAddressLocation}`
6408
+ ]
6409
+ });
6399
6410
  }
6400
6411
  } else {
6401
6412
  for (const fragmentAddress of Array.isArray(address) ? address : [address ?? null]) {
6402
6413
  fragments.push({
6403
- id: fragmentAddress,
6404
- adjacent: fragmentAddress ? [fragmentAddress, null] : [fragmentAddress]
6414
+ fragment: fragmentAddress,
6415
+ adjacentIds: fragmentAddress ? [fragmentAddress, null] : [fragmentAddress]
6405
6416
  });
6406
6417
  }
6407
6418
  }
6408
6419
  return fragments;
6409
6420
  };
6410
- var getBlockFilterFragmentId = ({
6421
+ var getBlockFilterFragment = ({
6411
6422
  chainId,
6412
6423
  interval,
6413
6424
  offset
6414
6425
  }) => {
6415
6426
  return [
6416
6427
  {
6417
- id: `block_${chainId}_${interval}_${offset}`,
6418
- adjacent: [`block_${chainId}_${interval}_${offset}`]
6428
+ fragment: {
6429
+ type: "block",
6430
+ chainId,
6431
+ interval,
6432
+ offset
6433
+ },
6434
+ adjacentIds: [`block_${chainId}_${interval}_${offset}`]
6419
6435
  }
6420
6436
  ];
6421
6437
  };
6422
- var getTransactionFilterFragmentIds = ({
6438
+ var getTransactionFilterFragments = ({
6423
6439
  chainId,
6424
6440
  fromAddress,
6425
6441
  toAddress
6426
6442
  }) => {
6427
6443
  const fragments = [];
6428
- const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);
6429
- const toAddressFragmentIds = getAddressFragmentIds(toAddress);
6430
- for (const fragmentFromAddress of fromAddressFragmentIds) {
6431
- for (const fragmentToAddress of toAddressFragmentIds) {
6432
- const id = `transaction_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}`;
6433
- const adjacent = [];
6434
- for (const adjacentFromAddress of fragmentFromAddress.adjacent) {
6435
- for (const adjacentToAddress of fragmentToAddress.adjacent) {
6436
- adjacent.push(
6437
- `transaction_${chainId}_${adjacentFromAddress}_${adjacentToAddress}`
6444
+ const fromAddressFragments = getAddressFragments(fromAddress);
6445
+ const toAddressFragments = getAddressFragments(toAddress);
6446
+ for (const fromAddressFragment of fromAddressFragments) {
6447
+ for (const toAddressFragment of toAddressFragments) {
6448
+ const fragment = {
6449
+ type: "transaction",
6450
+ chainId,
6451
+ fromAddress: fromAddressFragment.fragment,
6452
+ toAddress: toAddressFragment.fragment
6453
+ };
6454
+ const adjacentIds = [];
6455
+ for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
6456
+ for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
6457
+ adjacentIds.push(
6458
+ `transaction_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}`
6438
6459
  );
6439
6460
  }
6440
6461
  }
6441
- fragments.push({ id, adjacent });
6462
+ fragments.push({ fragment, adjacentIds });
6442
6463
  }
6443
6464
  }
6444
6465
  return fragments;
6445
6466
  };
6446
- var getTraceFilterFragmentIds = ({
6467
+ var getTraceFilterFragments = ({
6447
6468
  chainId,
6448
6469
  fromAddress,
6449
6470
  toAddress,
@@ -6452,32 +6473,39 @@ var getTraceFilterFragmentIds = ({
6452
6473
  ...filter
6453
6474
  }) => {
6454
6475
  const fragments = [];
6455
- const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);
6456
- const toAddressFragmentIds = getAddressFragmentIds(toAddress);
6476
+ const fromAddressFragments = getAddressFragments(fromAddress);
6477
+ const toAddressFragments = getAddressFragments(toAddress);
6457
6478
  const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
6458
- for (const fragmentFromAddress of fromAddressFragmentIds) {
6459
- for (const fragmentToAddress of toAddressFragmentIds) {
6479
+ for (const fromAddressFragment of fromAddressFragments) {
6480
+ for (const toAddressFragment of toAddressFragments) {
6460
6481
  for (const fragmentFunctionSelector of Array.isArray(functionSelector) ? functionSelector : [functionSelector]) {
6461
- const id = `trace_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${fragmentFunctionSelector ?? null}_${includeTransactionReceipts ? 1 : 0}`;
6462
- const adjacent = [];
6463
- for (const adjacentFromAddress of fragmentFromAddress.adjacent) {
6464
- for (const adjacentToAddress of fragmentToAddress.adjacent) {
6482
+ const fragment = {
6483
+ type: "trace",
6484
+ chainId,
6485
+ fromAddress: fromAddressFragment.fragment,
6486
+ toAddress: toAddressFragment.fragment,
6487
+ functionSelector: fragmentFunctionSelector ?? null,
6488
+ includeTransactionReceipts
6489
+ };
6490
+ const adjacentIds = [];
6491
+ for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
6492
+ for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
6465
6493
  for (const adjacentFunctionSelector of fragmentFunctionSelector ? [fragmentFunctionSelector, null] : [null]) {
6466
6494
  for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
6467
- adjacent.push(
6468
- `trace_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentFunctionSelector}_${adjacentTxr}`
6495
+ adjacentIds.push(
6496
+ `trace_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentFunctionSelector}_${adjacentTxr}`
6469
6497
  );
6470
6498
  }
6471
6499
  }
6472
6500
  }
6473
6501
  }
6474
- fragments.push({ id, adjacent });
6502
+ fragments.push({ fragment, adjacentIds });
6475
6503
  }
6476
6504
  }
6477
6505
  }
6478
6506
  return fragments;
6479
6507
  };
6480
- var getLogFilterFragmentIds = ({
6508
+ var getLogFilterFragments = ({
6481
6509
  chainId,
6482
6510
  address,
6483
6511
  topic0,
@@ -6487,23 +6515,32 @@ var getLogFilterFragmentIds = ({
6487
6515
  ...filter
6488
6516
  }) => {
6489
6517
  const fragments = [];
6490
- const addressFragmentIds = getAddressFragmentIds(address);
6518
+ const addressFragments = getAddressFragments(address);
6491
6519
  const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
6492
- for (const fragmentAddress of addressFragmentIds) {
6520
+ for (const addressFragment of addressFragments) {
6493
6521
  for (const fragmentTopic0 of Array.isArray(topic0) ? topic0 : [topic0]) {
6494
6522
  for (const fragmentTopic1 of Array.isArray(topic1) ? topic1 : [topic1]) {
6495
6523
  for (const fragmentTopic2 of Array.isArray(topic2) ? topic2 : [topic2]) {
6496
6524
  for (const fragmentTopic3 of Array.isArray(topic3) ? topic3 : [topic3]) {
6497
- const id = `log_${chainId}_${fragmentAddress.id}_${fragmentTopic0 ?? null}_${fragmentTopic1 ?? null}_${fragmentTopic2 ?? null}_${fragmentTopic3 ?? null}_${includeTransactionReceipts ? 1 : 0}`;
6498
- const adjacent = [];
6499
- for (const adjacentAddress of fragmentAddress.adjacent) {
6525
+ const fragment = {
6526
+ type: "log",
6527
+ chainId,
6528
+ address: addressFragment.fragment,
6529
+ topic0: fragmentTopic0 ?? null,
6530
+ topic1: fragmentTopic1 ?? null,
6531
+ topic2: fragmentTopic2 ?? null,
6532
+ topic3: fragmentTopic3 ?? null,
6533
+ includeTransactionReceipts
6534
+ };
6535
+ const adjacentIds = [];
6536
+ for (const addressAdjacentId of addressFragment.adjacentIds) {
6500
6537
  for (const adjacentTopic0 of fragmentTopic0 ? [fragmentTopic0, null] : [null]) {
6501
6538
  for (const adjacentTopic1 of fragmentTopic1 ? [fragmentTopic1, null] : [null]) {
6502
6539
  for (const adjacentTopic2 of fragmentTopic2 ? [fragmentTopic2, null] : [null]) {
6503
6540
  for (const adjacentTopic3 of fragmentTopic3 ? [fragmentTopic3, null] : [null]) {
6504
6541
  for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
6505
- adjacent.push(
6506
- `log_${chainId}_${adjacentAddress}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr}`
6542
+ adjacentIds.push(
6543
+ `log_${chainId}_${addressAdjacentId}_${adjacentTopic0}_${adjacentTopic1}_${adjacentTopic2}_${adjacentTopic3}_${adjacentTxr}`
6507
6544
  );
6508
6545
  }
6509
6546
  }
@@ -6511,7 +6548,7 @@ var getLogFilterFragmentIds = ({
6511
6548
  }
6512
6549
  }
6513
6550
  }
6514
- fragments.push({ id, adjacent });
6551
+ fragments.push({ fragment, adjacentIds });
6515
6552
  }
6516
6553
  }
6517
6554
  }
@@ -6519,149 +6556,197 @@ var getLogFilterFragmentIds = ({
6519
6556
  }
6520
6557
  return fragments;
6521
6558
  };
6522
- var getTransferFilterFragmentIds = ({
6559
+ var getTransferFilterFragments = ({
6523
6560
  chainId,
6524
6561
  fromAddress,
6525
6562
  toAddress,
6526
6563
  ...filter
6527
6564
  }) => {
6528
6565
  const fragments = [];
6529
- const fromAddressFragmentIds = getAddressFragmentIds(fromAddress);
6530
- const toAddressFragmentIds = getAddressFragmentIds(toAddress);
6566
+ const fromAddressFragments = getAddressFragments(fromAddress);
6567
+ const toAddressFragments = getAddressFragments(toAddress);
6531
6568
  const includeTransactionReceipts = shouldGetTransactionReceipt(filter);
6532
- for (const fragmentFromAddress of fromAddressFragmentIds) {
6533
- for (const fragmentToAddress of toAddressFragmentIds) {
6534
- const id = `transfer_${chainId}_${fragmentFromAddress.id}_${fragmentToAddress.id}_${includeTransactionReceipts ? 1 : 0}`;
6535
- const adjacent = [];
6536
- for (const adjacentFromAddress of fragmentFromAddress.adjacent) {
6537
- for (const adjacentToAddress of fragmentToAddress.adjacent) {
6569
+ for (const fromAddressFragment of fromAddressFragments) {
6570
+ for (const toAddressFragment of toAddressFragments) {
6571
+ const fragment = {
6572
+ type: "transfer",
6573
+ chainId,
6574
+ fromAddress: fromAddressFragment.fragment,
6575
+ toAddress: toAddressFragment.fragment,
6576
+ includeTransactionReceipts
6577
+ };
6578
+ const adjacentIds = [];
6579
+ for (const fromAddressAdjacentId of fromAddressFragment.adjacentIds) {
6580
+ for (const toAddressAdjacentId of toAddressFragment.adjacentIds) {
6538
6581
  for (const adjacentTxr of includeTransactionReceipts ? [1] : [0, 1]) {
6539
- adjacent.push(
6540
- `transfer_${chainId}_${adjacentFromAddress}_${adjacentToAddress}_${adjacentTxr}`
6582
+ adjacentIds.push(
6583
+ `transfer_${chainId}_${fromAddressAdjacentId}_${toAddressAdjacentId}_${adjacentTxr}`
6541
6584
  );
6542
6585
  }
6543
6586
  }
6544
6587
  }
6545
- fragments.push({ id, adjacent });
6588
+ fragments.push({ fragment, adjacentIds });
6546
6589
  }
6547
6590
  }
6548
6591
  return fragments;
6549
6592
  };
6550
-
6551
- // src/utils/range.ts
6552
- var range = (start2, stop) => Array.from({ length: stop - start2 }, (_, i) => start2 + i);
6553
-
6554
- // src/utils/interval.ts
6555
- function intervalSum(intervals) {
6556
- let totalSum = 0;
6557
- for (const [start2, end] of intervals) {
6558
- totalSum += end - start2 + 1;
6593
+ var fragmentAddressToId = (fragmentAddress) => {
6594
+ if (fragmentAddress === null)
6595
+ return null;
6596
+ if (typeof fragmentAddress === "string")
6597
+ return fragmentAddress;
6598
+ return `${fragmentAddress.address}_${fragmentAddress.eventSelector}_${fragmentAddress.childAddressLocation}`;
6599
+ };
6600
+ var fragmentToId = (fragment) => {
6601
+ switch (fragment.type) {
6602
+ case "block":
6603
+ return `block_${fragment.chainId}_${fragment.interval}_${fragment.offset}`;
6604
+ case "transaction":
6605
+ return `transaction_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}`;
6606
+ case "trace":
6607
+ return `trace_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.functionSelector}_${fragment.includeTransactionReceipts ? 1 : 0}`;
6608
+ case "log":
6609
+ return `log_${fragment.chainId}_${fragmentAddressToId(fragment.address)}_${fragment.topic0}_${fragment.topic1}_${fragment.topic2}_${fragment.topic3}_${fragment.includeTransactionReceipts ? 1 : 0}`;
6610
+ case "transfer":
6611
+ return `transfer_${fragment.chainId}_${fragmentAddressToId(fragment.fromAddress)}_${fragmentAddressToId(fragment.toAddress)}_${fragment.includeTransactionReceipts ? 1 : 0}`;
6559
6612
  }
6560
- return totalSum;
6561
- }
6562
- function intervalUnion(intervals_) {
6563
- if (intervals_.length === 0)
6564
- return [];
6565
- const intervals = intervals_.map((interval) => [...interval]);
6566
- intervals.sort((a, b) => a[0] - b[0]);
6567
- const result = [];
6568
- let currentInterval = intervals[0];
6569
- for (let i = 1; i < intervals.length; i++) {
6570
- const nextInterval = intervals[i];
6571
- if (currentInterval[1] >= nextInterval[0] - 1) {
6572
- currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);
6573
- } else {
6574
- result.push(currentInterval);
6575
- currentInterval = nextInterval;
6613
+ };
6614
+ var recoverAddress = (baseAddress, fragmentAddresses) => {
6615
+ if (baseAddress === void 0)
6616
+ return void 0;
6617
+ if (typeof baseAddress === "string")
6618
+ return baseAddress;
6619
+ if (Array.isArray(baseAddress))
6620
+ return dedupe(fragmentAddresses);
6621
+ if (typeof baseAddress.address === "string")
6622
+ return baseAddress;
6623
+ const address = {
6624
+ type: "log",
6625
+ chainId: baseAddress.chainId,
6626
+ address: [],
6627
+ eventSelector: baseAddress.eventSelector,
6628
+ childAddressLocation: baseAddress.childAddressLocation
6629
+ };
6630
+ address.address = dedupe(
6631
+ fragmentAddresses.map(
6632
+ ({ address: address2 }) => address2
6633
+ )
6634
+ );
6635
+ return address;
6636
+ };
6637
+ var recoverSelector = (base, fragments) => {
6638
+ if (base === void 0)
6639
+ return void 0;
6640
+ if (typeof base === "string")
6641
+ return base;
6642
+ return dedupe(fragments);
6643
+ };
6644
+ var recoverTopic = (base, fragments) => {
6645
+ if (base === null)
6646
+ return null;
6647
+ if (typeof base === "string")
6648
+ return base;
6649
+ return dedupe(fragments);
6650
+ };
6651
+ var recoverFilter = (baseFilter, fragments) => {
6652
+ switch (baseFilter.type) {
6653
+ case "block": {
6654
+ return baseFilter;
6576
6655
  }
6577
- }
6578
- result.push(currentInterval);
6579
- return result;
6580
- }
6581
- function intervalIntersection(list1, list2) {
6582
- const result = [];
6583
- let i = 0;
6584
- let j = 0;
6585
- while (i < list1.length && j < list2.length) {
6586
- const [start1, end1] = list1[i];
6587
- const [start2, end2] = list2[j];
6588
- const intersectionStart = Math.max(start1, start2);
6589
- const intersectionEnd = Math.min(end1, end2);
6590
- if (intersectionStart <= intersectionEnd) {
6591
- result.push([intersectionStart, intersectionEnd]);
6656
+ case "transaction": {
6657
+ return {
6658
+ ...baseFilter,
6659
+ fromAddress: recoverAddress(
6660
+ baseFilter.fromAddress,
6661
+ fragments.map(
6662
+ (fragment) => fragment.fromAddress
6663
+ )
6664
+ ),
6665
+ toAddress: recoverAddress(
6666
+ baseFilter.toAddress,
6667
+ fragments.map(
6668
+ (fragment) => fragment.toAddress
6669
+ )
6670
+ )
6671
+ };
6592
6672
  }
6593
- if (end1 < end2) {
6594
- i++;
6595
- } else {
6596
- j++;
6673
+ case "trace": {
6674
+ return {
6675
+ ...baseFilter,
6676
+ fromAddress: recoverAddress(
6677
+ baseFilter.fromAddress,
6678
+ fragments.map(
6679
+ (fragment) => fragment.fromAddress
6680
+ )
6681
+ ),
6682
+ toAddress: recoverAddress(
6683
+ baseFilter.toAddress,
6684
+ fragments.map(
6685
+ (fragment) => fragment.toAddress
6686
+ )
6687
+ ),
6688
+ functionSelector: recoverSelector(
6689
+ baseFilter.functionSelector,
6690
+ fragments.map(
6691
+ (fragment) => fragment.functionSelector
6692
+ )
6693
+ )
6694
+ };
6597
6695
  }
6598
- }
6599
- return intervalUnion(result);
6600
- }
6601
- function intervalIntersectionMany(lists) {
6602
- if (lists.length === 0)
6603
- return [];
6604
- if (lists.length === 1)
6605
- return lists[0];
6606
- let result = lists[0];
6607
- for (let i = 1; i < lists.length; i++) {
6608
- result = intervalIntersection(result, lists[i]);
6609
- }
6610
- return intervalUnion(result);
6611
- }
6612
- function intervalDifference(initial, remove) {
6613
- const initial_ = initial.map((interval) => [...interval]);
6614
- const remove_ = remove.map((interval) => [...interval]);
6615
- const result = [];
6616
- let i = 0;
6617
- let j = 0;
6618
- while (i < initial.length && j < remove.length) {
6619
- const interval1 = initial_[i];
6620
- const interval2 = remove_[j];
6621
- if (interval1[1] < interval2[0]) {
6622
- result.push(interval1);
6623
- i++;
6624
- } else if (interval2[1] < interval1[0]) {
6625
- j++;
6626
- } else {
6627
- if (interval1[0] < interval2[0]) {
6628
- result.push([interval1[0], interval2[0] - 1]);
6629
- }
6630
- if (interval1[1] > interval2[1]) {
6631
- interval1[0] = interval2[1] + 1;
6632
- j++;
6633
- } else {
6634
- i++;
6635
- }
6696
+ case "log": {
6697
+ return {
6698
+ ...baseFilter,
6699
+ address: recoverAddress(
6700
+ baseFilter.address,
6701
+ fragments.map(
6702
+ (fragment) => fragment.address
6703
+ )
6704
+ ),
6705
+ topic0: recoverTopic(
6706
+ baseFilter.topic0,
6707
+ fragments.map(
6708
+ (fragment) => fragment.topic0
6709
+ )
6710
+ ),
6711
+ topic1: recoverTopic(
6712
+ baseFilter.topic1,
6713
+ fragments.map(
6714
+ (fragment) => fragment.topic1
6715
+ )
6716
+ ),
6717
+ topic2: recoverTopic(
6718
+ baseFilter.topic2,
6719
+ fragments.map(
6720
+ (fragment) => fragment.topic2
6721
+ )
6722
+ ),
6723
+ topic3: recoverTopic(
6724
+ baseFilter.topic3,
6725
+ fragments.map(
6726
+ (fragment) => fragment.topic3
6727
+ )
6728
+ )
6729
+ };
6730
+ }
6731
+ case "transfer": {
6732
+ return {
6733
+ ...baseFilter,
6734
+ fromAddress: recoverAddress(
6735
+ baseFilter.fromAddress,
6736
+ fragments.map(
6737
+ (fragment) => fragment.fromAddress
6738
+ )
6739
+ ),
6740
+ toAddress: recoverAddress(
6741
+ baseFilter.toAddress,
6742
+ fragments.map(
6743
+ (fragment) => fragment.toAddress
6744
+ )
6745
+ )
6746
+ };
6636
6747
  }
6637
6748
  }
6638
- while (i < initial_.length) {
6639
- result.push(initial_[i]);
6640
- i++;
6641
- }
6642
- return result;
6643
- }
6644
- function sortIntervals(intervals) {
6645
- return intervals.sort((a, b) => a[0] < b[0] ? -1 : 1);
6646
- }
6647
- function getChunks({
6648
- interval,
6649
- maxChunkSize
6650
- }) {
6651
- const _chunks = [];
6652
- const [startBlock, endBlock] = interval;
6653
- let fromBlock = startBlock;
6654
- let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
6655
- while (fromBlock <= endBlock) {
6656
- _chunks.push([fromBlock, toBlock]);
6657
- fromBlock = toBlock + 1;
6658
- toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
6659
- }
6660
- return _chunks;
6661
- }
6662
- function intervalRange(interval) {
6663
- return range(interval[0], interval[1] + 1);
6664
- }
6749
+ };
6665
6750
 
6666
6751
  // src/sync-store/index.ts
6667
6752
  import { sql as ksql } from "kysely";
@@ -6864,11 +6949,12 @@ var createSyncStore = ({
6864
6949
  const perFragmentIntervals = /* @__PURE__ */ new Map();
6865
6950
  const values = [];
6866
6951
  for (const { filter, interval } of intervals) {
6867
- for (const fragment of getFragmentIds(filter)) {
6868
- if (perFragmentIntervals.has(fragment.id) === false) {
6869
- perFragmentIntervals.set(fragment.id, []);
6952
+ for (const fragment of getFragments(filter)) {
6953
+ const fragmentId = fragmentToId(fragment.fragment);
6954
+ if (perFragmentIntervals.has(fragmentId) === false) {
6955
+ perFragmentIntervals.set(fragmentId, []);
6870
6956
  }
6871
- perFragmentIntervals.get(fragment.id).push(interval);
6957
+ perFragmentIntervals.get(fragmentId).push(interval);
6872
6958
  }
6873
6959
  }
6874
6960
  for (const [fragmentId, intervals2] of perFragmentIntervals) {
@@ -6894,13 +6980,15 @@ var createSyncStore = ({
6894
6980
  let query2;
6895
6981
  for (let i = 0; i < filters.length; i++) {
6896
6982
  const filter = filters[i];
6897
- const fragments = getFragmentIds(filter);
6898
- for (const fragment of fragments) {
6983
+ const fragments = getFragments(filter);
6984
+ for (let j = 0; j < fragments.length; j++) {
6985
+ const fragment = fragments[j];
6899
6986
  const _query = db.selectFrom(
6900
- db.selectFrom("intervals").select(ksql`unnest(blocks)`.as("blocks")).where("fragment_id", "in", fragment.adjacent).as("unnested")
6987
+ db.selectFrom("intervals").select(ksql`unnest(blocks)`.as("blocks")).where("fragment_id", "in", fragment.adjacentIds).as("unnested")
6901
6988
  ).select([
6902
6989
  ksql`range_agg(unnested.blocks)`.as("merged_blocks"),
6903
- ksql.raw(`'${i}'`).as("filter")
6990
+ ksql.raw(`'${i}'`).as("filter"),
6991
+ ksql.raw(`'${j}'`).as("fragment")
6904
6992
  ]);
6905
6993
  query2 = query2 === void 0 ? _query : query2.unionAll(_query);
6906
6994
  }
@@ -6909,12 +6997,17 @@ var createSyncStore = ({
6909
6997
  const result = /* @__PURE__ */ new Map();
6910
6998
  for (let i = 0; i < filters.length; i++) {
6911
6999
  const filter = filters[i];
6912
- const intervals = rows.filter((row) => row.filter === `${i}`).map(
6913
- (row) => (row.merged_blocks ? JSON.parse(
6914
- `[${row.merged_blocks.slice(1, -1)}]`
6915
- ) : []).map((interval) => [interval[0], interval[1] - 1])
6916
- );
6917
- result.set(filter, intervalIntersectionMany(intervals));
7000
+ const fragments = getFragments(filter);
7001
+ result.set(filter, []);
7002
+ for (let j = 0; j < fragments.length; j++) {
7003
+ const fragment = fragments[j];
7004
+ const intervals = rows.filter((row) => row.filter === `${i}`).filter((row) => row.fragment === `${j}`).map(
7005
+ (row) => (row.merged_blocks ? JSON.parse(
7006
+ `[${row.merged_blocks.slice(1, -1)}]`
7007
+ ) : []).map((interval) => [interval[0], interval[1] - 1])
7008
+ )[0];
7009
+ result.get(filter).push({ fragment: fragment.fragment, intervals });
7010
+ }
6918
7011
  }
6919
7012
  return result;
6920
7013
  }),
@@ -8236,6 +8329,126 @@ var convertTrace = (trace) => ({
8236
8329
  subcalls: trace.trace.subcalls
8237
8330
  });
8238
8331
 
8332
+ // src/utils/range.ts
8333
+ var range = (start2, stop) => Array.from({ length: stop - start2 }, (_, i) => start2 + i);
8334
+
8335
+ // src/utils/interval.ts
8336
+ function intervalSum(intervals) {
8337
+ let totalSum = 0;
8338
+ for (const [start2, end] of intervals) {
8339
+ totalSum += end - start2 + 1;
8340
+ }
8341
+ return totalSum;
8342
+ }
8343
+ function intervalUnion(intervals_) {
8344
+ if (intervals_.length === 0)
8345
+ return [];
8346
+ const intervals = intervals_.map((interval) => [...interval]);
8347
+ intervals.sort((a, b) => a[0] - b[0]);
8348
+ const result = [];
8349
+ let currentInterval = intervals[0];
8350
+ for (let i = 1; i < intervals.length; i++) {
8351
+ const nextInterval = intervals[i];
8352
+ if (currentInterval[1] >= nextInterval[0] - 1) {
8353
+ currentInterval[1] = Math.max(currentInterval[1], nextInterval[1]);
8354
+ } else {
8355
+ result.push(currentInterval);
8356
+ currentInterval = nextInterval;
8357
+ }
8358
+ }
8359
+ result.push(currentInterval);
8360
+ return result;
8361
+ }
8362
+ function intervalIntersection(list1, list2) {
8363
+ const result = [];
8364
+ let i = 0;
8365
+ let j = 0;
8366
+ while (i < list1.length && j < list2.length) {
8367
+ const [start1, end1] = list1[i];
8368
+ const [start2, end2] = list2[j];
8369
+ const intersectionStart = Math.max(start1, start2);
8370
+ const intersectionEnd = Math.min(end1, end2);
8371
+ if (intersectionStart <= intersectionEnd) {
8372
+ result.push([intersectionStart, intersectionEnd]);
8373
+ }
8374
+ if (end1 < end2) {
8375
+ i++;
8376
+ } else {
8377
+ j++;
8378
+ }
8379
+ }
8380
+ return intervalUnion(result);
8381
+ }
8382
+ function intervalIntersectionMany(lists) {
8383
+ if (lists.length === 0)
8384
+ return [];
8385
+ if (lists.length === 1)
8386
+ return lists[0];
8387
+ let result = lists[0];
8388
+ for (let i = 1; i < lists.length; i++) {
8389
+ result = intervalIntersection(result, lists[i]);
8390
+ }
8391
+ return intervalUnion(result);
8392
+ }
8393
+ function intervalDifference(initial, remove) {
8394
+ const initial_ = initial.map((interval) => [...interval]);
8395
+ const remove_ = remove.map((interval) => [...interval]);
8396
+ const result = [];
8397
+ let i = 0;
8398
+ let j = 0;
8399
+ while (i < initial.length && j < remove.length) {
8400
+ const interval1 = initial_[i];
8401
+ const interval2 = remove_[j];
8402
+ if (interval1[1] < interval2[0]) {
8403
+ result.push(interval1);
8404
+ i++;
8405
+ } else if (interval2[1] < interval1[0]) {
8406
+ j++;
8407
+ } else {
8408
+ if (interval1[0] < interval2[0]) {
8409
+ result.push([interval1[0], interval2[0] - 1]);
8410
+ }
8411
+ if (interval1[1] > interval2[1]) {
8412
+ interval1[0] = interval2[1] + 1;
8413
+ j++;
8414
+ } else {
8415
+ i++;
8416
+ }
8417
+ }
8418
+ }
8419
+ while (i < initial_.length) {
8420
+ result.push(initial_[i]);
8421
+ i++;
8422
+ }
8423
+ return result;
8424
+ }
8425
+ function intervalBounds(intervals) {
8426
+ const start2 = Math.min(...intervals.map((interval) => interval[0]));
8427
+ const end = Math.max(...intervals.map((interval) => interval[1]));
8428
+ return [start2, end];
8429
+ }
8430
+ function sortIntervals(intervals) {
8431
+ return intervals.sort((a, b) => a[0] < b[0] ? -1 : 1);
8432
+ }
8433
+ function getChunks({
8434
+ interval,
8435
+ maxChunkSize
8436
+ }) {
8437
+ const _chunks = [];
8438
+ const [startBlock, endBlock] = interval;
8439
+ let fromBlock = startBlock;
8440
+ let toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
8441
+ while (fromBlock <= endBlock) {
8442
+ _chunks.push([fromBlock, toBlock]);
8443
+ fromBlock = toBlock + 1;
8444
+ toBlock = Math.min(fromBlock + maxChunkSize - 1, endBlock);
8445
+ }
8446
+ return _chunks;
8447
+ }
8448
+ function intervalRange(interval) {
8449
+ return range(interval[0], interval[1] + 1);
8450
+ }
8451
+
8239
8452
  // src/utils/rpc.ts
8240
8453
  import {
8241
8454
  BlockNotFoundError,
@@ -8823,51 +9036,75 @@ var createHistoricalSync = async (args) => {
8823
9036
  return {
8824
9037
  intervalsCache,
8825
9038
  async sync(_interval) {
8826
- const syncedIntervals = [];
8827
- await Promise.all(
8828
- args.sources.map(async (source) => {
8829
- const filter = source.filter;
8830
- if (filter.fromBlock !== void 0 && filter.fromBlock > _interval[1] || filter.toBlock !== void 0 && filter.toBlock < _interval[0]) {
8831
- return;
8832
- }
8833
- const interval = [
8834
- Math.max(filter.fromBlock ?? 0, _interval[0]),
8835
- Math.min(filter.toBlock ?? Number.POSITIVE_INFINITY, _interval[1])
8836
- ];
8837
- const completedIntervals = intervalsCache.get(filter);
8838
- const requiredIntervals = intervalDifference(
9039
+ const intervalsToSync = [];
9040
+ for (const { filter } of args.sources) {
9041
+ if (filter.fromBlock !== void 0 && filter.fromBlock > _interval[1] || filter.toBlock !== void 0 && filter.toBlock < _interval[0]) {
9042
+ continue;
9043
+ }
9044
+ const interval = [
9045
+ Math.max(filter.fromBlock ?? 0, _interval[0]),
9046
+ Math.min(filter.toBlock ?? Number.POSITIVE_INFINITY, _interval[1])
9047
+ ];
9048
+ const completedIntervals = intervalsCache.get(filter);
9049
+ const requiredIntervals = [];
9050
+ for (const {
9051
+ fragment,
9052
+ intervals: fragmentIntervals
9053
+ } of completedIntervals) {
9054
+ const requiredFragmentIntervals = intervalDifference(
8839
9055
  [interval],
8840
- completedIntervals
9056
+ fragmentIntervals
8841
9057
  );
8842
- if (requiredIntervals.length === 0)
8843
- return;
9058
+ if (requiredFragmentIntervals.length > 0) {
9059
+ requiredIntervals.push({
9060
+ fragment,
9061
+ intervals: requiredFragmentIntervals
9062
+ });
9063
+ }
9064
+ }
9065
+ if (requiredIntervals.length > 0) {
9066
+ const requiredInterval = intervalBounds(
9067
+ requiredIntervals.flatMap(({ intervals }) => intervals)
9068
+ );
9069
+ const requiredFilter = recoverFilter(
9070
+ filter,
9071
+ requiredIntervals.map(({ fragment }) => fragment)
9072
+ );
9073
+ intervalsToSync.push({
9074
+ filter: requiredFilter,
9075
+ interval: requiredInterval
9076
+ });
9077
+ }
9078
+ }
9079
+ await Promise.all(
9080
+ intervalsToSync.map(async ({ filter, interval }) => {
8844
9081
  const blockPromise = syncBlock(interval[1]);
8845
9082
  try {
8846
- await Promise.all(
8847
- requiredIntervals.map(async (interval2) => {
8848
- switch (filter.type) {
8849
- case "log": {
8850
- await syncLogFilter(filter, interval2);
8851
- break;
8852
- }
8853
- case "block": {
8854
- await syncBlockFilter(filter, interval2);
8855
- break;
8856
- }
8857
- case "transaction": {
8858
- await syncTransactionFilter(filter, interval2);
8859
- break;
8860
- }
8861
- case "trace":
8862
- case "transfer": {
8863
- await syncTraceOrTransferFilter(filter, interval2);
8864
- break;
8865
- }
8866
- default:
8867
- never(filter);
8868
- }
8869
- })
8870
- );
9083
+ switch (filter.type) {
9084
+ case "log": {
9085
+ await syncLogFilter(filter, interval);
9086
+ break;
9087
+ }
9088
+ case "block": {
9089
+ await syncBlockFilter(filter, interval);
9090
+ break;
9091
+ }
9092
+ case "transaction": {
9093
+ await syncTransactionFilter(
9094
+ filter,
9095
+ interval
9096
+ );
9097
+ break;
9098
+ }
9099
+ case "trace":
9100
+ case "transfer": {
9101
+ await syncTraceOrTransferFilter(
9102
+ filter,
9103
+ interval
9104
+ );
9105
+ break;
9106
+ }
9107
+ }
8871
9108
  } catch (_error) {
8872
9109
  const error = _error;
8873
9110
  args.common.logger.error({
@@ -8881,9 +9118,10 @@ var createHistoricalSync = async (args) => {
8881
9118
  if (isKilled)
8882
9119
  return;
8883
9120
  await blockPromise;
8884
- syncedIntervals.push({ filter, interval });
8885
9121
  })
8886
9122
  );
9123
+ if (isKilled)
9124
+ return;
8887
9125
  const blocks = await Promise.all(blockCache.values());
8888
9126
  await Promise.all([
8889
9127
  args.syncStore.insertBlocks({ blocks, chainId: args.network.chainId }),
@@ -8897,9 +9135,11 @@ var createHistoricalSync = async (args) => {
8897
9135
  chainId: args.network.chainId
8898
9136
  })
8899
9137
  ]);
9138
+ if (isKilled)
9139
+ return;
8900
9140
  if (args.network.disableCache === false) {
8901
9141
  await args.syncStore.insertIntervals({
8902
- intervals: syncedIntervals,
9142
+ intervals: intervalsToSync,
8903
9143
  chainId: args.network.chainId
8904
9144
  });
8905
9145
  }
@@ -10606,9 +10846,14 @@ var getCachedBlock = ({
10606
10846
  filter.fromBlock ?? 0,
10607
10847
  filter.toBlock ?? Number.POSITIVE_INFINITY
10608
10848
  ];
10609
- const cachedIntervals = historicalSync.intervalsCache.get(filter);
10849
+ const fragmentIntervals = historicalSync.intervalsCache.get(filter);
10610
10850
  const completedIntervals = sortIntervals(
10611
- intervalIntersection([requiredInterval], cachedIntervals)
10851
+ intervalIntersection(
10852
+ [requiredInterval],
10853
+ intervalIntersectionMany(
10854
+ fragmentIntervals.map(({ intervals }) => intervals)
10855
+ )
10856
+ )
10612
10857
  );
10613
10858
  if (completedIntervals.length === 0)
10614
10859
  return void 0;
@@ -10664,7 +10909,7 @@ async function* localHistoricalSyncGenerator({
10664
10909
  const requiredIntervals = Array.from(
10665
10910
  historicalSync.intervalsCache.entries()
10666
10911
  ).flatMap(
10667
- ([filter, interval]) => intervalDifference(
10912
+ ([filter, fragmentIntervals]) => intervalDifference(
10668
10913
  [
10669
10914
  [
10670
10915
  filter.fromBlock ?? 0,
@@ -10674,7 +10919,9 @@ async function* localHistoricalSyncGenerator({
10674
10919
  )
10675
10920
  ]
10676
10921
  ],
10677
- interval
10922
+ intervalIntersectionMany(
10923
+ fragmentIntervals.map(({ intervals }) => intervals)
10924
+ )
10678
10925
  )
10679
10926
  );
10680
10927
  const required = intervalSum(intervalUnion(requiredIntervals));