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