envio 3.2.1 → 3.3.0-alpha.1
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/package.json +6 -7
- package/src/Batch.res +12 -15
- package/src/Batch.res.mjs +4 -5
- package/src/BatchProcessing.res +199 -0
- package/src/BatchProcessing.res.mjs +125 -0
- package/src/ChainFetching.res +373 -0
- package/src/ChainFetching.res.mjs +206 -0
- package/src/ChainMetadata.res +27 -0
- package/src/ChainMetadata.res.mjs +27 -0
- package/src/ChainState.res +643 -0
- package/src/ChainState.res.mjs +476 -0
- package/src/ChainState.resi +87 -0
- package/src/Config.res +13 -4
- package/src/Config.res.mjs +8 -3
- package/src/ContractRegisterContext.res +106 -0
- package/src/ContractRegisterContext.res.mjs +76 -0
- package/src/Core.res +3 -0
- package/src/CrossChainState.res +294 -0
- package/src/CrossChainState.res.mjs +221 -0
- package/src/CrossChainState.resi +39 -0
- package/src/Ecosystem.res +58 -0
- package/src/Ecosystem.res.mjs +43 -1
- package/src/Env.res +0 -2
- package/src/Env.res.mjs +0 -3
- package/src/EventConfigBuilder.res +2 -2
- package/src/EventProcessing.res +60 -46
- package/src/EventProcessing.res.mjs +33 -32
- package/src/EventUtils.res +0 -4
- package/src/EventUtils.res.mjs +0 -4
- package/src/ExitOnCaughtUp.res +10 -0
- package/src/ExitOnCaughtUp.res.mjs +22 -0
- package/src/FetchState.res +205 -73
- package/src/FetchState.res.mjs +242 -103
- package/src/InMemoryStore.res +36 -451
- package/src/InMemoryStore.res.mjs +20 -369
- package/src/IndexerLoop.res +43 -0
- package/src/IndexerLoop.res.mjs +46 -0
- package/src/IndexerState.res +536 -0
- package/src/IndexerState.res.mjs +543 -0
- package/src/IndexerState.resi +128 -0
- package/src/Internal.res +29 -8
- package/src/LoadLayer.res +20 -18
- package/src/LoadLayer.res.mjs +14 -12
- package/src/LoadLayer.resi +6 -3
- package/src/Logging.res +11 -44
- package/src/Logging.res.mjs +10 -42
- package/src/Main.res +54 -79
- package/src/Main.res.mjs +44 -56
- package/src/PgStorage.res +8 -71
- package/src/PgStorage.res.mjs +3 -47
- package/src/Prometheus.res +1 -13
- package/src/Prometheus.res.mjs +84 -96
- package/src/PruneStaleHistory.res +45 -0
- package/src/PruneStaleHistory.res.mjs +46 -0
- package/src/RawEvent.res +73 -0
- package/src/RawEvent.res.mjs +51 -0
- package/src/Rollback.res +204 -0
- package/src/Rollback.res.mjs +118 -0
- package/src/SimulateItems.res +12 -10
- package/src/SimulateItems.res.mjs +1 -1
- package/src/UserContext.res +26 -114
- package/src/UserContext.res.mjs +15 -78
- package/src/Writing.res +242 -0
- package/src/Writing.res.mjs +215 -0
- package/src/db/InternalTable.res +14 -27
- package/src/sources/Evm.res +40 -1
- package/src/sources/Evm.res.mjs +94 -84
- package/src/sources/Fuel.res +40 -1
- package/src/sources/Fuel.res.mjs +36 -26
- package/src/sources/HyperFuel.res +41 -120
- package/src/sources/HyperFuel.res.mjs +42 -80
- package/src/sources/HyperFuel.resi +1 -24
- package/src/sources/HyperFuelClient.res +16 -297
- package/src/sources/HyperFuelClient.res.mjs +5 -4
- package/src/sources/HyperFuelSource.res +33 -8
- package/src/sources/HyperFuelSource.res.mjs +56 -10
- package/src/sources/HyperSyncSource.res +5 -3
- package/src/sources/HyperSyncSource.res.mjs +1 -1
- package/src/sources/RpcSource.res +2 -2
- package/src/sources/RpcSource.res.mjs +1 -1
- package/src/sources/SourceManager.res +14 -23
- package/src/sources/SourceManager.res.mjs +27 -29
- package/src/sources/SourceManager.resi +4 -2
- package/src/sources/Svm.res +18 -1
- package/src/sources/Svm.res.mjs +30 -22
- package/src/sources/SvmHyperSyncSource.res +1 -1
- package/src/sources/SvmHyperSyncSource.res.mjs +1 -1
- package/src/tui/Tui.res +38 -36
- package/src/tui/Tui.res.mjs +51 -51
- package/src/ChainFetcher.res +0 -519
- package/src/ChainFetcher.res.mjs +0 -314
- package/src/ChainManager.res +0 -358
- package/src/ChainManager.res.mjs +0 -291
- package/src/Ctx.res +0 -6
- package/src/Ctx.res.mjs +0 -2
- package/src/GlobalState.res +0 -1056
- package/src/GlobalState.res.mjs +0 -1086
- package/src/GlobalStateManager.res +0 -57
- package/src/GlobalStateManager.res.mjs +0 -68
- package/src/GlobalStateManager.resi +0 -7
- package/src/Ports.res +0 -5
- package/src/Ports.res.mjs +0 -9
- package/src/adapters/MarkBatchProcessedAdapter.res +0 -5
- package/src/adapters/MarkBatchProcessedAdapter.res.mjs +0 -14
- package/src/sources/EnvioApiClient.res +0 -15
- package/src/sources/EnvioApiClient.res.mjs +0 -24
package/src/Prometheus.res.mjs
CHANGED
|
@@ -400,39 +400,28 @@ let IndexingAddresses = {
|
|
|
400
400
|
set: set$4
|
|
401
401
|
};
|
|
402
402
|
|
|
403
|
-
let gauge$5 = makeOrThrow$1("
|
|
403
|
+
let gauge$5 = makeOrThrow$1("envio_indexing_concurrency", "The number of executing concurrent queries to the chain data-source.", chainIdLabelsSchema);
|
|
404
404
|
|
|
405
|
-
function set$5(
|
|
406
|
-
handleInt$1(gauge$5, chainId,
|
|
405
|
+
function set$5(concurrency, chainId) {
|
|
406
|
+
handleInt$1(gauge$5, chainId, concurrency);
|
|
407
407
|
}
|
|
408
408
|
|
|
409
|
-
let
|
|
409
|
+
let IndexingConcurrency = {
|
|
410
410
|
gauge: gauge$5,
|
|
411
411
|
set: set$5
|
|
412
412
|
};
|
|
413
413
|
|
|
414
|
-
let gauge$6 = makeOrThrow$1("
|
|
414
|
+
let gauge$6 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
|
|
415
415
|
|
|
416
|
-
function set$6(
|
|
417
|
-
handleInt$1(gauge$6, chainId,
|
|
416
|
+
function set$6(partitionsCount, chainId) {
|
|
417
|
+
handleInt$1(gauge$6, chainId, partitionsCount);
|
|
418
418
|
}
|
|
419
419
|
|
|
420
|
-
let
|
|
420
|
+
let IndexingPartitions = {
|
|
421
421
|
gauge: gauge$6,
|
|
422
422
|
set: set$6
|
|
423
423
|
};
|
|
424
424
|
|
|
425
|
-
let gauge$7 = makeOrThrow$1("envio_indexing_partitions", "The number of partitions used to split fetching logic by addresses and block ranges.", chainIdLabelsSchema);
|
|
426
|
-
|
|
427
|
-
function set$7(partitionsCount, chainId) {
|
|
428
|
-
handleInt$1(gauge$7, chainId, partitionsCount);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
let IndexingPartitions = {
|
|
432
|
-
gauge: gauge$7,
|
|
433
|
-
set: set$7
|
|
434
|
-
};
|
|
435
|
-
|
|
436
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);
|
|
437
426
|
|
|
438
427
|
let IndexingIdleTime = {
|
|
@@ -451,51 +440,51 @@ let IndexingQueryTime = {
|
|
|
451
440
|
counter: counter$2
|
|
452
441
|
};
|
|
453
442
|
|
|
454
|
-
let gauge$
|
|
443
|
+
let gauge$7 = makeOrThrow$1("envio_indexing_buffer_size", "The current number of items in the indexing buffer.", chainIdLabelsSchema);
|
|
455
444
|
|
|
456
|
-
function set$
|
|
457
|
-
handleInt$1(gauge$
|
|
445
|
+
function set$7(bufferSize, chainId) {
|
|
446
|
+
handleInt$1(gauge$7, chainId, bufferSize);
|
|
458
447
|
}
|
|
459
448
|
|
|
460
449
|
let IndexingBufferSize = {
|
|
461
|
-
gauge: gauge$
|
|
462
|
-
set: set$
|
|
450
|
+
gauge: gauge$7,
|
|
451
|
+
set: set$7
|
|
463
452
|
};
|
|
464
453
|
|
|
465
|
-
let gauge$
|
|
454
|
+
let gauge$8 = PromClient.Gauge.makeGauge({
|
|
466
455
|
name: "envio_indexing_target_buffer_size",
|
|
467
|
-
help: "The target buffer size
|
|
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."
|
|
468
457
|
});
|
|
469
458
|
|
|
470
|
-
function set$
|
|
471
|
-
gauge$
|
|
459
|
+
function set$8(targetBufferSize) {
|
|
460
|
+
gauge$8.set(targetBufferSize);
|
|
472
461
|
}
|
|
473
462
|
|
|
474
463
|
let IndexingTargetBufferSize = {
|
|
475
|
-
gauge: gauge$
|
|
476
|
-
set: set$
|
|
464
|
+
gauge: gauge$8,
|
|
465
|
+
set: set$8
|
|
477
466
|
};
|
|
478
467
|
|
|
479
|
-
let gauge$
|
|
468
|
+
let gauge$9 = makeOrThrow$1("envio_indexing_buffer_block", "The highest block number that has been fully fetched by the indexer.", chainIdLabelsSchema);
|
|
480
469
|
|
|
481
|
-
function set$
|
|
482
|
-
handleInt$1(gauge$
|
|
470
|
+
function set$9(blockNumber, chainId) {
|
|
471
|
+
handleInt$1(gauge$9, chainId, blockNumber);
|
|
483
472
|
}
|
|
484
473
|
|
|
485
474
|
let IndexingBufferBlockNumber = {
|
|
486
|
-
gauge: gauge$
|
|
487
|
-
set: set$
|
|
475
|
+
gauge: gauge$9,
|
|
476
|
+
set: set$9
|
|
488
477
|
};
|
|
489
478
|
|
|
490
|
-
let gauge$
|
|
479
|
+
let gauge$10 = makeOrThrow$1("envio_indexing_end_block", "The block number to stop indexing at. (inclusive)", chainIdLabelsSchema);
|
|
491
480
|
|
|
492
|
-
function set$
|
|
493
|
-
handleInt$1(gauge$
|
|
481
|
+
function set$10(endBlock, chainId) {
|
|
482
|
+
handleInt$1(gauge$10, chainId, endBlock);
|
|
494
483
|
}
|
|
495
484
|
|
|
496
485
|
let IndexingEndBlock = {
|
|
497
|
-
gauge: gauge$
|
|
498
|
-
set: set$
|
|
486
|
+
gauge: gauge$10,
|
|
487
|
+
set: set$10
|
|
499
488
|
};
|
|
500
489
|
|
|
501
490
|
let sourceLabelsSchema = S$RescriptSchema.schema(s => ({
|
|
@@ -536,18 +525,18 @@ let SourceRequestCount = {
|
|
|
536
525
|
addSeconds: addSeconds
|
|
537
526
|
};
|
|
538
527
|
|
|
539
|
-
let gauge$
|
|
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);
|
|
540
529
|
|
|
541
|
-
function set$
|
|
542
|
-
handleInt$1(gauge$
|
|
530
|
+
function set$11(sourceName, chainId, blockNumber) {
|
|
531
|
+
handleInt$1(gauge$11, {
|
|
543
532
|
source: sourceName,
|
|
544
533
|
chainId: chainId
|
|
545
534
|
}, blockNumber);
|
|
546
535
|
}
|
|
547
536
|
|
|
548
537
|
let SourceHeight = {
|
|
549
|
-
gauge: gauge$
|
|
550
|
-
set: set$
|
|
538
|
+
gauge: gauge$11,
|
|
539
|
+
set: set$11
|
|
551
540
|
};
|
|
552
541
|
|
|
553
542
|
let counter$4 = makeOrThrow("envio_reorg_detected_total", "Total number of reorgs detected", chainIdLabelsSchema);
|
|
@@ -561,43 +550,43 @@ let ReorgCount = {
|
|
|
561
550
|
increment: increment$5
|
|
562
551
|
};
|
|
563
552
|
|
|
564
|
-
let gauge$
|
|
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);
|
|
565
554
|
|
|
566
|
-
function set$
|
|
567
|
-
handleInt$1(gauge$
|
|
555
|
+
function set$12(blockNumber, chain) {
|
|
556
|
+
handleInt$1(gauge$12, chain, blockNumber);
|
|
568
557
|
}
|
|
569
558
|
|
|
570
559
|
let ReorgDetectionBlockNumber = {
|
|
571
|
-
gauge: gauge$
|
|
572
|
-
set: set$
|
|
560
|
+
gauge: gauge$12,
|
|
561
|
+
set: set$12
|
|
573
562
|
};
|
|
574
563
|
|
|
575
|
-
let gauge$
|
|
564
|
+
let gauge$13 = PromClient.Gauge.makeGauge({
|
|
576
565
|
name: "envio_reorg_threshold",
|
|
577
566
|
help: "Whether indexing is currently within the reorg threshold"
|
|
578
567
|
});
|
|
579
568
|
|
|
580
|
-
function set$
|
|
581
|
-
gauge$
|
|
569
|
+
function set$13(isInReorgThreshold) {
|
|
570
|
+
gauge$13.set(isInReorgThreshold ? 1 : 0);
|
|
582
571
|
}
|
|
583
572
|
|
|
584
573
|
let ReorgThreshold = {
|
|
585
|
-
gauge: gauge$
|
|
586
|
-
set: set$
|
|
574
|
+
gauge: gauge$13,
|
|
575
|
+
set: set$13
|
|
587
576
|
};
|
|
588
577
|
|
|
589
|
-
let gauge$
|
|
578
|
+
let gauge$14 = PromClient.Gauge.makeGauge({
|
|
590
579
|
name: "envio_rollback_enabled",
|
|
591
580
|
help: "Whether rollback on reorg is enabled"
|
|
592
581
|
});
|
|
593
582
|
|
|
594
|
-
function set$
|
|
595
|
-
gauge$
|
|
583
|
+
function set$14(enabled) {
|
|
584
|
+
gauge$14.set(enabled ? 1 : 0);
|
|
596
585
|
}
|
|
597
586
|
|
|
598
587
|
let RollbackEnabled = {
|
|
599
|
-
gauge: gauge$
|
|
600
|
-
set: set$
|
|
588
|
+
gauge: gauge$14,
|
|
589
|
+
set: set$14
|
|
601
590
|
};
|
|
602
591
|
|
|
603
592
|
let timeCounter$3 = PromClient.Counter.makeCounter({
|
|
@@ -646,62 +635,62 @@ let RollbackHistoryPrune = {
|
|
|
646
635
|
increment: increment$7
|
|
647
636
|
};
|
|
648
637
|
|
|
649
|
-
let gauge$
|
|
638
|
+
let gauge$15 = makeOrThrow$1("envio_rollback_target_block", "The block number reorg was rollbacked to the last time.", chainIdLabelsSchema);
|
|
650
639
|
|
|
651
|
-
function set$
|
|
652
|
-
handleInt$1(gauge$
|
|
640
|
+
function set$15(blockNumber, chain) {
|
|
641
|
+
handleInt$1(gauge$15, chain, blockNumber);
|
|
653
642
|
}
|
|
654
643
|
|
|
655
644
|
let RollbackTargetBlockNumber = {
|
|
656
|
-
gauge: gauge$
|
|
657
|
-
set: set$
|
|
645
|
+
gauge: gauge$15,
|
|
646
|
+
set: set$15
|
|
658
647
|
};
|
|
659
648
|
|
|
660
|
-
let gauge$
|
|
649
|
+
let gauge$16 = PromClient.Gauge.makeGauge({
|
|
661
650
|
name: "envio_processing_max_batch_size",
|
|
662
651
|
help: "The maximum number of items to process in a single batch."
|
|
663
652
|
});
|
|
664
653
|
|
|
665
|
-
function set$
|
|
666
|
-
gauge$
|
|
654
|
+
function set$16(maxBatchSize) {
|
|
655
|
+
gauge$16.set(maxBatchSize);
|
|
667
656
|
}
|
|
668
657
|
|
|
669
658
|
let ProcessingMaxBatchSize = {
|
|
670
|
-
gauge: gauge$
|
|
671
|
-
set: set$
|
|
659
|
+
gauge: gauge$16,
|
|
660
|
+
set: set$16
|
|
672
661
|
};
|
|
673
662
|
|
|
674
|
-
let gauge$
|
|
663
|
+
let gauge$17 = makeOrThrow$1("envio_progress_block", "The block number of the latest block processed and stored in the database.", chainIdLabelsSchema);
|
|
675
664
|
|
|
676
|
-
function set$
|
|
677
|
-
handleInt$1(gauge$
|
|
665
|
+
function set$17(blockNumber, chainId) {
|
|
666
|
+
handleInt$1(gauge$17, chainId, blockNumber);
|
|
678
667
|
}
|
|
679
668
|
|
|
680
669
|
let ProgressBlockNumber = {
|
|
681
|
-
gauge: gauge$
|
|
682
|
-
set: set$
|
|
670
|
+
gauge: gauge$17,
|
|
671
|
+
set: set$17
|
|
683
672
|
};
|
|
684
673
|
|
|
685
|
-
let gauge$
|
|
674
|
+
let gauge$18 = makeOrThrow$1("envio_progress_events", "The number of events processed and reflected in the database.", chainIdLabelsSchema);
|
|
686
675
|
|
|
687
|
-
function set$
|
|
688
|
-
handleFloat$1(gauge$
|
|
676
|
+
function set$18(processedCount, chainId) {
|
|
677
|
+
handleFloat$1(gauge$18, chainId, processedCount);
|
|
689
678
|
}
|
|
690
679
|
|
|
691
680
|
let ProgressEventsCount = {
|
|
692
|
-
gauge: gauge$
|
|
693
|
-
set: set$
|
|
681
|
+
gauge: gauge$18,
|
|
682
|
+
set: set$18
|
|
694
683
|
};
|
|
695
684
|
|
|
696
|
-
let gauge$
|
|
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);
|
|
697
686
|
|
|
698
|
-
function set$
|
|
699
|
-
handleInt$1(gauge$
|
|
687
|
+
function set$19(latencyMs, chainId) {
|
|
688
|
+
handleInt$1(gauge$19, chainId, latencyMs);
|
|
700
689
|
}
|
|
701
690
|
|
|
702
691
|
let ProgressLatency = {
|
|
703
|
-
gauge: gauge$
|
|
704
|
-
set: set$
|
|
692
|
+
gauge: gauge$19,
|
|
693
|
+
set: set$19
|
|
705
694
|
};
|
|
706
695
|
|
|
707
696
|
let effectLabelsSchema = S$RescriptSchema.object(s => s.f("effect", S$RescriptSchema.string));
|
|
@@ -721,15 +710,15 @@ let EffectCalls = {
|
|
|
721
710
|
activeCallsCount: activeCallsCount
|
|
722
711
|
};
|
|
723
712
|
|
|
724
|
-
let gauge$
|
|
713
|
+
let gauge$20 = makeOrThrow$1("envio_effect_cache", "The number of items in the effect cache.", effectLabelsSchema);
|
|
725
714
|
|
|
726
|
-
function set$
|
|
727
|
-
handleInt$1(gauge$
|
|
715
|
+
function set$20(count, effectName) {
|
|
716
|
+
handleInt$1(gauge$20, effectName, count);
|
|
728
717
|
}
|
|
729
718
|
|
|
730
719
|
let EffectCacheCount = {
|
|
731
|
-
gauge: gauge$
|
|
732
|
-
set: set$
|
|
720
|
+
gauge: gauge$20,
|
|
721
|
+
set: set$20
|
|
733
722
|
};
|
|
734
723
|
|
|
735
724
|
let counter$7 = makeOrThrow("envio_effect_cache_invalidations", "The number of effect cache invalidations.", effectLabelsSchema);
|
|
@@ -743,18 +732,18 @@ let EffectCacheInvalidationsCount = {
|
|
|
743
732
|
increment: increment$8
|
|
744
733
|
};
|
|
745
734
|
|
|
746
|
-
let gauge$
|
|
735
|
+
let gauge$21 = makeOrThrow$1("envio_effect_queue", "The number of effect calls waiting in the rate limit queue.", effectLabelsSchema);
|
|
747
736
|
|
|
748
737
|
let timeCounter$6 = makeOrThrow("envio_effect_queue_wait_seconds", "The time spent waiting in the rate limit queue.", effectLabelsSchema);
|
|
749
738
|
|
|
750
|
-
function set$
|
|
751
|
-
handleInt$1(gauge$
|
|
739
|
+
function set$21(count, effectName) {
|
|
740
|
+
handleInt$1(gauge$21, effectName, count);
|
|
752
741
|
}
|
|
753
742
|
|
|
754
743
|
let EffectQueueCount = {
|
|
755
|
-
gauge: gauge$
|
|
744
|
+
gauge: gauge$21,
|
|
756
745
|
timeCounter: timeCounter$6,
|
|
757
|
-
set: set$
|
|
746
|
+
set: set$21
|
|
758
747
|
};
|
|
759
748
|
|
|
760
749
|
let loadLabelsSchema = S$RescriptSchema.schema(s => ({
|
|
@@ -858,7 +847,6 @@ export {
|
|
|
858
847
|
Info,
|
|
859
848
|
ProcessStartTimeSeconds,
|
|
860
849
|
IndexingAddresses,
|
|
861
|
-
IndexingMaxConcurrency,
|
|
862
850
|
IndexingConcurrency,
|
|
863
851
|
IndexingPartitions,
|
|
864
852
|
IndexingIdleTime,
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Throttled prune of stale entity-history rows below the safe checkpoint.
|
|
2
|
+
|
|
3
|
+
let runPrune = async (state: IndexerState.t) => {
|
|
4
|
+
switch state->IndexerState.getSafeCheckpointId {
|
|
5
|
+
| None => ()
|
|
6
|
+
| Some(safeCheckpointId) =>
|
|
7
|
+
let persistence = state->IndexerState.persistence
|
|
8
|
+
await persistence.storage.pruneStaleCheckpoints(~safeCheckpointId)
|
|
9
|
+
|
|
10
|
+
for idx in 0 to persistence.allEntities->Array.length - 1 {
|
|
11
|
+
if idx !== 0 {
|
|
12
|
+
// Add some delay between entities
|
|
13
|
+
// To unblock the pg client if it's needed for something else
|
|
14
|
+
await Utils.delay(1000)
|
|
15
|
+
}
|
|
16
|
+
let entityConfig = persistence.allEntities->Array.getUnsafe(idx)
|
|
17
|
+
let timeRef = Hrtime.makeTimer()
|
|
18
|
+
try {
|
|
19
|
+
let () = await persistence.storage.pruneStaleEntityHistory(
|
|
20
|
+
~entityName=entityConfig.name,
|
|
21
|
+
~entityIndex=entityConfig.index,
|
|
22
|
+
~safeCheckpointId,
|
|
23
|
+
)
|
|
24
|
+
} catch {
|
|
25
|
+
| exn =>
|
|
26
|
+
exn->ErrorHandling.mkLogAndRaise(
|
|
27
|
+
~msg=`Failed to prune stale entity history`,
|
|
28
|
+
~logger=Logging.createChild(
|
|
29
|
+
~params={
|
|
30
|
+
"entityName": entityConfig.name,
|
|
31
|
+
"safeCheckpointId": safeCheckpointId,
|
|
32
|
+
},
|
|
33
|
+
),
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
Prometheus.RollbackHistoryPrune.increment(
|
|
37
|
+
~timeSeconds=Hrtime.timeSince(timeRef)->Hrtime.toSecondsFloat,
|
|
38
|
+
~entityName=entityConfig.name,
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let schedule = (state: IndexerState.t) =>
|
|
45
|
+
state->IndexerState.pruneStaleEntityHistoryThrottler->Throttler.schedule(() => runPrune(state))
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Utils from "./Utils.res.mjs";
|
|
4
|
+
import * as Hrtime from "./bindings/Hrtime.res.mjs";
|
|
5
|
+
import * as Logging from "./Logging.res.mjs";
|
|
6
|
+
import * as Throttler from "./Throttler.res.mjs";
|
|
7
|
+
import * as Prometheus from "./Prometheus.res.mjs";
|
|
8
|
+
import * as IndexerState from "./IndexerState.res.mjs";
|
|
9
|
+
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
10
|
+
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
11
|
+
|
|
12
|
+
async function runPrune(state) {
|
|
13
|
+
let safeCheckpointId = IndexerState.getSafeCheckpointId(state);
|
|
14
|
+
if (safeCheckpointId === undefined) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
let persistence = IndexerState.persistence(state);
|
|
18
|
+
await persistence.storage.pruneStaleCheckpoints(safeCheckpointId);
|
|
19
|
+
for (let idx = 0, idx_finish = persistence.allEntities.length; idx < idx_finish; ++idx) {
|
|
20
|
+
if (idx !== 0) {
|
|
21
|
+
await Utils.delay(1000);
|
|
22
|
+
}
|
|
23
|
+
let entityConfig = persistence.allEntities[idx];
|
|
24
|
+
let timeRef = Hrtime.makeTimer();
|
|
25
|
+
try {
|
|
26
|
+
await persistence.storage.pruneStaleEntityHistory(entityConfig.name, entityConfig.index, safeCheckpointId);
|
|
27
|
+
} catch (raw_exn) {
|
|
28
|
+
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
29
|
+
ErrorHandling.mkLogAndRaise(Logging.createChild({
|
|
30
|
+
entityName: entityConfig.name,
|
|
31
|
+
safeCheckpointId: safeCheckpointId
|
|
32
|
+
}), `Failed to prune stale entity history`, exn);
|
|
33
|
+
}
|
|
34
|
+
Prometheus.RollbackHistoryPrune.increment(Hrtime.toSecondsFloat(Hrtime.timeSince(timeRef)), entityConfig.name);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function schedule(state) {
|
|
39
|
+
Throttler.schedule(IndexerState.pruneStaleEntityHistoryThrottler(state), () => runPrune(state));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
runPrune,
|
|
44
|
+
schedule,
|
|
45
|
+
}
|
|
46
|
+
/* Utils Not a pure module */
|
package/src/RawEvent.res
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
let convertFieldsToJson = (fields: option<dict<unknown>>) => {
|
|
2
|
+
switch fields {
|
|
3
|
+
| None => %raw(`{}`)
|
|
4
|
+
| Some(fields) =>
|
|
5
|
+
// Convert bigint fields to string. There are no fields with nested
|
|
6
|
+
// bigints, so iterating only the top level is safe.
|
|
7
|
+
fields
|
|
8
|
+
->Utils.Dict.mapValues(value =>
|
|
9
|
+
typeof(value) === #bigint
|
|
10
|
+
? value
|
|
11
|
+
->(Utils.magic: unknown => bigint)
|
|
12
|
+
->BigInt.toString
|
|
13
|
+
->(Utils.magic: string => unknown)
|
|
14
|
+
: value
|
|
15
|
+
)
|
|
16
|
+
->(Utils.magic: dict<unknown> => JSON.t)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Block and transaction are passed already extracted from the ecosystem's
|
|
21
|
+
// concrete payload (EVM or Fuel) — `RawEvent` stays payload-shape-agnostic and
|
|
22
|
+
// only needs them as opaque field bags to serialise.
|
|
23
|
+
let make = (
|
|
24
|
+
eventItem: Internal.eventItem,
|
|
25
|
+
~block,
|
|
26
|
+
~transaction,
|
|
27
|
+
~params: Internal.eventParams,
|
|
28
|
+
~srcAddress: Address.t,
|
|
29
|
+
~cleanUpRawEventFieldsInPlace: JSON.t => unit,
|
|
30
|
+
): Internal.rawEvent => {
|
|
31
|
+
let {eventConfig, chain, blockNumber, blockHash, timestamp: blockTimestamp, logIndex} = eventItem
|
|
32
|
+
let chainId = chain->ChainMap.Chain.toChainId
|
|
33
|
+
let eventId = EventUtils.packEventIndex(~logIndex, ~blockNumber)
|
|
34
|
+
let blockFields =
|
|
35
|
+
block
|
|
36
|
+
->(Utils.magic: 'block => option<dict<unknown>>)
|
|
37
|
+
->convertFieldsToJson
|
|
38
|
+
let transactionFields =
|
|
39
|
+
transaction
|
|
40
|
+
->(Utils.magic: 'transaction => option<dict<unknown>>)
|
|
41
|
+
->convertFieldsToJson
|
|
42
|
+
|
|
43
|
+
blockFields->cleanUpRawEventFieldsInPlace
|
|
44
|
+
|
|
45
|
+
// Serialize to unknown, because serializing to Js.Json.t fails for Bytes Fuel type, since it has unknown schema
|
|
46
|
+
let params =
|
|
47
|
+
params
|
|
48
|
+
->S.reverseConvertOrThrow(eventConfig.paramsRawEventSchema)
|
|
49
|
+
->(Utils.magic: unknown => JSON.t)
|
|
50
|
+
let params = if params === %raw(`null`) {
|
|
51
|
+
// Should probably make the params field nullable
|
|
52
|
+
// But this is currently needed to make events
|
|
53
|
+
// with empty params work
|
|
54
|
+
%raw(`"null"`)
|
|
55
|
+
} else {
|
|
56
|
+
params
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
{
|
|
60
|
+
chain_id: chainId,
|
|
61
|
+
event_id: eventId,
|
|
62
|
+
event_name: eventConfig.name,
|
|
63
|
+
contract_name: eventConfig.contractName,
|
|
64
|
+
block_number: blockNumber,
|
|
65
|
+
log_index: logIndex,
|
|
66
|
+
src_address: srcAddress,
|
|
67
|
+
block_hash: blockHash,
|
|
68
|
+
block_timestamp: blockTimestamp,
|
|
69
|
+
block_fields: blockFields,
|
|
70
|
+
transaction_fields: transactionFields,
|
|
71
|
+
params,
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Utils from "./Utils.res.mjs";
|
|
4
|
+
import * as EventUtils from "./EventUtils.res.mjs";
|
|
5
|
+
import * as S$RescriptSchema from "rescript-schema/src/S.res.mjs";
|
|
6
|
+
|
|
7
|
+
function convertFieldsToJson(fields) {
|
|
8
|
+
if (fields !== undefined) {
|
|
9
|
+
return Utils.Dict.mapValues(fields, value => {
|
|
10
|
+
if (typeof value === "bigint") {
|
|
11
|
+
return value.toString();
|
|
12
|
+
} else {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
} else {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function make(eventItem, block, transaction, params, srcAddress, cleanUpRawEventFieldsInPlace) {
|
|
22
|
+
let logIndex = eventItem.logIndex;
|
|
23
|
+
let blockNumber = eventItem.blockNumber;
|
|
24
|
+
let eventConfig = eventItem.eventConfig;
|
|
25
|
+
let eventId = EventUtils.packEventIndex(blockNumber, logIndex);
|
|
26
|
+
let blockFields = convertFieldsToJson(block);
|
|
27
|
+
let transactionFields = convertFieldsToJson(transaction);
|
|
28
|
+
cleanUpRawEventFieldsInPlace(blockFields);
|
|
29
|
+
let params$1 = S$RescriptSchema.reverseConvertOrThrow(params, eventConfig.paramsRawEventSchema);
|
|
30
|
+
let params$2 = params$1 === null ? "null" : params$1;
|
|
31
|
+
return {
|
|
32
|
+
chain_id: eventItem.chain,
|
|
33
|
+
event_id: eventId,
|
|
34
|
+
event_name: eventConfig.name,
|
|
35
|
+
contract_name: eventConfig.contractName,
|
|
36
|
+
block_number: blockNumber,
|
|
37
|
+
log_index: logIndex,
|
|
38
|
+
src_address: srcAddress,
|
|
39
|
+
block_hash: eventItem.blockHash,
|
|
40
|
+
block_timestamp: eventItem.timestamp,
|
|
41
|
+
block_fields: blockFields,
|
|
42
|
+
transaction_fields: transactionFields,
|
|
43
|
+
params: params$2
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
convertFieldsToJson,
|
|
49
|
+
make,
|
|
50
|
+
}
|
|
51
|
+
/* Utils Not a pure module */
|