UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

100 lines (90 loc) 3.68 kB
// Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; 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 */