From fb1e3356a9c7e5e63c30209e81d12b4460edd663 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 24 Jun 2026 14:26:30 -0500 Subject: [PATCH 1/3] test: remove redundant receive() stubs from test contracts Assisted-by: Claude:claude-sonnet-4-6 --- test/CleanupPieces.t.sol | 2 -- test/PDPVerifier.t.sol | 8 -------- test/PDPVerifierProofTest.t.sol | 2 -- 3 files changed, 12 deletions(-) diff --git a/test/CleanupPieces.t.sol b/test/CleanupPieces.t.sol index 5f03d0b4..6c51fbe4 100644 --- a/test/CleanupPieces.t.sol +++ b/test/CleanupPieces.t.sol @@ -68,8 +68,6 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { TestListener listener; bytes empty = new bytes(0); - receive() external payable {} - function setUp() public override { super.setUp(); PDPVerifier pdpVerifierImpl = new PDPVerifier(1, CHALLENGE_FINALITY_DELAY); diff --git a/test/PDPVerifier.t.sol b/test/PDPVerifier.t.sol index fb85ca45..f52424b2 100644 --- a/test/PDPVerifier.t.sol +++ b/test/PDPVerifier.t.sol @@ -139,8 +139,6 @@ contract PDPVerifierDataSetCreateDeleteTest is MockFVMTest, PieceHelper { assertEq(3, pdpVerifier.getNextDataSetId(), "Next data set ID should be 3"); } - receive() external payable {} - function testDataSetIdsStartFromOne() public { // Test that data set IDs start from 1, not 0 assertEq(pdpVerifier.getNextDataSetId(), 1, "Next data set ID should start at 1"); @@ -338,8 +336,6 @@ contract PDPVerifierDataSetMutateTest is MockFVMTest, PieceHelper { TestingRecordKeeperService listener; bytes empty = new bytes(0); - receive() external payable {} - function setUp() public override { super.setUp(); PDPVerifier pdpVerifierImpl = new PDPVerifier(1, CHALLENGE_FINALITY_DELAY); @@ -1984,8 +1980,6 @@ contract PDPVerifierE2ETest is MockFVMTest, ProofBuilderHelper, PieceHelper { vm.deal(address(pdpVerifierImpl), 100 ether); } - receive() external payable {} - function testCompleteProvingPeriodE2E() public { // Step 1: Create a data set uint256 setId = pdpVerifier.addPieces{value: PDPFees.cleanupDeposit()}( @@ -2237,8 +2231,6 @@ contract PDPVerifierFeeTest is MockFVMTest, PieceHelper, ProofBuilderHelper { listener = new TestingRecordKeeperService(); } - receive() external payable {} - function testUpdateProofFeeWithDelayAutoApply() public { uint256 current = pdpVerifier.feePerTiB(); uint256 newFee = current + 1; diff --git a/test/PDPVerifierProofTest.t.sol b/test/PDPVerifierProofTest.t.sol index fb539771..0d714a71 100644 --- a/test/PDPVerifierProofTest.t.sol +++ b/test/PDPVerifierProofTest.t.sol @@ -63,8 +63,6 @@ contract PDPVerifierProofTest is MockFVMTest, ProofBuilderHelper, PieceHelper { assertEq(pdpVerifier.getNextChallengeEpoch(setId), vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY); } - receive() external payable {} - event Debug(string message, uint256 value); function testProveWithDifferentFeeAmounts() public { From 0b2a152bee3c7e42e1b183aa6b01539d88226987 Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 24 Jun 2026 15:03:37 -0500 Subject: [PATCH 2/3] test: add FVMPay balance assertions for burn, refund, and deposit return Assisted-by: Claude:claude-sonnet-4-6 --- test/CleanupPieces.t.sol | 7 +++++++ test/PDPVerifier.t.sol | 22 +++++++++++++++++++++- test/PDPVerifierProofTest.t.sol | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/test/CleanupPieces.t.sol b/test/CleanupPieces.t.sol index 6c51fbe4..6211324e 100644 --- a/test/CleanupPieces.t.sol +++ b/test/CleanupPieces.t.sol @@ -175,6 +175,7 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { // Net cost is zero; the cleanup deposit was returned at delete time assertEq(balanceBefore, address(this).balance, "net cost is zero"); + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after deposit returned"); assertFalse(pdpVerifier.dataSetLive(setId)); } @@ -200,8 +201,11 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { pdpVerifier.cleanupPieces(setId, 10); // SP succeeds + uint256 balanceBefore = address(this).balance; bool done = pdpVerifier.cleanupPieces(setId, 10); assertTrue(done); + assertEq(address(this).balance - balanceBefore, PDPFees.cleanupDeposit(), "SP receives deposit"); + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after cleanup"); assertPieceSlotsCleared(setId, 1); } @@ -219,6 +223,7 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { bool done = pdpVerifier.cleanupPieces(setId, 10); assertTrue(done); assertEq(anyone.balance - balanceBefore, PDPFees.cleanupDeposit(), "third party receives deposit"); + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after cleanup"); assertPieceSlotsCleared(setId, 1); } @@ -243,6 +248,7 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { assertTrue(done); assertEq(address(this).balance - balanceBefore, PDPFees.cleanupDeposit(), "SP receives deposit in same block"); + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after cleanup"); assertPieceSlotsCleared(setId, 2); } @@ -264,6 +270,7 @@ contract PDPVerifierCleanupTest is MockFVMTest, PieceHelper { assertTrue(done); assertEq(anyone.balance - balanceBefore, PDPFees.cleanupDeposit(), "deleter collects cleanup deposit"); + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after cleanup"); assertPieceSlotsCleared(setId, 2); } diff --git a/test/PDPVerifier.t.sol b/test/PDPVerifier.t.sol index f52424b2..89328feb 100644 --- a/test/PDPVerifier.t.sol +++ b/test/PDPVerifier.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.13; import {MockFVMTest} from "fvm-solidity/mocks/MockFVMTest.sol"; +import {BURN_ADDRESS} from "fvm-solidity/FVMActors.sol"; import {Test} from "forge-std/Test.sol"; import {UUPSUpgradeable} from "../lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol"; import {Cids} from "../src/Cids.sol"; @@ -62,12 +63,21 @@ contract PDPVerifierDataSetCreateDeleteTest is MockFVMTest, PieceHelper { } function testDeleteDataSet() public { + uint256 deposit = PDPFees.cleanupDeposit(); + uint256 callerBefore = address(this).balance; + vm.expectEmit(true, true, false, false); emit IPDPEvents.DataSetCreated(1, address(this)); - uint256 setId = pdpVerifier.createDataSet{value: PDPFees.cleanupDeposit()}(address(listener), empty); + uint256 setId = pdpVerifier.createDataSet{value: deposit}(address(listener), empty); + assertEq(address(pdpVerifier).balance, deposit, "Verifier holds deposit after create"); + vm.expectEmit(true, true, false, false); emit IPDPEvents.DataSetDeleted(setId, 0); pdpVerifier.deleteDataSet(setId, empty); + + assertEq(address(pdpVerifier).balance, 0, "Verifier balance is 0 after delete"); + assertEq(address(this).balance, callerBefore, "Caller recovered deposit"); + vm.expectRevert(PDPVerifier.DataSetNotLive.selector); pdpVerifier.getDataSetLeafCount(setId); } @@ -168,6 +178,7 @@ contract PDPVerifierDataSetCreateDeleteTest is MockFVMTest, PieceHelper { uint256 finalBalance = address(this).balance; uint256 refundedAmount = finalBalance - (initialBalance - required - excessAmount); assertEq(refundedAmount, excessAmount, "Excess amount should be refunded"); + assertEq(address(pdpVerifier).balance, required, "Verifier holds exactly the cleanup deposit"); // Additional checks to ensure the data set was created correctly assertEq(pdpVerifier.getDataSetLeafCount(setId), 0, "Data set leaf count should be 0"); @@ -2063,7 +2074,16 @@ contract PDPVerifierE2ETest is MockFVMTest, ProofBuilderHelper, PieceHelper { pdpVerifier.getNextChallengeEpoch(setId), pdpVerifier.getNextChallengeEpoch(setId) ); + uint256 proofFee = pdpVerifier.calculateProofFee(setId); + uint256 burnBefore = BURN_ADDRESS.balance; + uint256 verifierBefore = address(pdpVerifier).balance; pdpVerifier.provePossession{value: 1e18}(setId, proofsProofPeriod1); + assertEq(BURN_ADDRESS.balance - burnBefore, proofFee, "Proof fee burned to burn address"); + assertEq( + address(pdpVerifier).balance, + verifierBefore, + "Verifier balance unchanged: deposit held, fee burned, overpay refunded" + ); pdpVerifier.nextProvingPeriod(setId, vm.getBlockNumber() + CHALLENGE_FINALITY_DELAY, empty); // CHECK: leaf counts diff --git a/test/PDPVerifierProofTest.t.sol b/test/PDPVerifierProofTest.t.sol index 0d714a71..d70c42fb 100644 --- a/test/PDPVerifierProofTest.t.sol +++ b/test/PDPVerifierProofTest.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.13; import {MockFVMTest} from "fvm-solidity/mocks/MockFVMTest.sol"; +import {BURN_ADDRESS} from "fvm-solidity/FVMActors.sol"; import {Cids} from "../src/Cids.sol"; import {PDPVerifier} from "../src/PDPVerifier.sol"; import {MyERC1967Proxy} from "../src/ERC1967Proxy.sol"; @@ -51,7 +52,16 @@ contract PDPVerifierProofTest is MockFVMTest, ProofBuilderHelper, PieceHelper { challenges[i] = IPDPTypes.PieceIdAndOffset(0, 0); } emit IPDPEvents.PossessionProven(setId, challenges); + uint256 proofFee = pdpVerifier.calculateProofFee(setId); + uint256 burnBefore = BURN_ADDRESS.balance; + uint256 verifierBefore = address(pdpVerifier).balance; pdpVerifier.provePossession{value: 1e18}(setId, proofs); + assertEq(BURN_ADDRESS.balance - burnBefore, proofFee, "Proof fee burned to burn address"); + assertEq( + address(pdpVerifier).balance, + verifierBefore, + "Verifier balance unchanged: deposit held, fee burned, overpay refunded" + ); // Verify the next challenge is in a subsequent epoch. // Next challenge unchanged by prove @@ -105,7 +115,17 @@ contract PDPVerifierProofTest is MockFVMTest, ProofBuilderHelper, PieceHelper { // Test 2: Sending more than the required fee RANDOMNESS_PRECOMPILE.mockBeaconRandomness(challengeEpoch, challengeEpoch); + uint256 burnBefore = BURN_ADDRESS.balance; + uint256 senderBefore = sender.balance; + uint256 verifierBefore = address(pdpVerifier).balance; pdpVerifier.provePossession{value: correctFee + 1}(setId, proofs); + assertEq(BURN_ADDRESS.balance - burnBefore, correctFee, "Proof fee burned to burn address"); + assertEq(senderBefore - sender.balance, correctFee, "Sender net loss equals fee; 1 wei overpay refunded"); + assertEq( + address(pdpVerifier).balance, + verifierBefore, + "Verifier balance unchanged: deposit held, fee burned, overpay refunded" + ); // Verify that the proof was accepted assertEq( From b83b3b978d1646b55d6fccad0bff25dfa672328c Mon Sep 17 00:00:00 2001 From: William Morriss Date: Wed, 24 Jun 2026 15:09:07 -0500 Subject: [PATCH 3/3] deps: update fvm-solidity --- lib/fvm-solidity | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/fvm-solidity b/lib/fvm-solidity index d8d2fb58..264b7c94 160000 --- a/lib/fvm-solidity +++ b/lib/fvm-solidity @@ -1 +1 @@ -Subproject commit d8d2fb5899440ff38b5bb484557b825ac0b642e2 +Subproject commit 264b7c948032b2e14aad75053ca60d3f74a642c5