envio 2.29.2 → 2.30.0
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/evm.schema.json +18 -0
- package/package.json +5 -5
- package/src/Address.res +23 -0
- package/src/Address.res.js +14 -0
- package/src/Batch.res +103 -90
- package/src/Batch.res.js +81 -101
- package/src/FetchState.res +73 -129
- package/src/FetchState.res.js +87 -149
- package/src/Hasura.res +178 -124
- package/src/Hasura.res.js +115 -54
- package/src/Persistence.res +1 -13
- package/src/Persistence.res.js +1 -7
- package/src/PgStorage.res +0 -7
- package/src/PgStorage.res.js +1 -5
- package/src/Utils.res +10 -0
- package/src/Utils.res.js +5 -0
- package/src/bindings/Ethers.res +35 -11
- package/src/bindings/Ethers.res.js +21 -1
- package/src/bindings/PromClient.res +10 -0
- package/src/db/InternalTable.res +1 -59
- package/src/db/InternalTable.res.js +2 -34
- package/src/sources/HyperSyncClient.res +8 -2
- package/src/sources/HyperSyncClient.res.js +3 -2
- package/src/sources/HyperSyncSource.res +8 -1
- package/src/sources/HyperSyncSource.res.js +7 -2
- package/src/sources/RpcSource.res +153 -3
- package/src/sources/RpcSource.res.js +195 -73
|
@@ -11,6 +11,7 @@ var Ethers = require("../bindings/Ethers.res.js");
|
|
|
11
11
|
var Hrtime = require("../bindings/Hrtime.res.js");
|
|
12
12
|
var Js_exn = require("rescript/lib/js/js_exn.js");
|
|
13
13
|
var Source = require("./Source.res.js");
|
|
14
|
+
var Address = require("../Address.res.js");
|
|
14
15
|
var Logging = require("../Logging.res.js");
|
|
15
16
|
var $$Promise = require("../bindings/Promise.res.js");
|
|
16
17
|
var Belt_Int = require("rescript/lib/js/belt_Int.js");
|
|
@@ -22,6 +23,7 @@ var Caml_option = require("rescript/lib/js/caml_option.js");
|
|
|
22
23
|
var EventRouter = require("./EventRouter.res.js");
|
|
23
24
|
var LogSelection = require("../LogSelection.res.js");
|
|
24
25
|
var Caml_exceptions = require("rescript/lib/js/caml_exceptions.js");
|
|
26
|
+
var HyperSyncClient = require("./HyperSyncClient.res.js");
|
|
25
27
|
var Caml_splice_call = require("rescript/lib/js/caml_splice_call.js");
|
|
26
28
|
var S$RescriptSchema = require("rescript-schema/src/S.res.js");
|
|
27
29
|
var Caml_js_exceptions = require("rescript/lib/js/caml_js_exceptions.js");
|
|
@@ -38,9 +40,10 @@ function getKnownBlock(provider, blockNumber) {
|
|
|
38
40
|
});
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
async function getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber, backoffMsOnFailure) {
|
|
43
|
+
async function getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber, backoffMsOnFailure, lowercaseAddresses) {
|
|
44
|
+
var result;
|
|
42
45
|
try {
|
|
43
|
-
|
|
46
|
+
result = await getKnownBlock(provider, blockNumber);
|
|
44
47
|
}
|
|
45
48
|
catch (raw_err){
|
|
46
49
|
var err = Caml_js_exceptions.internalToOCamlException(raw_err);
|
|
@@ -52,8 +55,12 @@ async function getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber
|
|
|
52
55
|
type: "EXPONENTIAL_BACKOFF"
|
|
53
56
|
});
|
|
54
57
|
await Time.resolvePromiseAfterDelay(backoffMsOnFailure);
|
|
55
|
-
return await getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber, (backoffMsOnFailure << 1));
|
|
58
|
+
return await getKnownBlockWithBackoff(provider, sourceName, chain, blockNumber, (backoffMsOnFailure << 1), lowercaseAddresses);
|
|
56
59
|
}
|
|
60
|
+
if (lowercaseAddresses) {
|
|
61
|
+
result.miner = Address.Evm.fromAddressLowercaseOrThrow(result.miner);
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
57
64
|
}
|
|
58
65
|
|
|
59
66
|
var suggestedRangeRegExp = /retry with the range (\d+)-(\d+)/;
|
|
@@ -485,6 +492,9 @@ function sanitizeUrl(url) {
|
|
|
485
492
|
}
|
|
486
493
|
|
|
487
494
|
function make(param) {
|
|
495
|
+
var lowercaseAddresses = param.lowercaseAddresses;
|
|
496
|
+
var shouldUseHypersyncClientDecoder = param.shouldUseHypersyncClientDecoder;
|
|
497
|
+
var allEventSignatures = param.allEventSignatures;
|
|
488
498
|
var eventRouter = param.eventRouter;
|
|
489
499
|
var chain = param.chain;
|
|
490
500
|
var url = param.url;
|
|
@@ -510,7 +520,7 @@ function make(param) {
|
|
|
510
520
|
});
|
|
511
521
|
}), undefined, undefined, undefined, undefined);
|
|
512
522
|
var blockLoader = LazyLoader.make((function (blockNumber) {
|
|
513
|
-
return getKnownBlockWithBackoff(provider, name, chain, blockNumber, 1000);
|
|
523
|
+
return getKnownBlockWithBackoff(provider, name, chain, blockNumber, 1000, lowercaseAddresses);
|
|
514
524
|
}), (function (am, exn) {
|
|
515
525
|
Logging.error({
|
|
516
526
|
err: exn,
|
|
@@ -526,13 +536,51 @@ function make(param) {
|
|
|
526
536
|
var getEventBlockOrThrow = makeThrowingGetEventBlock(function (blockNumber) {
|
|
527
537
|
return LazyLoader.get(blockLoader, blockNumber);
|
|
528
538
|
});
|
|
529
|
-
var getEventTransactionOrThrow = makeThrowingGetEventTransaction(Ethers.JsonRpcProvider.makeGetTransactionFields(function (__x) {
|
|
530
|
-
|
|
531
|
-
|
|
539
|
+
var getEventTransactionOrThrow = makeThrowingGetEventTransaction(Ethers.JsonRpcProvider.makeGetTransactionFields((function (__x) {
|
|
540
|
+
return LazyLoader.get(transactionLoader, __x);
|
|
541
|
+
}), lowercaseAddresses));
|
|
532
542
|
var contractNameAbiMapping = {};
|
|
533
543
|
Belt_Array.forEach(param.contracts, (function (contract) {
|
|
534
544
|
contractNameAbiMapping[contract.name] = contract.abi;
|
|
535
545
|
}));
|
|
546
|
+
var convertEthersLogToHyperSyncEvent = function (log) {
|
|
547
|
+
var hyperSyncLog_removed = Belt_Option.getWithDefault(log.removed, false);
|
|
548
|
+
var hyperSyncLog_logIndex = log.index;
|
|
549
|
+
var hyperSyncLog_transactionIndex = log.transactionIndex;
|
|
550
|
+
var hyperSyncLog_transactionHash = log.transactionHash;
|
|
551
|
+
var hyperSyncLog_blockHash = log.blockHash;
|
|
552
|
+
var hyperSyncLog_blockNumber = log.blockNumber;
|
|
553
|
+
var hyperSyncLog_address = Caml_option.some(log.address);
|
|
554
|
+
var hyperSyncLog_data = log.data;
|
|
555
|
+
var hyperSyncLog_topics = Belt_Array.map(log.topics, (function (topic) {
|
|
556
|
+
return topic;
|
|
557
|
+
}));
|
|
558
|
+
var hyperSyncLog = {
|
|
559
|
+
removed: hyperSyncLog_removed,
|
|
560
|
+
logIndex: hyperSyncLog_logIndex,
|
|
561
|
+
transactionIndex: hyperSyncLog_transactionIndex,
|
|
562
|
+
transactionHash: hyperSyncLog_transactionHash,
|
|
563
|
+
blockHash: hyperSyncLog_blockHash,
|
|
564
|
+
blockNumber: hyperSyncLog_blockNumber,
|
|
565
|
+
address: hyperSyncLog_address,
|
|
566
|
+
data: hyperSyncLog_data,
|
|
567
|
+
topics: hyperSyncLog_topics
|
|
568
|
+
};
|
|
569
|
+
return {
|
|
570
|
+
log: hyperSyncLog
|
|
571
|
+
};
|
|
572
|
+
};
|
|
573
|
+
var hscDecoder = {
|
|
574
|
+
contents: undefined
|
|
575
|
+
};
|
|
576
|
+
var getHscDecoder = function () {
|
|
577
|
+
var decoder = hscDecoder.contents;
|
|
578
|
+
if (decoder !== undefined) {
|
|
579
|
+
return decoder;
|
|
580
|
+
} else {
|
|
581
|
+
return HyperSyncClient.Decoder.fromSignatures(allEventSignatures);
|
|
582
|
+
}
|
|
583
|
+
};
|
|
536
584
|
var getItemsOrThrow = async function (fromBlock, toBlock, addressesByContractName, indexingContracts, currentBlockHeight, partitionId, selection, param, param$1) {
|
|
537
585
|
var startFetchingBatchTimeRef = Hrtime.makeTimer();
|
|
538
586
|
var maxSuggestedBlockInterval = mutSuggestedBlockIntervals[maxSuggestedBlockIntervalKey];
|
|
@@ -548,77 +596,151 @@ function make(param) {
|
|
|
548
596
|
return LazyLoader.get(blockLoader, blockNumber);
|
|
549
597
|
}), syncConfig, provider, mutSuggestedBlockIntervals, partitionId);
|
|
550
598
|
var latestFetchedBlock = match$2.latestFetchedBlock;
|
|
599
|
+
var logs = match$2.logs;
|
|
551
600
|
var executedBlockInterval = (suggestedToBlock - fromBlock | 0) + 1 | 0;
|
|
552
601
|
if (executedBlockInterval >= suggestedBlockInterval && !Utils.Dict.has(mutSuggestedBlockIntervals, maxSuggestedBlockIntervalKey)) {
|
|
553
602
|
mutSuggestedBlockIntervals[partitionId] = Caml.int_min(executedBlockInterval + syncConfig.accelerationAdditive | 0, syncConfig.intervalCeiling);
|
|
554
603
|
}
|
|
555
|
-
var parsedQueueItems
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
604
|
+
var parsedQueueItems;
|
|
605
|
+
if (shouldUseHypersyncClientDecoder) {
|
|
606
|
+
var hyperSyncEvents = Belt_Array.map(logs, convertEthersLogToHyperSyncEvent);
|
|
607
|
+
var parsedEvents;
|
|
608
|
+
try {
|
|
609
|
+
parsedEvents = await getHscDecoder().decodeEvents(hyperSyncEvents);
|
|
610
|
+
}
|
|
611
|
+
catch (raw_exn){
|
|
612
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
613
|
+
throw {
|
|
614
|
+
RE_EXN_ID: Source.GetItemsError,
|
|
615
|
+
_1: {
|
|
616
|
+
TAG: "FailedParsingItems",
|
|
617
|
+
exn: exn,
|
|
618
|
+
blockNumber: fromBlock,
|
|
619
|
+
logIndex: 0,
|
|
620
|
+
message: "Failed to parse events using hypersync client decoder. Please double-check your ABI."
|
|
621
|
+
},
|
|
622
|
+
Error: new Error()
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
parsedQueueItems = await Promise.all(Belt_Array.keepMap(Belt_Array.zip(logs, parsedEvents), (function (param) {
|
|
626
|
+
var maybeDecodedEvent = param[1];
|
|
627
|
+
var log = param[0];
|
|
628
|
+
var topic0 = Belt_Option.getWithDefault(Belt_Array.get(log.topics, 0), "0x0");
|
|
629
|
+
var routedAddress = lowercaseAddresses ? Address.Evm.fromAddressLowercaseOrThrow(log.address) : log.address;
|
|
630
|
+
var eventConfig = EventRouter.get(eventRouter, EventRouter.getEvmEventId(topic0, log.topics.length), routedAddress, log.blockNumber, indexingContracts);
|
|
631
|
+
if (eventConfig !== undefined && !(maybeDecodedEvent === null || maybeDecodedEvent === undefined)) {
|
|
632
|
+
return Caml_option.some((async function () {
|
|
633
|
+
var match;
|
|
634
|
+
try {
|
|
635
|
+
match = await Promise.all([
|
|
636
|
+
getEventBlockOrThrow(log),
|
|
637
|
+
getEventTransactionOrThrow(log, eventConfig.transactionSchema)
|
|
638
|
+
]);
|
|
639
|
+
}
|
|
640
|
+
catch (raw_exn){
|
|
641
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
642
|
+
throw {
|
|
643
|
+
RE_EXN_ID: Source.GetItemsError,
|
|
644
|
+
_1: {
|
|
645
|
+
TAG: "FailedGettingFieldSelection",
|
|
646
|
+
exn: exn,
|
|
647
|
+
blockNumber: log.blockNumber,
|
|
648
|
+
logIndex: log.index,
|
|
649
|
+
message: "Failed getting selected fields. Please double-check your RPC provider returns correct data."
|
|
650
|
+
},
|
|
651
|
+
Error: new Error()
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
var block = match[0];
|
|
655
|
+
return {
|
|
656
|
+
kind: 0,
|
|
657
|
+
eventConfig: eventConfig,
|
|
658
|
+
timestamp: block.timestamp,
|
|
659
|
+
chain: chain,
|
|
660
|
+
blockNumber: block.number,
|
|
661
|
+
logIndex: log.index,
|
|
662
|
+
event: {
|
|
663
|
+
params: eventConfig.convertHyperSyncEventArgs(maybeDecodedEvent),
|
|
664
|
+
chainId: chain,
|
|
665
|
+
srcAddress: routedAddress,
|
|
666
|
+
logIndex: log.index,
|
|
667
|
+
transaction: match[1],
|
|
668
|
+
block: block
|
|
669
|
+
}
|
|
670
|
+
};
|
|
671
|
+
})());
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
})));
|
|
675
|
+
} else {
|
|
676
|
+
parsedQueueItems = await Promise.all(Belt_Array.keepMap(logs, (function (log) {
|
|
677
|
+
var topic0 = log.topics[0];
|
|
678
|
+
var eventConfig = EventRouter.get(eventRouter, EventRouter.getEvmEventId(topic0, log.topics.length), log.address, log.blockNumber, indexingContracts);
|
|
679
|
+
if (eventConfig === undefined) {
|
|
680
|
+
return ;
|
|
681
|
+
}
|
|
682
|
+
var blockNumber = log.blockNumber;
|
|
683
|
+
var logIndex = log.index;
|
|
684
|
+
return Caml_option.some((async function () {
|
|
685
|
+
var match;
|
|
686
|
+
try {
|
|
687
|
+
match = await Promise.all([
|
|
688
|
+
getEventBlockOrThrow(log),
|
|
689
|
+
getEventTransactionOrThrow(log, eventConfig.transactionSchema)
|
|
690
|
+
]);
|
|
691
|
+
}
|
|
692
|
+
catch (raw_exn){
|
|
693
|
+
var exn = Caml_js_exceptions.internalToOCamlException(raw_exn);
|
|
694
|
+
throw {
|
|
695
|
+
RE_EXN_ID: Source.GetItemsError,
|
|
696
|
+
_1: {
|
|
697
|
+
TAG: "FailedGettingFieldSelection",
|
|
698
|
+
exn: exn,
|
|
699
|
+
blockNumber: blockNumber,
|
|
700
|
+
logIndex: logIndex,
|
|
701
|
+
message: "Failed getting selected fields. Please double-check your RPC provider returns correct data."
|
|
702
|
+
},
|
|
703
|
+
Error: new Error()
|
|
704
|
+
};
|
|
705
|
+
}
|
|
706
|
+
var block = match[0];
|
|
707
|
+
var decodedEvent;
|
|
708
|
+
try {
|
|
709
|
+
decodedEvent = Viem.parseLogOrThrow(contractNameAbiMapping, eventConfig.contractName, log.topics, log.data);
|
|
710
|
+
}
|
|
711
|
+
catch (raw_exn$1){
|
|
712
|
+
var exn$1 = Caml_js_exceptions.internalToOCamlException(raw_exn$1);
|
|
713
|
+
throw {
|
|
714
|
+
RE_EXN_ID: Source.GetItemsError,
|
|
715
|
+
_1: {
|
|
716
|
+
TAG: "FailedParsingItems",
|
|
717
|
+
exn: exn$1,
|
|
718
|
+
blockNumber: blockNumber,
|
|
719
|
+
logIndex: logIndex,
|
|
720
|
+
message: "Failed to parse event with viem, please double-check your ABI."
|
|
721
|
+
},
|
|
722
|
+
Error: new Error()
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
return {
|
|
726
|
+
kind: 0,
|
|
727
|
+
eventConfig: eventConfig,
|
|
728
|
+
timestamp: block.timestamp,
|
|
729
|
+
chain: chain,
|
|
730
|
+
blockNumber: block.number,
|
|
615
731
|
logIndex: log.index,
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
732
|
+
event: {
|
|
733
|
+
params: decodedEvent.args,
|
|
734
|
+
chainId: chain,
|
|
735
|
+
srcAddress: log.address,
|
|
736
|
+
logIndex: log.index,
|
|
737
|
+
transaction: match[1],
|
|
738
|
+
block: block
|
|
739
|
+
}
|
|
740
|
+
};
|
|
741
|
+
})());
|
|
742
|
+
})));
|
|
743
|
+
}
|
|
622
744
|
var optFirstBlockParent = await firstBlockParentPromise;
|
|
623
745
|
var totalTimeElapsed = Hrtime.intFromMillis(Hrtime.toMillis(Hrtime.timeSince(startFetchingBatchTimeRef)));
|
|
624
746
|
var reorgGuard_rangeLastBlock = {
|