envio 3.3.0-alpha.0 → 3.3.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/package.json +6 -6
  2. package/src/Batch.res +0 -6
  3. package/src/Batch.res.mjs +0 -11
  4. package/src/BatchProcessing.res +2 -12
  5. package/src/BatchProcessing.res.mjs +2 -7
  6. package/src/ChainFetching.res +22 -13
  7. package/src/ChainFetching.res.mjs +13 -13
  8. package/src/ChainMetadata.res +1 -11
  9. package/src/ChainMetadata.res.mjs +1 -10
  10. package/src/ChainState.res +176 -2
  11. package/src/ChainState.res.mjs +153 -9
  12. package/src/ChainState.resi +53 -1
  13. package/src/Config.res +3 -6
  14. package/src/Config.res.mjs +2 -3
  15. package/src/Core.res +7 -0
  16. package/src/CrossChainState.res +99 -91
  17. package/src/CrossChainState.res.mjs +72 -57
  18. package/src/CrossChainState.resi +1 -9
  19. package/src/Ecosystem.res +6 -1
  20. package/src/Env.res +0 -7
  21. package/src/Env.res.mjs +0 -6
  22. package/src/Envio.res +3 -2
  23. package/src/EventConfigBuilder.res +19 -5
  24. package/src/EventConfigBuilder.res.mjs +6 -4
  25. package/src/EventProcessing.res +26 -0
  26. package/src/EventProcessing.res.mjs +20 -0
  27. package/src/FetchState.res +92 -22
  28. package/src/FetchState.res.mjs +87 -14
  29. package/src/IndexerLoop.res +2 -3
  30. package/src/IndexerLoop.res.mjs +1 -1
  31. package/src/IndexerState.res +0 -8
  32. package/src/IndexerState.res.mjs +4 -8
  33. package/src/IndexerState.resi +0 -4
  34. package/src/Internal.res +43 -4
  35. package/src/Internal.res.mjs +18 -0
  36. package/src/Main.res +3 -50
  37. package/src/Main.res.mjs +3 -24
  38. package/src/Prometheus.res +0 -11
  39. package/src/Prometheus.res.mjs +83 -98
  40. package/src/Rollback.res +1 -1
  41. package/src/Rollback.res.mjs +1 -1
  42. package/src/SimulateItems.res +3 -0
  43. package/src/SimulateItems.res.mjs +2 -1
  44. package/src/sources/Evm.res +52 -38
  45. package/src/sources/Evm.res.mjs +48 -36
  46. package/src/sources/Fuel.res +3 -1
  47. package/src/sources/Fuel.res.mjs +1 -0
  48. package/src/sources/HyperFuelSource.res +5 -0
  49. package/src/sources/HyperFuelSource.res.mjs +2 -0
  50. package/src/sources/HyperSync.res +4 -1
  51. package/src/sources/HyperSync.res.mjs +5 -3
  52. package/src/sources/HyperSync.resi +1 -0
  53. package/src/sources/HyperSyncClient.res +9 -78
  54. package/src/sources/HyperSyncClient.res.mjs +1 -22
  55. package/src/sources/HyperSyncSource.res +3 -4
  56. package/src/sources/HyperSyncSource.res.mjs +2 -1
  57. package/src/sources/RpcSource.res +7 -2
  58. package/src/sources/RpcSource.res.mjs +3 -1
  59. package/src/sources/SimulateSource.res +3 -1
  60. package/src/sources/SimulateSource.res.mjs +1 -0
  61. package/src/sources/Source.res +4 -0
  62. package/src/sources/SourceManager.res +9 -8
  63. package/src/sources/SourceManager.res.mjs +21 -26
  64. package/src/sources/SourceManager.resi +2 -3
  65. package/src/sources/Svm.res +25 -2
  66. package/src/sources/Svm.res.mjs +27 -2
  67. package/src/sources/SvmHyperSyncClient.res +3 -29
  68. package/src/sources/SvmHyperSyncSource.res +60 -84
  69. package/src/sources/SvmHyperSyncSource.res.mjs +59 -78
  70. package/src/sources/TransactionStore.res +111 -0
  71. package/src/sources/TransactionStore.res.mjs +77 -0
  72. package/src/tui/Tui.res +13 -16
  73. package/src/tui/Tui.res.mjs +12 -14
package/src/Main.res CHANGED
@@ -1,19 +1,4 @@
1
- type chainData = {
2
- chainId: float,
3
- poweredByHyperSync: bool,
4
- firstEventBlockNumber: option<int>,
5
- latestProcessedBlock: option<int>,
6
- timestampCaughtUpToHeadOrEndblock: option<Date.t>,
7
- numEventsProcessed: float,
8
- latestFetchedBlockNumber: int,
9
- // Need this for API backwards compatibility
10
- @as("currentBlockHeight")
11
- knownHeight: int,
12
- numBatchesFetched: int,
13
- startBlock: int,
14
- endBlock: option<int>,
15
- numAddresses: int,
16
- }
1
+ type chainData = ChainState.chainData
17
2
  @tag("status")
18
3
  type state =
19
4
  | @as("disabled") Disabled({})
@@ -183,7 +168,7 @@ let buildChainsObject = (~config: Config.t) => {
183
168
  | Some(state) => {
184
169
  let chain = ChainMap.Chain.makeUnsafe(~chainId=chainConfig.id)
185
170
  let chainState = state->IndexerState.getChainState(~chain)
186
- let indexingAddresses = (chainState->ChainState.fetchState).indexingAddresses
171
+ let indexingAddresses = chainState->ChainState.indexingAddresses
187
172
 
188
173
  // Collect all addresses for this contract name from indexingAddresses
189
174
  let addresses = []
@@ -780,39 +765,7 @@ let start = async (
780
765
  | None => Initializing({})
781
766
  | Some(state) => {
782
767
  let chains =
783
- state
784
- ->IndexerState.chainStates
785
- ->Dict.valuesToArray
786
- ->Array.map(cs => {
787
- let fetchState = cs->ChainState.fetchState
788
- let latestFetchedBlockNumber = Pervasives.max(
789
- FetchState.bufferBlockNumber(fetchState),
790
- 0,
791
- )
792
- let knownHeight =
793
- cs->ChainState.hasProcessedToEndblock
794
- ? fetchState.endBlock->Option.getOr(fetchState.knownHeight)
795
- : fetchState.knownHeight
796
-
797
- {
798
- chainId: (cs->ChainState.chainConfig).id->Int.toFloat,
799
- poweredByHyperSync: (
800
- cs->ChainState.sourceManager->SourceManager.getActiveSource
801
- ).poweredByHyperSync,
802
- latestFetchedBlockNumber,
803
- knownHeight,
804
- numBatchesFetched: 0,
805
- startBlock: fetchState.startBlock,
806
- endBlock: fetchState.endBlock,
807
- firstEventBlockNumber: fetchState.firstEventBlock,
808
- latestProcessedBlock: cs->ChainState.committedProgressBlockNumber === -1
809
- ? None
810
- : Some(cs->ChainState.committedProgressBlockNumber),
811
- timestampCaughtUpToHeadOrEndblock: cs->ChainState.timestampCaughtUpToHeadOrEndblock,
812
- numEventsProcessed: cs->ChainState.numEventsProcessed,
813
- numAddresses: fetchState->FetchState.numAddresses,
814
- }
815
- })
768
+ state->IndexerState.chainStates->Dict.valuesToArray->Array.map(ChainState.toChainData)
816
769
  Active({
817
770
  envioVersion,
818
771
  chains,
package/src/Main.res.mjs CHANGED
@@ -11,7 +11,6 @@ import * as Process from "process";
11
11
  import * as ChainMap from "./ChainMap.res.mjs";
12
12
  import * as PgStorage from "./PgStorage.res.mjs";
13
13
  import * as ChainState from "./ChainState.res.mjs";
14
- import * as FetchState from "./FetchState.res.mjs";
15
14
  import * as Prometheus from "./Prometheus.res.mjs";
16
15
  import * as IndexerLoop from "./IndexerLoop.res.mjs";
17
16
  import * as Persistence from "./Persistence.res.mjs";
@@ -20,8 +19,6 @@ import Yargs from "yargs/yargs";
20
19
  import * as IndexerState from "./IndexerState.res.mjs";
21
20
  import * as ErrorHandling from "./ErrorHandling.res.mjs";
22
21
  import * as HandlerLoader from "./HandlerLoader.res.mjs";
23
- import * as Primitive_int from "@rescript/runtime/lib/es6/Primitive_int.js";
24
- import * as SourceManager from "./sources/SourceManager.res.mjs";
25
22
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
26
23
  import * as Helpers from "yargs/helpers";
27
24
  import * as RollbackCommit from "./RollbackCommit.res.mjs";
@@ -168,7 +165,7 @@ function buildChainsObject(config) {
168
165
  if (state !== undefined) {
169
166
  let chain = ChainMap.Chain.makeUnsafe(chainConfig.id);
170
167
  let chainState = IndexerState.getChainState(Primitive_option.valFromOption(state), chain);
171
- let indexingAddresses = ChainState.fetchState(chainState).indexingAddresses;
168
+ let indexingAddresses = ChainState.indexingAddresses(chainState);
172
169
  let addresses = [];
173
170
  let values = Object.values(indexingAddresses);
174
171
  for (let idx = 0, idx_finish = values.length; idx < idx_finish; ++idx) {
@@ -586,25 +583,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
586
583
  };
587
584
  }
588
585
  let state$1 = Primitive_option.valFromOption(state);
589
- let chains = Object.values(IndexerState.chainStates(state$1)).map(cs => {
590
- let fetchState = ChainState.fetchState(cs);
591
- let latestFetchedBlockNumber = Primitive_int.max(FetchState.bufferBlockNumber(fetchState), 0);
592
- let knownHeight = ChainState.hasProcessedToEndblock(cs) ? Stdlib_Option.getOr(fetchState.endBlock, fetchState.knownHeight) : fetchState.knownHeight;
593
- return {
594
- chainId: ChainState.chainConfig(cs).id,
595
- poweredByHyperSync: SourceManager.getActiveSource(ChainState.sourceManager(cs)).poweredByHyperSync,
596
- firstEventBlockNumber: fetchState.firstEventBlock,
597
- latestProcessedBlock: ChainState.committedProgressBlockNumber(cs) === -1 ? undefined : ChainState.committedProgressBlockNumber(cs),
598
- timestampCaughtUpToHeadOrEndblock: ChainState.timestampCaughtUpToHeadOrEndblock(cs),
599
- numEventsProcessed: ChainState.numEventsProcessed(cs),
600
- latestFetchedBlockNumber: latestFetchedBlockNumber,
601
- currentBlockHeight: knownHeight,
602
- numBatchesFetched: 0,
603
- startBlock: fetchState.startBlock,
604
- endBlock: fetchState.endBlock,
605
- numAddresses: FetchState.numAddresses(fetchState)
606
- };
607
- });
586
+ let chains = Object.values(IndexerState.chainStates(state$1)).map(ChainState.toChainData);
608
587
  return {
609
588
  status: "active",
610
589
  envioVersion: envioVersion,
@@ -615,7 +594,7 @@ async function start(persistence, resetOpt, isTestOpt, exitAfterFirstEventBlockO
615
594
  };
616
595
  }, persistence$1, isDevelopmentMode);
617
596
  }
618
- let state = IndexerState.makeFromDbState(config$2, persistence$1, Persistence.getInitializedState(persistence$1), registrations, isDevelopmentMode, shouldUseTui, exitAfterFirstEventBlock, undefined, undefined, undefined, undefined, onError);
597
+ let state = IndexerState.makeFromDbState(config$2, persistence$1, Persistence.getInitializedState(persistence$1), registrations, isDevelopmentMode, shouldUseTui, exitAfterFirstEventBlock, undefined, undefined, onError);
619
598
  if (shouldUseTui) {
620
599
  Tui.start(() => state);
621
600
  }
@@ -351,17 +351,6 @@ module IndexingAddresses = {
351
351
  }
352
352
  }
353
353
 
354
- module IndexingMaxConcurrency = {
355
- let gauge = PromClient.Gauge.makeGauge({
356
- "name": "envio_indexing_max_concurrency",
357
- "help": "The maximum number of concurrent data-source queries across the whole indexer.",
358
- })
359
-
360
- let set = (~maxConcurrency) => {
361
- gauge->PromClient.Gauge.set(maxConcurrency)
362
- }
363
- }
364
-
365
354
  module IndexingConcurrency = {
366
355
  let gauge = SafeGauge.makeOrThrow(
367
356
  ~name="envio_indexing_concurrency",
@@ -400,42 +400,28 @@ let IndexingAddresses = {
400
400
  set: set$4
401
401
  };
402
402
 
403
- let gauge$5 = PromClient.Gauge.makeGauge({
404
- name: "envio_indexing_max_concurrency",
405
- help: "The maximum number of concurrent data-source queries across the whole indexer."
406
- });
403
+ let gauge$5 = makeOrThrow$1("envio_indexing_concurrency", "The number of executing concurrent queries to the chain data-source.", chainIdLabelsSchema);
407
404
 
408
- function set$5(maxConcurrency) {
409
- gauge$5.set(maxConcurrency);
405
+ function set$5(concurrency, chainId) {
406
+ handleInt$1(gauge$5, chainId, concurrency);
410
407
  }
411
408
 
412
- let IndexingMaxConcurrency = {
409
+ let IndexingConcurrency = {
413
410
  gauge: gauge$5,
414
411
  set: set$5
415
412
  };
416
413
 
417
- let gauge$6 = makeOrThrow$1("envio_indexing_concurrency", "The number of executing concurrent queries to the chain data-source.", chainIdLabelsSchema);
414
+ let gauge$6 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
418
415
 
419
- function set$6(concurrency, chainId) {
420
- handleInt$1(gauge$6, chainId, concurrency);
416
+ function set$6(partitionsCount, chainId) {
417
+ handleInt$1(gauge$6, chainId, partitionsCount);
421
418
  }
422
419
 
423
- let IndexingConcurrency = {
420
+ let IndexingPartitions = {
424
421
  gauge: gauge$6,
425
422
  set: set$6
426
423
  };
427
424
 
428
- let gauge$7 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
429
-
430
- function set$7(partitionsCount, chainId) {
431
- handleInt$1(gauge$7, chainId, partitionsCount);
432
- }
433
-
434
- let IndexingPartitions = {
435
- gauge: gauge$7,
436
- set: set$7
437
- };
438
-
439
425
  let counter = makeOrThrow("envio_indexing_idle_seconds", "The time the indexer source syncing has been idle. A high value may indicate the source sync is a bottleneck.", chainIdLabelsSchema);
440
426
 
441
427
  let IndexingIdleTime = {
@@ -454,51 +440,51 @@ let IndexingQueryTime = {
454
440
  counter: counter$2
455
441
  };
456
442
 
457
- let gauge$8 = makeOrThrow$1("envio_indexing_buffer_size", "The current number of items in the indexing buffer.", chainIdLabelsSchema);
443
+ let gauge$7 = makeOrThrow$1("envio_indexing_buffer_size", "The current number of items in the indexing buffer.", chainIdLabelsSchema);
458
444
 
459
- function set$8(bufferSize, chainId) {
460
- handleInt$1(gauge$8, chainId, bufferSize);
445
+ function set$7(bufferSize, chainId) {
446
+ handleInt$1(gauge$7, chainId, bufferSize);
461
447
  }
462
448
 
463
449
  let IndexingBufferSize = {
464
- gauge: gauge$8,
465
- set: set$8
450
+ gauge: gauge$7,
451
+ set: set$7
466
452
  };
467
453
 
468
- let gauge$9 = PromClient.Gauge.makeGauge({
454
+ let gauge$8 = PromClient.Gauge.makeGauge({
469
455
  name: "envio_indexing_target_buffer_size",
470
456
  help: "The indexer-wide target buffer size shared across all chains. The actual number of items in the queue may exceed this value, but the indexer always tries to keep the buffer filled up to this target."
471
457
  });
472
458
 
473
- function set$9(targetBufferSize) {
474
- gauge$9.set(targetBufferSize);
459
+ function set$8(targetBufferSize) {
460
+ gauge$8.set(targetBufferSize);
475
461
  }
476
462
 
477
463
  let IndexingTargetBufferSize = {
478
- gauge: gauge$9,
479
- set: set$9
464
+ gauge: gauge$8,
465
+ set: set$8
480
466
  };
481
467
 
482
- let gauge$10 = makeOrThrow$1("envio_indexing_buffer_block", "The highest block number that has been fully fetched by the indexer.", chainIdLabelsSchema);
468
+ let gauge$9 = makeOrThrow$1("envio_indexing_buffer_block", "The highest block number that has been fully fetched by the indexer.", chainIdLabelsSchema);
483
469
 
484
- function set$10(blockNumber, chainId) {
485
- handleInt$1(gauge$10, chainId, blockNumber);
470
+ function set$9(blockNumber, chainId) {
471
+ handleInt$1(gauge$9, chainId, blockNumber);
486
472
  }
487
473
 
488
474
  let IndexingBufferBlockNumber = {
489
- gauge: gauge$10,
490
- set: set$10
475
+ gauge: gauge$9,
476
+ set: set$9
491
477
  };
492
478
 
493
- let gauge$11 = makeOrThrow$1("envio_indexing_end_block", "The block number to stop indexing at. (inclusive)", chainIdLabelsSchema);
479
+ let gauge$10 = makeOrThrow$1("envio_indexing_end_block", "The block number to stop indexing at. (inclusive)", chainIdLabelsSchema);
494
480
 
495
- function set$11(endBlock, chainId) {
496
- handleInt$1(gauge$11, chainId, endBlock);
481
+ function set$10(endBlock, chainId) {
482
+ handleInt$1(gauge$10, chainId, endBlock);
497
483
  }
498
484
 
499
485
  let IndexingEndBlock = {
500
- gauge: gauge$11,
501
- set: set$11
486
+ gauge: gauge$10,
487
+ set: set$10
502
488
  };
503
489
 
504
490
  let sourceLabelsSchema = S$RescriptSchema.schema(s => ({
@@ -539,18 +525,18 @@ let SourceRequestCount = {
539
525
  addSeconds: addSeconds
540
526
  };
541
527
 
542
- let gauge$12 = makeOrThrow$1("envio_source_known_height", "The latest known block number reported by the source. This value may lag behind the actual chain height, as it is updated only when queried.", sourceLabelsSchema);
528
+ let gauge$11 = makeOrThrow$1("envio_source_known_height", "The latest known block number reported by the source. This value may lag behind the actual chain height, as it is updated only when queried.", sourceLabelsSchema);
543
529
 
544
- function set$12(sourceName, chainId, blockNumber) {
545
- handleInt$1(gauge$12, {
530
+ function set$11(sourceName, chainId, blockNumber) {
531
+ handleInt$1(gauge$11, {
546
532
  source: sourceName,
547
533
  chainId: chainId
548
534
  }, blockNumber);
549
535
  }
550
536
 
551
537
  let SourceHeight = {
552
- gauge: gauge$12,
553
- set: set$12
538
+ gauge: gauge$11,
539
+ set: set$11
554
540
  };
555
541
 
556
542
  let counter$4 = makeOrThrow("envio_reorg_detected_total", "Total number of reorgs detected", chainIdLabelsSchema);
@@ -564,43 +550,43 @@ let ReorgCount = {
564
550
  increment: increment$5
565
551
  };
566
552
 
567
- let gauge$13 = makeOrThrow$1("envio_reorg_detected_block", "The block number where reorg was detected the last time. This doesn't mean that the block was reorged, this is simply where we found block hash to be different.", chainIdLabelsSchema);
553
+ let gauge$12 = makeOrThrow$1("envio_reorg_detected_block", "The block number where reorg was detected the last time. This doesn't mean that the block was reorged, this is simply where we found block hash to be different.", chainIdLabelsSchema);
568
554
 
569
- function set$13(blockNumber, chain) {
570
- handleInt$1(gauge$13, chain, blockNumber);
555
+ function set$12(blockNumber, chain) {
556
+ handleInt$1(gauge$12, chain, blockNumber);
571
557
  }
572
558
 
573
559
  let ReorgDetectionBlockNumber = {
574
- gauge: gauge$13,
575
- set: set$13
560
+ gauge: gauge$12,
561
+ set: set$12
576
562
  };
577
563
 
578
- let gauge$14 = PromClient.Gauge.makeGauge({
564
+ let gauge$13 = PromClient.Gauge.makeGauge({
579
565
  name: "envio_reorg_threshold",
580
566
  help: "Whether indexing is currently within the reorg threshold"
581
567
  });
582
568
 
583
- function set$14(isInReorgThreshold) {
584
- gauge$14.set(isInReorgThreshold ? 1 : 0);
569
+ function set$13(isInReorgThreshold) {
570
+ gauge$13.set(isInReorgThreshold ? 1 : 0);
585
571
  }
586
572
 
587
573
  let ReorgThreshold = {
588
- gauge: gauge$14,
589
- set: set$14
574
+ gauge: gauge$13,
575
+ set: set$13
590
576
  };
591
577
 
592
- let gauge$15 = PromClient.Gauge.makeGauge({
578
+ let gauge$14 = PromClient.Gauge.makeGauge({
593
579
  name: "envio_rollback_enabled",
594
580
  help: "Whether rollback on reorg is enabled"
595
581
  });
596
582
 
597
- function set$15(enabled) {
598
- gauge$15.set(enabled ? 1 : 0);
583
+ function set$14(enabled) {
584
+ gauge$14.set(enabled ? 1 : 0);
599
585
  }
600
586
 
601
587
  let RollbackEnabled = {
602
- gauge: gauge$15,
603
- set: set$15
588
+ gauge: gauge$14,
589
+ set: set$14
604
590
  };
605
591
 
606
592
  let timeCounter$3 = PromClient.Counter.makeCounter({
@@ -649,62 +635,62 @@ let RollbackHistoryPrune = {
649
635
  increment: increment$7
650
636
  };
651
637
 
652
- let gauge$16 = makeOrThrow$1("envio_rollback_target_block", "The block number reorg was rollbacked to the last time.", chainIdLabelsSchema);
638
+ let gauge$15 = makeOrThrow$1("envio_rollback_target_block", "The block number reorg was rollbacked to the last time.", chainIdLabelsSchema);
653
639
 
654
- function set$16(blockNumber, chain) {
655
- handleInt$1(gauge$16, chain, blockNumber);
640
+ function set$15(blockNumber, chain) {
641
+ handleInt$1(gauge$15, chain, blockNumber);
656
642
  }
657
643
 
658
644
  let RollbackTargetBlockNumber = {
659
- gauge: gauge$16,
660
- set: set$16
645
+ gauge: gauge$15,
646
+ set: set$15
661
647
  };
662
648
 
663
- let gauge$17 = PromClient.Gauge.makeGauge({
649
+ let gauge$16 = PromClient.Gauge.makeGauge({
664
650
  name: "envio_processing_max_batch_size",
665
651
  help: "The maximum number of items to process in a single batch."
666
652
  });
667
653
 
668
- function set$17(maxBatchSize) {
669
- gauge$17.set(maxBatchSize);
654
+ function set$16(maxBatchSize) {
655
+ gauge$16.set(maxBatchSize);
670
656
  }
671
657
 
672
658
  let ProcessingMaxBatchSize = {
673
- gauge: gauge$17,
674
- set: set$17
659
+ gauge: gauge$16,
660
+ set: set$16
675
661
  };
676
662
 
677
- let gauge$18 = makeOrThrow$1("envio_progress_block", "The block number of the latest block processed and stored in the database.", chainIdLabelsSchema);
663
+ let gauge$17 = makeOrThrow$1("envio_progress_block", "The block number of the latest block processed and stored in the database.", chainIdLabelsSchema);
678
664
 
679
- function set$18(blockNumber, chainId) {
680
- handleInt$1(gauge$18, chainId, blockNumber);
665
+ function set$17(blockNumber, chainId) {
666
+ handleInt$1(gauge$17, chainId, blockNumber);
681
667
  }
682
668
 
683
669
  let ProgressBlockNumber = {
684
- gauge: gauge$18,
685
- set: set$18
670
+ gauge: gauge$17,
671
+ set: set$17
686
672
  };
687
673
 
688
- let gauge$19 = makeOrThrow$1("envio_progress_events", "The number of events processed and reflected in the database.", chainIdLabelsSchema);
674
+ let gauge$18 = makeOrThrow$1("envio_progress_events", "The number of events processed and reflected in the database.", chainIdLabelsSchema);
689
675
 
690
- function set$19(processedCount, chainId) {
691
- handleFloat$1(gauge$19, chainId, processedCount);
676
+ function set$18(processedCount, chainId) {
677
+ handleFloat$1(gauge$18, chainId, processedCount);
692
678
  }
693
679
 
694
680
  let ProgressEventsCount = {
695
- gauge: gauge$19,
696
- set: set$19
681
+ gauge: gauge$18,
682
+ set: set$18
697
683
  };
698
684
 
699
- let gauge$20 = makeOrThrow$1("envio_progress_latency", "The latency in milliseconds between the latest processed event creation and the time it was written to storage.", chainIdLabelsSchema);
685
+ let gauge$19 = makeOrThrow$1("envio_progress_latency", "The latency in milliseconds between the latest processed event creation and the time it was written to storage.", chainIdLabelsSchema);
700
686
 
701
- function set$20(latencyMs, chainId) {
702
- handleInt$1(gauge$20, chainId, latencyMs);
687
+ function set$19(latencyMs, chainId) {
688
+ handleInt$1(gauge$19, chainId, latencyMs);
703
689
  }
704
690
 
705
691
  let ProgressLatency = {
706
- gauge: gauge$20,
707
- set: set$20
692
+ gauge: gauge$19,
693
+ set: set$19
708
694
  };
709
695
 
710
696
  let effectLabelsSchema = S$RescriptSchema.object(s => s.f("effect", S$RescriptSchema.string));
@@ -724,15 +710,15 @@ let EffectCalls = {
724
710
  activeCallsCount: activeCallsCount
725
711
  };
726
712
 
727
- let gauge$21 = makeOrThrow$1("envio_effect_cache", "The number of items in the effect cache.", effectLabelsSchema);
713
+ let gauge$20 = makeOrThrow$1("envio_effect_cache", "The number of items in the effect cache.", effectLabelsSchema);
728
714
 
729
- function set$21(count, effectName) {
730
- handleInt$1(gauge$21, effectName, count);
715
+ function set$20(count, effectName) {
716
+ handleInt$1(gauge$20, effectName, count);
731
717
  }
732
718
 
733
719
  let EffectCacheCount = {
734
- gauge: gauge$21,
735
- set: set$21
720
+ gauge: gauge$20,
721
+ set: set$20
736
722
  };
737
723
 
738
724
  let counter$7 = makeOrThrow("envio_effect_cache_invalidations", "The number of effect cache invalidations.", effectLabelsSchema);
@@ -746,18 +732,18 @@ let EffectCacheInvalidationsCount = {
746
732
  increment: increment$8
747
733
  };
748
734
 
749
- let gauge$22 = makeOrThrow$1("envio_effect_queue", "The number of effect calls waiting in the rate limit queue.", effectLabelsSchema);
735
+ let gauge$21 = makeOrThrow$1("envio_effect_queue", "The number of effect calls waiting in the rate limit queue.", effectLabelsSchema);
750
736
 
751
737
  let timeCounter$6 = makeOrThrow("envio_effect_queue_wait_seconds", "The time spent waiting in the rate limit queue.", effectLabelsSchema);
752
738
 
753
- function set$22(count, effectName) {
754
- handleInt$1(gauge$22, effectName, count);
739
+ function set$21(count, effectName) {
740
+ handleInt$1(gauge$21, effectName, count);
755
741
  }
756
742
 
757
743
  let EffectQueueCount = {
758
- gauge: gauge$22,
744
+ gauge: gauge$21,
759
745
  timeCounter: timeCounter$6,
760
- set: set$22
746
+ set: set$21
761
747
  };
762
748
 
763
749
  let loadLabelsSchema = S$RescriptSchema.schema(s => ({
@@ -861,7 +847,6 @@ export {
861
847
  Info,
862
848
  ProcessStartTimeSeconds,
863
849
  IndexingAddresses,
864
- IndexingMaxConcurrency,
865
850
  IndexingConcurrency,
866
851
  IndexingPartitions,
867
852
  IndexingIdleTime,
package/src/Rollback.res CHANGED
@@ -18,7 +18,7 @@ let getLastKnownValidBlock = async (
18
18
  ->ChainState.reorgDetection
19
19
  ->ReorgDetection.getThresholdBlockNumbersBelowBlock(
20
20
  ~blockNumber=reorgBlockNumber,
21
- ~knownHeight=(chainState->ChainState.fetchState).knownHeight,
21
+ ~knownHeight=chainState->ChainState.knownHeight,
22
22
  )
23
23
 
24
24
  switch scannedBlockNumbers {
@@ -18,7 +18,7 @@ import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
18
18
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
19
19
 
20
20
  async function getLastKnownValidBlock(chainState, reorgBlockNumber, isRealtime) {
21
- let scannedBlockNumbers = ReorgDetection.getThresholdBlockNumbersBelowBlock(ChainState.reorgDetection(chainState), reorgBlockNumber, ChainState.fetchState(chainState).knownHeight);
21
+ let scannedBlockNumbers = ReorgDetection.getThresholdBlockNumbersBelowBlock(ChainState.reorgDetection(chainState), reorgBlockNumber, ChainState.knownHeight(chainState));
22
22
  if (scannedBlockNumbers.length === 0) {
23
23
  return ChainState.getHighestBlockBelowThreshold(chainState);
24
24
  }
@@ -288,6 +288,9 @@ let parse = (~simulateItems: array<JSON.t>, ~config: Config.t, ~chainConfig: Con
288
288
  blockNumber,
289
289
  blockHash,
290
290
  logIndex,
291
+ // Simulate keeps the transaction inline on the payload, so the store
292
+ // key is unused.
293
+ transactionIndex: 0,
291
294
  payload: (
292
295
  {
293
296
  contractName: eventConfig.contractName,
@@ -241,6 +241,7 @@ function parse(simulateItems, config, chainConfig) {
241
241
  blockNumber: blockNumber,
242
242
  blockHash: match$3[3],
243
243
  logIndex: logIndex,
244
+ transactionIndex: 0,
244
245
  payload: {
245
246
  contractName: eventConfig.contractName,
246
247
  eventName: eventConfig.name,
@@ -248,7 +249,7 @@ function parse(simulateItems, config, chainConfig) {
248
249
  chainId: chainId,
249
250
  srcAddress: srcAddress,
250
251
  logIndex: logIndex,
251
- transaction: transaction,
252
+ transaction: Primitive_option.some(transaction),
252
253
  block: match$3[0]
253
254
  }
254
255
  });
@@ -1,5 +1,7 @@
1
1
  // EVM's concrete item payload. Erased to `Internal.eventPayload` on the item
2
- // and recovered here via `toPayload`.
2
+ // and recovered here via `toPayload`. HyperSync omits `transaction` (it lives
3
+ // raw in the per-chain store and is written onto the payload at batch prep);
4
+ // RPC/simulate build it inline.
3
5
  type payload = {
4
6
  contractName: string,
5
7
  eventName: string,
@@ -7,12 +9,55 @@ type payload = {
7
9
  chainId: int,
8
10
  srcAddress: Address.t,
9
11
  logIndex: int,
10
- transaction: Internal.eventTransaction,
12
+ transaction?: Internal.eventTransaction,
11
13
  block: Internal.eventBlock,
12
14
  }
13
15
  external fromPayload: payload => Internal.eventPayload = "%identity"
14
16
  external toPayload: Internal.eventPayload => payload = "%identity"
15
17
 
18
+ // Ordered transaction field names. The index of each is the field code shared
19
+ // with the Rust store (`EvmTxField`) — keep this order in sync.
20
+ let transactionFields = [
21
+ "transactionIndex",
22
+ "hash",
23
+ "from",
24
+ "to",
25
+ "gas",
26
+ "gasPrice",
27
+ "maxPriorityFeePerGas",
28
+ "maxFeePerGas",
29
+ "cumulativeGasUsed",
30
+ "effectiveGasPrice",
31
+ "gasUsed",
32
+ "input",
33
+ "nonce",
34
+ "value",
35
+ "v",
36
+ "r",
37
+ "s",
38
+ "contractAddress",
39
+ "logsBloom",
40
+ "root",
41
+ "status",
42
+ "yParity",
43
+ "maxFeePerBlobGas",
44
+ "blobVersionedHashes",
45
+ "type",
46
+ "l1Fee",
47
+ "l1GasPrice",
48
+ "l1GasUsed",
49
+ "l1FeeScalar",
50
+ "gasUsedForL1",
51
+ "accessList",
52
+ "authorizationList",
53
+ ]
54
+
55
+ // Field name → bit index (the code shared with the Rust store), built once.
56
+ let transactionFieldCodes = TransactionStore.fieldCodes(transactionFields)
57
+
58
+ let transactionFieldMask = (eventConfigs: array<Internal.eventConfig>): float =>
59
+ eventConfigs->TransactionStore.mask(~codes=transactionFieldCodes)
60
+
16
61
  let cleanUpRawEventFieldsInPlace: JSON.t => unit = %raw(`fields => {
17
62
  delete fields.hash
18
63
  delete fields.number
@@ -50,41 +95,7 @@ let make = (~logger: Pino.t): Ecosystem.t => {
50
95
  "sendRoot",
51
96
  "mixHash",
52
97
  ],
53
- transactionFields: [
54
- "transactionIndex",
55
- "hash",
56
- "from",
57
- "to",
58
- "gas",
59
- "gasPrice",
60
- "maxPriorityFeePerGas",
61
- "maxFeePerGas",
62
- "cumulativeGasUsed",
63
- "effectiveGasPrice",
64
- "gasUsed",
65
- "input",
66
- "nonce",
67
- "value",
68
- "v",
69
- "r",
70
- "s",
71
- "contractAddress",
72
- "logsBloom",
73
- "root",
74
- "status",
75
- "yParity",
76
- "chainId",
77
- "maxFeePerBlobGas",
78
- "blobVersionedHashes",
79
- "type",
80
- "l1Fee",
81
- "l1GasPrice",
82
- "l1GasUsed",
83
- "l1FeeScalar",
84
- "gasUsedForL1",
85
- "accessList",
86
- "authorizationList",
87
- ],
98
+ transactionFields,
88
99
  blockNumberName: "number",
89
100
  blockTimestampName: "timestamp",
90
101
  blockHashName: "hash",
@@ -106,7 +117,10 @@ let make = (~logger: Pino.t): Ecosystem.t => {
106
117
  s.field("block", S.option(S.object(s2 => s2.field("number", S.unknown))))
107
118
  ),
108
119
  logger,
109
- toEvent: eventItem => eventItem.payload->Internal.payloadToEvent,
120
+ transactionFieldMask,
121
+ // The payload carries `transaction` by batch prep (HyperSync) or inline
122
+ // (RPC/simulate), so the event is the payload as-is.
123
+ toEvent: eventItem => eventItem.payload->(Utils.magic: Internal.eventPayload => Internal.event),
110
124
  toEventLogger: eventItem =>
111
125
  Logging.createChildFrom(
112
126
  ~logger,