envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
98 lines (91 loc) • 3.49 kB
JavaScript
// Generated by ReScript, PLEASE EDIT WITH CARE
function make(maxReorgDepth, shouldRollbackOnReorg, chainReorgCheckpoints) {
if (!(maxReorgDepth > 0 && shouldRollbackOnReorg)) {
return;
}
let checkpointIds = Array(chainReorgCheckpoints.length);
let checkpointBlockNumbers = Array(chainReorgCheckpoints.length);
chainReorgCheckpoints.forEach((checkpoint, idx) => {
checkpointIds[idx] = checkpoint.id;
checkpointBlockNumbers[idx] = checkpoint.block_number;
});
return {
checkpointIds: checkpointIds,
checkpointBlockNumbers: checkpointBlockNumbers,
maxReorgDepth: maxReorgDepth
};
}
function getSafeCheckpointId(safeCheckpointTracking, sourceBlockNumber) {
let safeBlockNumber = sourceBlockNumber - safeCheckpointTracking.maxReorgDepth | 0;
let match = safeCheckpointTracking.checkpointIds;
if (match.length === 0) {
return 0n;
}
if (safeCheckpointTracking.checkpointBlockNumbers[0] > safeBlockNumber) {
return 0n;
}
if (match.length === 1) {
return match[0];
}
let trackingCheckpointsCount = safeCheckpointTracking.checkpointIds.length;
let result;
let idx = 1;
while (idx < trackingCheckpointsCount && result === undefined) {
if (safeCheckpointTracking.checkpointBlockNumbers[idx] > safeBlockNumber) {
result = safeCheckpointTracking.checkpointIds[idx - 1 | 0];
}
idx = idx + 1 | 0;
};
let checkpointId = result;
if (checkpointId !== undefined) {
return checkpointId;
} else {
return safeCheckpointTracking.checkpointIds[trackingCheckpointsCount - 1 | 0];
}
}
function updateOnNewBatch(safeCheckpointTracking, sourceBlockNumber, chainId, batchCheckpointIds, batchCheckpointBlockNumbers, batchCheckpointChainIds) {
let safeCheckpointId = getSafeCheckpointId(safeCheckpointTracking, sourceBlockNumber);
let mutCheckpointIds = [];
let mutCheckpointBlockNumbers = [];
for (let idx = 0, idx_finish = safeCheckpointTracking.checkpointIds.length; idx < idx_finish; ++idx) {
let checkpointId = safeCheckpointTracking.checkpointIds[idx];
if (checkpointId >= safeCheckpointId) {
mutCheckpointIds.push(checkpointId);
mutCheckpointBlockNumbers.push(safeCheckpointTracking.checkpointBlockNumbers[idx]);
}
}
for (let idx$1 = 0, idx_finish$1 = batchCheckpointIds.length; idx$1 < idx_finish$1; ++idx$1) {
if (batchCheckpointChainIds[idx$1] === chainId) {
mutCheckpointIds.push(batchCheckpointIds[idx$1]);
mutCheckpointBlockNumbers.push(batchCheckpointBlockNumbers[idx$1]);
}
}
return {
checkpointIds: mutCheckpointIds,
checkpointBlockNumbers: mutCheckpointBlockNumbers,
maxReorgDepth: safeCheckpointTracking.maxReorgDepth
};
}
function rollback(safeCheckpointTracking, targetBlockNumber) {
let mutCheckpointIds = [];
let mutCheckpointBlockNumbers = [];
for (let idx = 0, idx_finish = safeCheckpointTracking.checkpointIds.length; idx < idx_finish; ++idx) {
let blockNumber = safeCheckpointTracking.checkpointBlockNumbers[idx];
if (blockNumber <= targetBlockNumber) {
mutCheckpointIds.push(safeCheckpointTracking.checkpointIds[idx]);
mutCheckpointBlockNumbers.push(safeCheckpointTracking.checkpointBlockNumbers[idx]);
}
}
return {
checkpointIds: mutCheckpointIds,
checkpointBlockNumbers: mutCheckpointBlockNumbers,
maxReorgDepth: safeCheckpointTracking.maxReorgDepth
};
}
export {
make,
getSafeCheckpointId,
updateOnNewBatch,
rollback,
}
/* No side effect */