From a23c34a879676de47e59d40f35d118cf364b227e Mon Sep 17 00:00:00 2001 From: William Morriss Date: Sat, 27 Sep 2025 02:14:25 -0500 Subject: [PATCH 1/2] demonstrate https://github.com/FilOzone/pdp/issues/205 --- foundry.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foundry.toml b/foundry.toml index 68ac373..30fbc0a 100644 --- a/foundry.toml +++ b/foundry.toml @@ -5,7 +5,7 @@ script = 'script' out = 'out' libs = ['lib'] cache_path = 'cache' -solc = "0.8.23" +solc = "0.8.30" # For dependencies remappings = [ From 5c372f23f22dffbfc080dc081039c017a66df4c5 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Sat, 27 Sep 2025 02:13:03 -0500 Subject: [PATCH 2/2] fix: vm.getBlockNumber --- test/PDPVerifier.t.sol | 58 ++++++++++++++++----------------- test/PDPVerifierProofTest.t.sol | 16 ++++----- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/test/PDPVerifier.t.sol b/test/PDPVerifier.t.sol index 6138487..27bb153 100644 --- a/test/PDPVerifier.t.sol +++ b/test/PDPVerifier.t.sol @@ -303,11 +303,11 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { // flush add vm.expectEmit(true, true, false, false); - emit IPDPEvents.NextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, 2); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + emit IPDPEvents.NextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, 2); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); assertEq(pdpVerifier.getDataSetLeafCount(setId), leafCount); - assertEq(pdpVerifier.getNextChallengeEpoch(setId), block.number + CHALLENGE_FINALITY_DELAY); + assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); assertEq(pdpVerifier.getChallengeRange(setId), leafCount); assertTrue(pdpVerifier.pieceLive(setId, pieceId)); @@ -337,12 +337,12 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { assertEq(firstId, 0); // flush add vm.expectEmit(true, true, true, false); - emit IPDPEvents.NextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, 6); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + emit IPDPEvents.NextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, 6); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); uint256 expectedLeafCount = 64 + 128; assertEq(pdpVerifier.getDataSetLeafCount(setId), expectedLeafCount); - assertEq(pdpVerifier.getNextChallengeEpoch(setId), block.number + CHALLENGE_FINALITY_DELAY); + assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); assertTrue(pdpVerifier.pieceLive(setId, firstId)); assertTrue(pdpVerifier.pieceLive(setId, firstId + 1)); @@ -408,8 +408,8 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { pieces[0] = makeSamplePiece(2); pdpVerifier.addPieces(setId, pieces, empty); assertEq(pdpVerifier.getNextChallengeEpoch(setId), pdpVerifier.NO_CHALLENGE_SCHEDULED()); // Not updated on first add anymore - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); - assertEq(pdpVerifier.getNextChallengeEpoch(setId), block.number + CHALLENGE_FINALITY_DELAY); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); + assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); // Remove piece uint256[] memory toRemove = new uint256[](1); @@ -418,7 +418,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { vm.expectEmit(true, true, false, false); emit IPDPEvents.PiecesRemoved(setId, toRemove); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); // flush + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // flush assertEq(pdpVerifier.getNextChallengeEpoch(setId), pdpVerifier.NO_CHALLENGE_SCHEDULED()); assertEq(pdpVerifier.pieceLive(setId, 0), false); @@ -462,7 +462,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { vm.expectEmit(true, true, false, false); emit IPDPEvents.PiecesRemoved(setId, toRemove); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); // flush + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // flush assertEq(pdpVerifier.pieceLive(setId, 0), false); assertEq(pdpVerifier.pieceLive(setId, 1), true); @@ -470,7 +470,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { assertEq(pdpVerifier.getNextPieceId(setId), 3); assertEq(pdpVerifier.getDataSetLeafCount(setId), 64 / 32); - assertEq(pdpVerifier.getNextChallengeEpoch(setId), block.number + CHALLENGE_FINALITY_DELAY); + assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); bytes memory emptyCidData = new bytes(0); assertEq(pdpVerifier.getPieceCid(setId, 0).data, emptyCidData); @@ -497,7 +497,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { vm.expectRevert("Can only schedule removal of existing pieces"); pdpVerifier.schedulePieceDeletions(setId, toRemove, empty); // Actual removal does not fail - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // Scheduling both unchallengeable and challengeable pieces for removal succeeds // scheduling duplicate ids in both cases succeeds @@ -514,7 +514,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { assertEq(true, pdpVerifier.pieceChallengable(setId, 0)); assertEq(false, pdpVerifier.pieceChallengable(setId, 1)); pdpVerifier.schedulePieceDeletions(setId, toRemove2, empty); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); assertEq(false, pdpVerifier.pieceLive(setId, 0)); assertEq(false, pdpVerifier.pieceLive(setId, 1)); @@ -551,7 +551,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { // Test nextProvingPeriod with too large extra data vm.expectRevert("Extra data too large"); - pdpVerifier.nextProvingPeriod(setId, block.number + 10, tooLargeExtraData); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + 10, tooLargeExtraData); // Test deleteDataSet with too large extra data vm.expectRevert("Extra data too large"); @@ -595,7 +595,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { // Try to call nextProvingPeriod as non-storage-provider vm.prank(nonStorageProvider); vm.expectRevert("only the storage provider can move to next proving period"); - pdpVerifier.nextProvingPeriod(setId, block.number + 10, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + 10, empty); } function testNextProvingPeriodChallengeEpochTooSoon() public { @@ -606,7 +606,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { pdpVerifier.addPieces(setId, pieces, empty); // Current block number - uint256 currentBlock = block.number; + uint256 currentBlock = vm.getBlockNumber(); // Try to call nextProvingPeriod with a challenge epoch that is not at least // challengeFinality epochs in the future @@ -640,10 +640,10 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { // Try to set next proving period with various values vm.expectRevert("can only start proving once leaves are added"); - pdpVerifier.nextProvingPeriod(setId, block.number + 100, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + 100, empty); vm.expectRevert("can only start proving once leaves are added"); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); vm.expectRevert("can only start proving once leaves are added"); pdpVerifier.nextProvingPeriod(setId, type(uint256).max, empty); @@ -656,7 +656,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { // Try to call nextProvingPeriod on the empty data set // Should revert because no leaves have been added yet vm.expectRevert("can only start proving once leaves are added"); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); } function testEmitDataSetEmptyEvent() public { @@ -677,7 +677,7 @@ contract PDPVerifierDataSetMutateTest is Test, PieceHelper { emit IPDPEvents.DataSetEmpty(setId); // Call nextProvingPeriod which should remove the piece and emit the event - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // Verify the data set is indeed empty assertEq(pdpVerifier.getDataSetLeafCount(setId), 0); @@ -776,7 +776,7 @@ contract PDPVerifierPaginationTest is Test, PieceHelper { // Move to next proving period to make removals effective uint256 challengeFinality = pdpVerifier.getChallengeFinality(); - pdpVerifier.nextProvingPeriod(setId, block.number + challengeFinality, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + challengeFinality, empty); // Should return only 7 active pieces (Cids.Cid[] memory pieces, uint256[] memory ids, uint256[] memory sizes, bool hasMore) = @@ -1177,7 +1177,7 @@ contract SumTreeAddTest is Test, PieceHelper { // Remove pieces in batch pdpVerifier.schedulePieceDeletions(testSetId, pieceIdsToRemove, empty); // flush adds and removals - pdpVerifier.nextProvingPeriod(testSetId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(testSetId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); for (uint256 i = 0; i < pieceIdsToRemove.length; i++) { bytes memory zeroBytes; assertEq(pdpVerifier.getPieceCid(testSetId, pieceIdsToRemove[i]).data, zeroBytes); @@ -1321,7 +1321,7 @@ contract SumTreeAddTest is Test, PieceHelper { pdpVerifier.addPieces(testSetId, pieceDataArray, empty); } pdpVerifier.schedulePieceDeletions(testSetId, pieceIdsToRemove, empty); - pdpVerifier.nextProvingPeriod(testSetId, block.number + CHALLENGE_FINALITY_DELAY, empty); //flush removals + pdpVerifier.nextProvingPeriod(testSetId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); //flush removals assertFindPieceAndOffset(testSetId, 0, 3, 0); assertFindPieceAndOffset(testSetId, 1, 4, 0); @@ -1432,10 +1432,10 @@ contract PDPListenerIntegrationTest is Test, PieceHelper { badListener.setBadOperation(PDPRecordKeeper.OperationType.NEXT_PROVING_PERIOD); vm.expectRevert("Failing operation"); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); badListener.setBadOperation(PDPRecordKeeper.OperationType.NONE); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); } } @@ -1519,7 +1519,7 @@ contract PDPVerifierExtraDataTest is Test, PieceHelper { ); // Test NEXT_PROVING_PERIOD operation - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); assertEq( extraDataListener.getExtraData(setId, PDPRecordKeeper.OperationType.NEXT_PROVING_PERIOD), empty, @@ -1596,7 +1596,7 @@ contract PDPVerifierE2ETest is Test, ProofBuilderHelper, PieceHelper { piecesProofPeriod1[1] = makePiece(treesA[1], leafCountsA[1]); pdpVerifier.addPieces(setId, piecesProofPeriod1, empty); // flush the original addPieces call - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); uint256 challengeRangeProofPeriod1 = pdpVerifier.getChallengeRange(setId); assertEq( @@ -1662,7 +1662,7 @@ contract PDPVerifierE2ETest is Test, ProofBuilderHelper, PieceHelper { pdpVerifier.provePossession{value: 1e18}(setId, proofsProofPeriod1); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // CHECK: leaf counts assertEq( pdpVerifier.getPieceLeafCount(setId, 0), @@ -1693,7 +1693,7 @@ contract PDPVerifierE2ETest is Test, ProofBuilderHelper, PieceHelper { // CHECK: the next challenge epoch has been updated assertEq( pdpVerifier.getNextChallengeEpoch(setId), - block.number + CHALLENGE_FINALITY_DELAY, + vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, "Next challenge epoch should be updated" ); } diff --git a/test/PDPVerifierProofTest.t.sol b/test/PDPVerifierProofTest.t.sol index f184ab4..e3626e8 100644 --- a/test/PDPVerifierProofTest.t.sol +++ b/test/PDPVerifierProofTest.t.sol @@ -69,9 +69,9 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { assertEq(pdpVerifier.getNextChallengeEpoch(setId), challengeEpoch); // Verify the next challenge is in a subsequent epoch after nextProvingPeriod - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); - assertEq(pdpVerifier.getNextChallengeEpoch(setId), block.number + CHALLENGE_FINALITY_DELAY); + assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); } receive() external payable {} @@ -273,7 +273,7 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { vm.mockCall(address(pdpVerifier.PYTH()), pythCallData, abi.encode(price)); pdpVerifier.provePossession{value: 1e18}(setId, proofs); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); // resample + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // resample uint256 nextChallengeEpoch = pdpVerifier.getNextChallengeEpoch(setId); assertNotEq(nextChallengeEpoch, challengeEpoch); @@ -320,7 +320,7 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { removePieces[0] = newPieceId; pdpVerifier.schedulePieceDeletions(setId, removePieces, empty); // flush removes - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // Make a new proof that is valid with two pieces challengeEpoch = pdpVerifier.getNextChallengeEpoch(setId); @@ -374,14 +374,14 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { (uint256 setId, bytes32[][] memory tree) = makeDataSetWithOnePiece(leafCount); // Set challenge sampling far in the future - uint256 farFutureBlock = block.number + 1000; + uint256 farFutureBlock = vm.getBlockNumber() + 1000; pdpVerifier.nextProvingPeriod(setId, farFutureBlock, empty); assertEq( pdpVerifier.getNextChallengeEpoch(setId), farFutureBlock, "Challenge epoch should be set to far future" ); // Reset to a closer block - uint256 nearerBlock = block.number + CHALLENGE_FINALITY_DELAY; + uint256 nearerBlock = vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY; pdpVerifier.nextProvingPeriod(setId, nearerBlock, empty); assertEq( pdpVerifier.getNextChallengeEpoch(setId), nearerBlock, "Challenge epoch should be reset to nearer block" @@ -449,7 +449,7 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { // Create new data set and add pieces. uint256 setId = pdpVerifier.createDataSet{value: PDPFees.sybilFee()}(address(listener), empty); pdpVerifier.addPieces(setId, pieces, empty); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); // flush adds + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // flush adds return (setId, trees); } @@ -468,7 +468,7 @@ contract PDPVerifierProofTest is Test, ProofBuilderHelper, PieceHelper { Cids.Cid[] memory pieces = new Cids.Cid[](1); pieces[0] = makePiece(tree, leafCount); uint256 pieceId = pdpVerifier.addPieces(setId, pieces, empty); - pdpVerifier.nextProvingPeriod(setId, block.number + CHALLENGE_FINALITY_DELAY, empty); // flush adds + pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // flush adds return (tree, pieceId); }