From ecf2716618138f43e440c0ed5dda0808098327d6 Mon Sep 17 00:00:00 2001 From: Sambhav Jain <136801346+DarkLord017@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:00:03 +0530 Subject: [PATCH 1/2] feat(pieceAdded): move updatePrcing to piecesAdded --- .../src/FilecoinWarmStorageService.sol | 10 ++++++++-- .../lib/FilecoinWarmStorageServiceLayout.sol | 1 + .../test/FilecoinWarmStorageService.t.sol | 20 ++++++++++--------- service_contracts/test/mocks/SharedMocks.sol | 19 ++++++++++++++++++ 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 01ab88f8..24b5722f 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.20; import {PDPListener} from "@pdp/PDPVerifier.sol"; +import {IPDPVerifier} from "@pdp/interfaces/IPDPVerifier.sol"; import {Cids} from "@pdp/Cids.sol"; import {SessionKeyRegistry} from "@session-key-registry/SessionKeyRegistry.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; @@ -834,6 +835,11 @@ contract FilecoinWarmStorageService is // Verify the signature verifyAddPiecesSignature(payer, info.clientDataSetId, pieceData, nonce, metadataKeys, metadataValues, signature); + // Update payment rates immediately to enforce payment validation + // Get the current leaf count from PDPVerifier (updated before this call) + uint256 currentLeafCount = IPDPVerifier(pdpVerifierAddress).getDataSetLeafCount(dataSetId); + updatePaymentRates(dataSetId, currentLeafCount); + // Store metadata for each new piece for (uint256 i = 0; i < pieceData.length; i++) { uint256 pieceId = firstAdded + i; @@ -963,7 +969,6 @@ contract FilecoinWarmStorageService is // This marks when the data set became active for proving provingActivationEpoch[dataSetId] = block.number; - // Update the payment rates updatePaymentRates(dataSetId, leafCount); return; @@ -1010,8 +1015,9 @@ contract FilecoinWarmStorageService is provingDeadlines[dataSetId] = nextDeadline; provenThisPeriod[dataSetId] = false; - // Update the payment rates based on current data set size updatePaymentRates(dataSetId, leafCount); + + } /** diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol index fb8182af..be961412 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol @@ -27,3 +27,4 @@ bytes32 constant FIL_BEAM_CONTROLLER_ADDRESS_SLOT = bytes32(uint256(18)); bytes32 constant NEXT_UPGRADE_SLOT = bytes32(uint256(19)); bytes32 constant STORAGE_PRICE_PER_TIB_PER_MONTH_SLOT = bytes32(uint256(20)); bytes32 constant MINIMUM_STORAGE_RATE_PER_MONTH_SLOT = bytes32(uint256(21)); + diff --git a/service_contracts/test/FilecoinWarmStorageService.t.sol b/service_contracts/test/FilecoinWarmStorageService.t.sol index ff8d8216..b1cd6c36 100644 --- a/service_contracts/test/FilecoinWarmStorageService.t.sol +++ b/service_contracts/test/FilecoinWarmStorageService.t.sol @@ -803,9 +803,9 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // First batch (3 pieces) with key "meta" => metadataShort Cids.Cid[] memory pieceData1 = new Cids.Cid[](3); - pieceData1[0].data = bytes("1_0:1111"); - pieceData1[1].data = bytes("1_1:111100000"); - pieceData1[2].data = bytes("1_2:11110000000000"); + pieceData1[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("1_0:1111"))); + pieceData1[1] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("1_1:111100000"))); + pieceData1[2] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("1_2:11110000000000"))); string[] memory keys1 = new string[](1); string[] memory values1 = new string[](1); keys1[0] = "meta"; @@ -817,8 +817,10 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // Second batch (2 pieces) with key "meta" => metadataLong Cids.Cid[] memory pieceData2 = new Cids.Cid[](2); - pieceData2[0].data = bytes("2_0:22222222222222222222"); - pieceData2[1].data = bytes("2_1:222222222222222222220000000000000000000000000000000000000000"); + pieceData2[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("2_0:22222222222222222222"))); + pieceData2[1] = Cids.CommPv2FromDigest( + 0, 4, keccak256(abi.encodePacked("2_1:222222222222222222220000000000000000000000000000000000000000000")) + ); string[] memory keys2 = new string[](1); string[] memory values2 = new string[](1); keys2[0] = "meta"; @@ -4558,7 +4560,7 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // Prepare piece data Cids.Cid[] memory pieceData = new Cids.Cid[](1); - pieceData[0].data = bytes("test_piece_1"); + pieceData[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("test_piece_1"))); string[] memory keys = new string[](0); string[] memory values = new string[](0); @@ -4604,7 +4606,7 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // Prepare piece data Cids.Cid[] memory pieceData = new Cids.Cid[](1); - pieceData[0].data = bytes("test_piece"); + pieceData[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("test_piece_1"))); string[] memory keys = new string[](0); string[] memory values = new string[](0); @@ -4678,7 +4680,7 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // Prepare piece data Cids.Cid[] memory pieceData = new Cids.Cid[](1); - pieceData[0].data = bytes("test"); + pieceData[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("test_piece_1"))); string[] memory keys = new string[](0); string[] memory values = new string[](0); @@ -4725,7 +4727,7 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest { // Prepare piece data Cids.Cid[] memory pieceData = new Cids.Cid[](1); - pieceData[0].data = bytes("test"); + pieceData[0] = Cids.CommPv2FromDigest(0, 4, keccak256(abi.encodePacked("test_piece_1"))); string[] memory keys = new string[](0); string[] memory values = new string[](0); diff --git a/service_contracts/test/mocks/SharedMocks.sol b/service_contracts/test/mocks/SharedMocks.sol index 39e0b267..594c2f5a 100644 --- a/service_contracts/test/mocks/SharedMocks.sol +++ b/service_contracts/test/mocks/SharedMocks.sol @@ -99,6 +99,8 @@ contract MockPDPVerifier { // Track data set service providers for testing mapping(uint256 => address) public dataSetServiceProviders; + // Track simple leaf counts per data set for tests (approximate via bytes length) + mapping(uint256 => uint256) public dataSetLeafCount; event DataSetCreated(uint256 indexed setId, address indexed owner); event DataSetServiceProviderChanged( @@ -118,6 +120,9 @@ contract MockPDPVerifier { // Track service provider dataSetServiceProviders[setId] = msg.sender; + // initialize leaf count to 0 + dataSetLeafCount[setId] = 0; + emit DataSetCreated(setId, msg.sender); return setId; } @@ -128,6 +133,7 @@ contract MockPDPVerifier { } delete dataSetServiceProviders[setId]; + delete dataSetLeafCount[setId]; emit DataSetDeleted(setId, 0); } @@ -150,9 +156,22 @@ contract MockPDPVerifier { } bytes memory extraData = abi.encode(nonce, allKeys, allValues, signature); + + uint256 leafCount = 0; + for (uint256 i = 0; i < pieceData.length; i++) { + (uint256 padding, uint8 height,) = Cids.validateCommPv2(pieceData[i]); + leafCount += Cids.leafCount(padding, height); + } + dataSetLeafCount[dataSetId] += leafCount; + listenerAddr.piecesAdded(dataSetId, firstAdded, pieceData, extraData); } + // Expose leaf count similar to real PDPVerifier + function getDataSetLeafCount(uint256 setId) external view returns (uint256) { + return dataSetLeafCount[setId]; + } + /** * @notice Simulates service provider change for testing purposes * @dev This function mimics the PDPVerifier's claimDataSetOwnership functionality From 88283c4aa6764de20d1cfc4d982a24ba017fc934 Mon Sep 17 00:00:00 2001 From: Sambhav Jain <136801346+DarkLord017@users.noreply.github.com> Date: Mon, 8 Dec 2025 17:02:19 +0530 Subject: [PATCH 2/2] forge fmt --- service_contracts/src/FilecoinWarmStorageService.sol | 2 -- service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol | 1 - 2 files changed, 3 deletions(-) diff --git a/service_contracts/src/FilecoinWarmStorageService.sol b/service_contracts/src/FilecoinWarmStorageService.sol index 24b5722f..9f1ffa06 100644 --- a/service_contracts/src/FilecoinWarmStorageService.sol +++ b/service_contracts/src/FilecoinWarmStorageService.sol @@ -1016,8 +1016,6 @@ contract FilecoinWarmStorageService is provenThisPeriod[dataSetId] = false; updatePaymentRates(dataSetId, leafCount); - - } /** diff --git a/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol b/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol index be961412..fb8182af 100644 --- a/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol +++ b/service_contracts/src/lib/FilecoinWarmStorageServiceLayout.sol @@ -27,4 +27,3 @@ bytes32 constant FIL_BEAM_CONTROLLER_ADDRESS_SLOT = bytes32(uint256(18)); bytes32 constant NEXT_UPGRADE_SLOT = bytes32(uint256(19)); bytes32 constant STORAGE_PRICE_PER_TIB_PER_MONTH_SLOT = bytes32(uint256(20)); bytes32 constant MINIMUM_STORAGE_RATE_PER_MONTH_SLOT = bytes32(uint256(21)); -