diff --git a/contracts/contracts/LineaRollup.sol b/contracts/contracts/LineaRollup.sol index 4fdaae747..88d44ef8b 100644 --- a/contracts/contracts/LineaRollup.sol +++ b/contracts/contracts/LineaRollup.sol @@ -224,15 +224,22 @@ contract LineaRollup is bytes32 currentDataEvaluationPoint; bytes32 currentDataHash; - uint256 lastFinalizedBlockNumber = currentL2BlockNumber; /// @dev Assigning in memory saves a lot of gas vs. calldata reading. BlobSubmissionData memory blobSubmissionData; bytes32 computedShnarf = _parentShnarf; + uint256 blobFirstBlockNumber = _blobSubmissionData[0].submissionData.firstBlockInData; uint256 blobFinalBlockNumber = shnarfFinalBlockNumbers[computedShnarf]; + if (blobFirstBlockNumber <= currentL2BlockNumber) { + revert FirstBlockLessThanOrEqualToLastFinalizedBlock( + blobFirstBlockNumber, + currentL2BlockNumber + ); + } + for (uint256 i; i < blobSubmissionLength; i++) { blobSubmissionData = _blobSubmissionData[i]; @@ -242,7 +249,7 @@ contract LineaRollup is revert EmptyBlobDataAtIndex(i); } - _validateSubmissionData(blobSubmissionData.submissionData, blobFinalBlockNumber, lastFinalizedBlockNumber); + _validateSubmissionData(blobSubmissionData.submissionData, blobFinalBlockNumber); currentDataEvaluationPoint = Utils._efficientKeccak(blobSubmissionData.submissionData.snarkHash, currentDataHash); @@ -282,7 +289,7 @@ contract LineaRollup is shnarfFinalBlockNumbers[computedShnarf] = blobFinalBlockNumber; emit DataSubmittedV3( - _blobSubmissionData[0].submissionData.firstBlockInData, + blobFirstBlockNumber, blobFinalBlockNumber, _parentShnarf, computedShnarf, @@ -315,7 +322,11 @@ contract LineaRollup is bytes32 currentDataHash = keccak256(_submissionData.compressedData); - _validateSubmissionData(submissionData, shnarfFinalBlockNumbers[_parentShnarf], currentL2BlockNumber); + if (_submissionData.firstBlockInData <= currentL2BlockNumber) { + revert FirstBlockLessThanOrEqualToLastFinalizedBlock(_submissionData.firstBlockInData, currentL2BlockNumber); + } + + _validateSubmissionData(submissionData, shnarfFinalBlockNumbers[_parentShnarf]); bytes32 dataEvaluationPoint = Utils._efficientKeccak(_submissionData.snarkHash, currentDataHash); bytes32 computedShnarf = _computeShnarf( @@ -349,12 +360,10 @@ contract LineaRollup is * @notice Internal function to validate submission data. * @param _submissionData The supporting data for compressed data submission excluding compressed data. * @param _parentFinalBlockNumber The final block number for the parent blob. - * @param _lastFinalizedBlockNumber The last finalized block number. */ function _validateSubmissionData( SupportingSubmissionDataV2 memory _submissionData, - uint256 _parentFinalBlockNumber, - uint256 _lastFinalizedBlockNumber + uint256 _parentFinalBlockNumber ) internal pure { if (_submissionData.finalStateRootHash == EMPTY_HASH) { revert FinalBlockStateEqualsZeroHash(); @@ -371,10 +380,6 @@ contract LineaRollup is } } - if (_submissionData.firstBlockInData <= _lastFinalizedBlockNumber) { - revert FirstBlockLessThanOrEqualToLastFinalizedBlock(_submissionData.firstBlockInData, _lastFinalizedBlockNumber); - } - if (_submissionData.firstBlockInData > _submissionData.finalBlockInData) { revert FirstBlockGreaterThanFinalBlock(_submissionData.firstBlockInData, _submissionData.finalBlockInData); } diff --git a/contracts/contracts/interfaces/l1/ILineaRollup.sol b/contracts/contracts/interfaces/l1/ILineaRollup.sol index 2d434eb96..d61603c0f 100644 --- a/contracts/contracts/interfaces/l1/ILineaRollup.sol +++ b/contracts/contracts/interfaces/l1/ILineaRollup.sol @@ -172,15 +172,15 @@ interface ILineaRollup { /** * @notice Emitted when compressed data is being submitted and verified succesfully on L1. * @dev The block range is indexed and parent shnarf included for state reconstruction simplicity. - * @param startBlock The indexed L2 block number indicating which block the data starts from. - * @param endBlock The indexed L2 block number indicating which block the data ends on. + * @param startBlockNumber The indexed L2 block number indicating which block the data starts from. + * @param endBlockNumber The indexed L2 block number indicating which block the data ends on. * @param parentShnarf The parent shnarf for the data being submitted. * @param shnarf The indexed shnarf for the data being submitted. * @param finalStateRootHash The L2 state root hash that the current blob submission ends on. NB: The last blob in the collection. */ event DataSubmittedV3( - uint256 indexed startBlock, - uint256 indexed endBlock, + uint256 indexed startBlockNumber, + uint256 indexed endBlockNumber, bytes32 parentShnarf, bytes32 indexed shnarf, bytes32 finalStateRootHash