Skip to content

[Release] FWSS v1.3.0 Mainnet Upgrade (includes Calibnet) #509

Description

@github-actions

Overview

Field Value
Stack Version v1.3.0
Upgrade Type Breaking Change
Changelog PR #507; follow-up #515
Technical Owner @rvagg (Rod)
Go/No-Go Status Released; close-out pending

Release Tracking

The filecoin-services release version is the stack version. It may differ from an individual contract VERSION() when the stack changes without an FWSS code change.

Item Value
Frozen deploy commit c2ff7f8 (v1.3.0); includes #512, docs-only #514, and changelog follow-up #515.
GitHub pre-release v1.3.0 pre-release
Release status Pre-release; Mainnet proxy switch verified, close-out pending
Synapse SDK PR FilOzone/synapse-sdk#844 merged on 2026-06-11 after successful manual workflow run 27367127348, updating Synapse to final v1.3.0 deployment metadata from #523. Earlier #831 was merged before final Mainnet metadata landed.

Component Versions

Component Version Changed? Notes
Stack (filecoin-services) v1.3.0 Yes Git tag / GitHub Release
FilecoinWarmStorageService 1.3.0 Yes Merged in #510; verify via proxy VERSION() after upgrade
PDPVerifier v3.4.0 No Already live from the v1.2.1 compatibility rollout; no PDP change in this FWSS release

Upgrade Schedule

Network AFTER_EPOCH Status
Calibnet 3790520 Corrective execute verified; proxy now points to the corrected v1.3.0 implementation; SP-relayed terminateService validation passed on-chain.
Mainnet 6093399 Corrective execute and StateView switch verified; proxy now points to the corrected v1.3.0 implementation; getPriceList() works through the new StateView. Mainnet Synapse SDK storage E2E/createDataSet validation recorded. Deployment metadata PR #523 is merged.

Run Log

Keep this table current as values become known.

Network New FWSS implementation Announce tx Execute tx Post-upgrade checks
Calibnet 0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46 0x69c6aca0b2ee3fbc69f97a3429f3e01158ddc53a90570a92528eb8f34c898ff0 0xb785db5df7d29521dc38b9b75643cb2965a97d10e50659ae525909a68e2ed6c2 Corrective execute tx success at epoch 3790561; implementation slot verified as 0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46; VERSION() returns 1.3.0; viewContractAddress() returns v1.3.0 StateView 0xF4B446171b3677fD2B9b183a9fB76d517365700a; nextUpgrade() is cleared. SP-relayed terminateService validation passed on Calibnet in tx 0xbbf0dd675f46d839c14e106a9c07fa937b2ec33374fff120af6a9e907276101b. Earlier Calibnet implementation 0x68f9c0ACdA8489dc9F08eD279B33D0c5Eb39F95B, announce tx 0xd79f3a0854d55c2996f9af022eb2b0fe33345a1ca856502212e560aac30fabb4, and execute tx 0x16ae39ffb31887b89fd8f3dea14bb7befe7ce3860ce6829213e6ddffeb8eb5aa are superseded within this v1.3.0 rollout.
Mainnet 0xaF996097790c17D3C23Cc45A3035a29D293d1492 0x0fbe8e36135b143de53382c4f5c6898a1723d78e29e269e39f9739a0e53e0533 (AFTER_EPOCH=6093399) 0x4b0066b946f2cef6d0724cd5100dbbf41cd66192f0c2e21db808b8e72b033f11 Execute tx success at epoch 6096291; implementation slot verified as 0xaF996097790c17D3C23Cc45A3035a29D293d1492; VERSION() returns 1.3.0; interim execute migrated to StateView 0x73f0E21A2Ca905636456FEbfe45E1273d555239f; follow-up setView tx 0xd96309a7f89af8f07cc8ef6dbb01a510726fa80430c959a0cec6c520260c15cc set final StateView 0xAD28BBF18A72f728Ed816D07F5a1d7Ec40D68b5e; nextUpgrade() is cleared; getPriceList() works through the final StateView. Deployment metadata PR #523 merged after checksum validation and live-slot verification. Earlier Mainnet implementation 0xaD5c7e49fb0407Ec607d8880431b705Ea292DA4c and the earlier AFTER_EPOCH=6093240 plan are superseded within this v1.3.0 rollout.

Additional Mainnet validation evidence: Synapse SDK storage E2E smoke test completed on 2026-06-12 using NETWORK=mainnet; data set 1271 confirmed on provider 5, pieceId 0, PieceCID bafkzcibdyeaqjke44f3y4fpzelqzbhdgtx27vtiy3ve2w34f2arzv7q27ywpneik, commit tx 0x40e9152bb6690e2aa2686f63dda7773dcd2b714b15fcaf44fc4888c5cdd743bf; download verification matched the original 315-byte test file. The run completed with one warning: SDK selected two SPs but only provider 5 committed successfully (1/2 copies stored; provider 1 commit failed). Full evidence in comment.

Scope

  • In scope: FilecoinWarmStorageService implementation upgrade behind the existing FWSS proxy.
  • Out of scope by default: FilecoinWarmStorageServiceStateView, ServiceProviderRegistry, PDPVerifier, FilecoinPay, and SessionKeyRegistry.
  • If this release needs an out-of-scope change, add a clearly labeled exception section to this issue before starting that work.

Cross-Repo Impact

List every required cross-repo change or release. Use None only after the technical owner confirms the upgrade is FWSS-only.

Cross-repo impact is filled from Rod's Devnet 1.3.0 Frontier Smoke Report, especially the "Code Used" section and Rod's follow-up comment. Later go/no-go still needs confirmation that required changes are merged/released or explicitly waived.

Repository Required change, PR, issue, or release Required before Mainnet? Owner/Status
FilOzone/synapse-sdk #823 pricing/cost calculation plus regenerated FWSS ABI/types; #827 SP-relayed terminateService; #828 findPiece polling fix. Follow-up SDK/core release after FWSS v1.3.0 is live. Required for Synapse-facing GA validation/release path. #823 notes it should not be published until Calibnet and Mainnet have the new FWSS implementation because getPriceList() reverts on current live contracts. Confirmed as smoke-test code by #513. #823 open, approved, CI green; #827 open draft, CI green, changes requested; #828 merged on 2026-06-05.
filecoin-project/curio Current Curio main as used in #513, including #1270 PDP user termination / cleanup flow. Track follow-ups #1283 local-state reconciliation after third-party abandonment cleanup and #1284 retrieval behavior after PDP/FWSS cleanup. Current Curio main is the GA code path used in #513; Mainnet readiness still needs a build/release or explicit waiver for SP rollout. Follow-up issues are tracked unless owner marks them blockers. #1270 merged on 2026-06-02 with CI green. #1283 and #1284 open from #513 findings. No public Curio release found earlier containing #1270; release/build status still needs confirmation before Mainnet.
FilOzone/pdp #279 fixes the unintended second inactivity window for third-party abandonment cleanup found in #513. No for this FWSS v1.3.0 upgrade. PDP rollout is deferred to a later point in time. #279 merged on 2026-06-05 with CI green, but deployment/release is intentionally deferred and tracked outside this FWSS implementation upgrade.

Dependency Targets and Compatibility

Record the intended deployed dependency versions or addresses, then verify actual deployed state against those targets before go/no-go.

Observed on 2026-06-05 against the current live FWSS proxies, which still report VERSION() == 1.2.1. The v1.3.0 implementation deployment should keep these dependency targets unless the technical owner records an exception before deployment.

Dependency Target version/address Calibnet observed Mainnet observed Verification/status
PDPVerifier v3.4.0
Calibnet: 0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C
Mainnet: 0xBADd0B92C1c71d02E7d520f64c0876538fa2557F
FWSS pdpVerifierAddress() matches target; dependency VERSION() returns 3.4.0 FWSS pdpVerifierAddress() matches target; dependency VERSION() returns 3.4.0 Matches service_contracts/deployments.json and live proxy dependency getters.
FilecoinPay Calibnet: 0x09a0fDc2723fAd1A7b8e3e00eE5DF73841df55a0
Mainnet: 0x23b1e018F08BB982348b15a86ee926eEBf7F4DAa
FWSS paymentsContractAddress() matches target; no VERSION() getter exposed FWSS paymentsContractAddress() matches target; no VERSION() getter exposed Address matches service_contracts/deployments.json; VERSION() call reverts as expected for this dependency.
ServiceProviderRegistry v1.1.0
Calibnet: 0x839e5c9988e4e9977d40708d0094103c0839Ac9D
Mainnet: 0xf55dDbf63F1b55c3F1D4FA7e339a68AB7b64A5eB
FWSS serviceProviderRegistry() matches target; dependency VERSION() returns 1.1.0 FWSS serviceProviderRegistry() matches target; dependency VERSION() returns 1.1.0 Matches service_contracts/deployments.json and live proxy dependency getters.
SessionKeyRegistry Calibnet: 0x518411c2062E119Aaf7A8B12A2eDf9a939347655
Mainnet: 0x74FD50525A958aF5d484601E252271f9625231aB
FWSS sessionKeyRegistry() matches target; no VERSION() getter exposed FWSS sessionKeyRegistry() matches target; no VERSION() getter exposed Address matches service_contracts/deployments.json; VERSION() call reverts as expected for this dependency.

Rollback Plan

State whether rollback is safe before any live announce transaction. Link the approved rollback procedure or script when available.

Field Value
Rollback status Not obtained for this rollout: previous implementation addresses were confirmed, but no technical-owner-approved rollback safety decision or procedure was finalized before execution. Treat this as a documented rollout exception and a required process improvement for future upgrades.
Previous FWSS implementation Calibnet: 0xC196EFddF64C4c2605284Ab66bdbc24fC795dE9E
Mainnet: 0xEBc8CD859d0D389235bDe59B97485936daA1aED5
Confirmed by Phi on 2026-06-05.
Rollback procedure/script No approved rollback procedure/script was finalized for this rollout. Future upgrade checklists should require an explicit technical-owner rollback decision before live announce, including whether rollback is safe after migration/reinitializer state changes and the exact Safe/script procedure if rollback is allowed.
Decision notes Rollout proceeded without a finalized rollback plan. This should be captured in the lessons-learned/checklist follow-up so future FWSS upgrades do not reach live announce without either an approved rollback plan or an explicit written no-rollback decision.

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 Devnet 1.3.0 Frontier Smoke Report #513 exercised Synapse, Curio, FWSS, PDPVerifier, and FilecoinPay across create, add, remove, prove, terminate, cleanup, abandonment, and negative/security paths. It found release-relevant FWSS #512, now included in frozen tag v1.3.0 at c2ff7f8. On 2026-06-08, the SP abandonment/cleanup flow was confirmed working (Slack thread). PDP #279 remains intentionally deferred and is not a blocker for this FWSS v1.3.0 upgrade.

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.
  • 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 createDataSet 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. Update it only after the relevant proxy switch is complete, normally in a follow-up PR.
  • If an AFTER_EPOCH changes, submit a new announcePlannedUpgrade() transaction and record that it supersedes 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.

export UPGRADE_WAIT_DURATION_EPOCHS=2880 # use 240+ for Calibnet rehearsal, 20160 for breaking changes
CURRENT_EPOCH=$(cast block-number --rpc-url "$ETH_RPC_URL")
AFTER_EPOCH=$((CURRENT_EPOCH + UPGRADE_WAIT_DURATION_EPOCHS))
echo "Current: $CURRENT_EPOCH, Upgrade after: $AFTER_EPOCH"

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 createDataSet flow succeeds after the upgrade, either by a manual network-specific transaction or Dealbot canary graph evidence.

Changes

  • Replaces mutable FWSS owner-pricing helpers with FilecoinWarmStorageServiceStateView.getPriceList() as the price-discovery path.
  • Adds lifecycle reserve accounting and one-time operation fees for data set lifecycle actions.
  • Updates consent-based termination so PDP rails terminate immediately while CDN rails persist until data-set deletion.
  • Adds abandonment cleanup support for inactive data sets and includes the #512 settlement/deletion fix found during devnet validation.

Action Required for Integrators

  • Continue using the existing FWSS proxy addresses; this rollout upgrades the implementation behind each proxy.
  • Stop calling removed FWSS pricing helpers and update consumers of removed pricing/CDN events.
  • Use FilecoinWarmStorageServiceStateView.getPriceList() for price discovery after the upgraded implementation is live on the target network.
  • Update funding, allowance, settlement, and termination assumptions for lifecycle reserve and one-time operation fees.

Release Checklist

Work through the phases in order. Do not announce Mainnet until the Calibnet execute transaction, on-chain checks, smoke/E2E test, and createDataSet validation are complete.

Phase 1: Branch, Issue, PR, and Checks

cd service_contracts
forge test --match-contract FilecoinWarmStorageServiceUpgradeTest
forge inspect src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService storageLayout --extra-output storageLayout
  • Version bump PR merged so main contains the final FilecoinWarmStorageService version string (#510, merge 1fdaa85)
  • Create release branch from main after the version bump lands (release-v1.3.0, fast-forwarded to c2ff7f8 to include #512, docs-only #514, and changelog follow-up #515)
  • Name the technical owner, update the Overview, and confirm they own the written upgrade plan and go/no-go decision (@rvagg / Rod confirmed by Phi)
  • Fill Cross-Repo Impact with required PRs, issues, releases, or None (filled from Devnet 1.3.0 Frontier Smoke Report #513 Code Used / Rod follow-up comment; merge/release confirmation remains for go/no-go)
  • Fill Dependency Targets and Compatibility by comparing target versions/addresses with observed Calibnet and Mainnet deployed state (live dependencies matched targets on 2026-06-05)
  • Record Rollback Plan status (no approved rollback plan was obtained for this rollout; capture as a lessons-learned/checklist follow-up for future upgrades)
  • Run foc-devnet post-upgrade state validation, or record the technical owner's approved exception (Devnet 1.3.0 Frontier Smoke Report #513 frontier smoke recorded; 2026-06-08 SP abandonment/cleanup confirmation received; PDP chore(tools): remaining ETH_KEYSTORE, ETH_RPC_URL, and CHAIN changes #279 rollout deferred)
  • Freeze the deploy commit and record it in Release Tracking (c2ff7f8)
  • Create and push the stack tag from the frozen deploy commit before any live proxy switch (v1.3.0 retagged to c2ff7f8; #516 remains a follow-up for #511):
git tag v1.3.0
git push origin v1.3.0
  • Create the GitHub Release from v1.3.0, mark it as a pre-release, and include component versions plus a FWSS rollout status table (v1.3.0 pre-release)
  • Confirm the Update Synapse SDK workflow opened the expected Synapse SDK PR from the tag/pre-release, or record an exception in Release Tracking (exception recorded: tag-push run 27101304131 and release-published run 27101771307 failed in Synapse SDK lint and opened no PR)
  • Release issue Overview and Release Tracking updated with PR links, release link, summary, and action required

Phase 2: Deploy Contracts

Deploy both networks before any announce/execute.

Calibnet FWSS Implementation

  • Run Deploy Contract workflow with network=Calibnet, contract=FWSS Implementation, dry_run=true (run 27102915473, success)
  • Re-run with dry_run=false (run 27103068161, success)
  • Capture CALI_NEW_IMPL and add it to the Run Log (0x68f9c0ACdA8489dc9F08eD279B33D0c5Eb39F95B)
  • Verify implementation on Sourcify and Blockscout (FWSS implementation verified in run 27103068161; batch summary also notes SignatureVerificationLib Sourcify verification failed)
  • Attempt FilFox verification and record result (FWSS implementation Filfox verification succeeded in run 27103068161)

Mainnet FWSS Implementation

  • Run Deploy Contract workflow with network=Mainnet, contract=FWSS Implementation, dry_run=true (skipped by release decision; Calibnet dry run and deployment succeeded from the same frozen v1.3.0 ref)
  • Re-run with dry_run=false (run 27103486934, success)
  • Capture MAIN_NEW_IMPL and add it to the Run Log (0xaD5c7e49fb0407Ec607d8880431b705Ea292DA4c)
  • Verify implementation on Sourcify and Blockscout (FWSS implementation verified in run 27103486934; batch summary also notes SignatureVerificationLib Sourcify verification failed)
  • Attempt FilFox verification and record result (FWSS implementation Filfox verification succeeded in run 27103486934)
  • Add both implementation addresses to the GitHub pre-release rollout status. Do not update service_contracts/deployments.json until proxy slots are live. (Calibnet 0x68f9c0ACdA8489dc9F08eD279B33D0c5Eb39F95B, Mainnet 0xaD5c7e49fb0407Ec607d8880431b705Ea292DA4c)

Verification command pattern:

cd service_contracts

# Calibnet: CHAIN=314159 and FWSS_IMPL="$CALI_NEW_IMPL"
# Mainnet: CHAIN=314 and FWSS_IMPL="$MAIN_NEW_IMPL"
export CHAIN=314159
export FWSS_IMPL="$CALI_NEW_IMPL"

source tools/verify-contracts.sh
verify_sourcify "$FWSS_IMPL" "src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService"
verify_blockscout "$FWSS_IMPL" "src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService"
verify_filfox "$FWSS_IMPL" "src/FilecoinWarmStorageService.sol:FilecoinWarmStorageService"

Phase 3: Calibnet Announce + Execute

Announce

  • Compute Calibnet AFTER_EPOCH and update the schedule table (3786814 = 2026-06-08 15:00:00 UTC)
export ETH_RPC_URL="https://api.calibration.node.glif.io/rpc/v1"
export UPGRADE_WAIT_DURATION_EPOCHS=240 # use a longer window if desired
CURRENT_EPOCH=$(cast block-number --rpc-url "$ETH_RPC_URL")
AFTER_EPOCH=$((CURRENT_EPOCH + UPGRADE_WAIT_DURATION_EPOCHS))
echo "$CURRENT_EPOCH -> $AFTER_EPOCH"
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"
export AFTER_EPOCH="6093240"

CALLDATA_ONLY=true ./warm-storage-announce-upgrade.sh
  • In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata (Safe tx executed)
  • Record Calibnet announce tx link in the Run Log (0xd79f3a0854d55c2996f9af022eb2b0fe33345a1ca856502212e560aac30fabb4)
  • Update the GitHub pre-release Calibnet rollout status with the announce tx and AFTER_EPOCH

Execute

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 (executed; generated calldata: 0x4f1ef28600000000000000000000000068f9c0acda8489dc9f08ed279b33d0c5eb39f95b00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000024ce5494bb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
  • Record Calibnet execute tx link in the Run Log (0x16ae39ffb31887b89fd8f3dea14bb7befe7ce3860ce6829213e6ddffeb8eb5aa)
  • Verify implementation slot equals CALI_NEW_IMPL (0x68f9c0ACdA8489dc9F08eD279B33D0c5Eb39F95B)
  • Verify VERSION() returns the release version without the leading v (1.3.0)
  • Verify nextUpgrade() is cleared via FilecoinWarmStorageServiceStateView.nextUpgrade() (0x0000000000000000000000000000000000000000, 0)
export ETH_RPC_URL="https://api.calibration.node.glif.io/rpc/v1"
export FWSS_PROXY_ADDRESS="0x02925630df557F957f70E112bA06e50965417CA0"
export EXPECTED_FWSS_IMPLEMENTATION_ADDRESS="$CALI_NEW_IMPL"
export EXPECTED_FWSS_VERSION="v1.3.0" # use the FWSS contract VERSION() if it differs from the stack tag
EXPECTED_FWSS_VERSION="${EXPECTED_FWSS_VERSION#v}"

CURRENT_VIEW=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$FWSS_PROXY_ADDRESS" \
  'viewContractAddress()(address)')

IMPLEMENTATION_SLOT=$(cast rpc --rpc-url "$ETH_RPC_URL" \
  eth_getStorageAt \
  "$FWSS_PROXY_ADDRESS" \
  0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \
  latest | tr -d '"' | sed 's/^0x000000000000000000000000/0x/')

ACTUAL_VERSION=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$FWSS_PROXY_ADDRESS" \
  'VERSION()(string)' | tr -d '"')

NEXT_UPGRADE=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$CURRENT_VIEW" \
  'nextUpgrade()(address,uint96)')

echo "Implementation slot: $IMPLEMENTATION_SLOT (expected $EXPECTED_FWSS_IMPLEMENTATION_ADDRESS)"
echo "VERSION(): $ACTUAL_VERSION (expected $EXPECTED_FWSS_VERSION)"
echo "nextUpgrade(): $NEXT_UPGRADE (expected zero address and 0)"
  • Update Calibnet StateView: v1.3.0 StateView 0xF4B446171b3677fD2B9b183a9fB76d517365700a deployed by run 27153663060, configured by setViewContract tx, and verified via configured viewContractAddress(); configured view service(), nextUpgrade(), getCurrentPricingRates(), and getPriceList() checks pass.
  • Run and record a Calibnet smoke/E2E test result
  • Validate a Calibnet createDataSet flow manually or with Dealbot canary graph evidence, then record the tx/link in the Run Log
  • Verify the proxy/execute transaction on Blockscout (execute tx)
  • Update the GitHub pre-release Calibnet rollout status with execute tx, checks, StateView update, and smoke/E2E evidence (release page updated with corrective Calibnet execute, StateView, and SP-relayed terminateService validation)
  • Technical owner confirms Calibnet results are good before announcing Mainnet (implicit: Mainnet announce and execute proceeded)

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 (go: Mainnet announced and executed)
  • Confirm required cross-repo changes are merged/released or explicitly waived by the technical owner
  • Notify stakeholders before announcing Mainnet, including FilB so they can propagate the upgrade notice
  • Compute Mainnet AFTER_EPOCH and update the schedule table (6093240 = 2026-06-10 15:00:00 UTC)
export ETH_RPC_URL="https://api.node.glif.io/rpc/v1"
TARGET_UTC="2026-06-10 15:00:00 UTC"
AFTER_EPOCH=6093240
echo "Mainnet execute allowed after: $AFTER_EPOCH ($TARGET_UTC)"
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"
export AFTER_EPOCH="$AFTER_EPOCH"

CALLDATA_ONLY=true ./warm-storage-announce-upgrade.sh
  • In Safe Transaction Builder, set target to the printed FWSS proxy, value to 0, and data to the printed calldata (Safe tx executed)
  • Record Mainnet announce tx link in the Run Log (0x0fbe8e36135b143de53382c4f5c6898a1723d78e29e269e39f9739a0e53e0533)
  • Update the GitHub pre-release Mainnet rollout status with the announce tx and AFTER_EPOCH

Execute

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 (Safe tx executed)
  • Record Mainnet execute tx link in the Run Log (0x4b0066b946f2cef6d0724cd5100dbbf41cd66192f0c2e21db808b8e72b033f11)
  • Verify implementation slot equals MAIN_NEW_IMPL (0xaF996097790c17D3C23Cc45A3035a29D293d1492)
  • Verify VERSION() returns the release version without the leading v (1.3.0)
  • Verify nextUpgrade() is cleared (zero address / 0)
export ETH_RPC_URL="https://api.node.glif.io/rpc/v1"
export FWSS_PROXY_ADDRESS="0x8408502033C418E1bbC97cE9ac48E5528F371A9f"
export EXPECTED_FWSS_IMPLEMENTATION_ADDRESS="$MAIN_NEW_IMPL"
export EXPECTED_FWSS_VERSION="v1.3.0" # use the FWSS contract VERSION() if it differs from the stack tag
EXPECTED_FWSS_VERSION="${EXPECTED_FWSS_VERSION#v}"

CURRENT_VIEW=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$FWSS_PROXY_ADDRESS" \
  'viewContractAddress()(address)')

IMPLEMENTATION_SLOT=$(cast rpc --rpc-url "$ETH_RPC_URL" \
  eth_getStorageAt \
  "$FWSS_PROXY_ADDRESS" \
  0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \
  latest | tr -d '"' | sed 's/^0x000000000000000000000000/0x/')

ACTUAL_VERSION=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$FWSS_PROXY_ADDRESS" \
  'VERSION()(string)' | tr -d '"')

NEXT_UPGRADE=$(cast call --rpc-url "$ETH_RPC_URL" \
  "$CURRENT_VIEW" \
  'nextUpgrade()(address,uint96)')

echo "Implementation slot: $IMPLEMENTATION_SLOT (expected $EXPECTED_FWSS_IMPLEMENTATION_ADDRESS)"
echo "VERSION(): $ACTUAL_VERSION (expected $EXPECTED_FWSS_VERSION)"
echo "nextUpgrade(): $NEXT_UPGRADE (expected zero address and 0)"
  • Run and record a Mainnet smoke/E2E test result (evidence)
  • Validate a Mainnet createDataSet flow manually or with Dealbot canary graph evidence, then record the tx/link in the Run Log (data set 1271, commit tx; evidence)
  • Verify the proxy on Blockscout (execute tx, setViewContract tx)
  • Update the GitHub pre-release Mainnet rollout status with execute tx, checks, and smoke/E2E evidence

Phase 5: Promote Release and Close Out

  • Confirm live Calibnet and Mainnet FWSS implementation slots match the new implementation addresses (Calibnet: 0x9e4e6699d8F67dFc883d6b0A7344Bd56F7E80B46, Mainnet: 0xaF996097790c17D3C23Cc45A3035a29D293d1492)
  • Confirm cross-repo follow-ups are complete or tracked with owners
  • Open or update a follow-up PR for service_contracts/deployments.json with live implementation addresses plus pdp_version and fwss_version fields for each network (#523)
  • Merge the service_contracts/deployments.json follow-up PR after checksum validation and live-slot verification (#523 merged; Check deployments.json Checksums passed; live slots verified)
  • Merge release-prep/changelog PRs if still open, keeping mutable rollout details on the GitHub Release page (#526 merged)
  • Promote the GitHub Release from pre-release to latest after Mainnet proxy switch, checks, and release-page status are complete (v1.3.0)
  • Merge relevant auto-generated PRs in filecoin-cloud (FilOzone/filecoin-cloud#317 contract-address sync merged; SDK package-update PRs are downstream follow-ups, not blockers for this contract release close-out)
  • No separate "Upgrade Synapse to use newest contracts" issue needed; Synapse SDK contract-address update completed through FilOzone/synapse-sdk#844 and the follow-up release path is already complete/tracked (synapse-sdk-v1.0.1)
  • Capture lessons learned from this rollout and update service_contracts/tools/UPGRADE-CHECKLIST.md if the process should change. Rollback-plan lesson learned: no technical-owner-approved rollback plan was finalized before this rollout executed; future upgrades should require either an approved rollback procedure or an explicit written no-rollback decision before live announce.
  • Add release link to this issue (v1.3.0)
  • Close this issue

Resources

Metadata

Metadata

Assignees

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
🎉 Done

Relationships

None yet

Development

No branches or pull requests

Issue actions