@@ -137,10 +137,16 @@ contract FilecoinWarmStorageService is
137137
138138 // Decode structure for data set creation extra data
139139 struct DataSetCreateData {
140+ // The address of the payer who should have signed the message
140141 address payer;
142+ // the unique ID for the client's data set
143+ uint256 clientDataSetId;
144+ // Array of metadata keys
141145 string [] metadataKeys;
146+ // Array of metadata values
142147 string [] metadataValues;
143- bytes signature; // Authentication signature
148+ // The signature bytes (v, r, s)
149+ bytes signature;
144150 }
145151
146152 // Structure for service pricing information
@@ -253,7 +259,7 @@ contract FilecoinWarmStorageService is
253259 mapping (uint256 dataSetId = > bool ) private provenThisPeriod;
254260
255261 mapping (uint256 dataSetId = > DataSetInfo) private dataSetInfo;
256- mapping (address payer = > uint256 ) private clientDataSetIds;
262+ mapping (address payer = > mapping ( uint256 clientDataSetId = > uint256 ) ) private clientDataSetIds;
257263 mapping (address payer = > uint256 []) private clientDataSets;
258264 mapping (uint256 pdpRailId = > uint256 ) private railToDataSet;
259265
@@ -535,26 +541,23 @@ contract FilecoinWarmStorageService is
535541
536542 address payee = serviceProviderRegistry.getProviderPayee (providerId);
537543
538- uint256 clientDataSetId = clientDataSetIds[createData.payer]++ ;
544+ require (
545+ clientDataSetIds[createData.payer][createData.clientDataSetId] == 0 ,
546+ Errors.ClientDataSetAlreadyRegistered (createData.clientDataSetId)
547+ );
548+ clientDataSetIds[createData.payer][createData.clientDataSetId] = dataSetId;
539549 clientDataSets[createData.payer].push (dataSetId);
540550
541551 // Verify the client's signature
542- verifyCreateDataSetSignature (
543- createData.payer,
544- clientDataSetId,
545- payee,
546- createData.metadataKeys,
547- createData.metadataValues,
548- createData.signature
549- );
552+ verifyCreateDataSetSignature (payee, createData);
550553
551554 // Initialize the DataSetInfo struct
552555 DataSetInfo storage info = dataSetInfo[dataSetId];
553556 info.payer = createData.payer;
554557 info.payee = payee; // Using payee address from registry
555558 info.serviceProvider = serviceProvider; // Set the service provider
556559 info.commissionBps = serviceCommissionBps;
557- info.clientDataSetId = clientDataSetId;
560+ info.clientDataSetId = createData. clientDataSetId;
558561 info.providerId = providerId;
559562
560563 // Store each metadata key-value entry for this data set
@@ -679,6 +682,8 @@ contract FilecoinWarmStorageService is
679682 Errors.PaymentRailsNotFinalized (dataSetId, info.pdpEndEpoch)
680683 );
681684
685+ // NOTE keep clientDataSetIds[payer][clientDataSetId] to prevent replay
686+
682687 // Remove from client's dataset list
683688 uint256 [] storage clientDataSetList = clientDataSets[payer];
684689 for (uint256 i = 0 ; i < clientDataSetList.length ; i++ ) {
@@ -1298,10 +1303,16 @@ contract FilecoinWarmStorageService is
12981303 * @return decoded The decoded DataSetCreateData struct
12991304 */
13001305 function decodeDataSetCreateData (bytes calldata extraData ) internal pure returns (DataSetCreateData memory ) {
1301- (address payer , string [] memory keys , string [] memory values , bytes memory signature ) =
1302- abi.decode (extraData, (address , string [], string [], bytes ));
1303-
1304- return DataSetCreateData ({payer: payer, metadataKeys: keys, metadataValues: values, signature: signature});
1306+ (address payer , uint256 clientDataSetId , string [] memory keys , string [] memory values , bytes memory signature ) =
1307+ abi.decode (extraData, (address , uint256 , string [], string [], bytes ));
1308+
1309+ return DataSetCreateData ({
1310+ payer: payer,
1311+ clientDataSetId: clientDataSetId,
1312+ metadataKeys: keys,
1313+ metadataValues: values,
1314+ signature: signature
1315+ });
13051316 }
13061317
13071318 /**
@@ -1443,37 +1454,28 @@ contract FilecoinWarmStorageService is
14431454
14441455 /**
14451456 * @notice Verifies a signature for the CreateDataSet operation
1446- * @param payer The address of the payer who should have signed the message
1447- * @param clientDataSetId The unique ID for the client's data set
1457+ * @param createData The decoded DataSetCreateData used to build the signature
14481458 * @param payee The service provider address
1449- * @param metadataKeys Array of metadata keys
1450- * @param metadataValues Array of metadata values
1451- * @param signature The signature bytes (v, r, s)
14521459 */
1453- function verifyCreateDataSetSignature (
1454- address payer ,
1455- uint256 clientDataSetId ,
1456- address payee ,
1457- string [] memory metadataKeys ,
1458- string [] memory metadataValues ,
1459- bytes memory signature
1460- ) internal view {
1460+ function verifyCreateDataSetSignature (address payee , DataSetCreateData memory createData ) internal view {
14611461 // Hash the metadata entries
1462- bytes32 metadataHash = hashMetadataEntries (metadataKeys, metadataValues);
1462+ bytes32 metadataHash = hashMetadataEntries (createData. metadataKeys, createData. metadataValues);
14631463
14641464 // Prepare the message hash that was signed
1465- bytes32 structHash = keccak256 (abi.encode (CREATE_DATA_SET_TYPEHASH, clientDataSetId, payee, metadataHash));
1465+ bytes32 structHash =
1466+ keccak256 (abi.encode (CREATE_DATA_SET_TYPEHASH, createData.clientDataSetId, payee, metadataHash));
14661467 bytes32 digest = _hashTypedDataV4 (structHash);
14671468
14681469 // Recover signer address from the signature
1469- address recoveredSigner = recoverSigner (digest, signature);
1470+ address recoveredSigner = recoverSigner (digest, createData. signature);
14701471
1471- if (payer == recoveredSigner) {
1472+ if (createData. payer == recoveredSigner) {
14721473 return ;
14731474 }
14741475 require (
1475- sessionKeyRegistry.authorizationExpiry (payer, recoveredSigner, CREATE_DATA_SET_TYPEHASH) >= block .timestamp ,
1476- Errors.InvalidSignature (payer, recoveredSigner)
1476+ sessionKeyRegistry.authorizationExpiry (createData.payer, recoveredSigner, CREATE_DATA_SET_TYPEHASH)
1477+ >= block .timestamp ,
1478+ Errors.InvalidSignature (createData.payer, recoveredSigner)
14771479 );
14781480 }
14791481
0 commit comments