You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mainnet SPR/FWSS implementations and StateView are live and verified. Live Mainnet filecoin-pin smoke is explicitly deferred to upcoming Dealbot evidence and is not claimed as passed. Phase 5 close-out is next; Synapse and filecoin-cloud follow-ups are merged, while Curio remains tracked post-upgrade
Release Tracking
The filecoin-services GitHub release version is the stack version. It may differ from an individual contract VERSION() when the stack changes without an FWSS code change.
Latest release; Calibnet and Mainnet rollout verified; Synapse and filecoin-cloud follow-ups merged; live Mainnet filecoin-pin smoke deferred to upcoming Dealbot evidence; process PR and issue close-out pending
deployments.json PR(s)
Scope policy #568; Calibnet live-address snapshot #573 (merged); Mainnet live-address snapshot #576 (merged as 022171c; final two-network live verification passed)
Set the requested delay before proposing the Safe transaction. For the normal delay-based flow, fill in the actual AFTER_EPOCH from nextUpgrade() after the announcement executes. The observed value is the source of truth for the execute step and external communications.
v1.3.1 bootstrap only: The announcement-mode column is temporary. Record legacy for the v1.3.0 -> v1.3.1 rollout; upgrades from v1.3.1 onward use delay. Record the absolute target before Safe signing, include the notice duration and signing buffer in the requested-delay cell, and verify the same target on-chain after execution.
Run Log
The Run Log is this release issue's operator journal for rollout facts discovered during execution: deployed addresses, transaction links, validation outputs, exceptions, and owner decisions.
Keep this table current as values become known.
Network
New FWSS implementation
StateView / setView tx
Announce tx
Actual afterEpoch
Execute tx
Post-upgrade checks
Calibnet
0x51Bc9fB1e20280D57460a0a69a7077a9682AA164
switch to 0x9BF9e67e83EC8613883FDdDec4D3b38AEE937177 at epoch 3967915 (Safe nonce 18)
Implementation checks passed: VERSION()=1.3.1, initializer 9, dependencies/pricing/state preserved; StateView checks passed: new View selected and bound, active reads healthy, no current live reactivation-state fixture; smoke/E2E + filecoin-pin passed: Data Sets 26657/26658 live on providers 4/2, active pieces and byte-identical retrieval verified
Mainnet
0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a9
switch to 0xdDd8F083a3fe9C66547D46bee24e5AaF56BCa0ab at epoch 6274898 (Safe nonce 17)
This release explicitly includes a ServiceProviderRegistry implementation upgrade so future upgrades can use announceUpgradePlan(address,uint96). Existing SPR proxy addresses and registry state must be preserved; no replacement proxy is allowed.
Target VERSION(): 1.2.0; deployment constructor reinitializer: 3, derived and cross-checked from live counter 2 + 1.
Deploy through the Deploy Contract workflow with contract=Warm Storage stack: run the metadata-aware dry-run first, approve the complete inventory, then use the live stack run to obtain and record the actual implementation address. The dry-run records deployment decisions and counters; it does not predict a real CREATE address.
Approved-scope v1.3.1 stack inventory encoded at candidate aea9357: deploy the ServiceProviderRegistry implementation, Rails, the FilecoinWarmStorageService implementation, and a new StateView; preserve every proxy plus FilecoinPay, PDPVerifier, and unchanged dependency addresses. FilecoinPay and PDPVerifier remain pinned. StateView is intentionally unpinned and requires a separate Safe setViewContract action after the FWSS implementation switch. Technical-owner final inventory approval remains pending.
Bootstrap with the legacy absolute-epoch announcePlannedUpgrade call because v1.1.0 does not expose the relative-delay entrypoint. Include a Safe-signing buffer, then verify the exact pending implementation and epoch on-chain.
Execute only the announced implementation at/after the observed epoch with upgradeToAndCall(..., migrate("1.2.0")). Verify implementation slot, version, owner, initializer 3, registry state, and cleared plan.
On each network, deploy both FWSS and SPR implementations before either announcement. Rehearse and complete Calibnet first. Use a recorded deterministic execution order (proposed: SPR, then FWSS), validate both, then obtain a separate Mainnet go/no-go.
Rollback is approved by the technical owner. Before live announce, record the exact no-migration rollback transaction and targeted fork-rehearsal evidence. Rolling SPR back to the v1.1.0 implementation cannot replay reinitializer 2 after the proxy counter reaches 3; a subsequent roll-forward must also use empty calldata because reinitializer 3 has already been consumed.
Merged scope PR #568 unpins only FWSS_VIEW for Calibnet and Mainnet. FilecoinPay and PDPVerifier remain pinned and preserved. Final release-ref evidence: Calibnet run 30996922868 and Mainnet run 30996922569, both passed from aea9357.
Deploy one new StateView per network through the same approved contract=Warm Storage stack run; do not use a separate deployment path.
Preserve the existing FWSS proxies. Each new View must be constructed with the existing network's FWSS proxy address.
Record and verify each new View address before proposing a Safe action.
Execute setViewContract(newView) only after the FWSS v1.3.1 implementation is live and its immediate post-upgrade reads pass. Verify viewContractAddress() and reactivation-window reads afterward.
If rollback is required after the View switch, first set the FWSS proxy back to the previous View address, verify it, then perform the FWSS implementation rollback.
Each pre-seeded row now has an explicit disposition, tracker, and later gate. Completing this section allows the rollout to proceed; it does not complete the Synapse build or post-rollout follow-ups. The post-Calibnet filecoin-pin validation is complete. Audit evidence: Phase 1 read-only audit and cross-repo disposition.
Repository
Required change, PR, issue, or release
Required before Mainnet?
Owner/Status
FilOzone/synapse-sdk
Generate the ABI/type sync PR with the Update Synapse SDK workflow against the approved deployment-address ref and require a successful integration build. Review the generated PDPVerifier ABI against live v3.4.0 and explicitly accept or pin/filter the ahead-of-live administrative entrypoint before merge. #845 is not required for this rollout.
Generated PR, build, downstream review, and final Mainnet address-state merge: complete. #845 preview mechanism: no.
Schema support #907, Calibnet-era #911, and final Mainnet address-state #916 merged
FilOzone/pdp
None: no PDP deployment or new release. Compatibility with live PDPVerifier 3.4.0 is confirmed for this rollout.
No PDP PR/release
Compatibility confirmed 2026-08-05
filecoin-project/curio
#1353 remains post-upgrade/version-gated cleanup. Clarification for #1356 was requested in Slack.
No; neither issue blocks this contract upgrade or Mainnet rollout and both may be resolved after the upgrade
Issue assigned to @LexLuthr; @rjan90 tracking the post-upgrade follow-up
FilOzone/filecoin-cloud
None before proxy switches; merge the automated address-sync PR after live deployment state is recorded
No code change or release required. The post-Calibnet default-path filecoin-pin addpassed with two new Data Sets and byte-identical retrieval.
Validation complete; release no
Completed 2026-08-10; #615 did not block the validation
Other / none
None: no other event-shape, ABI, linked-library, or proxy-address consumer change is required to enter later phases
No
Non-blocking disposition recorded 2026-08-05
Dependency Targets and Compatibility
Record the intended deployed dependency versions or addresses, then verify actual deployed state against those targets before go/no-go. Reads below were pinned at Calibnet block 3,939,384 and Mainnet block 6,240,050; details are in the Phase 1 audit.
Dependency
Target version/address
Calibnet observed
Mainnet observed
Verification/status
PDPVerifier
No PDP deployment; preserve proxy and live VERSION()=3.4.0
Preserve decision accepted for Phase 2; remains pinned. Matches FWSS getters and deployment inventory. Compatibility with live v3.4.0 is confirmed; review the generated Synapse PDPVerifier ABI before merging the SDK sync PR. Technical-owner review is deferred to the pre-announce gate
FilecoinPay
Preserve deployed v1.0.0 addresses; source v1.0.0 at f0a40fe
0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0
0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa
Preserve decision accepted for Phase 2; remains pinned. Matches FWSS getters and has identical live runtime hash on both networks. Technical-owner review is deferred to the pre-announce gate
ServiceProviderRegistry
Preserve proxies; target implementation 1.2.0
Proxy 0x839e5c9988e4e9977d40708d0094103c0839Ac9D; current impl 0x0A2E79efFC7DB1D15912E4F6722F527F493F18Ef; 1.1.0, counter 2
Proxy 0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB; current impl 0x01293CaFdE24DE89fF26d1A19Bfc4E36CBF74F9B; 1.1.0, counter 2
Current state and target accepted for Phase 2; target implementation addresses are deployment outputs. Technical-owner review is deferred to the pre-announce gate
Matches FWSS getters; executable bytecode matches after metadata removal; accepted for Phase 2
FilecoinWarmStorageServiceStateView
Deploy one candidate View per network and switch existing FWSS proxies with setViewContract
Current View 0xF4B446171b3677fD2B9b183a9fB76d517365700a; new address is a Phase 2 output
Current View 0xAD28BBF18A72f728Ed816D07F5a1d7Ec40D68b5e; new address is a Phase 2 output
Expanded scope accepted for Phase 2 and confirmed by both tagged release plans. Record and verify new addresses, then switch only after FWSS v1.3.1 is live and the pre-announce/Safe review gate is satisfied. Final inventory
State whether rollback is safe before any live announce transaction. Link the approved rollback procedure or script when available.
Field
Value
Rollback status
Accepted for Phase 2 — rollback uses an announced empty-calldata UUPS rollback. The release operator waived a separate targeted fork rehearsal as a candidate-deployment prerequisite; technical-owner review remains mandatory before announce/switch transactions
If StateView was switched, first call setViewContract(previousView) and verify it. Announce the previous implementation, wait for the observed epoch, then call upgradeToAndCall(previousImplementation, 0x) with value 0. Reverse rollback order: StateView, FWSS, then SPR. Never call an old migration. Current execute helpers are not rollback helpers. See audit mechanics
Decision notes
Operator acceptance and deferred technical-owner gate are recorded here. Forward counters become FWSS Calibnet 9, FWSS Mainnet 5, and SPR 3. A subsequent roll-forward uses empty calldata because the new reinitializers have already been consumed.
Pre-Live Validation
Record validation that proves the planned upgrade works against the full contract, Curio, and Synapse state before live rollout.
Validation
Evidence/status
foc-devnet post-upgrade state validation
Run 30802517410 passed 6/6 fresh-deployment scenarios against source-equivalent candidate 4d8f21a. It does not simulate upgrading proxies with existing state. The release operator explicitly accepts this evidence and waives the missing two-stage scenario as a Phase 2 candidate-deployment prerequisite; technical-owner review is deferred to the pre-announce gate. Exception
Pricing validation
Release branch: forge test --offline --match-contract PriceListTest — 127 passed, 0 failed. Recorded evidence
Synapse SDK integration build
Schema support #907 merged. Run 31397121479 successfully regenerated ABIs/addresses from Calibnet address commit 69b8ef7, passed lint/build, and opened #911. Review/merge remains required or explicitly waived before Mainnet announcement.
Network Constants
Network
Chain ID
RPC URL
FWSS Proxy
Safe Owner
Calibnet
314159
https://api.calibration.node.glif.io/rpc/v1
0x02925630df557F957f70E112bA06e50965417CA0
0x6386622B4915B027900d65560b0ab84F8a1ff2AA
Mainnet
314
https://api.node.glif.io/rpc/v1
0x8408502033C418E1bbC97cE9ac48E5528F371A9f
0x6386622B4915B027900d65560b0ab84F8a1ff2AA
Operating Rules
Use the release issue as the rollout source of truth. Keep the schedule, Run Log, tx links, and post-upgrade evidence current.
Create the stack tag and GitHub Release before any live proxy switch. Mark the GitHub Release as a pre-release until Mainnet is complete and verified.
Keep the GitHub pre-release page updated as the external rollout tracker for consumers; keep this issue updated as the operator runbook.
Keep CHANGELOG focused on what changed. Put mutable deployment status, addresses, epochs, and transaction links on the GitHub Release page.
Tag semantics: The vX.Y.Z tag is immutable and points to the frozen deploy commit used for contract deployment and bytecode verification. Post-deploy rollout facts such as live addresses, epochs, tx links, and deployments.json follow-up PRs are not folded back into the tag. They live on main, the release issue Run Log, and the GitHub Release page. Do not create a second "final release" tag.
Where to find what: Use the vX.Y.Z tag for the source that produced the deployed bytecode. Use on-chain reads from the FWSS proxy for live state, including the implementation slot and address getters such as viewContractAddress(), pdpVerifierAddress(), paymentsContractAddress(), serviceProviderRegistry(), sessionKeyRegistry(), usdfcTokenAddress(), and filBeamBeneficiaryAddress(). Use the GitHub Release rollout table for the historical record of what was live for this release.
service_contracts/deployments.json on a release branch or vX.Y.Z tag is the copy that existed at branch-cut/tag time and may be stale after Calibnet/Mainnet proxy or View switches. Do not use it as live state. Update deployments.json on main through the follow-up PR flow, but treat chain state and linked execute transactions as the live verification source.
The technical owner owns the written upgrade plan, dependency target verification, and final go/no-go decision.
Before any live announce transaction, fill in the Technical Owner, Cross-Repo Impact, Dependency Targets and Compatibility, Rollback Plan, and foc-devnet validation status.
Generate owner-action calldata with CALLDATA_ONLY=true and submit it through Safe Transaction Builder.
In Safe Transaction Builder, use the script output exactly: target is the printed FWSS proxy, value is 0, and data is the printed calldata.
Do not announce Mainnet until Calibnet execution, on-chain checks, explorer checks, smoke/E2E checks, and filecoin-pin Data Set creation validation are complete.
Do not announce Mainnet until required cross-repo changes are merged/released or explicitly waived by the technical owner.
service_contracts/deployments.json reflects what is live behind proxies and View contracts. Update it only after the relevant proxy switch and, if applicable, View switch are complete, normally through follow-up PR(s) to main, and record PR links in Release Tracking.
In the normal delay-based flow, the requested delay starts when the Safe announcement executes. After execution, verify both fields returned by nextUpgrade() and record its exact afterEpoch as the source of truth.
A later announcement replaces the pending plan. Record the replacement transaction and explicitly mark it as superseding the previous announcement.
Notice Guidance
Upgrade Type
Minimum Notice
Recommended
Routine
2880 epochs (~24h)
1-2 days
Breaking change
20160 epochs (~1 week)
1-2 weeks
Calibnet can use a shorter window for rehearsal and validation, but use enough time for signers to coordinate. Select a positive operational delay; the contract's one-epoch floor is an emergency safety bound, not the routine notice policy.
export UPGRADE_DELAY_EPOCHS=2880 # use 240+ for Calibnet rehearsal, 20160 for breaking changesexport ANNOUNCEMENT_MODE=delay
echo"Requested upgrade delay: $UPGRADE_DELAY_EPOCHS epochs"
Temporary Bootstrap Compatibility
FWSS v1.3.0 is currently deployed on Calibnet and Mainnet and does not expose announceUpgradePlan(address,uint96). The v1.3.0 -> v1.3.1 rollout must announce through announcePlannedUpgrade((address,uint96)). Use ANNOUNCEMENT_MODE=legacy with an absolute AFTER_EPOCH for both networks and include a conservative Safe-signing buffer so the proposal is still in the future when it executes.
This is a v1.3.1 bootstrap exception, not a second long-term workflow. Treat legacy mode as deprecated once v1.3.1 is live on both networks, then use the Phase 5 cleanup item to remove it when rollback to v1.3.0 is retired.
Post-Upgrade Evidence Required
For each network, record evidence that:
FWSS proxy implementation slot equals the new implementation address.
VERSION() returns the expected FWSS contract version without the leading v.
nextUpgrade() is cleared.
Blockscout shows the proxy and transaction as expected.
A smoke/E2E test passes. The v1.2.0 rollout used the Synapse SDK storage E2E example.
A filecoin-pinadd flow succeeds after the upgrade with unique Data Set metadata, forcing creation of a new Data Set on the target network. Record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log.
Upgrade ServiceProviderRegistry from 1.1.0 to 1.2.0 as the documented companion exception.
Preserve all existing proxy addresses and deployed state.
Keep the release-prep PR limited to combined release notes, FWSS/SPR version bumps, and existing version assertion updates. Surface and track operational tooling gaps when their checklist phase is reached.
Action Required for Integrators
No proxy-address migration is expected.
Consumers should move future upgrade automation from the deprecated absolute-epoch announcement method to announceUpgradePlan(address,uint96) after v1.3.1/v1.2.0 are live.
Operators must continue using legacy announcement mode for this one bootstrap rollout. Phase 2 candidate deployments may proceed under the recorded operator exception; no announce, implementation switch, or setViewContract Safe action may proceed until Kubuxu completes the deferred technical-owner review.
Process deviation — issue created early for checklist-driven discovery
Issue #561 was intentionally created before the release-prep PR and release branch so this rollout could expose checklist gaps. The release branch release-v1.3.1 was originally cut from main at 4d8f21a after PR #562 merged, fast-forwarded to 42238fe after deployment-tooling PR #565, refreshed to 7f7037f after pinned-drift reporting PR #567, then refreshed to candidate aea9357 after StateView scope PR #568. The reusable checklist changed during this sequence, so this rendered issue was reconciled manually rather than creating a duplicate. The issue-creation checklist item remains removed from this release instance.
Release Checklist
Work through the phases in order. Do not announce Mainnet until the Calibnet execute transaction, on-chain checks, smoke/E2E test, and filecoin-pin Data Set creation validation are complete.
Release-prep PR(s) opened for review (prefer one PR when practical) with changelog/release notes, a Deployment note linking to the GitHub Release page for rollout status, addresses, and transaction links, and any applicable version/submodule bump. For FWSS contract changes, include the FilecoinWarmStorageServiceVERSION() bump. For PDP-only stack releases, use the PDP/submodule bump PR and leave the FWSS VERSION() unchanged. Suggested title: chore: prep FWSS v1.3.1 release
Upgrade checks run:
cd service_contracts
forge test --match-contract FilecoinWarmStorageServiceUpgradeTest
forge inspect src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService storageLayout --extra-output storageLayout
Release-prep PR(s) merged so main contains the final release notes and applicable version/submodule changes before creating the release branch
Review and accept the complete two-network deployment inventory for Phase 2 entry. Final aea9357 plans preserve FilecoinPay and PDPVerifier and deploy ServiceProviderRegistry implementation, Rails, FilecoinWarmStorageService implementation, and StateView. Technical-owner review is deferred to the mandatory pre-announce/Safe gate. Operator exception.
Confirm neither release-ref plan contains an unexpected deployment. Both aea9357 plans exactly match the intended four-component deploy set and preserve dispositions. Recorded final inventory.
Fill Cross-Repo Impact with required PRs, issues, releases, or None — dispositions recorded above; Synapse remains a pre-Mainnet gate, while Curio and cloud work are owned non-blocking follow-ups and filecoin-pin validation completed 2026-08-10
Fill Dependency Targets and Compatibility by comparing target versions/addresses with observed Calibnet and Mainnet deployed state — accepted for Phase 2 under the operator exception; technical-owner review remains a pre-announce gate
Fill Rollback Plan, including whether rollback is safe and the approved procedure/script link when available — empty-calldata rollback procedure accepted; separate rehearsal waived as a Phase 2 entry prerequisite
Run foc-devnet post-upgrade state validation, or record an approved exception — source-equivalent 6/6 fresh-deployment evidence accepted and missing two-stage scenario waived for Phase 2 entry
Create and push the stack tag from the frozen deploy commit before any live proxy switch:
git tag v1.3.1
git push origin v1.3.1
Create the GitHub Release from v1.3.1, mark it as a pre-release, and include component versions plus a FWSS rollout status table:
GitHub Release creation commands
export RELEASE_ISSUE_URL="TBD"# replace with the generated release issue URL
cat > /tmp/fwss-release-notes.md <<'EOF'> Status: Pre-release. Calibnet and Mainnet rollout pending; tracked in [the release issue](RELEASE_ISSUE_URL).## Summary- TBD## Component Versions| Component | Version | Notes ||---|---|---|| Stack (`filecoin-services`) | `v1.3.1` | Git tag / GitHub Release || `FilecoinWarmStorageService` | `1.3.1` | Contract `VERSION()` returned by the FWSS proxy || `PDPVerifier` | `TBD` | Link PDP release if this stack consumes a new PDP version |## Rollout Status| Network | FWSS Proxy | FWSS Implementation | StateView | Announce tx | Actual `afterEpoch` | Execute tx | Status ||---|---|---|---|---|---:|---|---|| Calibnet | `0x02925630df557F957f70E112bA06e50965417CA0` | `TBD` | `TBD` | `TBD` | `TBD` | `TBD` | Pending || Mainnet | `0x8408502033C418E1bbC97cE9ac48E5528F371A9f` | `TBD` | `TBD` | `TBD` | `TBD` | `TBD` | Pending |## Action Required For Integrators- TBDEOF
perl -0pi -e 's|RELEASE_ISSUE_URL|$ENV{RELEASE_ISSUE_URL}|g' /tmp/fwss-release-notes.md
gh release create v1.3.1 \
--verify-tag \
--prerelease \
--title "FWSS v1.3.1" \
--notes-file /tmp/fwss-release-notes.md
Confirm the Update Synapse SDK workflow opened or updated the expected Synapse SDK PR and that its integration build passes against the intended contract ABI/types and deployment-address state, or record an exception/owner in Release Tracking. The original failure and owner were recorded; schema support #907 has since merged, and successful Calibnet address-state run 31397121479 opened #911. Run the workflow again in Phase 5 after final deployment-address state exists.
Release issue Overview and Release Tracking updated with PR links, release link, summary, and action required
Immediately before each live deployment, rerun the metadata-aware dry-run from the frozen v1.3.1 tag for that network and confirm it exactly matches the Phase 1 approved inventory. Stop and return to scope review if it differs; do not broadcast or change pins ad hoc.
Run the Deploy Contract workflow once per network from the same frozen tag with contract=Warm Storage stack and dry_run=false. The metadata-aware stack run deploys every approved changed, unpinned component in nonce order; do not select components manually or run separate FWSS/SPR deployment paths.
Run service_contracts/tools/verify-deployments.sh --chain <CHAIN> for each target network after deployment metadata is available. Resolve or explicitly waive any bytecode/metadata mismatch before live announce.
If linked libraries or StateView are deployed, record their actual addresses and verification status in the Run Log and carry out the ABI-publishing decision approved in Phase 1.
Use the deploy dry-run output to distinguish contracts that are Pinned/preserved, Up to date, or Would deploy. Record the final deploy set before any live announce transaction.
Dry-run marks as needing deployment
Operator action
SignatureVerificationLib, Rails, or FilecoinWarmStorageService
The approved contract=Warm Storage stack live run deploys each changed, unpinned component automatically and records its address
ServiceProviderRegistry
Only unpin in the reviewed release-prep PR when the release explicitly includes it; add an exception section to this issue, then let the approved contract=Warm Storage stack run deploy it
PDPVerifier, FilecoinPay, ProviderIdSet, or FilecoinWarmStorageServiceStateView
Keep pinned in the reviewed release ref unless the release explicitly includes it and the technical owner approves the expanded scope before the live stack run
SessionKeyRegistry
Only deploy if explicitly included; use the dedicated contract=SessionKeyRegistry workflow option and add an exception section to this issue
Calibnet Warm Storage Stack
Re-run the Deploy Contract workflow from frozen tag v1.3.1 with network=Calibnet, contract=Warm Storage stack, dry_run=true
Confirm the inventory exactly matches the Phase 1 approved Calibnet plan; stop and return to scope review if it differs before broadcasting
Re-run with dry_run=false
Capture CALI_NEW_IMPL, plus CALI_NEW_SPR_IMPL, new library addresses, and CALI_NEW_VIEW when those components are in the approved inventory, and add them to the Run Log
Verify every newly deployed contract on Sourcify and Blockscout
Attempt FilFox verification and record result
Mainnet Warm Storage Stack
Re-run the Deploy Contract workflow from frozen tag v1.3.1 with network=Mainnet, contract=Warm Storage stack, dry_run=true
Confirm the inventory exactly matches the Phase 1 approved Mainnet plan; stop and return to scope review if it differs before broadcasting
Re-run with dry_run=false
Capture MAIN_NEW_IMPL, plus MAIN_NEW_SPR_IMPL, new library addresses, and MAIN_NEW_VIEW when those components are in the approved inventory, and add them to the Run Log
Verify every newly deployed contract on Sourcify and Blockscout
Attempt FilFox verification and record result
Add both FWSS implementation addresses and every companion SPR, library, or StateView candidate address to the GitHub pre-release rollout status. Do not update service_contracts/deployments.json until proxy slots are live.
Verification command pattern:
cd service_contracts
# Calibnet: use CALI_NEW_* values; Mainnet: use MAIN_NEW_* values.export CHAIN=314159
export FWSS_IMPL="$CALI_NEW_IMPL"export SPR_IMPL="${CALI_NEW_SPR_IMPL:-}"export RAILS_IMPL="${CALI_NEW_RAILS:-}"source tools/verify-contracts.sh
verify_candidate() {
local address="$1"local artifact="$2"
[ -z"$address" ] &&return 0
verify_sourcify "$address""$artifact"
verify_blockscout "$address""$artifact"
verify_filfox "$address""$artifact"
}
verify_candidate "$FWSS_IMPL""src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService"
verify_candidate "$SPR_IMPL""src/ServiceProviderRegistry.sol:ServiceProviderRegistry"
verify_candidate "$RAILS_IMPL""src/lib/Rails.sol:Rails"
Repeat for every address in the approved live inventory, including a new StateView or other library when present. Supply explorer-specific constructor/library arguments when required, and record any verification failure or waiver in the Run Log.
Optional StateView Switch
If the stack deploy inventory includes a new FilecoinWarmStorageServiceStateView, confirm it was deployed by the approved live stack run; do not run a second StateView deployment
Capture CALI_NEW_VIEW and/or MAIN_NEW_VIEW, record the deployed StateView address and verification status in the Run Log, and add the StateView address to the GitHub pre-release rollout table
Generate setViewContract(address) calldata for each affected network and stage it in Safe UI. Execute the staged setViewContract transaction after the corresponding FWSS proxy upgrade execute transaction unless the technical owner approves a different ordering. Calibnet executed successfully as Safe nonce 18; Mainnet executed successfully as Safe nonce 17, both after immediate implementation checks.
In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata.
Phase 3: Calibnet Announce + Execute
Announce
If this release has a ServiceProviderRegistry exception, generate its Calibnet bootstrap announcement with NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$CALI_NEW_SPR_IMPL" AFTER_EPOCH=<absolute-epoch> CALLDATA_ONLY=true ./service-provider-registry-announce-upgrade.sh, execute it through the owner Safe, then verify and record the exact implementation and afterEpoch returned by nextUpgrade() before any execute transaction. This legacy absolute-epoch path is only for upgrading a registry that does not yet expose the relative-delay entrypoint.
Set the Calibnet requested delay and update the schedule table. v1.3.1 bootstrap only: record the announcement mode as legacy; upgrades from v1.3.1 onward always use delay.
Generate announce calldata and submit/sign/execute in Safe UI:
cd service_contracts/tools
export ETH_RPC_URL="https://api.calibration.node.glif.io/rpc/v1"export FWSS_PROXY_ADDRESS="0x02925630df557F957f70E112bA06e50965417CA0"export NEW_FWSS_IMPLEMENTATION_ADDRESS="$CALI_NEW_IMPL"
For the normal delay-based flow:
export UPGRADE_DELAY_EPOCHS=240 # use a longer window if desiredexport ANNOUNCEMENT_MODE=delay
unset AFTER_EPOCH
For the v1.3.0 -> v1.3.1 bootstrap rollout only, use this configuration instead:
If this release has a ServiceProviderRegistry exception, generate its Calibnet execution with NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$CALI_NEW_SPR_IMPL" NEW_VERSION=<version> CALLDATA_ONLY=true ./service-provider-registry-execute-upgrade.sh, execute it in the approved transaction order, then verify and record its implementation slot, VERSION(), initializer counter, preserved registry state, and cleared nextUpgrade()
Generate execute calldata and submit/sign/execute in Safe UI:
cd service_contracts/tools
export ETH_RPC_URL="https://api.calibration.node.glif.io/rpc/v1"export FWSS_PROXY_ADDRESS="0x02925630df557F957f70E112bA06e50965417CA0"export NEW_WARM_STORAGE_IMPLEMENTATION_ADDRESS="$CALI_NEW_IMPL"
CALLDATA_ONLY=true ./warm-storage-execute-upgrade.sh
In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata
Record Calibnet execute tx link in the Run Log
Verify implementation slot equals CALI_NEW_IMPL
Verify VERSION() returns the expected FWSS contract version
Verify viewContractAddress() equals CALI_NEW_VIEW if a StateView switch was expected, or the unchanged View address otherwise
Validate Calibnet Data Set creation through filecoin-pin add with --network calibration and unique --data-set-metadata, then record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log — Data Sets 26657 and 26658
The unique smoke_run metadata is required so this validates new Data Set creation rather than reusing an existing Data Set.
Verify the proxy on Blockscout — FWSS proxy resolves to 0x51Bc9fB1e20280D57460a0a69a7077a9682AA164; SPR proxy resolves to 0x0dF90c9a20b3f1E383c7196C06943565396c0956; both implementations and StateView are verified
Update the GitHub pre-release Calibnet rollout status with execute tx, checks, and smoke/E2E evidence — v1.3.1 pre-release
If Calibnet deployment addresses should be published before Mainnet, open or update a Calibnet-only follow-up PR to main for service_contracts/deployments.json after the Calibnet proxy switch and, if applicable, View switch are live, then record the PR link in Release Tracking. Opened #573 from the successful deployment-run snapshot after both switches were live.
Technical owner confirms Calibnet results are good before announcing Mainnet
Phase 4: Mainnet Announce + Execute
Announce
Technical owner records Mainnet go/no-go after reviewing Calibnet evidence, rollback status, dependency targets, and cross-repo status
Confirm required cross-repo changes are merged/released or explicitly waived by the technical owner — Synapse #911 has passed checks and downstream review and may merge post-upgrade per Rod; close this gate with the technical-owner go/no-go acceptance
Create or update the public operational notice on status.filecoin.cloud before or alongside stakeholder notification. Mainnet maintenance is scheduled for 2026-08-12 14:15–23:59 UTC, covers the implementation/StateView/validation window, links the v1.3.1 pre-release, and notifies subscribers. The component remains operational until the scheduled start.
Notify stakeholders before announcing Mainnet, including FilB so they can propagate the upgrade notice — operator confirmed Slack notification posted 2026-08-11 with the on-chain announcement, public status page, pre-release, and changelog links
If this release has a ServiceProviderRegistry exception, generate its Mainnet bootstrap announcement with NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$MAIN_NEW_SPR_IMPL" AFTER_EPOCH=<absolute-epoch> CALLDATA_ONLY=true ./service-provider-registry-announce-upgrade.sh, execute it through the owner Safe, then verify and record the exact implementation and afterEpoch returned by nextUpgrade() before any execute transaction. Executed at epoch 6270876; live plan is candidate 0x1Bb676392272313598930FEf8D5B66FFECcE02F0, afterEpoch=6274616.
Set the Mainnet requested delay and update the schedule table. v1.3.1 bootstrap only:legacy, with 2880 notice + 2880 Safe-signing buffer; proposed absolute epoch 6274616 generated at epoch 6268856. Execute by epoch 6271736 to preserve the full notice or regenerate both payloads. Upgrades from v1.3.1 onward always use delay.
Generate announce calldata and submit/sign/execute in Safe UI — batch executed successfully in SPR → FWSS order:
cd service_contracts/tools
export ETH_RPC_URL="https://api.node.glif.io/rpc/v1"export FWSS_PROXY_ADDRESS="0x8408502033C418E1bbC97cE9ac48E5528F371A9f"export NEW_FWSS_IMPLEMENTATION_ADDRESS="$MAIN_NEW_IMPL"
For the normal delay-based flow:
export UPGRADE_DELAY_EPOCHS=2880 # use 20160 for breaking changesexport ANNOUNCEMENT_MODE=delay
unset AFTER_EPOCH
For the v1.3.0 -> v1.3.1 bootstrap rollout only, use this configuration instead:
In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata — exact batch decoded and executed as proposed
After the Safe transaction executes, verify and read back the pending plan — SPR 0x1Bb676392272313598930FEf8D5B66FFECcE02F0; FWSS 0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a9; shared afterEpoch=6274616:
Record the Mainnet announce tx and observed afterEpoch in the schedule and Run Log — tx, execution epoch 6270876, observed afterEpoch=6274616
Update the GitHub pre-release Mainnet rollout status with the announce tx and observed afterEpoch
Execute
Wait for the observed Mainnet afterEpoch — execution occurred at epoch 6274884, after 6274616
If this release has a ServiceProviderRegistry exception, generate its Mainnet execution with NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$MAIN_NEW_SPR_IMPL" NEW_VERSION=<version> CALLDATA_ONLY=true ./service-provider-registry-execute-upgrade.sh, execute it in the approved transaction order, then verify and record its implementation slot, VERSION(), initializer counter, preserved registry state, and cleared nextUpgrade()
Generate execute calldata and submit/sign/execute in Safe UI:
cd service_contracts/tools
export ETH_RPC_URL="https://api.node.glif.io/rpc/v1"export FWSS_PROXY_ADDRESS="0x8408502033C418E1bbC97cE9ac48E5528F371A9f"export NEW_WARM_STORAGE_IMPLEMENTATION_ADDRESS="$MAIN_NEW_IMPL"
CALLDATA_ONLY=true ./warm-storage-execute-upgrade.sh
In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata
Record Mainnet execute tx link in the Run Log — tx, epoch 6274884
Verify implementation slot equals MAIN_NEW_IMPL
Verify VERSION() returns the expected FWSS contract version
Verify viewContractAddress() equals MAIN_NEW_VIEW if a StateView switch was expected, or the unchanged View address otherwise — switched and verified
Verify FWSS pricing output, such as getPriceList(), matches the intended release pricing and record the command/output in the Run Log — byte-identical pre/post evidence
Validate Mainnet Data Set creation through filecoin-pin add with --network mainnet and unique --data-set-metadata, then record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log — explicitly deferred to upcoming Dealbot evidence; preflight selected two new Data Sets without spending
The unique smoke_run metadata is required so this validates new Data Set creation rather than reusing an existing Data Set.
Verify the proxy on Blockscout — FWSS proxy resolves to verified implementation 0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a9; SPR proxy resolves to verified implementation 0x1Bb676392272313598930FEf8D5B66FFECcE02F0; StateView source is verified. Evidence
Update the GitHub pre-release Mainnet rollout status with execute tx, completed checks, and the explicit Dealbot smoke deferral — v1.3.1 pre-release
Phase 5: Promote Release and Close Out
Confirm live Calibnet and Mainnet FWSS implementation slots match the new implementation addresses — Calibnet evidence; Mainnet evidence
Resolve the public Mainnet operational notice after successful rollout validation — maintenance resolved
After any ServiceProviderRegistry bootstrap upgrade is live on both networks, replace the legacy absolute-epoch announcement helper with the relative-delay announceUpgradePlan(address,uint96) flow before the next SPR upgrade, and record the cleanup PR link. — focused cleanup #579 merged as eec58d8.
After FWSS v1.3.1 is live on Calibnet and Mainnet, treat ANNOUNCEMENT_MODE=legacy as deprecated and decide whether rollback to v1.3.0 is still supported. Once that rollback path is retired, open and merge a follow-up PR that removes the legacy mode, its AFTER_EPOCH handling, the temporary announcement-mode schedule column and bootstrap clauses, the README bootstrap example, and the Temporary Bootstrap Compatibility instructions; record the cleanup PR link. If v1.3.0 rollback remains supported, retain legacy mode or document the exact v1.3.1-tagged helper that operators must use. — Decision: v1.3.0 rollback remains supported for this release. Mainline legacy mode remains deprecated; use the immutable v1.3.1-rollout.1 helper for that rollback path until support is retired.
Confirm cross-repo follow-ups are complete or tracked with owners — final Synapse address-state #916 and filecoin-cloud address sync #355 are merged; Curio #1353 is assigned to @LexLuthr and #1356 remains tracked by @rjan90.
Open or update follow-up PR(s) to main for service_contracts/deployments.json after the relevant Calibnet/Mainnet proxy switches and, if applicable, View switches are live. Include live implementation addresses, View addresses, deployment bytecode metadata, and pdp_version / fwss_version fields for each updated network. Calibnet #573 and Mainnet #576 are merged; final two-network live verification passed.
Record the service_contracts/deployments.json PR link(s) in Release Tracking, then merge after checksum validation, bytecode metadata verification, and live-slot verification — Calibnet #573 and Mainnet #576 merged
Merge release-prep PR(s) if still open, keeping mutable rollout details on the GitHub Release page — release-prep #562 merged
Promote the GitHub Release from pre-release to latest after Mainnet proxy switch, checks, and release-page status are complete — v1.3.1 promoted on 2026-08-13
Publish or update required ABIs after linked-library or interface changes: checked-in ABI/type sync was merged in Synapse #911; final Mainnet generation in #916 produced no ABI delta and updates only the generated Mainnet StateView address/source links. No separate linked-library ABI target is required.
ABI update commands
make -C service_contracts update-abi
git status --short service_contracts/abi
Run the Update Synapse SDK workflow manually with the release tag and the approved source ref/SHA after the intended deployment address state is available, or record an exception/owner in Release Tracking. Manual exception approved for this rollout because same-tag rerun resolves merged #911; equivalent generation from final merged SHA 022171c opened #916. Evidence.
Confirm Synapse PR/release is merged or owned — final address-state #916 merged as 44ffc12
Capture lessons learned from this rollout and update service_contracts/tools/UPGRADE-CHECKLIST.md if the process should change — process PR #578 is rebased onto merged chore: use relative delays for SPR upgrades #579 and ready for review; it tracks issue-first release setup, the status-page lifecycle, removal of FWSS v1.3.1 bootstrap-only instructions, and collapsible pre-checklist context for easier human review; mark complete after merge
Overview
v1.3.1RoutineMainnet SPR/FWSS implementations and StateView are live and verified. Live Mainnet filecoin-pin smoke is explicitly deferred to upcoming Dealbot evidence and is not claimed as passed. Phase 5 close-out is next; Synapse and filecoin-cloud follow-ups are merged, while Curio remains tracked post-upgradeRelease Tracking
The filecoin-services GitHub release version is the stack version. It may differ from an individual contract
VERSION()when the stack changes without an FWSS code change.v1.3.1/aea9357. Exact deployed rollout ref:v1.3.1-rollout.1/c1ae9e5. Only the deploy-all tooling differs.v1.3.1 — FWSS + ServiceProviderRegistry Upgrade— promoted to latest on 2026-08-1314:15–23:59 UTC, after epoch6274616; resolved after the successful rolloutLatest release; Calibnet and Mainnet rollout verified; Synapse and filecoin-cloud follow-ups merged; live Mainnet filecoin-pin smoke deferred to upcoming Dealbot evidence; process PR and issue close-out pendingdeployments.jsonPR(s)022171c; final two-network live verification passed)44ffc12. Manual exception and validation evidence.filecoin-cloudPRe67e9f3.Field ownership for duplicated rollout data:
service_contracts/deployments.jsononmainComponent Versions
filecoin-services)v1.3.1FilecoinWarmStorageService1.3.11.3.0ServiceProviderRegistry1.2.01.1.0PDPVerifierUpgrade Schedule
AFTER_EPOCHlegacy2880 notice + 2000 signing buffer (4880 total)39613873956643; implementations executed at epoch3967890; StateView switched at epoch3967915; smoke/E2E validatedlegacy2880 notice + 2880 signing buffer (5760 total)62746166270876; implementations executed at epoch6274884; immediate checks passed; StateView switched at epoch6274898and verified.Set the requested delay before proposing the Safe transaction. For the normal delay-based flow, fill in the actual
AFTER_EPOCHfromnextUpgrade()after the announcement executes. The observed value is the source of truth for the execute step and external communications.Run Log
The Run Log is this release issue's operator journal for rollout facts discovered during execution: deployed addresses, transaction links, validation outputs, exceptions, and owner decisions.
Keep this table current as values become known.
afterEpoch0x51Bc9fB1e20280D57460a0a69a7077a9682AA1640x9BF9e67e83EC8613883FDdDec4D3b38AEE937177at epoch3967915(Safe nonce 18)3961387VERSION()=1.3.1, initializer9, dependencies/pricing/state preserved; StateView checks passed: new View selected and bound, active reads healthy, no current live reactivation-state fixture; smoke/E2E + filecoin-pin passed: Data Sets26657/26658live on providers4/2, active pieces and byte-identical retrieval verified0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a90xdDd8F083a3fe9C66547D46bee24e5AaF56BCa0abat epoch6274898(Safe nonce 17)627087662746166274884Scope
FilecoinWarmStorageServiceimplementation upgrade behind the existing FWSS proxy.FilecoinWarmStorageServiceStateView,ServiceProviderRegistry,PDPVerifier,FilecoinPay, andSessionKeyRegistry.Exception — ServiceProviderRegistry v1.2.0 companion rollout
This release explicitly includes a ServiceProviderRegistry implementation upgrade so future upgrades can use
announceUpgradePlan(address,uint96). Existing SPR proxy addresses and registry state must be preserved; no replacement proxy is allowed.0x839e5c9988e4e9977d40708d0094103c0839Ac9D0x0A2E79efFC7DB1D15912E4F6722F527F493F18EfVERSION()=1.1.0; initializer2;nextUpgrade=(0x0,0); Safe owner matches Network Constants0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB0x01293CaFdE24DE89fF26d1A19Bfc4E36CBF74F9BVERSION()=1.1.0; initializer2;nextUpgrade=(0x0,0); Safe owner matches Network ConstantsSPR-specific release gates:
VERSION():1.2.0; deployment constructor reinitializer:3, derived and cross-checked from live counter2 + 1.contract=Warm Storage stack: run the metadata-aware dry-run first, approve the complete inventory, then use the live stack run to obtain and record the actual implementation address. The dry-run records deployment decisions and counters; it does not predict a real CREATE address.aea9357: deploy the ServiceProviderRegistry implementation,Rails, the FilecoinWarmStorageService implementation, and a new StateView; preserve every proxy plus FilecoinPay, PDPVerifier, and unchanged dependency addresses. FilecoinPay and PDPVerifier remain pinned. StateView is intentionally unpinned and requires a separate SafesetViewContractaction after the FWSS implementation switch. Technical-owner final inventory approval remains pending.announcePlannedUpgradecall because v1.1.0 does not expose the relative-delay entrypoint. Include a Safe-signing buffer, then verify the exact pending implementation and epoch on-chain.upgradeToAndCall(..., migrate("1.2.0")). Verify implementation slot, version, owner, initializer3, registry state, and cleared plan.2after the proxy counter reaches3; a subsequent roll-forward must also use empty calldata because reinitializer3has already been consumed.SPR Run Log
afterEpoch0x0dF90c9a20b3f1E383c7196C06943565396c09563961387VERSION()=1.2.0, initializer3, owner/registry state preserved, plan cleared0x1Bb676392272313598930FEf8D5B66FFECcE02F062708766274616VERSION()=1.2.0, initializer3, owner/registry state preserved, plan clearedException — FilecoinWarmStorageServiceStateView companion rollout
This release includes a new immutable StateView on both networks so clients can use the reactivation behavior introduced by FWSS v1.3.1. The upgraded FWSS preserves the original proving activation epoch and enforces the canonical reactivation window. The candidate StateView calculates that same window, while the currently deployed v1.3.0 View reverts with
ProvingPeriodNotInitializedwhen no proving deadline is active.StateView-specific release gates:
FWSS_VIEWfor Calibnet and Mainnet. FilecoinPay and PDPVerifier remain pinned and preserved. Final release-ref evidence: Calibnet run 30996922868 and Mainnet run 30996922569, both passed fromaea9357.contract=Warm Storage stackrun; do not use a separate deployment path.setViewContract(newView)only after the FWSS v1.3.1 implementation is live and its immediate post-upgrade reads pass. VerifyviewContractAddress()and reactivation-window reads afterward.setViewContractSafe action.Cross-Repo Impact
Each pre-seeded row now has an explicit disposition, tracker, and later gate. Completing this section allows the rollout to proceed; it does not complete the Synapse build or post-rollout follow-ups. The post-Calibnet filecoin-pin validation is complete. Audit evidence: Phase 1 read-only audit and cross-repo disposition.
FilOzone/synapse-sdkFilOzone/pdpNone: no PDP deployment or new release. Compatibility with live PDPVerifier3.4.0is confirmed for this rollout.filecoin-project/curioFilOzone/filecoin-cloudNonebefore proxy switches; merge the automated address-sync PR after live deployment state is recordede67e9f3filecoin-project/filecoin-pinfilecoin-pin addpassed with two new Data Sets and byte-identical retrieval.None: no other event-shape, ABI, linked-library, or proxy-address consumer change is required to enter later phasesDependency Targets and Compatibility
Record the intended deployed dependency versions or addresses, then verify actual deployed state against those targets before go/no-go. Reads below were pinned at Calibnet block
3,939,384and Mainnet block6,240,050; details are in the Phase 1 audit.PDPVerifierVERSION()=3.4.00x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C; impl0xd60b90f6D3C42B26a246E141ec701a20Dde2fA61;3.4.00xBADd0B92C1c71d02E7d520f64c0876538fa2557F; impl0xb41A97FEDD2D9497C639A643ec75E56CbCeDe8BA;3.4.0FilecoinPayv1.0.0atf0a40fe0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a00x23b1e018F08BB982348b15a86ee926eEBf7F4DAaServiceProviderRegistry1.2.00x839e5c9988e4e9977d40708d0094103c0839Ac9D; current impl0x0A2E79efFC7DB1D15912E4F6722F527F493F18Ef;1.1.0, counter20xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB; current impl0x01293CaFdE24DE89fF26d1A19Bfc4E36CBF74F9B;1.1.0, counter2SessionKeyRegistry74fc4e94500859709a97b1c64981cfae52f9bdfe0x518411c2062E119Aaf7A8B12A2eDf9a9393476550x74FD50525A958aF5d484601E252271f9625231aBFilecoinWarmStorageServiceStateViewsetViewContract0xF4B446171b3677fD2B9b183a9fB76d517365700a; new address is a Phase 2 output0xAD28BBF18A72f728Ed816D07F5a1d7Ec40D68b5e; new address is a Phase 2 outputUSDFC0xb3042734b608a1B16e9e86B374A3f3e389B4cDf00x80B98d3aa09ffff255c3ba4A241111Ff1262F0450x1D60d2F5960Af6341e842C539985FA297E10d6eARollback Plan
State whether rollback is safe before any live announce transaction. Link the approved rollback procedure or script when available.
Accepted for Phase 2 — rollback uses an announced empty-calldata UUPS rollback. The release operator waived a separate targeted fork rehearsal as a candidate-deployment prerequisite; technical-owner review remains mandatory before announce/switch transactions0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46(1.3.0, counter8); Mainnet0xaF996097790c17D3C23Cc45A3035a29D293d1492(1.3.0, counter4)0x0A2E79efFC7DB1D15912E4F6722F527F493F18Ef(1.1.0, counter2); Mainnet0x01293CaFdE24DE89fF26d1A19Bfc4E36CBF74F9B(1.1.0, counter2)setViewContract(previousView)and verify it. Announce the previous implementation, wait for the observed epoch, then callupgradeToAndCall(previousImplementation, 0x)with value0. Reverse rollback order: StateView, FWSS, then SPR. Never call an old migration. Current execute helpers are not rollback helpers. See audit mechanics9, FWSS Mainnet5, and SPR3. A subsequent roll-forward uses empty calldata because the new reinitializers have already been consumed.Pre-Live Validation
Record validation that proves the planned upgrade works against the full contract, Curio, and Synapse state before live rollout.
4d8f21a. It does not simulate upgrading proxies with existing state. The release operator explicitly accepts this evidence and waives the missing two-stage scenario as a Phase 2 candidate-deployment prerequisite; technical-owner review is deferred to the pre-announce gate. Exceptionforge test --offline --match-contract PriceListTest— 127 passed, 0 failed. Recorded evidence69b8ef7, passed lint/build, and opened #911. Review/merge remains required or explicitly waived before Mainnet announcement.Network Constants
314159https://api.calibration.node.glif.io/rpc/v10x02925630df557F957f70E112bA06e50965417CA00x6386622B4915B027900d65560b0ab84F8a1ff2AA314https://api.node.glif.io/rpc/v10x8408502033C418E1bbC97cE9ac48E5528F371A9f0x6386622B4915B027900d65560b0ab84F8a1ff2AAOperating Rules
vX.Y.Ztag is immutable and points to the frozen deploy commit used for contract deployment and bytecode verification. Post-deploy rollout facts such as live addresses, epochs, tx links, anddeployments.jsonfollow-up PRs are not folded back into the tag. They live onmain, the release issue Run Log, and the GitHub Release page. Do not create a second "final release" tag.vX.Y.Ztag for the source that produced the deployed bytecode. Use on-chain reads from the FWSS proxy for live state, including the implementation slot and address getters such asviewContractAddress(),pdpVerifierAddress(),paymentsContractAddress(),serviceProviderRegistry(),sessionKeyRegistry(),usdfcTokenAddress(), andfilBeamBeneficiaryAddress(). Use the GitHub Release rollout table for the historical record of what was live for this release.service_contracts/deployments.jsonon a release branch orvX.Y.Ztag is the copy that existed at branch-cut/tag time and may be stale after Calibnet/Mainnet proxy or View switches. Do not use it as live state. Updatedeployments.jsononmainthrough the follow-up PR flow, but treat chain state and linked execute transactions as the live verification source.CALLDATA_ONLY=trueand submit it through Safe Transaction Builder.0, and data is the printed calldata.filecoin-pinData Set creation validation are complete.service_contracts/deployments.jsonreflects what is live behind proxies and View contracts. Update it only after the relevant proxy switch and, if applicable, View switch are complete, normally through follow-up PR(s) tomain, and record PR links in Release Tracking.nextUpgrade()and record its exactafterEpochas the source of truth.Notice Guidance
2880epochs (~24h)20160epochs (~1 week)Calibnet can use a shorter window for rehearsal and validation, but use enough time for signers to coordinate. Select a positive operational delay; the contract's one-epoch floor is an emergency safety bound, not the routine notice policy.
Temporary Bootstrap Compatibility
FWSS v1.3.0 is currently deployed on Calibnet and Mainnet and does not expose
announceUpgradePlan(address,uint96). The v1.3.0 -> v1.3.1 rollout must announce throughannouncePlannedUpgrade((address,uint96)). UseANNOUNCEMENT_MODE=legacywith an absoluteAFTER_EPOCHfor both networks and include a conservative Safe-signing buffer so the proposal is still in the future when it executes.This is a v1.3.1 bootstrap exception, not a second long-term workflow. Treat legacy mode as deprecated once v1.3.1 is live on both networks, then use the Phase 5 cleanup item to remove it when rollback to v1.3.0 is retired.
Post-Upgrade Evidence Required
For each network, record evidence that:
VERSION()returns the expected FWSS contract version without the leadingv.nextUpgrade()is cleared.filecoin-pinaddflow succeeds after the upgrade with unique Data Set metadata, forcing creation of a new Data Set on the target network. Record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log.Changes
1.3.0to1.3.1with the fixes and metadata additions tracked by FWSS M4.5 GA Fast Follow Contract Upgrade #549.1.1.0to1.2.0as the documented companion exception.Action Required for Integrators
announceUpgradePlan(address,uint96)after v1.3.1/v1.2.0 are live.setViewContractSafe action may proceed until Kubuxu completes the deferred technical-owner review.Process deviation — issue created early for checklist-driven discovery
Issue #561 was intentionally created before the release-prep PR and release branch so this rollout could expose checklist gaps. The release branch
release-v1.3.1was originally cut frommainat4d8f21aafter PR #562 merged, fast-forwarded to42238feafter deployment-tooling PR #565, refreshed to7f7037fafter pinned-drift reporting PR #567, then refreshed to candidateaea9357after StateView scope PR #568. The reusable checklist changed during this sequence, so this rendered issue was reconciled manually rather than creating a duplicate. The issue-creation checklist item remains removed from this release instance.Release Checklist
Phase 1: Branch, Issue, PR, and Checks
main(tracker FWSS M4.5 GA Fast Follow Contract Upgrade #549; required PRs fix: allow abandonment and consensual termination of underfunded data sets #520, fix: non-reverting upgrade announcement #547, and feat: introduce IFilecoinServiceMetadata and apply it in FWSS #551)FilecoinWarmStorageServiceVERSION()bump. For PDP-only stack releases, use the PDP/submodule bump PR and leave the FWSSVERSION()unchanged. Suggested title:chore: prep FWSS v1.3.1 releasemaincontains the final release notes and applicable version/submodule changes before creating the release branchmainafter the release-prep PR(s) land:release-v1.3.1. Refreshed by fast-forward to candidateaea9357after chore: include StateView in v1.3.1 rollout #568 merged.aea9357, run the Deploy Contract workflow once for Calibnet and once for Mainnet withcontract=Warm Storage stackanddry_run=true. Recorded evidence: Calibnet run 30996922868 and Mainnet run 30996922569.aea9357plans preserve FilecoinPay and PDPVerifier and deploy ServiceProviderRegistry implementation,Rails, FilecoinWarmStorageService implementation, and StateView. Technical-owner review is deferred to the mandatory pre-announce/Safe gate. Operator exception.aea9357plans exactly match the intended four-component deploy set and preserve dispositions. Recorded final inventory.None— dispositions recorded above; Synapse remains a pre-Mainnet gate, while Curio and cloud work are owned non-blocking follow-ups and filecoin-pin validation completed 2026-08-10v1.3.1/aea9357; exact rollout tagv1.3.1-rollout.1/c1ae9e5v1.3.1, mark it as a pre-release, and include component versions plus a FWSS rollout status table:GitHub Release creation commands
Phase 2: Deploy Contracts
Deploy both networks before any announce/execute.
v1.3.1tag for that network and confirm it exactly matches the Phase 1 approved inventory. Stop and return to scope review if it differs; do not broadcast or change pins ad hoc.contract=Warm Storage stackanddry_run=false. The metadata-aware stack run deploys every approved changed, unpinned component in nonce order; do not select components manually or run separate FWSS/SPR deployment paths.service_contracts/tools/verify-deployments.sh --chain <CHAIN>for each target network after deployment metadata is available. Resolve or explicitly waive any bytecode/metadata mismatch before live announce.Deployment metadata checks
Use the deploy dry-run output to distinguish contracts that are
Pinned/preserved,Up to date, orWould deploy. Record the final deploy set before any live announce transaction.SignatureVerificationLib,Rails, orFilecoinWarmStorageServicecontract=Warm Storage stacklive run deploys each changed, unpinned component automatically and records its addressServiceProviderRegistrycontract=Warm Storage stackrun deploy itPDPVerifier,FilecoinPay,ProviderIdSet, orFilecoinWarmStorageServiceStateViewSessionKeyRegistrycontract=SessionKeyRegistryworkflow option and add an exception section to this issueCalibnet Warm Storage Stack
v1.3.1withnetwork=Calibnet,contract=Warm Storage stack,dry_run=truedry_run=falseCALI_NEW_IMPL, plusCALI_NEW_SPR_IMPL, new library addresses, andCALI_NEW_VIEWwhen those components are in the approved inventory, and add them to the Run LogMainnet Warm Storage Stack
v1.3.1withnetwork=Mainnet,contract=Warm Storage stack,dry_run=truedry_run=falseMAIN_NEW_IMPL, plusMAIN_NEW_SPR_IMPL, new library addresses, andMAIN_NEW_VIEWwhen those components are in the approved inventory, and add them to the Run Logservice_contracts/deployments.jsonuntil proxy slots are live.Verification command pattern:
Repeat for every address in the approved live inventory, including a new StateView or other library when present. Supply explorer-specific constructor/library arguments when required, and record any verification failure or waiver in the Run Log.
Optional StateView Switch
FilecoinWarmStorageServiceStateView, confirm it was deployed by the approved live stack run; do not run a second StateView deploymentCALI_NEW_VIEWand/orMAIN_NEW_VIEW, record the deployed StateView address and verification status in the Run Log, and add the StateView address to the GitHub pre-release rollout tablesetViewContract(address)calldata for each affected network and stage it in Safe UI. Execute the stagedsetViewContracttransaction after the corresponding FWSS proxy upgrade execute transaction unless the technical owner approves a different ordering. Calibnet executed successfully as Safe nonce 18; Mainnet executed successfully as Safe nonce 17, both after immediate implementation checks.setViewContracttransaction lands, record its tx link in the Run Log and verifyviewContractAddress()equals the new StateView address. Calibnet recorded and verified; Mainnet recorded and verified.StateView setViewContract calldata and verification
In Safe Transaction Builder, set target to the printed FWSS proxy, value to
0, and data to the printed calldata.Phase 3: Calibnet Announce + Execute
Announce
If this release has a ServiceProviderRegistry exception, generate its Calibnet bootstrap announcement with
NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$CALI_NEW_SPR_IMPL" AFTER_EPOCH=<absolute-epoch> CALLDATA_ONLY=true ./service-provider-registry-announce-upgrade.sh, execute it through the owner Safe, then verify and record the exact implementation andafterEpochreturned bynextUpgrade()before any execute transaction. This legacy absolute-epoch path is only for upgrading a registry that does not yet expose the relative-delay entrypoint.Set the Calibnet requested delay and update the schedule table. v1.3.1 bootstrap only: record the announcement mode as
legacy; upgrades from v1.3.1 onward always usedelay.Generate announce calldata and submit/sign/execute in Safe UI:
For the normal delay-based flow:
For the v1.3.0 -> v1.3.1 bootstrap rollout only, use this configuration instead:
Generate the transaction after selecting exactly one configuration above:
0, and data to the printed calldataafterEpochin the schedule and Run LogafterEpochExecute
afterEpochNEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$CALI_NEW_SPR_IMPL" NEW_VERSION=<version> CALLDATA_ONLY=true ./service-provider-registry-execute-upgrade.sh, execute it in the approved transaction order, then verify and record its implementation slot,VERSION(), initializer counter, preserved registry state, and clearednextUpgrade()0, and data to the printed calldataCALI_NEW_IMPLVERSION()returns the expected FWSS contract versionviewContractAddress()equalsCALI_NEW_VIEWif a StateView switch was expected, or the unchanged View address otherwisenextUpgrade()is clearedgetPriceList(), matches the intended release pricing and record the command/output in the Run Logfilecoin-pin addwith--network calibrationand unique--data-set-metadata, then record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log — Data Sets26657and26658Calibnet filecoin-pin validation
The unique
smoke_runmetadata is required so this validates new Data Set creation rather than reusing an existing Data Set.0x51Bc9fB1e20280D57460a0a69a7077a9682AA164; SPR proxy resolves to0x0dF90c9a20b3f1E383c7196C06943565396c0956; both implementations and StateView are verifiedmainforservice_contracts/deployments.jsonafter the Calibnet proxy switch and, if applicable, View switch are live, then record the PR link in Release Tracking. Opened #573 from the successful deployment-run snapshot after both switches were live.Phase 4: Mainnet Announce + Execute
Announce
Technical owner records Mainnet go/no-go after reviewing Calibnet evidence, rollback status, dependency targets, and cross-repo status
Confirm required cross-repo changes are merged/released or explicitly waived by the technical owner — Synapse #911 has passed checks and downstream review and may merge post-upgrade per Rod; close this gate with the technical-owner go/no-go acceptance
Create or update the public operational notice on status.filecoin.cloud before or alongside stakeholder notification. Mainnet maintenance is scheduled for 2026-08-12
14:15–23:59 UTC, covers the implementation/StateView/validation window, links the v1.3.1 pre-release, and notifies subscribers. The component remains operational until the scheduled start.Notify stakeholders before announcing Mainnet, including FilB so they can propagate the upgrade notice — operator confirmed Slack notification posted 2026-08-11 with the on-chain announcement, public status page, pre-release, and changelog links
If this release has a ServiceProviderRegistry exception, generate its Mainnet bootstrap announcement with
NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$MAIN_NEW_SPR_IMPL" AFTER_EPOCH=<absolute-epoch> CALLDATA_ONLY=true ./service-provider-registry-announce-upgrade.sh, execute it through the owner Safe, then verify and record the exact implementation andafterEpochreturned bynextUpgrade()before any execute transaction. Executed at epoch6270876; live plan is candidate0x1Bb676392272313598930FEf8D5B66FFECcE02F0,afterEpoch=6274616.Set the Mainnet requested delay and update the schedule table. v1.3.1 bootstrap only:
legacy, with2880notice +2880Safe-signing buffer; proposed absolute epoch6274616generated at epoch6268856. Execute by epoch6271736to preserve the full notice or regenerate both payloads. Upgrades from v1.3.1 onward always usedelay.Generate announce calldata and submit/sign/execute in Safe UI — batch executed successfully in SPR → FWSS order:
For the normal delay-based flow:
For the v1.3.0 -> v1.3.1 bootstrap rollout only, use this configuration instead:
Generate the transaction after selecting exactly one configuration above:
0, and data to the printed calldata — exact batch decoded and executed as proposed0x1Bb676392272313598930FEf8D5B66FFECcE02F0; FWSS0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a9; sharedafterEpoch=6274616:afterEpochin the schedule and Run Log — tx, execution epoch6270876, observedafterEpoch=6274616afterEpochExecute
afterEpoch— execution occurred at epoch6274884, after6274616NEW_SERVICE_PROVIDER_REGISTRY_IMPLEMENTATION_ADDRESS="$MAIN_NEW_SPR_IMPL" NEW_VERSION=<version> CALLDATA_ONLY=true ./service-provider-registry-execute-upgrade.sh, execute it in the approved transaction order, then verify and record its implementation slot,VERSION(), initializer counter, preserved registry state, and clearednextUpgrade()0, and data to the printed calldata6274884MAIN_NEW_IMPLVERSION()returns the expected FWSS contract versionviewContractAddress()equalsMAIN_NEW_VIEWif a StateView switch was expected, or the unchanged View address otherwise — switched and verifiednextUpgrade()is clearedgetPriceList(), matches the intended release pricing and record the command/output in the Run Log — byte-identical pre/post evidencefilecoin-pin addwith--network mainnetand unique--data-set-metadata, then record the command output, metadata, Data Set ID, tx/link, SP, and timestamp in the Run Log — explicitly deferred to upcoming Dealbot evidence; preflight selected two new Data Sets without spendingMainnet filecoin-pin validation
The unique
smoke_runmetadata is required so this validates new Data Set creation rather than reusing an existing Data Set.0x3583e9fc40243924C6f8eBE3d17e5364Bb6A01a9; SPR proxy resolves to verified implementation0x1Bb676392272313598930FEf8D5B66FFECcE02F0; StateView source is verified. EvidencePhase 5: Promote Release and Close Out
announceUpgradePlan(address,uint96)flow before the next SPR upgrade, and record the cleanup PR link. — focused cleanup #579 merged aseec58d8.ANNOUNCEMENT_MODE=legacyas deprecated and decide whether rollback to v1.3.0 is still supported. Once that rollback path is retired, open and merge a follow-up PR that removes the legacy mode, itsAFTER_EPOCHhandling, the temporary announcement-mode schedule column and bootstrap clauses, the README bootstrap example, and the Temporary Bootstrap Compatibility instructions; record the cleanup PR link. If v1.3.0 rollback remains supported, retain legacy mode or document the exact v1.3.1-tagged helper that operators must use. — Decision: v1.3.0 rollback remains supported for this release. Mainline legacy mode remains deprecated; use the immutablev1.3.1-rollout.1helper for that rollback path until support is retired.mainforservice_contracts/deployments.jsonafter the relevant Calibnet/Mainnet proxy switches and, if applicable, View switches are live. Include live implementation addresses, View addresses, deployment bytecode metadata, andpdp_version/fwss_versionfields for each updated network. Calibnet #573 and Mainnet #576 are merged; final two-network live verification passed.service_contracts/deployments.jsonPR link(s) in Release Tracking, then merge after checksum validation, bytecode metadata verification, and live-slot verification — Calibnet #573 and Mainnet #576 mergedservice_contracts/deployments.jsonbytecode metadata matches the live deployed contracts after all proxy and View switches are complete — merged snapshot and two-network verification evidenceDeployment bytecode metadata verification commands
ABI update commands
022171copened #916. Evidence.e67e9f344ffc12service_contracts/tools/UPGRADE-CHECKLIST.mdif the process should change — process PR #578 is rebased onto merged chore: use relative delays for SPR upgrades #579 and ready for review; it tracks issue-first release setup, the status-page lifecycle, removal of FWSS v1.3.1 bootstrap-only instructions, and collapsible pre-checklist context for easier human review; mark complete after mergeResources