Skip to content

Commit d58232d

Browse files
rjan90rvagg
andauthored
fix: disable storage provider changes for GA (#309)
Disables storage provider changes by reverting in the `FilecoinWarmStorageService.storageProviderChanged()` listener callback. PDPVerifier remains unchanged, so no contract upgrade is needed for that layer. ### Changes - Modified `FilecoinWarmStorageService.storageProviderChanged()` to revert with "Storage provider changes are not yet supported" - Updated test expectations to verify the revert behavior Ref: #203 --------- Co-authored-by: Rod Vagg <[email protected]>
1 parent 68b9c7b commit d58232d

File tree

4 files changed

+50
-208
lines changed

4 files changed

+50
-208
lines changed

service_contracts/abi/FilecoinWarmStorageService.abi.json

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -719,17 +719,17 @@
719719
"name": "storageProviderChanged",
720720
"inputs": [
721721
{
722-
"name": "dataSetId",
722+
"name": "",
723723
"type": "uint256",
724724
"internalType": "uint256"
725725
},
726726
{
727-
"name": "oldServiceProvider",
727+
"name": "",
728728
"type": "address",
729729
"internalType": "address"
730730
},
731731
{
732-
"name": "newServiceProvider",
732+
"name": "",
733733
"type": "address",
734734
"internalType": "address"
735735
},
@@ -1965,27 +1965,6 @@
19651965
"name": "NotInitializing",
19661966
"inputs": []
19671967
},
1968-
{
1969-
"type": "error",
1970-
"name": "OldServiceProviderMismatch",
1971-
"inputs": [
1972-
{
1973-
"name": "dataSetId",
1974-
"type": "uint256",
1975-
"internalType": "uint256"
1976-
},
1977-
{
1978-
"name": "expected",
1979-
"type": "address",
1980-
"internalType": "address"
1981-
},
1982-
{
1983-
"name": "actual",
1984-
"type": "address",
1985-
"internalType": "address"
1986-
}
1987-
]
1988-
},
19891968
{
19901969
"type": "error",
19911970
"name": "OnlyFilBeamControllerAllowed",

service_contracts/src/FilecoinWarmStorageService.sol

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -919,43 +919,18 @@ contract FilecoinWarmStorageService is
919919
}
920920

921921
/**
922-
* @notice Handles data set service provider changes by updating internal state only
923-
* @dev Called by the PDPVerifier contract when data set service provider is transferred.
924-
* NOTE: The PDPVerifier contract emits events and exposes methods in terms of "storage providers",
925-
* because its scope is specifically the Proof-of-Data-Possession for storage services.
926-
* In FilecoinWarmStorageService (and the broader service registry architecture), we use the term
927-
* "service provider" to support a future where multiple types of services may exist (not just storage).
928-
* As a result, some parameters and events reflect this terminology shift and this method represents
929-
* a transition point in the language, from PDPVerifier to FilecoinWarmStorageService.
930-
* @param dataSetId The ID of the data set whose service provider is changing
931-
* @param oldServiceProvider The previous service provider address
932-
* @param newServiceProvider The new service provider address (must be an approved provider)
922+
* @notice Handles data set service provider changes (currently disabled for GA)
923+
* @dev Storage provider changes are disabled for GA. This will be re-enabled post-GA
924+
* with proper client authorization. See: https://github.com/FilOzone/filecoin-services/issues/203
925+
* Called by the PDPVerifier contract when data set service provider is transferred.
933926
*/
934927
function storageProviderChanged(
935-
uint256 dataSetId,
936-
address oldServiceProvider,
937-
address newServiceProvider,
928+
uint256, // dataSetId
929+
address, // oldServiceProvider
930+
address, // newServiceProvider
938931
bytes calldata // extraData - not used
939932
) external override onlyPDPVerifier {
940-
// Verify the data set exists and validate the old service provider
941-
DataSetInfo storage info = dataSetInfo[dataSetId];
942-
require(
943-
info.serviceProvider == oldServiceProvider,
944-
Errors.OldServiceProviderMismatch(dataSetId, info.serviceProvider, oldServiceProvider)
945-
);
946-
require(newServiceProvider != address(0), Errors.ZeroAddress(Errors.AddressField.ServiceProvider));
947-
948-
// Verify new service provider is registered
949-
uint256 newProviderId = serviceProviderRegistry.getProviderIdByAddress(newServiceProvider);
950-
951-
// Check if provider is registered
952-
require(newProviderId != 0, Errors.ProviderNotRegistered(newServiceProvider));
953-
954-
// Update the data set service provider
955-
info.serviceProvider = newServiceProvider;
956-
957-
// Emit event for off-chain tracking
958-
emit DataSetServiceProviderChanged(dataSetId, oldServiceProvider, newServiceProvider);
933+
revert("Storage provider changes are not yet supported");
959934
}
960935

961936
function terminateService(uint256 dataSetId) external {

service_contracts/test/FilecoinWarmStorageService.t.sol

Lines changed: 15 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1172,44 +1172,23 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest {
11721172
* @notice Test successful service provider change between two approved providers
11731173
* @dev Verifies only the data set's payee is updated, event is emitted, and serviceProviderRegistry state is unchanged.
11741174
*/
1175+
// NOTE: Disabled for GA - Storage provider changes are not permitted
1176+
// See: https://github.com/FilOzone/filecoin-services/issues/203
11751177
function testServiceProviderChangedSuccessDecoupled() public {
11761178
// Create a data set with sp1 as the service provider
11771179
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
11781180

1179-
// Change service provider from sp1 to sp2
1181+
// Change service provider from sp1 to sp2 should revert
11801182
bytes memory testExtraData = new bytes(0);
1181-
vm.expectEmit(true, true, true, true);
1182-
emit FilecoinWarmStorageService.DataSetServiceProviderChanged(testDataSetId, sp1, sp2);
11831183
vm.prank(sp2);
1184+
vm.expectRevert("Storage provider changes are not yet supported");
11841185
mockPDPVerifier.changeDataSetServiceProvider(testDataSetId, sp2, address(pdpServiceWithPayments), testExtraData);
1185-
1186-
// Only the data set's service provider is updated
1187-
FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(testDataSetId);
1188-
assertEq(dataSet.serviceProvider, sp2, "Service provider should be updated to new service provider");
1189-
// Payee should remain unchanged (still sp1's beneficiary)
1190-
assertEq(dataSet.payee, sp1, "Payee should remain unchanged");
1191-
}
1192-
1193-
/**
1194-
* @notice Test service provider change reverts if new service provider is not an approved provider
1195-
*/
1196-
function testServiceProviderChangedNoLongerChecksApproval() public {
1197-
// Create a data set with sp1 as the service provider
1198-
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
1199-
address newProvider = address(0x9999);
1200-
bytes memory testExtraData = new bytes(0);
1201-
1202-
// The change should now fail because the new provider is not registered
1203-
vm.prank(newProvider);
1204-
vm.expectRevert(abi.encodeWithSelector(Errors.ProviderNotRegistered.selector, newProvider));
1205-
mockPDPVerifier.changeDataSetServiceProvider(
1206-
testDataSetId, newProvider, address(pdpServiceWithPayments), testExtraData
1207-
);
12081186
}
12091187

12101188
/**
12111189
* @notice Test service provider change reverts if new service provider is zero address
12121190
*/
1191+
// NOTE: The mock PDPVerifier checks for zero address before calling the listener
12131192
function testServiceProviderChangedRevertsIfNewServiceProviderZeroAddress() public {
12141193
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
12151194
bytes memory testExtraData = new bytes(0);
@@ -1221,65 +1200,44 @@ contract FilecoinWarmStorageServiceTest is MockFVMTest {
12211200
}
12221201

12231202
/**
1224-
* @notice Test service provider change reverts if old service provider mismatch
1203+
* @notice Test service provider change reverts (feature not yet supported)
12251204
*/
1205+
// NOTE: Disabled for GA - Storage provider changes are not permitted
1206+
// See: https://github.com/FilOzone/filecoin-services/issues/203
12261207
function testServiceProviderChangedRevertsIfOldServiceProviderMismatch() public {
12271208
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
12281209
bytes memory testExtraData = new bytes(0);
1229-
// Call directly as PDPVerifier with wrong old service provider
1210+
// Call directly as PDPVerifier - should now revert before validation
12301211
vm.prank(address(mockPDPVerifier));
1231-
vm.expectRevert(abi.encodeWithSelector(Errors.OldServiceProviderMismatch.selector, 1, sp1, sp2));
1212+
vm.expectRevert("Storage provider changes are not yet supported");
12321213
pdpServiceWithPayments.storageProviderChanged(testDataSetId, sp2, sp2, testExtraData);
12331214
}
12341215

12351216
/**
12361217
* @notice Test service provider change reverts if called by unauthorized address
12371218
*/
1219+
// NOTE: This test for the onlyPDPVerifier modifier validation remains important
12381220
function testServiceProviderChangedRevertsIfUnauthorizedCaller() public {
12391221
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
12401222
bytes memory testExtraData = new bytes(0);
1241-
// Call directly as sp2 (not PDPVerifier)
1223+
// Call directly as sp2 (not PDPVerifier) - should fail on modifier before main revert
12421224
vm.prank(sp2);
12431225
vm.expectRevert(abi.encodeWithSelector(Errors.OnlyPDPVerifierAllowed.selector, address(mockPDPVerifier), sp2));
12441226
pdpServiceWithPayments.storageProviderChanged(testDataSetId, sp1, sp2, testExtraData);
12451227
}
12461228

1247-
/**
1248-
* @notice Test multiple data sets per provider: only the targeted data set's payee is updated
1249-
*/
1250-
function testMultipleDataSetsPerProviderServiceProviderChange() public {
1251-
// Create two data sets for sp1
1252-
uint256 ps1 = createDataSetForServiceProviderTest(sp1, client, "Data Set 1");
1253-
uint256 ps2 = createDataSetForServiceProviderTest(sp1, client, "Data Set 2");
1254-
// Change service provider of ps1 to sp2
1255-
bytes memory testExtraData = new bytes(0);
1256-
vm.expectEmit(true, true, true, true);
1257-
emit FilecoinWarmStorageService.DataSetServiceProviderChanged(ps1, sp1, sp2);
1258-
vm.prank(sp2);
1259-
mockPDPVerifier.changeDataSetServiceProvider(ps1, sp2, address(pdpServiceWithPayments), testExtraData);
1260-
// ps1 service provider updated, ps2 service provider unchanged
1261-
FilecoinWarmStorageService.DataSetInfoView memory dataSet1 = viewContract.getDataSet(ps1);
1262-
FilecoinWarmStorageService.DataSetInfoView memory dataSet2 = viewContract.getDataSet(ps2);
1263-
assertEq(dataSet1.serviceProvider, sp2, "ps1 service provider should be sp2");
1264-
assertEq(dataSet1.payee, sp1, "ps1 payee should remain sp1");
1265-
assertEq(dataSet2.serviceProvider, sp1, "ps2 service provider should remain sp1");
1266-
assertEq(dataSet2.payee, sp1, "ps2 payee should remain sp1");
1267-
}
1268-
12691229
/**
12701230
* @notice Test service provider change works with arbitrary extra data
12711231
*/
1232+
// NOTE: Disabled for GA - Storage provider changes are not permitted
1233+
// See: https://github.com/FilOzone/filecoin-services/issues/203
12721234
function testServiceProviderChangedWithArbitraryExtraData() public {
12731235
uint256 testDataSetId = createDataSetForServiceProviderTest(sp1, client, "Test Data Set");
12741236
// Use arbitrary extra data
12751237
bytes memory testExtraData = abi.encode("arbitrary", 123, address(this));
1276-
vm.expectEmit(true, true, true, true);
1277-
emit FilecoinWarmStorageService.DataSetServiceProviderChanged(testDataSetId, sp1, sp2);
12781238
vm.prank(sp2);
1239+
vm.expectRevert("Storage provider changes are not yet supported");
12791240
mockPDPVerifier.changeDataSetServiceProvider(testDataSetId, sp2, address(pdpServiceWithPayments), testExtraData);
1280-
FilecoinWarmStorageService.DataSetInfoView memory dataSet = viewContract.getDataSet(testDataSetId);
1281-
assertEq(dataSet.serviceProvider, sp2, "Service provider should be updated to new service provider");
1282-
assertEq(dataSet.payee, sp1, "Payee should remain unchanged");
12831241
}
12841242

12851243
function testProvenPeriods() public {

service_contracts/test/FilecoinWarmStorageServiceOwner.t.sol

Lines changed: 24 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {SessionKeyRegistry} from "@session-key-registry/SessionKeyRegistry.sol";
1212
import {PDPListener} from "@pdp/PDPVerifier.sol";
1313
import {MyERC1967Proxy} from "@pdp/ERC1967Proxy.sol";
1414
import {FilecoinPayV1} from "@fws-payments/FilecoinPayV1.sol";
15-
import {Errors} from "../src/Errors.sol";
1615
import {MockERC20, MockPDPVerifier} from "./mocks/SharedMocks.sol";
1716
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
1817

@@ -217,139 +216,70 @@ contract FilecoinWarmStorageServiceOwnerTest is MockFVMTest {
217216
console.log("Service provider field correctly set to creator:", provider1);
218217
}
219218

219+
// NOTE: Disabled for GA - Storage provider changes are not permitted
220+
// See: https://github.com/FilOzone/filecoin-services/issues/203
220221
function testStorageProviderChangedUpdatesOnlyOwnerField() public {
221-
console.log("=== Test: storageProviderChanged updates only owner field ===");
222+
console.log("=== Test: storageProviderChanged reverts (not yet supported) ===");
222223

223224
uint256 dataSetId = createDataSet(provider1, client);
224225

225-
// Get initial state
226-
FilecoinWarmStorageService.DataSetInfoView memory infoBefore = viewContract.getDataSet(dataSetId);
227-
assertEq(infoBefore.serviceProvider, provider1, "Initial owner should be provider1");
228-
229-
// Change storage provider
230-
vm.expectEmit(true, true, true, true);
231-
emit DataSetServiceProviderChanged(dataSetId, provider1, provider2);
232-
226+
// Change storage provider should revert at FWSS listener
233227
vm.prank(provider2);
228+
vm.expectRevert("Storage provider changes are not yet supported");
234229
pdpVerifier.changeDataSetServiceProvider(dataSetId, provider2, address(serviceContract), new bytes(0));
235230

236-
// Check updated state
237-
FilecoinWarmStorageService.DataSetInfoView memory infoAfter = viewContract.getDataSet(dataSetId);
238-
239-
assertEq(infoAfter.serviceProvider, provider2, "Service provider should be updated to provider2");
240-
assertEq(infoAfter.payee, provider1, "Payee should remain unchanged");
241-
assertEq(infoAfter.payer, client, "Payer should remain unchanged");
242-
243-
console.log("Service provider updated from", provider1, "to", provider2);
244-
console.log("Payee remained unchanged:", provider1);
231+
console.log("Storage provider change correctly rejected");
245232
}
246233

234+
// NOTE: Disabled for GA - Storage provider changes are not permitted
235+
// See: https://github.com/FilOzone/filecoin-services/issues/203
247236
function testStorageProviderChangedRevertsForUnregisteredProvider() public {
248-
console.log("=== Test: storageProviderChanged reverts for unregistered provider ===");
237+
console.log("=== Test: storageProviderChanged reverts (not yet supported) ===");
249238

250239
uint256 dataSetId = createDataSet(provider1, client);
251240

252241
address unregisteredAddress = address(0x999);
253242

254-
// Try to change to unregistered provider
243+
// Try to change to unregistered provider, expect a revert
255244
vm.prank(address(pdpVerifier));
256-
vm.expectRevert(abi.encodeWithSelector(Errors.ProviderNotRegistered.selector, unregisteredAddress));
245+
vm.expectRevert("Storage provider changes are not yet supported");
257246
serviceContract.storageProviderChanged(dataSetId, provider1, unregisteredAddress, new bytes(0));
258247

259-
console.log("Correctly reverted for unregistered provider");
248+
console.log("Correctly reverted (feature not yet supported)");
260249
}
261250

251+
// NOTE: Disabled for GA - Storage provider changes are not permitted
252+
// See: https://github.com/FilOzone/filecoin-services/issues/203
262253
function testStorageProviderChangedSucceedsForAnyRegisteredProvider() public {
263-
console.log("=== Test: storageProviderChanged succeeds for any registered provider ===");
254+
console.log("=== Test: storageProviderChanged reverts (not yet supported) ===");
264255

265256
uint256 dataSetId = createDataSet(provider1, client);
266257

267-
// Change to shouldn't require provider be approved
258+
// Change to registered provider should revert
268259
vm.prank(address(pdpVerifier));
260+
vm.expectRevert("Storage provider changes are not yet supported");
269261
serviceContract.storageProviderChanged(dataSetId, provider1, unauthorizedProvider, new bytes(0));
270262

271-
// Verify the service provider was changed
272-
FilecoinWarmStorageService.DataSetInfoView memory info = viewContract.getDataSet(dataSetId);
273-
assertEq(info.serviceProvider, unauthorizedProvider, "Service provider should be updated");
274-
275-
console.log("Successfully changed to registered provider (approval not required)");
263+
console.log("Correctly reverted (feature not yet supported)");
276264
}
277265

266+
// NOTE: Disabled for GA - Storage provider changes are not permitted
267+
// See: https://github.com/FilOzone/filecoin-services/issues/203
278268
function testStorageProviderChangedRevertsForWrongOldOwner() public {
279-
console.log("=== Test: storageProviderChanged reverts for wrong old owner ===");
269+
console.log("=== Test: storageProviderChanged reverts (not yet supported) ===");
280270

281271
uint256 dataSetId = createDataSet(provider1, client);
282272

283-
// Try to change with wrong old owner
273+
// Try to change with wrong old owner - now reverts before validation
284274
vm.prank(address(pdpVerifier));
285-
vm.expectRevert(
286-
abi.encodeWithSelector(
287-
Errors.OldServiceProviderMismatch.selector,
288-
dataSetId,
289-
provider1, // actual owner
290-
provider3 // wrong old owner passed
291-
)
292-
);
275+
vm.expectRevert("Storage provider changes are not yet supported");
293276
serviceContract.storageProviderChanged(
294277
dataSetId,
295278
provider3, // wrong old owner
296279
provider2,
297280
new bytes(0)
298281
);
299282

300-
console.log("Correctly reverted for wrong old owner");
301-
}
302-
303-
function testTerminateServiceUsesOwnerForAuthorization() public {
304-
console.log("=== Test: terminateService uses owner for authorization ===");
305-
306-
uint256 dataSetId = createDataSet(provider1, client);
307-
308-
// Change owner to provider2
309-
vm.prank(provider2);
310-
pdpVerifier.changeDataSetServiceProvider(dataSetId, provider2, address(serviceContract), new bytes(0));
311-
312-
// Provider1 (original creator but no longer owner) should not be able to terminate
313-
vm.prank(provider1);
314-
vm.expectRevert(
315-
abi.encodeWithSelector(
316-
Errors.CallerNotPayerOrPayee.selector,
317-
dataSetId,
318-
client, // payer
319-
provider2, // current owner
320-
provider1 // caller
321-
)
322-
);
323-
serviceContract.terminateService(dataSetId);
324-
325-
// Provider2 (current owner) should be able to terminate
326-
vm.prank(provider2);
327-
serviceContract.terminateService(dataSetId);
328-
329-
console.log("Only current owner (provider2) could terminate, not original creator (provider1)");
330-
}
331-
332-
function testMultipleOwnerChanges() public {
333-
console.log("=== Test: Multiple owner changes ===");
334-
335-
uint256 dataSetId = createDataSet(provider1, client);
336-
337-
// First change: provider1 -> provider2
338-
vm.prank(provider2);
339-
pdpVerifier.changeDataSetServiceProvider(dataSetId, provider2, address(serviceContract), new bytes(0));
340-
341-
FilecoinWarmStorageService.DataSetInfoView memory info1 = viewContract.getDataSet(dataSetId);
342-
assertEq(info1.serviceProvider, provider2, "Service provider should be provider2 after first change");
343-
344-
// Second change: provider2 -> provider3
345-
vm.prank(provider3);
346-
pdpVerifier.changeDataSetServiceProvider(dataSetId, provider3, address(serviceContract), new bytes(0));
347-
348-
FilecoinWarmStorageService.DataSetInfoView memory info2 = viewContract.getDataSet(dataSetId);
349-
assertEq(info2.serviceProvider, provider3, "Service provider should be provider3 after second change");
350-
assertEq(info2.payee, provider1, "Payee should still be original provider1");
351-
352-
console.log("Service provider changed successfully: provider1 -> provider2 -> provider3");
353-
console.log("Payee remained as provider1 throughout");
283+
console.log("Correctly reverted (feature not yet supported)");
354284
}
355285
}

0 commit comments

Comments
 (0)