envio 3.3.0-alpha.0 → 3.3.0-alpha.10
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 +10 -0
- package/index.d.ts +45 -25
- package/package.json +7 -7
- package/src/Address.res +5 -2
- package/src/Address.res.mjs +3 -1
- package/src/Api.res +1 -1
- package/src/Api.res.mjs +1 -1
- package/src/Batch.res +0 -6
- package/src/Batch.res.mjs +1 -12
- package/src/BatchProcessing.res +7 -12
- package/src/BatchProcessing.res.mjs +8 -7
- package/src/Bin.res +3 -0
- package/src/Bin.res.mjs +4 -0
- package/src/ChainFetching.res +48 -16
- package/src/ChainFetching.res.mjs +36 -17
- package/src/ChainMetadata.res +1 -11
- package/src/ChainMetadata.res.mjs +1 -10
- package/src/ChainState.res +628 -149
- package/src/ChainState.res.mjs +440 -102
- package/src/ChainState.resi +74 -4
- package/src/Config.res +61 -33
- package/src/Config.res.mjs +50 -10
- package/src/ContractRegisterContext.res +2 -12
- package/src/ContractRegisterContext.res.mjs +3 -5
- package/src/Core.res +14 -3
- package/src/CrossChainState.res +142 -93
- package/src/CrossChainState.res.mjs +88 -60
- package/src/CrossChainState.resi +2 -10
- package/src/Ecosystem.res +5 -6
- package/src/Ecosystem.res.mjs +3 -3
- package/src/Env.res +0 -7
- package/src/Env.res.mjs +0 -6
- package/src/Envio.res +17 -11
- package/src/EnvioGlobal.res +53 -0
- package/src/EnvioGlobal.res.mjs +31 -0
- package/src/EventConfigBuilder.res +177 -88
- package/src/EventConfigBuilder.res.mjs +99 -42
- package/src/EventProcessing.res +74 -28
- package/src/EventProcessing.res.mjs +55 -29
- package/src/ExitOnCaughtUp.res +10 -2
- package/src/ExitOnCaughtUp.res.mjs +10 -1
- package/src/FetchState.res +558 -300
- package/src/FetchState.res.mjs +437 -423
- package/src/HandlerLoader.res +8 -104
- package/src/HandlerLoader.res.mjs +2 -81
- package/src/HandlerRegister.res +518 -144
- package/src/HandlerRegister.res.mjs +285 -133
- package/src/HandlerRegister.resi +24 -8
- package/src/IndexerLoop.res +2 -3
- package/src/IndexerLoop.res.mjs +1 -1
- package/src/IndexerState.res +10 -11
- package/src/IndexerState.res.mjs +14 -11
- package/src/IndexerState.resi +2 -5
- package/src/IndexingAddresses.res +108 -0
- package/src/IndexingAddresses.res.mjs +101 -0
- package/src/IndexingAddresses.resi +34 -0
- package/src/Internal.res +155 -46
- package/src/Internal.res.mjs +30 -2
- package/src/LoadLayer.res +5 -5
- package/src/LoadLayer.res.mjs +6 -6
- package/src/LogSelection.res +102 -165
- package/src/LogSelection.res.mjs +101 -116
- package/src/Main.res +71 -236
- package/src/Main.res.mjs +60 -145
- package/src/Metrics.res +74 -0
- package/src/Metrics.res.mjs +75 -0
- package/src/PgStorage.res +4 -4
- package/src/PgStorage.res.mjs +5 -5
- package/src/Prometheus.res +10 -74
- package/src/Prometheus.res.mjs +124 -186
- package/src/PruneStaleHistory.res +2 -2
- package/src/PruneStaleHistory.res.mjs +3 -3
- package/src/RawEvent.res +7 -2
- package/src/RawEvent.res.mjs +4 -4
- package/src/Rollback.res +3 -3
- package/src/Rollback.res.mjs +4 -4
- package/src/RollbackCommit.res +4 -1
- package/src/RollbackCommit.res.mjs +3 -2
- package/src/SimulateDeadInputTracker.res +85 -0
- package/src/SimulateDeadInputTracker.res.mjs +73 -0
- package/src/SimulateDeadInputTracker.resi +12 -0
- package/src/SimulateItems.res +91 -23
- package/src/SimulateItems.res.mjs +55 -32
- package/src/TestIndexer.res +54 -40
- package/src/TestIndexer.res.mjs +37 -30
- package/src/bindings/Performance.res +7 -0
- package/src/bindings/Performance.res.mjs +21 -0
- package/src/bindings/Performance.resi +7 -0
- package/src/bindings/Viem.res +0 -41
- package/src/bindings/Viem.res.mjs +1 -43
- package/src/sources/BlockStore.res +46 -0
- package/src/sources/BlockStore.res.mjs +24 -0
- package/src/sources/EventRouter.res +36 -33
- package/src/sources/EventRouter.res.mjs +13 -14
- package/src/sources/Evm.res +83 -72
- package/src/sources/Evm.res.mjs +53 -69
- package/src/sources/EvmChain.res +18 -20
- package/src/sources/EvmChain.res.mjs +15 -15
- package/src/sources/EvmRpcClient.res +74 -5
- package/src/sources/EvmRpcClient.res.mjs +13 -4
- package/src/sources/FieldMask.res +39 -0
- package/src/sources/FieldMask.res.mjs +42 -0
- package/src/sources/Fuel.res +9 -6
- package/src/sources/Fuel.res.mjs +5 -10
- package/src/sources/HyperFuelSource.res +46 -50
- package/src/sources/HyperFuelSource.res.mjs +64 -54
- package/src/sources/HyperSync.res +39 -7
- package/src/sources/HyperSync.res.mjs +57 -37
- package/src/sources/HyperSync.resi +12 -2
- package/src/sources/HyperSyncClient.res +22 -111
- package/src/sources/HyperSyncClient.res.mjs +2 -30
- package/src/sources/HyperSyncHeightStream.res +1 -8
- package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
- package/src/sources/HyperSyncSource.res +94 -107
- package/src/sources/HyperSyncSource.res.mjs +82 -86
- package/src/sources/Rpc.res +15 -47
- package/src/sources/Rpc.res.mjs +25 -56
- package/src/sources/RpcSource.res +320 -467
- package/src/sources/RpcSource.res.mjs +268 -385
- package/src/sources/RpcWebSocketHeightStream.res +0 -5
- package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
- package/src/sources/SimulateSource.res +10 -4
- package/src/sources/SimulateSource.res.mjs +16 -6
- package/src/sources/Source.res +34 -6
- package/src/sources/SourceManager.res +86 -27
- package/src/sources/SourceManager.res.mjs +84 -47
- package/src/sources/SourceManager.resi +12 -3
- package/src/sources/Svm.res +31 -16
- package/src/sources/Svm.res.mjs +36 -13
- package/src/sources/SvmHyperSyncClient.res +5 -32
- package/src/sources/SvmHyperSyncSource.res +159 -134
- package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
- package/src/sources/TransactionStore.res +49 -0
- package/src/sources/TransactionStore.res.mjs +30 -0
- package/src/tui/Tui.res +13 -16
- package/src/tui/Tui.res.mjs +12 -14
- package/svm.schema.json +49 -37
- package/src/bindings/Hrtime.res +0 -58
- package/src/bindings/Hrtime.res.mjs +0 -90
- package/src/bindings/Hrtime.resi +0 -30
|
@@ -4,9 +4,9 @@ import * as Utils from "./Utils.res.mjs";
|
|
|
4
4
|
import * as Logging from "./Logging.res.mjs";
|
|
5
5
|
import * as Ecosystem from "./Ecosystem.res.mjs";
|
|
6
6
|
import * as ChainState from "./ChainState.res.mjs";
|
|
7
|
-
import * as FetchState from "./FetchState.res.mjs";
|
|
8
7
|
import * as Prometheus from "./Prometheus.res.mjs";
|
|
9
8
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
9
|
+
import * as Stdlib_Array from "@rescript/runtime/lib/es6/Stdlib_Array.js";
|
|
10
10
|
import * as ChainMetadata from "./ChainMetadata.res.mjs";
|
|
11
11
|
import * as ErrorHandling from "./ErrorHandling.res.mjs";
|
|
12
12
|
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
@@ -17,7 +17,8 @@ import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
|
|
|
17
17
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
18
18
|
import * as ContractRegisterContext from "./ContractRegisterContext.res.mjs";
|
|
19
19
|
|
|
20
|
-
async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
20
|
+
async function runContractRegistersOrThrow(itemsWithContractRegister, config, transactionStore, blockStore) {
|
|
21
|
+
await ChainState.materializePageItems(itemsWithContractRegister, transactionStore, blockStore, config.ecosystem.name);
|
|
21
22
|
let itemsWithDcs = [];
|
|
22
23
|
let onRegister = (item, contractAddress, contractName) => {
|
|
23
24
|
let dc_registrationBlock = item.blockNumber;
|
|
@@ -37,9 +38,9 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
|
37
38
|
let promises = [];
|
|
38
39
|
for (let idx = 0, idx_finish = itemsWithContractRegister.length; idx < idx_finish; ++idx) {
|
|
39
40
|
let item = itemsWithContractRegister[idx];
|
|
40
|
-
let match = item.
|
|
41
|
+
let match = item.onEventRegistration;
|
|
41
42
|
let contractRegister = match.contractRegister;
|
|
42
|
-
let contractRegister$1 = contractRegister !== undefined ? contractRegister : Stdlib_JsError.throwWithMessage("Contract register is not set for event " + match.name);
|
|
43
|
+
let contractRegister$1 = contractRegister !== undefined ? contractRegister : Stdlib_JsError.throwWithMessage("Contract register is not set for event " + match.eventConfig.name);
|
|
43
44
|
let errorMessage = "Event contractRegister failed, please fix the error to keep the indexer running smoothly";
|
|
44
45
|
try {
|
|
45
46
|
let params = {
|
|
@@ -71,10 +72,10 @@ async function runContractRegistersOrThrow(itemsWithContractRegister, config) {
|
|
|
71
72
|
return itemsWithDcs;
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
function applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query) {
|
|
75
|
+
function applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, latestFetchedBlock, query, transactionStore, blockStore) {
|
|
75
76
|
let chainState = IndexerState.getChainState(state, chain);
|
|
76
77
|
let wasFetchingAtHead = ChainState.isFetchingAtHead(chainState);
|
|
77
|
-
ChainState.handleQueryResult(chainState, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight);
|
|
78
|
+
ChainState.handleQueryResult(chainState, query, newItems, newItemsWithDcs, latestFetchedBlock, knownHeight, transactionStore, blockStore);
|
|
78
79
|
if (IndexerState.exitAfterFirstEventBlock(state) && newItems.length !== 0) {
|
|
79
80
|
ChainState.setEndBlockToFirstEvent(chainState, newItems[0].blockNumber);
|
|
80
81
|
}
|
|
@@ -94,12 +95,31 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
94
95
|
let stats = response.stats;
|
|
95
96
|
let latestFetchedBlockTimestamp = response.latestFetchedBlockTimestamp;
|
|
96
97
|
let latestFetchedBlockNumber = response.latestFetchedBlockNumber;
|
|
98
|
+
let fromBlockQueried = response.fromBlockQueried;
|
|
99
|
+
let blockStore = response.blockStore;
|
|
100
|
+
let transactionStore = response.transactionStore;
|
|
97
101
|
let parsedQueueItems = response.parsedQueueItems;
|
|
98
102
|
let knownHeight = response.knownHeight;
|
|
99
|
-
if (knownHeight > ChainState.
|
|
103
|
+
if (knownHeight > ChainState.knownHeight(chainState)) {
|
|
100
104
|
Prometheus.SourceHeight.set(SourceManager.getActiveSource(ChainState.sourceManager(chainState)).name, ChainState.chainConfig(chainState).id, knownHeight);
|
|
101
105
|
}
|
|
102
|
-
Prometheus.FetchingBlockRange.increment(chain, stats["total time elapsed (s)"], Stdlib_Option.getOr(stats["parsing time (s)"], 0), parsedQueueItems.length, (latestFetchedBlockNumber -
|
|
106
|
+
Prometheus.FetchingBlockRange.increment(chain, stats["total time elapsed (s)"], Stdlib_Option.getOr(stats["parsing time (s)"], 0), parsedQueueItems.length, (latestFetchedBlockNumber - fromBlockQueried | 0) + 1 | 0);
|
|
107
|
+
let numContractRegisterEvents = Stdlib_Array.reduce(parsedQueueItems, 0, (count, item) => {
|
|
108
|
+
if (item.onEventRegistration.contractRegister !== undefined) {
|
|
109
|
+
return count + 1 | 0;
|
|
110
|
+
} else {
|
|
111
|
+
return count;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
Logging.trace({
|
|
115
|
+
msg: "Finished querying",
|
|
116
|
+
chainId: chain,
|
|
117
|
+
partitionId: query.partitionId,
|
|
118
|
+
fromBlock: fromBlockQueried,
|
|
119
|
+
toBlock: latestFetchedBlockNumber,
|
|
120
|
+
numEvents: parsedQueueItems.length,
|
|
121
|
+
numContractRegisterEvents: numContractRegisterEvents
|
|
122
|
+
});
|
|
103
123
|
let reorgResult = ChainState.registerReorgGuard(chainState, response.blockHashes, knownHeight);
|
|
104
124
|
let rollbackWithReorgDetectedBlockNumber;
|
|
105
125
|
if (typeof reorgResult !== "object") {
|
|
@@ -123,7 +143,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
123
143
|
let newItems = [];
|
|
124
144
|
for (let idx = 0, idx_finish = parsedQueueItems.length; idx < idx_finish; ++idx) {
|
|
125
145
|
let item = parsedQueueItems[idx];
|
|
126
|
-
if (item.
|
|
146
|
+
if (item.onEventRegistration.contractRegister !== undefined) {
|
|
127
147
|
itemsWithContractRegister.push(item);
|
|
128
148
|
}
|
|
129
149
|
newItems.push(item);
|
|
@@ -133,7 +153,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
133
153
|
applyQueryResponse(state, chain, newItems, newItemsWithDcs, knownHeight, {
|
|
134
154
|
blockNumber: latestFetchedBlockNumber,
|
|
135
155
|
blockTimestamp: latestFetchedBlockTimestamp
|
|
136
|
-
}, query);
|
|
156
|
+
}, query, transactionStore, blockStore);
|
|
137
157
|
ChainMetadata.stage(state);
|
|
138
158
|
scheduleFetch();
|
|
139
159
|
return scheduleProcessing();
|
|
@@ -144,7 +164,7 @@ async function onQueryResponse(state, param, stateId, scheduleFetch, schedulePro
|
|
|
144
164
|
}
|
|
145
165
|
let newItemsWithDcs;
|
|
146
166
|
try {
|
|
147
|
-
newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state));
|
|
167
|
+
newItemsWithDcs = await runContractRegistersOrThrow(itemsWithContractRegister, IndexerState.config(state), transactionStore, blockStore);
|
|
148
168
|
} catch (raw_exn) {
|
|
149
169
|
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
150
170
|
return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));
|
|
@@ -159,7 +179,7 @@ function finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFe
|
|
|
159
179
|
let chainState = IndexerState.getChainState(state, chain);
|
|
160
180
|
ChainState.updateKnownHeight(chainState, knownHeight);
|
|
161
181
|
let isBelowReorgThreshold = !IndexerState.isInReorgThreshold(state) && IndexerState.config(state).shouldRollbackOnReorg;
|
|
162
|
-
let shouldEnterReorgThreshold = isBelowReorgThreshold && Object.values(IndexerState.chainStates(state)).every(
|
|
182
|
+
let shouldEnterReorgThreshold = isBelowReorgThreshold && Object.values(IndexerState.chainStates(state)).every(ChainState.isReadyToEnterReorgThreshold);
|
|
163
183
|
if (shouldEnterReorgThreshold) {
|
|
164
184
|
IndexerState.enterReorgThreshold(state);
|
|
165
185
|
}
|
|
@@ -167,19 +187,18 @@ function finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFe
|
|
|
167
187
|
scheduleProcessing();
|
|
168
188
|
}
|
|
169
189
|
|
|
170
|
-
async function fetchChain(state, chain,
|
|
190
|
+
async function fetchChain(state, chain, action, stateId, scheduleFetch, scheduleProcessing, scheduleRollback) {
|
|
171
191
|
let chainState = IndexerState.getChainState(state, chain);
|
|
172
192
|
if (IndexerState.isResolvingReorg(state) || IndexerState.isStopped(state)) {
|
|
173
193
|
return;
|
|
174
194
|
}
|
|
175
|
-
let fetchState = ChainState.fetchState(chainState);
|
|
176
195
|
let isRealtime = IndexerState.isRealtime(state);
|
|
177
196
|
let sourceManager = ChainState.sourceManager(chainState);
|
|
178
197
|
let reducedPolling = !isRealtime;
|
|
179
198
|
try {
|
|
180
|
-
return await
|
|
199
|
+
return await ChainState.dispatch(chainState, async query => {
|
|
181
200
|
try {
|
|
182
|
-
let response = await SourceManager.executeQuery(sourceManager, query,
|
|
201
|
+
let response = await SourceManager.executeQuery(sourceManager, query, ChainState.knownHeight(chainState), isRealtime);
|
|
183
202
|
return await onQueryResponse(state, {
|
|
184
203
|
chain: chain,
|
|
185
204
|
response: response,
|
|
@@ -189,7 +208,7 @@ async function fetchChain(state, chain, concurrencyLimit, bufferLimit, stateId,
|
|
|
189
208
|
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
190
209
|
return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, undefined));
|
|
191
210
|
}
|
|
192
|
-
}, knownHeight => SourceManager.waitForNewBlock(sourceManager, knownHeight, isRealtime, reducedPolling), knownHeight => finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFetch, scheduleProcessing),
|
|
211
|
+
}, knownHeight => SourceManager.waitForNewBlock(sourceManager, knownHeight, isRealtime, reducedPolling), knownHeight => finishWaitingForNewBlock(state, chain, knownHeight, stateId, scheduleFetch, scheduleProcessing), action, stateId);
|
|
193
212
|
} catch (raw_exn) {
|
|
194
213
|
let exn = Primitive_exceptions.internalToException(raw_exn);
|
|
195
214
|
return IndexerState.errorExit(state, ErrorHandling.make(exn, undefined, IndexerState.unexpectedErrorMsg));
|
package/src/ChainMetadata.res
CHANGED
|
@@ -7,19 +7,9 @@ let stage = (state: IndexerState.t) => {
|
|
|
7
7
|
->IndexerState.chainStates
|
|
8
8
|
->Dict.valuesToArray
|
|
9
9
|
->Array.forEach(cs => {
|
|
10
|
-
let fetchState = cs->ChainState.fetchState
|
|
11
10
|
chainsData->Dict.set(
|
|
12
11
|
(cs->ChainState.chainConfig).id->Int.toString,
|
|
13
|
-
|
|
14
|
-
firstEventBlockNumber: fetchState.firstEventBlock->Null.fromOption,
|
|
15
|
-
isHyperSync: (
|
|
16
|
-
cs->ChainState.sourceManager->SourceManager.getActiveSource
|
|
17
|
-
).poweredByHyperSync,
|
|
18
|
-
latestFetchedBlockNumber: fetchState->FetchState.bufferBlockNumber,
|
|
19
|
-
timestampCaughtUpToHeadOrEndblock: cs
|
|
20
|
-
->ChainState.timestampCaughtUpToHeadOrEndblock
|
|
21
|
-
->Null.fromOption,
|
|
22
|
-
},
|
|
12
|
+
cs->ChainState.toChainMetadata,
|
|
23
13
|
)
|
|
24
14
|
})
|
|
25
15
|
|
|
@@ -2,21 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import * as Writing from "./Writing.res.mjs";
|
|
4
4
|
import * as ChainState from "./ChainState.res.mjs";
|
|
5
|
-
import * as FetchState from "./FetchState.res.mjs";
|
|
6
|
-
import * as Stdlib_Null from "@rescript/runtime/lib/es6/Stdlib_Null.js";
|
|
7
5
|
import * as IndexerState from "./IndexerState.res.mjs";
|
|
8
|
-
import * as SourceManager from "./sources/SourceManager.res.mjs";
|
|
9
6
|
|
|
10
7
|
function stage(state) {
|
|
11
8
|
let chainsData = {};
|
|
12
9
|
Object.values(IndexerState.chainStates(state)).forEach(cs => {
|
|
13
|
-
|
|
14
|
-
chainsData[ChainState.chainConfig(cs).id.toString()] = {
|
|
15
|
-
first_event_block: Stdlib_Null.fromOption(fetchState.firstEventBlock),
|
|
16
|
-
buffer_block: FetchState.bufferBlockNumber(fetchState),
|
|
17
|
-
ready_at: Stdlib_Null.fromOption(ChainState.timestampCaughtUpToHeadOrEndblock(cs)),
|
|
18
|
-
_is_hyper_sync: SourceManager.getActiveSource(ChainState.sourceManager(cs)).poweredByHyperSync
|
|
19
|
-
};
|
|
10
|
+
chainsData[ChainState.chainConfig(cs).id.toString()] = ChainState.toChainMetadata(cs);
|
|
20
11
|
});
|
|
21
12
|
Writing.setChainMeta(state, chainsData);
|
|
22
13
|
}
|