Skip to content

Latest commit

 

History

History
390 lines (345 loc) · 32.2 KB

File metadata and controls

390 lines (345 loc) · 32.2 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog

[1.2.0] - 2026-03-23 - FWSS Upgrade

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.

Deployment Addresses

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.

Changed

  • Data set creation now charges the PDPVerifier USDFC sybil fee via a client-funded burn rail (#437)

Fixed

  • Corrected FWSS proving-period boundary handling to use exclusive-inclusive ranges (#419)
  • Simplified and optimized validator-path settlement calculations in _findProvenEpochs (#423, #424)

Upgrade Notes

  • 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. See service_contracts/deployments.json for the PDP proxy addresses.
  • 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.

Deployment Addresses

See service_contracts/deployments.json for v1.1.0 Mainnet (chain 314) and Calibnet (chain 314159) contract addresses.

Added

  • ProviderIdSet contract 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)

Changed

  • BREAKING: Renamed deployment keys in deployments.json for consistency (#388)
    • PAYMENTS_CONTRACT_ADDRESSFILECOIN_PAY_ADDRESS
    • FWS_IMPLEMENTATION_ADDRESSFWSS_IMPLEMENTATION_ADDRESS
    • WARM_STORAGE_PROXY_ADDRESSFWSS_PROXY_ADDRESS
    • WARM_STORAGE_VIEW_ADDRESSFWSS_VIEW_ADDRESS
    • Added SIGNATURE_VERIFICATION_LIB_ADDRESS
  • BREAKING: Rail settlement required before dataset deletion (#377)
    • dataSetDeleted() now blocked until settledUpTo >= endEpoch
    • Prevents SPs from deleting datasets before clients can settle
    • Added RailNotFullySettled error
  • BREAKING: Removed redundant PDP config getters from view contract (#372)
    • Removed: challengeWindow(), getChallengesPerProof(), getMaxProvingPeriod()
    • Use getPDPConfig() instead (per IPDPProvingSchedule interface)
  • 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)

Fixed

  • 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)

Documentation

  • 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.

Core Contracts - Mainnet

  1. Payments Contract: 0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa
  1. PDPVerifier Implementation: 0xe2Dc211BffcA499761570E04e8143Be2BA66095f
  1. PDPVerifier Proxy: 0xBADd0B92C1c71d02E7d520f64c0876538fa2557F
  1. SessionKeyRegistry: 0x74FD50525A958aF5d484601E252271f9625231aB
  2. ServiceProviderRegistry Implementation: 0xe255D3a89D6B326b48bc0fC94a472A839471D6B0
  3. ServiceProviderRegistry Proxy: 0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB
  4. FilecoinWarmStorageService Implementation: 0xd60b90f6D3C42B26a246E141ec701a20Dde2fA61
  5. FilecoinWarmStorageService Proxy: 0x8408502033C418E1bbC97cE9ac48E5528F371A9f
  6. FilecoinWarmStorageServiceStateView: 0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46

Configuration:

Core Contracts - Calibration Network

  1. Payments Contract: 0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0
  1. PDPVerifier Implementation: 0x2355Cb19BA1eFF51673562E1a5fc5eE292AF9D42
  1. PDPVerifier Proxy: 0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C
  1. SessionKeyRegistry: 0x518411c2062E119Aaf7A8B12A2eDf9a939347655
  2. ServiceProviderRegistry Implementation: 0xb32Bb530638d20f1B59B40CDD2Ce4208430f7DE3
  3. ServiceProviderRegistry Proxy: 0x839e5c9988e4e9977d40708d0094103c0839Ac9D
  4. FilecoinWarmStorageService Implementation: 0x1cAeE5EfCfc3681C2bBF689Ccb30d70c6e45F49f
  5. FilecoinWarmStorageService Proxy: 0x02925630df557F957f70E112bA06e50965417CA0
  6. FilecoinWarmStorageServiceStateView: 0xA5D87b04086B1d591026cCE10255351B5AA4689B

Configuration:

Added

  • 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)

Changed

  • BREAKING: Simplified DataSetStatus enum from 3 states to 2 states (#314)
    • Old values: NotFound (0), Active (1), Terminating (2)
    • New values: Inactive (0), Active (1)
    • Migration:
      • NotFoundInactive (non-existent datasets)
      • TerminatingActive (terminated datasets with pieces are still Active)
      • Use pdpEndEpoch to check if a dataset is terminated
    • Details: Inactive represents non-existent datasets or datasets with no pieces yet. Active represents all datasets with pieces, including terminated ones.
    • Use getDataSetStatusDetails() to check termination status separately from Active/Inactive status
  • BREAKING: ServiceProviderRegistry Bloom Schema refactor (#308)
    • Removed encoded productData; all product attributes now use capability key-value store
    • Keys are string, values are bytes
    • Migration for synapse and curio:
      1. All productInfo previously ABI-encoded is removed. Use capability key-value store instead. Encode unsigned integers as big-endian, addresses as bytes[20], strings as UTF-8.
      2. Replace getPDPOffering() with getAllProductCapabilities() to retrieve product info
      3. getActiveProvidersByProductType() and getProvidersByProductType() now return productCapabilityValues in ProviderWithProduct[]
      4. getProductCapabilities() no longer returns exists bool array
      5. getProductCapability() is removed; use productCapabilities mapping instead
      6. updatePDPServiceWithCapabilities() is removed; use updateProduct() instead
      7. Capability values cannot be empty; exclude the key if product lacks the capability
    • Contract size reduced from 21,290 to 17,751 bytes (-3,539 bytes)
  • BREAKING: Non-sequential clientDataSetId (#265)
    • Changed from sequential counter to mapping-based non-sequential IDs
    • Migration: Clients can now create datasets with any unique clientDataSetId value, removing the sequential bottleneck
    • Added DataSetIdAlreadyExists error for duplicate IDs
  • BREAKING: Renamed Payments contract to FilecoinPayV1 (#293)
    • Migration: Update all contract references from Payments to FilecoinPayV1
    • ABI file renamed: Payments.abi.jsonFilecoinPayV1.abi.json
    • Deployment scripts and documentation updated
  • BREAKING: ServiceProviderRegistry events now emit raw productData (#294)
    • Removed serviceUrl argument from Product events
    • Migration: Parse serviceUrl from raw productData if needed
    • Events now more portable and forward-compatible with future product types
  • BREAKING: ServiceProviderRegistry deletes removed product data (#295)
    • Changed behavior: Product data is now properly cleaned up when removed
    • Migration: Use isActive to detect if product exists, not presence of data fields
  • Calibnet: Reduced DEFAULT_CHALLENGE_WINDOW_SIZE from 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)

Removed

  • BREAKING: PaymentArbitrated event removed from contract and subgraph (#301)

Performance Improvements

  • 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

Core Contracts

  1. Payments Contract: 0x6dB198201F900c17e86D267d7Df82567FB03df5E
  1. PDPVerifier Implementation: 0x4EC9a8ae6e6A419056b6C332509deEA371b182EF
  1. PDPVerifier Proxy: 0x579dD9E561D4Cd1776CF3e52E598616E77D5FBcb
  1. SessionKeyRegistry: 0x97Dd879F5a97A8c761B94746d7F5cfF50AAd4452
  2. ServiceProviderRegistry Implementation: 0x5672fE3B5366819B4Bd2F538A2CAEA11f0b2Aff5
  3. ServiceProviderRegistry Proxy: 0x1096ba1e7BB912136DA8524A22bF71091dc4FDd9
  4. FilecoinWarmStorageService Implementation: 0x6B78a026309bc2659c5891559D412FA1BA6529A5
  5. FilecoinWarmStorageService Proxy: 0x468342072e0dc86AFFBe15519bc5B1A1aa86e4dc
  6. FilecoinWarmStorageServiceStateView: 0xE4587AAdB97d7B8197aa08E432bAD0D9Cfe3a17F

Configuration:

Changed

  • 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)

0.2.0 - 2025-10-07 - M3 Calibration Network Deployment

Core Contracts

Calibration Network:

  1. Payments Contract: 0x6dB198201F900c17e86D267d7Df82567FB03df5E
  1. PDPVerifier Implementation: 0xCa92b746a7af215e0AaC7D0F956d74B522b295b6
  1. PDPVerifier Proxy: 0x9ecb84bB617a6Fd9911553bE12502a1B091CdfD8
  1. SessionKeyRegistry: 0x97Dd879F5a97A8c761B94746d7F5cfF50AAd4452
  2. ServiceProviderRegistry Implementation: 0xEdc9A41371d69a736bEfBa7678007BDBA61425E5
  3. ServiceProviderRegistry Proxy: 0xA8a7e2130C27e4f39D1aEBb3D538D5937bCf8ddb
  4. FilecoinWarmStorageService Implementation: 0x2d76e3A41fa4614D1840CEB73aa07c5d0af6a023
  5. FilecoinWarmStorageService Proxy: 0x9ef4cAb0aD0D19b8Df28791Df80b29bC784bE91b
  6. FilecoinWarmStorageServiceStateView: 0x7175a72479e2B0050ed310f1a49a517C03573547

Configuration:

Added

  • 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 deposits
    • depositWithAuthorizationAndApproveOperator() for combined deposit and operator approval
    • depositWithAuthorizationAndIncreaseOperatorApproval() 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)

Changed

  • Modify CDN payment rails and add methods for usage-based payments (#237)
  • BREAKING: Updated Payments contract ABI with breaking changes (#223)
    • DepositRecorded event removes usedPermit parameter - event listeners must be updated
    • railCancel function state mutability changed from nonpayable to payable - callers may need to handle potential token transfers
    • PermitRecipientMustBeMsgSender error replaced with SignerMustBeMsgSender error - error handling code must be updated
  • feat: remove provierId from ServiceProviderInfo struct (#247)
    • Adds a ServiceProviderInfoView struct with providerId field for external consumption.
  • Breaking: feat!: FilCDN now is FilBeam (#236)
  • Breaking: feat!: update service parameters (#239)
  • 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

Changed

  • BREAKING: Renamed PandoraService to FilecoinWarmStorageService throughout the codebase
    • Contract name changed from PandoraService to FilecoinWarmStorageService
    • 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
  • BREAKING: Renamed core terminology throughout the codebase for better clarity, matching PDPVerifier version 2.0.0.
    • Core Terminology Changes:
      • proofSetdataSet (all functions, events, variables, mappings; "proof set" becomes "data set")
      • rootpiece (all references to stored data units)
      • rootIdpieceId
      • ownerserviceProvider (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:
      • ProofSetCreatedDataSetCreated
      • ProofSetDeletedDataSetDeleted
      • ProofSetOwnershipChangedDataSetServiceProviderChanged
      • ProofSetRailCreatedDataSetRailCreated
      • RootMetadataAddedPieceMetadataAdded
    • State Variable and Mapping Renames:
      • proofSetInfodataSetInfo
      • proofSetIdByRaildataSetIdByRail
      • proofSetRaildataSetRail
      • proofSetExpectedMaxSizedataSetExpectedMaxSize
      • proofSetZeroCostsEpochdataSetZeroCostsEpoch
      • proofSetRootMetadatadataSetPieceMetadata
      • railToProofSetrailToDataSet
      • clientProofSetsclientDataSets
      • PROOFSET_CREATION_FEEDATA_SET_CREATION_FEE
    • Struct Updates:
      • ProofSetInfoDataSetInfo (with field proofSetIddataSetId, rootMetadatapieceMetadata)
      • ProofSetCreateDataDataSetCreateData
      • ApprovedProviderInfo.ownerApprovedProviderInfo.serviceProvider
    • EIP-712 Type Hash Updates:
      • CREATE_PROOFSET_TYPEHASHCREATE_DATA_SET_TYPEHASH
        • Type string: "CreateProofSet(uint256 clientDataSetId,bool withCDN,address payee)""CreateDataSet(uint256 clientDataSetId,bool withCDN,address payee)"
      • CID_TYPEHASHPIECE_CID_TYPEHASH
        • Type string: "Cid(bytes data)""PieceCid(bytes data)"
      • ROOTDATA_TYPEHASHPIECE_DATA_TYPEHASH
        • Type string: "RootData(Cid root,uint256 rawSize)Cid(bytes data)""PieceData(PieceCid piece,uint256 rawSize)PieceCid(bytes data)"
      • ADD_ROOTS_TYPEHASHADD_PIECES_TYPEHASH
        • Type string: "AddRoots(uint256 clientDataSetId,uint256 firstAdded,RootData[] rootData)...""AddPieces(uint256 clientDataSetId,uint256 firstAdded,PieceData[] pieceData)..."
      • SCHEDULE_REMOVALS_TYPEHASHSCHEDULE_PIECE_REMOVALS_TYPEHASH
        • Type string: "ScheduleRemovals(uint256 clientDataSetId,uint256[] rootIds)""SchedulePieceRemovals(uint256 clientDataSetId,uint256[] pieceIds)"
      • DELETE_PROOFSET_TYPEHASHDELETE_DATA_SET_TYPEHASH
        • Type string: "DeleteProofSet(uint256 clientDataSetId)""DeleteDataSet(uint256 clientDataSetId)"
    • Signature Verification Method Renames:
      • verifyCreateProofSetSignature()verifyCreateDataSetSignature()
      • verifyAddRootsSignature()verifyAddPiecesSignature()
      • verifyScheduleRemovalsSignature()verifySchedulePieceRemovalsSignature()
      • verifyDeleteProofSetSignature()verifyDeleteDataSetSignature()
    • Type Updates:
      • PDPVerifier.RootDataIPDPTypes.PieceData throughout
      • Added import: import {IPDPTypes} from "@pdp/interfaces/IPDPTypes.sol";
    • Documentation and Script Updates:
      • create_proofset_with_payments.shcreate_data_set_with_payments.sh
      • Updated README files to reflect new terminology

Technical Updates

  • Updated FilecoinWarmStorageService VERSION constant to "0.1.0"
  • Added ContractUpgraded event and migrate() function for future upgrade support
  • Added import for ERC1967Utils from OpenZeppelin
  • Updated submodule service_contracts/lib/pdp to version 2.0.0

Migration Notes

This release contains breaking changes that rename core concepts throughout the codebase. Developers will need to update:

  • All function calls from proofSet* to dataSet* and root* to piece*
  • Event listeners for the renamed events
  • Struct field references (especially ownerserviceProvider)
  • EIP-712 signature generation code to use new type strings
  • Type imports from PDPVerifier.RootData to IPDPTypes.PieceData

The underlying functionality remains unchanged; this release only updates terminology for consistency.