All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog
This release improves data set creation and data set query behavior in FWSS, while fixing proving-period settlement logic and clarifying funding requirements for new data sets.
See service_contracts/deployments.json for the latest Mainnet (chain 314) and Calibnet (chain 314159) contract addresses. The FWSS proxy addresses remain unchanged in this release; the upgrade only changes the implementation behind the existing proxies.
- Data set creation now charges the PDPVerifier USDFC sybil fee via a client-funded burn rail (#437)
- Corrected FWSS proving-period boundary handling to use exclusive-inclusive ranges (#419)
- Simplified and optimized validator-path settlement calculations in
_findProvenEpochs(#423, #424)
- Existing FWSS proxy integrations continue using the same proxy addresses.
- No migration is required for existing data sets or existing integrations.
- Clients creating new data sets should ensure they have enough available USDFC funds and lockup allowance to cover both the existing minimum lockup and the PDPVerifier sybil fee.
- The USDFC sybil fee is
0.1 USDFC. - The configured amount can be read on-chain by calling
USDFC_SYBIL_FEE()on the PDPVerifier proxy for each network. Seeservice_contracts/deployments.jsonfor the PDP proxy addresses.
- The USDFC sybil fee is
- No user action is required unless your integration depends on the exact pre-upgrade dataset-creation funding assumptions.
1.1.0 - 2026-01-30 - FWSS Upgrade
This release includes bug fixes, new features, and operational improvements for the Filecoin Warm Storage Service.
See service_contracts/deployments.json for v1.1.0 Mainnet (chain 314) and Calibnet (chain 314159) contract addresses.
ProviderIdSetcontract for efficient provider ID management (#386)- Space-efficient arrayset implementation for sparse provider IDs
- Interface:
getProviderIds(),containsProviderId(),addProviderId(),removeProviderId() - While the contract is generic and can store any set of provider IDs, one specific instance has been designated as the canonical "endorsed set of provider IDs" for FOC, supporting the GA durability requirements by identifying storage providers that meet quality and reliability standards (#357)
- Two-step upgrade announcement flow for ServiceProviderRegistry (#356)
- Automatic deployment address management via
deployments.json(#364) - Devnet deployment support (#373)
- CDN validation in
validatePayerOperatorApprovalAndFunds()(#342)
- BREAKING: Renamed deployment keys in
deployments.jsonfor consistency (#388)PAYMENTS_CONTRACT_ADDRESS→FILECOIN_PAY_ADDRESSFWS_IMPLEMENTATION_ADDRESS→FWSS_IMPLEMENTATION_ADDRESSWARM_STORAGE_PROXY_ADDRESS→FWSS_PROXY_ADDRESSWARM_STORAGE_VIEW_ADDRESS→FWSS_VIEW_ADDRESS- Added
SIGNATURE_VERIFICATION_LIB_ADDRESS
- BREAKING: Rail settlement required before dataset deletion (#377)
dataSetDeleted()now blocked untilsettledUpTo >= endEpoch- Prevents SPs from deleting datasets before clients can settle
- Added
RailNotFullySettlederror
- BREAKING: Removed redundant PDP config getters from view contract (#372)
- Removed:
challengeWindow(),getChallengesPerProof(),getMaxProvingPeriod() - Use
getPDPConfig()instead (perIPDPProvingScheduleinterface)
- Removed:
- Rail rate automatically modified when
piecesAdded()is called (#365) - Deferred rate recalculation to piece operations for efficiency (#381)
- Replaced Filfox with Blockscout as default block explorer (#349)
- Piece metadata now properly cleaned up on scheduled removals (#343)
- Ignore errors when CDN rails already terminated via FilecoinPay (#385)
- Deploy warm storage only script fix (#348)
- FWSS upgrade process documentation (UPGRADE-PROCESS.md)
- Pricing model specification document (#366)
- Added precision loss documentation for minimum rate calculation (#378)
- Clarified rate change semantics after termination
- Added v1.0.0 release links to README (#344)
1.0.0 - 2025-10-27 - FWSS GA Release
This is the General Availability (GA) release of the Filecoin Warm Storage Service (FWSS) contracts.
- Payments Contract: 0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa
- From Filecoin-Pay v1.0.0
- PDPVerifier Implementation: 0xe2Dc211BffcA499761570E04e8143Be2BA66095f
- From PDP v3.1.0
- PDPVerifier Proxy: 0xBADd0B92C1c71d02E7d520f64c0876538fa2557F
- From PDP v3.1.0
- SessionKeyRegistry: 0x74FD50525A958aF5d484601E252271f9625231aB
- ServiceProviderRegistry Implementation: 0xe255D3a89D6B326b48bc0fC94a472A839471D6B0
- ServiceProviderRegistry Proxy: 0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB
- FilecoinWarmStorageService Implementation: 0xd60b90f6D3C42B26a246E141ec701a20Dde2fA61
- FilecoinWarmStorageService Proxy: 0x8408502033C418E1bbC97cE9ac48E5528F371A9f
- FilecoinWarmStorageServiceStateView: 0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46
Configuration:
- USDFC Token: 0x80B98d3aa09ffff255c3ba4A241111Ff1262F045
- FILBEAM_BENEFICIARY_ADDRESS: 0x1D60d2F5960Af6341e842C539985FA297E10d6eA
- FILBEAM_CONTROLLER_ADDRESS: 0x5f7E5E2A756430EdeE781FF6e6F7954254Ef629A
- CHALLENGE_FINALITY: 150 epochs
- MAX_PROVING_PERIOD: 2880 epochs
- CHALLENGE_WINDOW_SIZE: 20 epochs
- Service Name: "Filecoin Warm Storage Service - Mainnet GA Release"
- Service Description: "Mainnet FWSS GA contracts"
- Payments Contract: 0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0
- From Filecoin-Pay v1.0.0
- PDPVerifier Implementation: 0x2355Cb19BA1eFF51673562E1a5fc5eE292AF9D42
- From PDP v3.1.0
- PDPVerifier Proxy: 0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C
- From PDP v3.1.0
- SessionKeyRegistry: 0x518411c2062E119Aaf7A8B12A2eDf9a939347655
- ServiceProviderRegistry Implementation: 0xb32Bb530638d20f1B59B40CDD2Ce4208430f7DE3
- ServiceProviderRegistry Proxy: 0x839e5c9988e4e9977d40708d0094103c0839Ac9D
- FilecoinWarmStorageService Implementation: 0x1cAeE5EfCfc3681C2bBF689Ccb30d70c6e45F49f
- FilecoinWarmStorageService Proxy: 0x02925630df557F957f70E112bA06e50965417CA0
- FilecoinWarmStorageServiceStateView: 0xA5D87b04086B1d591026cCE10255351B5AA4689B
Configuration:
- USDFC Token: 0xb3042734b608a1B16e9e86B374A3f3e389B4cDf0
- FILBEAM_BENEFICIARY_ADDRESS: 0x1D60d2F5960Af6341e842C539985FA297E10d6eA
- FILBEAM_CONTROLLER_ADDRESS: 0x5f7E5E2A756430EdeE781FF6e6F7954254Ef629A
- CHALLENGE_FINALITY: 10 epochs
- MAX_PROVING_PERIOD: 240 epochs
- CHALLENGE_WINDOW_SIZE: 20 epochs
- Service Name: "Filecoin Warm Storage Service - Calibration GA Release"
- Service Description: "Calibration FWSS GA contracts"
- EXTRA_DATA size limits for enhanced security (#313)
- Floor price set to 0.06 USDFC/month (#320)
- Random nonces for AddPieces operations (#317)
- Relaxed constraints on
setViewContract(#310) - Auto-verify contracts after deployment (#272)
- Regression tests for dataset cleanup (#276)
- Export Errors ABI (#329)
- BREAKING: Simplified
DataSetStatusenum from 3 states to 2 states (#314)- Old values:
NotFound (0),Active (1),Terminating (2) - New values:
Inactive (0),Active (1) - Migration:
NotFound→Inactive(non-existent datasets)Terminating→Active(terminated datasets with pieces are still Active)- Use
pdpEndEpochto check if a dataset is terminated
- Details:
Inactiverepresents non-existent datasets or datasets with no pieces yet.Activerepresents all datasets with pieces, including terminated ones. - Use
getDataSetStatusDetails()to check termination status separately from Active/Inactive status
- Old values:
- BREAKING: ServiceProviderRegistry Bloom Schema refactor (#308)
- Removed encoded
productData; all product attributes now use capability key-value store - Keys are
string, values arebytes - Migration for synapse and curio:
- All
productInfopreviously ABI-encoded is removed. Use capability key-value store instead. Encode unsigned integers as big-endian, addresses asbytes[20], strings as UTF-8. - Replace
getPDPOffering()withgetAllProductCapabilities()to retrieve product info getActiveProvidersByProductType()andgetProvidersByProductType()now returnproductCapabilityValuesinProviderWithProduct[]getProductCapabilities()no longer returnsexistsbool arraygetProductCapability()is removed; useproductCapabilitiesmapping insteadupdatePDPServiceWithCapabilities()is removed; useupdateProduct()instead- Capability values cannot be empty; exclude the key if product lacks the capability
- All
- Contract size reduced from 21,290 to 17,751 bytes (-3,539 bytes)
- Removed encoded
- BREAKING: Non-sequential
clientDataSetId(#265)- Changed from sequential counter to mapping-based non-sequential IDs
- Migration: Clients can now create datasets with any unique
clientDataSetIdvalue, removing the sequential bottleneck - Added
DataSetIdAlreadyExistserror for duplicate IDs
- BREAKING: Renamed Payments contract to FilecoinPayV1 (#293)
- Migration: Update all contract references from
PaymentstoFilecoinPayV1 - ABI file renamed:
Payments.abi.json→FilecoinPayV1.abi.json - Deployment scripts and documentation updated
- Migration: Update all contract references from
- BREAKING: ServiceProviderRegistry events now emit raw productData (#294)
- Removed
serviceUrlargument from Product events - Migration: Parse
serviceUrlfrom rawproductDataif needed - Events now more portable and forward-compatible with future product types
- Removed
- BREAKING: ServiceProviderRegistry deletes removed product data (#295)
- Changed behavior: Product data is now properly cleaned up when removed
- Migration: Use
isActiveto detect if product exists, not presence of data fields
- Calibnet: Reduced
DEFAULT_CHALLENGE_WINDOW_SIZEfrom 30 epochs to 20 epochs for faster testing iteration (#327) - Made storage pricing and minimum rate mutable storage variables instead of immutable constants (#325)
- Made FWSS permissionless by removing provider approval checks (#302)
- CDN pricing changed from monthly to usage-based egress model (#324)
- Use constant typehash instead of rehashing for EIP-712 signatures (#315)
- Burn mechanism now uses FVMPay (#296)
- SignatureVerificationLib refactored to use delegate pattern (#282)
- Subgraph now uses productData from events directly (#298)
- Subgraph decodes PDP offering using ethereum.decode (#290)
- CDNPaymentRailsToppedUp event refactored (#284)
- Updated lib/pdp to v3.1.0 with improved validator support for forward progress despite missing proofs (#321)
- BREAKING:
PaymentArbitratedevent removed from contract and subgraph (#301)
- Optimized payment validation to loop over proving periods (#267)
- Removed railToDataSet mapping for CDN rails (#278)
- Optimized withCDN metadata key handling (#271)
- Added dataSetHasCDNMetadataKey optimization (#274)
- Replaced error strings with custom errors (#270)
0.3.0 - 2025-10-08 - M3.1 Calibration Network Deployment
- Payments Contract: 0x6dB198201F900c17e86D267d7Df82567FB03df5E
- From Filecoin-Pay v0.6.0
- PDPVerifier Implementation: 0x4EC9a8ae6e6A419056b6C332509deEA371b182EF
- From PDP v2.2.1
- PDPVerifier Proxy: 0x579dD9E561D4Cd1776CF3e52E598616E77D5FBcb
- From PDP v2.2.1
- SessionKeyRegistry: 0x97Dd879F5a97A8c761B94746d7F5cfF50AAd4452
- ServiceProviderRegistry Implementation: 0x5672fE3B5366819B4Bd2F538A2CAEA11f0b2Aff5
- ServiceProviderRegistry Proxy: 0x1096ba1e7BB912136DA8524A22bF71091dc4FDd9
- FilecoinWarmStorageService Implementation: 0x6B78a026309bc2659c5891559D412FA1BA6529A5
- FilecoinWarmStorageService Proxy: 0x468342072e0dc86AFFBe15519bc5B1A1aa86e4dc
- FilecoinWarmStorageServiceStateView: 0xE4587AAdB97d7B8197aa08E432bAD0D9Cfe3a17F
Configuration:
- USDFC Token: 0xb3042734b608a1B16e9e86B374A3f3e389B4cDf0
- FILBEAM_BENEFICIARY_ADDRESS: 0x1D60d2F5960Af6341e842C539985FA297E10d6eA
- FILBEAM_CONTROLLER_ADDRESS: 0x5f7E5E2A756430EdeE781FF6e6F7954254Ef629A
- CHALLENGE_FINALITY: 10 epochs
- MAX_PROVING_PERIOD: 240 epochs
- CHALLENGE_WINDOW_SIZE: 30 epochs
- Service Name: "Filecoin Warm Storage Service - Calibration M3.1"
- Service Description: "Calibration FWSS contracts for M3.1"
- ServiceProviderRegistry full redeploy - Required due to state compatibility issues with FilecoinWarmStorageService
- Previous FWSS release (0.2.0) used an old ServiceProviderRegistry; upgrading existing ServiceProviderRegistry would cause state mismatch with FWSS
- ServiceProviderRegistry VERSION updated to 0.3.0 to properly reflect inclusion of providerId struct fix from PR #247
- FilecoinWarmStorageService VERSION string updated to 0.3.0.
- Changed PDPVerifier to v2.2.1 (PDP v2.2.1 release notes)
- Restored
createDataSet()function for enhanced flexibility in dataset initialization, enabling empty "bucket" creation, smoother Curio and synapse-sdk integration (#219)
- Restored
0.2.0 - 2025-10-07 - M3 Calibration Network Deployment
- Payments Contract: 0x6dB198201F900c17e86D267d7Df82567FB03df5E
- From Filecoin-Pay v0.6.0
- PDPVerifier Implementation: 0xCa92b746a7af215e0AaC7D0F956d74B522b295b6
- From PDP v2.2.0
- PDPVerifier Proxy: 0x9ecb84bB617a6Fd9911553bE12502a1B091CdfD8
- From PDP v2.2.0
- SessionKeyRegistry: 0x97Dd879F5a97A8c761B94746d7F5cfF50AAd4452
- ServiceProviderRegistry Implementation: 0xEdc9A41371d69a736bEfBa7678007BDBA61425E5
- ServiceProviderRegistry Proxy: 0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb
- FilecoinWarmStorageService Implementation: 0x2d76e3A41fa4614D1840CEB73aa07c5d0af6a023
- FilecoinWarmStorageService Proxy: 0x9ef4cAb0aD0D19b8Df28791Df80b29bC784bE91b
- FilecoinWarmStorageServiceStateView: 0x7175a72479e2B0050ed310f1a49a517C03573547
Configuration:
- USDFC Token: 0xb3042734b608a1B16e9e86B374A3f3e389B4cDf0
- FILBEAM_BENEFICIARY_ADDRESS: 0x1D60d2F5960Af6341e842C539985FA297E10d6eA
- FILBEAM_CONTROLLER_ADDRESS: 0x5f7E5E2A756430EdeE781FF6e6F7954254Ef629A
- CHALLENGE_FINALITY: 10 epochs
- MAX_PROVING_PERIOD: 240 epochs
- CHALLENGE_WINDOW_SIZE: 30 epochs
- Service Name: "Filecoin Warm Storage Service - Calibration M3"
- Service Description: "Calibration FWSS contracts for M3"
- feat: announcePlannedUpgrade (#260)
- feat: Allow deletion of terminated dataset, Add getDataSetStatus (#255)
- feat(ServiceProviderRegistry): add getProvidersByIds batch lookup function (251)
- perf(ServiceProviderRegistry): getProviderPayee helper for dataSetCreated (#249)
- Added ERC-3009 support with new deposit authorization functions (#225)
depositWithAuthorization()for ERC-3009 compliant depositsdepositWithAuthorizationAndApproveOperator()for combined deposit and operator approvaldepositWithAuthorizationAndIncreaseOperatorApproval()for combined deposit and operator allowance increase
- feat: service registry: add providerId to ServiceInfo (#209)
- feat: owner beneficairy seperation without transfer (#191)
- feat: Add dataset termination and deletion status tracking for SDK usability (#146)
- Switch from PieceCIDv2 to v2 (#123)
- perf(provenPeriods): bitmap (#258)
- Modify CDN payment rails and add methods for usage-based payments (#237)
- BREAKING: Updated Payments contract ABI with breaking changes (#223)
DepositRecordedevent removesusedPermitparameter - event listeners must be updatedrailCancelfunction state mutability changed fromnonpayabletopayable- callers may need to handle potential token transfersPermitRecipientMustBeMsgSendererror replaced withSignerMustBeMsgSendererror - error handling code must be updated
- feat: remove provierId from ServiceProviderInfo struct (#247)
- Adds a
ServiceProviderInfoViewstruct withproviderIdfield for external consumption.
- Adds a
- Breaking: feat!: FilCDN now is FilBeam (#236)
- Breaking: feat!: update service parameters (#239)
- The price changes was temporiarily reverted for this release until a upcoming feature is landed that warranted this change.
- feat: remove dataset creation fee (#245)
- feat: update getClientDataSets to return dataSetId (#242)
- fix: update FilCDN Controller & Beneficiary addresses (#230)
- feat(subgraph): updates based on KV metadata and service provider registry (#189)
- Add emit pieceCid in PieceAdded event (#207)
- fix: Clear withCDN flag when terminating service (#208)
- fix: remove serviceName and serviceDescription properties (#199)
- feat: rename datset termination and emit events for dataset termination and add extradata (#129)
- feat: remove service provider registry as we're moving it to it's own contract (#135)
0.1.0 - 2025-01-24
- BREAKING: Renamed PandoraService to FilecoinWarmStorageService throughout the codebase
- Contract name changed from
PandoraServicetoFilecoinWarmStorageService - EIP-712 domain name updated to "FilecoinWarmStorageService"
- All file names, deployment scripts, and documentation updated accordingly
- This change requires regenerating all EIP-712 signatures for client applications
- Contract name changed from
- BREAKING: Renamed core terminology throughout the codebase for better clarity, matching PDPVerifier version 2.0.0.
- Core Terminology Changes:
proofSet→dataSet(all functions, events, variables, mappings; "proof set" becomes "data set")root→piece(all references to stored data units)rootId→pieceIdowner→serviceProvider(in ApprovedProviderInfo struct)
- Function Renames:
proofSetCreated()→dataSetCreated()proofSetDeleted()→dataSetDeleted()rootsAdded()→piecesAdded()rootsScheduledRemove()→piecesScheduledRemove()ownerChanged()→serviceProviderChanged()getProofSetIdByRail()→getDataSetIdByRail()getProofSetInfo()→getDataSetInfo()isProofSetChargeable()→isDataSetChargeable()updateProofSetExpectedMaxSize()→updateDataSetExpectedMaxSize()pauseProofSetPayments()→pauseDataSetPayments()resumeProofSetPayments()→resumeDataSetPayments()
- Event Renames:
ProofSetCreated→DataSetCreatedProofSetDeleted→DataSetDeletedProofSetOwnershipChanged→DataSetServiceProviderChangedProofSetRailCreated→DataSetRailCreatedRootMetadataAdded→PieceMetadataAdded
- State Variable and Mapping Renames:
proofSetInfo→dataSetInfoproofSetIdByRail→dataSetIdByRailproofSetRail→dataSetRailproofSetExpectedMaxSize→dataSetExpectedMaxSizeproofSetZeroCostsEpoch→dataSetZeroCostsEpochproofSetRootMetadata→dataSetPieceMetadatarailToProofSet→railToDataSetclientProofSets→clientDataSetsPROOFSET_CREATION_FEE→DATA_SET_CREATION_FEE
- Struct Updates:
ProofSetInfo→DataSetInfo(with fieldproofSetId→dataSetId,rootMetadata→pieceMetadata)ProofSetCreateData→DataSetCreateDataApprovedProviderInfo.owner→ApprovedProviderInfo.serviceProvider
- EIP-712 Type Hash Updates:
CREATE_PROOFSET_TYPEHASH→CREATE_DATA_SET_TYPEHASH- Type string:
"CreateProofSet(uint256 clientDataSetId,bool withCDN,address payee)"→"CreateDataSet(uint256 clientDataSetId,bool withCDN,address payee)"
- Type string:
CID_TYPEHASH→PIECE_CID_TYPEHASH- Type string:
"Cid(bytes data)"→"PieceCid(bytes data)"
- Type string:
ROOTDATA_TYPEHASH→PIECE_DATA_TYPEHASH- Type string:
"RootData(Cid root,uint256 rawSize)Cid(bytes data)"→"PieceData(PieceCid piece,uint256 rawSize)PieceCid(bytes data)"
- Type string:
ADD_ROOTS_TYPEHASH→ADD_PIECES_TYPEHASH- Type string:
"AddRoots(uint256 clientDataSetId,uint256 firstAdded,RootData[] rootData)..."→"AddPieces(uint256 clientDataSetId,uint256 firstAdded,PieceData[] pieceData)..."
- Type string:
SCHEDULE_REMOVALS_TYPEHASH→SCHEDULE_PIECE_REMOVALS_TYPEHASH- Type string:
"ScheduleRemovals(uint256 clientDataSetId,uint256[] rootIds)"→"SchedulePieceRemovals(uint256 clientDataSetId,uint256[] pieceIds)"
- Type string:
DELETE_PROOFSET_TYPEHASH→DELETE_DATA_SET_TYPEHASH- Type string:
"DeleteProofSet(uint256 clientDataSetId)"→"DeleteDataSet(uint256 clientDataSetId)"
- Type string:
- Signature Verification Method Renames:
verifyCreateProofSetSignature()→verifyCreateDataSetSignature()verifyAddRootsSignature()→verifyAddPiecesSignature()verifyScheduleRemovalsSignature()→verifySchedulePieceRemovalsSignature()verifyDeleteProofSetSignature()→verifyDeleteDataSetSignature()
- Type Updates:
PDPVerifier.RootData→IPDPTypes.PieceDatathroughout- Added import:
import {IPDPTypes} from "@pdp/interfaces/IPDPTypes.sol";
- Documentation and Script Updates:
create_proofset_with_payments.sh→create_data_set_with_payments.sh- Updated README files to reflect new terminology
- Core Terminology Changes:
- Updated FilecoinWarmStorageService
VERSIONconstant to "0.1.0" - Added
ContractUpgradedevent andmigrate()function for future upgrade support - Added import for
ERC1967Utilsfrom OpenZeppelin - Updated submodule
service_contracts/lib/pdpto version 2.0.0
This release contains breaking changes that rename core concepts throughout the codebase. Developers will need to update:
- All function calls from
proofSet*todataSet*androot*topiece* - Event listeners for the renamed events
- Struct field references (especially
owner→serviceProvider) - EIP-712 signature generation code to use new type strings
- Type imports from
PDPVerifier.RootDatatoIPDPTypes.PieceData
The underlying functionality remains unchanged; this release only updates terminology for consistency.