UNPKG

envio

Version:

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

98 lines (91 loc) 3.49 kB
// 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 */