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
Track the successive rollout of PDPVerifier from v3.4.0 to v3.5.0, with Calibration first and Mainnet second.
This issue is the full operational checklist for the rollout and release closeout.
Rollout Status
Network
Announced
Executable on or after
Executed
Notes
Calibration
Pending
TBD
Pending
Upgrade first; fill in the planned-upgrade transaction and timestamp when announced.
Mainnet
Pending
TBD
Pending
Upgrade after Calibration execution and smoke tests pass.
Operational Notes
Use this single issue to track the full rollout across both networks.
Confirm the live proxy VERSION() separately; it may lag the release baseline if recent releases did not include a PDPVerifier deployment.
Record major steps as issue comments as you go rather than editing every detail into the top post.
Use UPGRADE_DELAY_EPOCHS for the normal planned-upgrade flow once the live proxy exposes announceUpgradePlan(). Use the temporary AFTER_EPOCH bootstrap path only when upgrading from an implementation that predates that method; removal is tracked in Remove legacy PDPVerifier AFTER_EPOCH bootstrap flow #288.
After an announcement executes, read and record the observed nextUpgrade.afterEpoch. Use that observed value for all subsequent readiness checks.
Do not deploy until all bytecode-affecting PRs are merged to main.
If the release tag must match the exact on-chain bytecode, tag the deploy commit before changelog-only closeout changes. Otherwise, tag the finalized release-notes commit and record the implementation deploy commit separately.
The current tools/deploy-calibnet.sh and tools/deploy-mainnet.sh also deploy a fresh proxy. For upgrades, the safest path is still:
deploy the implementation manually with forge create
generate SAFE calldata with tools/upgrade.sh
tools/upgrade.sh prints the SAFE contract's on-chain nonce. The Safe UI may queue the transaction at a higher nonce if there are already pending transactions. That does not change the contract calldata.
Choose exactly one announcement mode below. The default notice window is 2880 Filecoin epochs (~1 day); adjust intentionally if the release needs a longer window.
For the normal delay-based flow, once the live proxy exposes announceUpgradePlan():
Temporary bootstrap compatibility: The currently deployed PDPVerifier v3.4.0 implementation does not expose announceUpgradePlan(). Use the following legacy flow only while the live proxy predates that method—normally for the first bootstrap, or for separately documented rollback recovery. Remove this section only after the full removal criteria in #288 are satisfied.
If the Safe UI asks whether to use the implementation ABI for the proxy, use the implementation ABI, but keep the transaction target as the proxy.
Stage the Calibration planned-upgrade SAFE transaction
Execute the Calibration planned-upgrade SAFE transaction
Record the Calibration planned-upgrade announcement transaction hash and update the rollout status table
Read the actual plan after the Safe transaction executes. This verifies that the requested notice window starts at execution and catches a legacy announcement that no longer preserves the full notice period.
ANNOUNCE_TX_HASH="<TX_HASH>"
NOTICE_EPOCHS=2880 # Must match the requested notice used aboveif! ANNOUNCE_STATUS=$(cast receipt --rpc-url "$RPC_URL""$ANNOUNCE_TX_HASH" status);thenecho"ERROR: failed to read the announcement receipt"exit 1
fi
ANNOUNCE_STATUS=${ANNOUNCE_STATUS%%*}if [ "$ANNOUNCE_STATUS"!="1" ] && [ "$ANNOUNCE_STATUS"!="0x1" ];thenecho"ERROR: announcement transaction did not succeed (status $ANNOUNCE_STATUS)"exit 1
fiif! ANNOUNCE_EPOCH=$(cast receipt --rpc-url "$RPC_URL""$ANNOUNCE_TX_HASH" blockNumber);thenecho"ERROR: failed to read the announcement epoch"exit 1
fiif [[ "$ANNOUNCE_EPOCH"=~ ^0x[0-9a-fA-F]+$ ]];then
ANNOUNCE_EPOCH=$((ANNOUNCE_EPOCH))elif! [[ "$ANNOUNCE_EPOCH"=~ ^[0-9]+$ ]];thenecho"ERROR: invalid announcement epoch: $ANNOUNCE_EPOCH"exit 1
fiif! UPGRADE_PLAN_OUTPUT=$(cast call --rpc-url "$RPC_URL" \ 0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C \"nextUpgrade()(address,uint96)");thenecho"ERROR: failed to read nextUpgrade()"exit 1
fi
UPGRADE_PLAN=($UPGRADE_PLAN_OUTPUT)
if [ "${#UPGRADE_PLAN[@]}"-lt 2 ];thenecho"ERROR: malformed nextUpgrade() output"exit 1
fi
OBSERVED_IMPL=${UPGRADE_PLAN[0]}
OBSERVED_AFTER_EPOCH=${UPGRADE_PLAN[1]}if [[ "$OBSERVED_AFTER_EPOCH"=~ ^0x[0-9a-fA-F]+$ ]];then
OBSERVED_AFTER_EPOCH=$((OBSERVED_AFTER_EPOCH))elif! [[ "$OBSERVED_AFTER_EPOCH"=~ ^[0-9]+$ ]];thenecho"ERROR: invalid observed afterEpoch: $OBSERVED_AFTER_EPOCH"exit 1
fi
MIN_AFTER_EPOCH=$((ANNOUNCE_EPOCH + NOTICE_EPOCHS))echo"Planned implementation: $OBSERVED_IMPL (expected <IMPL>)"echo"Observed afterEpoch: $OBSERVED_AFTER_EPOCH"if [ "$(printf '%s'"$OBSERVED_IMPL"| tr '[:upper:]''[:lower:]')"!= \
"$(printf '%s'"<IMPL>"| tr '[:upper:]''[:lower:]')" ];thenecho"ERROR: announced implementation mismatch"exit 1
fiif [ "$OBSERVED_AFTER_EPOCH"-lt"$MIN_AFTER_EPOCH" ];thenecho"ERROR: announcement does not preserve the requested notice window"echo"STOP: do not stage or execute the upgrade."echo"Generate and execute a replacement announcement, then repeat this verification."exit 1
fi
Confirm the observed implementation and notice-window checks pass
If the announcement reverted or a check failed, stop the rollout. For the legacy bootstrap, recompute a fresh AFTER_EPOCH, execute a superseding announcement, record the superseded transaction/plan, and repeat verification.
Do not stage or execute the upgrade transaction until the observed checks pass
Record OBSERVED_AFTER_EPOCH in the rollout status table
Wait until the chain reaches OBSERVED_AFTER_EPOCH
Optional parallel work while waiting: deploy and verify the Mainnet implementation, then stage the Mainnet planned-upgrade announcement with its requested notice window. Do not generate, stage, or execute the final Mainnet upgradeToAndCall payload until the Calibration upgrade executes and smoke tests pass.
Choose exactly one announcement mode below. The default notice window is 2880 Filecoin epochs (~1 day); adjust intentionally if the release needs a longer window.
For the normal delay-based flow, once the live proxy exposes announceUpgradePlan():
Temporary bootstrap compatibility: The currently deployed PDPVerifier v3.4.0 implementation does not expose announceUpgradePlan(). Use the following legacy flow only while the live proxy predates that method—normally for the first bootstrap, or for separately documented rollback recovery. Remove this section only after the full removal criteria in #288 are satisfied.
If the Safe UI asks whether to use the implementation ABI for the proxy, use the implementation ABI, but keep the transaction target as the proxy.
Stage the Mainnet planned-upgrade SAFE transaction
Execute the Mainnet planned-upgrade SAFE transaction
Record the Mainnet planned-upgrade announcement transaction hash and update the rollout status table
Read the actual plan after the Safe transaction executes. This verifies that the requested notice window starts at execution and catches a legacy announcement that no longer preserves the full notice period.
ANNOUNCE_TX_HASH="<TX_HASH>"
NOTICE_EPOCHS=2880 # Must match the requested notice used aboveif! ANNOUNCE_STATUS=$(cast receipt --rpc-url "$RPC_URL""$ANNOUNCE_TX_HASH" status);thenecho"ERROR: failed to read the announcement receipt"exit 1
fi
ANNOUNCE_STATUS=${ANNOUNCE_STATUS%%*}if [ "$ANNOUNCE_STATUS"!="1" ] && [ "$ANNOUNCE_STATUS"!="0x1" ];thenecho"ERROR: announcement transaction did not succeed (status $ANNOUNCE_STATUS)"exit 1
fiif! ANNOUNCE_EPOCH=$(cast receipt --rpc-url "$RPC_URL""$ANNOUNCE_TX_HASH" blockNumber);thenecho"ERROR: failed to read the announcement epoch"exit 1
fiif [[ "$ANNOUNCE_EPOCH"=~ ^0x[0-9a-fA-F]+$ ]];then
ANNOUNCE_EPOCH=$((ANNOUNCE_EPOCH))elif! [[ "$ANNOUNCE_EPOCH"=~ ^[0-9]+$ ]];thenecho"ERROR: invalid announcement epoch: $ANNOUNCE_EPOCH"exit 1
fiif! UPGRADE_PLAN_OUTPUT=$(cast call --rpc-url "$RPC_URL" \ 0xBADd0B92C1c71d02E7d520f64c0876538fa2557F \"nextUpgrade()(address,uint96)");thenecho"ERROR: failed to read nextUpgrade()"exit 1
fi
UPGRADE_PLAN=($UPGRADE_PLAN_OUTPUT)
if [ "${#UPGRADE_PLAN[@]}"-lt 2 ];thenecho"ERROR: malformed nextUpgrade() output"exit 1
fi
OBSERVED_IMPL=${UPGRADE_PLAN[0]}
OBSERVED_AFTER_EPOCH=${UPGRADE_PLAN[1]}if [[ "$OBSERVED_AFTER_EPOCH"=~ ^0x[0-9a-fA-F]+$ ]];then
OBSERVED_AFTER_EPOCH=$((OBSERVED_AFTER_EPOCH))elif! [[ "$OBSERVED_AFTER_EPOCH"=~ ^[0-9]+$ ]];thenecho"ERROR: invalid observed afterEpoch: $OBSERVED_AFTER_EPOCH"exit 1
fi
MIN_AFTER_EPOCH=$((ANNOUNCE_EPOCH + NOTICE_EPOCHS))echo"Planned implementation: $OBSERVED_IMPL (expected <IMPL>)"echo"Observed afterEpoch: $OBSERVED_AFTER_EPOCH"if [ "$(printf '%s'"$OBSERVED_IMPL"| tr '[:upper:]''[:lower:]')"!= \
"$(printf '%s'"<IMPL>"| tr '[:upper:]''[:lower:]')" ];thenecho"ERROR: announced implementation mismatch"exit 1
fiif [ "$OBSERVED_AFTER_EPOCH"-lt"$MIN_AFTER_EPOCH" ];thenecho"ERROR: announcement does not preserve the requested notice window"echo"STOP: do not stage or execute the upgrade."echo"Generate and execute a replacement announcement, then repeat this verification."exit 1
fi
Confirm the observed implementation and notice-window checks pass
If the announcement reverted or a check failed, stop the rollout. For the legacy bootstrap, recompute a fresh AFTER_EPOCH, execute a superseding announcement, record the superseded transaction/plan, and repeat verification.
Do not stage or execute the upgrade transaction until the observed checks pass
Record OBSERVED_AFTER_EPOCH in the rollout status table
Wait until the chain reaches OBSERVED_AFTER_EPOCH
Confirm Calibration upgrade and smoke tests completed successfully before proceeding to final Mainnet upgrade execution
This is part of the "202608 FOC Release": FilOzone/filecoin-services#597
Items that are in scope: https://github.com/FilOzone/pdp/milestone/10
Summary
Track the successive rollout of
PDPVerifierfromv3.4.0tov3.5.0, with Calibration first and Mainnet second.This issue is the full operational checklist for the rollout and release closeout.
Rollout Status
Operational Notes
VERSION()separately; it may lag the release baseline if recent releases did not include a PDPVerifier deployment.UPGRADE_DELAY_EPOCHSfor the normal planned-upgrade flow once the live proxy exposesannounceUpgradePlan(). Use the temporaryAFTER_EPOCHbootstrap path only when upgrading from an implementation that predates that method; removal is tracked in Remove legacy PDPVerifier AFTER_EPOCH bootstrap flow #288.nextUpgrade.afterEpoch. Use that observed value for all subsequent readiness checks.main.tools/deploy-calibnet.shandtools/deploy-mainnet.shalso deploy a fresh proxy. For upgrades, the safest path is still:forge createtools/upgrade.shtools/upgrade.shprints the SAFE contract's on-chain nonce. The Safe UI may queue the transaction at a higher nonce if there are already pending transactions. That does not change the contract calldata.Suggested release tag:
v3.5.0Network Constants
0xBADd0B92C1c71d02E7d520f64c0876538fa2557F0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C0x3569b2600877a9F42d9Ebdd205386F3F3788F3E5https://api.node.glif.io/rpc/v1https://api.calibration.node.glif.io/rpc/v12880epochs (~1 day at 30 seconds/epoch)Release Preparation
1. Prepare and Merge Release PRs
PDPVerifier.VERSIONbump if the deployed contract version is changing.CHANGELOG.mdrelease notes before deployment.## [X.Y.Z] - TBDuntil the rollout executes.TBDuntil known.docs(changelog): draft vX.Y.Z release notes and version bumpmainPDPVerifier.VERSIONbump is bytecode-affecting and must be merged before selecting the deploy commit or deploying any implementation.2. Freeze the Deploy Commit
mainconfirmedVERSIONconfirmed insrc/PDPVerifier.solchore: correctly set version to vX.Y.Zrg -n 'string public constant VERSION' src/PDPVerifier.sol3. Confirm Constructor Values
initializerVersionchallengeFinalityRPC_URL="https://api.calibration.node.glif.io/rpc/v1" \ ./tools/get-initialized-counter.sh 0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417CinitializerVersionchallengeFinalityRPC_URL="https://api.node.glif.io/rpc/v1" \ ./tools/get-initialized-counter.sh 0xBADd0B92C1c71d02E7d520f64c0876538fa2557FDeploy the next implementation with
initializerVersion = <current counter + 1>.4. Confirm the Live Proxy Owner and Version
If the owner is a SAFE or other contract owner, use
tools/upgrade.shto generate calldata for the owner workflow rather than broadcasting directly.5. Confirm the PDP Upgrade Plan
PDPVerifierversions checked against the target version and recordednone6. Record PDP Rollback Safety
safeorunsafe, with rationale7. Validate PDP in FOC Devnet
PDPVerifierupgrade and link evidence that the post-upgrade PDP state is valid (run evidence)PDPVerifierversions used by the validation recordedCalibration Rollout
PDPVerifierimplementation to CalibrationVERSION()and immutable values on the Calibration implementationChoose exactly one announcement mode below. The default notice window is
2880Filecoin epochs (~1 day); adjust intentionally if the release needs a longer window.For the normal delay-based flow, once the live proxy exposes
announceUpgradePlan():If the Safe UI asks whether to use the implementation ABI for the proxy, use the implementation ABI, but keep the transaction target as the proxy.
Read the actual plan after the Safe transaction executes. This verifies that the requested notice window starts at execution and catches a legacy announcement that no longer preserves the full notice period.
AFTER_EPOCH, execute a superseding announcement, record the superseded transaction/plan, and repeat verification.OBSERVED_AFTER_EPOCHin the rollout status tableOBSERVED_AFTER_EPOCHOptional parallel work while waiting: deploy and verify the Mainnet implementation, then stage the Mainnet planned-upgrade announcement with its requested notice window. Do not generate, stage, or execute the final Mainnet
upgradeToAndCallpayload until the Calibration upgrade executes and smoke tests pass.tools: support SAFE-owned PDP upgradesFor legacy one-step upgrades, this prints:
targetvaluedataIf building the transaction via the Safe UI ABI form:
upgradeToAndCall(address,bytes)newImplementation:<IMPL>data:0x8fd3ab800x8fd3ab80is the calldata formigrate().nextUpgrade()still matches<IMPL>andOBSERVED_AFTER_EPOCHOBSERVED_AFTER_EPOCHvX.Y.ZnextUpgrade()cleared to the zero address and0Find a recent live dataset with active pieces:
Then run:
Check that:
the old and new pagination calls agree
findPieceIdsByCid()returns the expected piece ID(s)Verify
createDataSetsucceeds on Calibration through a PDP integration pathRecord Calibration result in an issue comment; send external update if needed
docs(changelog): draft vX.Y.Z release notesConfirm no blocker remains for Mainnet rollout
Mainnet Rollout
docs(changelog): draft vX.Y.Z release notesPDPVerifierimplementation to MainnetVERSION()and immutable values on the Mainnet implementationChoose exactly one announcement mode below. The default notice window is
2880Filecoin epochs (~1 day); adjust intentionally if the release needs a longer window.For the normal delay-based flow, once the live proxy exposes
announceUpgradePlan():If the Safe UI asks whether to use the implementation ABI for the proxy, use the implementation ABI, but keep the transaction target as the proxy.
Read the actual plan after the Safe transaction executes. This verifies that the requested notice window starts at execution and catches a legacy announcement that no longer preserves the full notice period.
Confirm the observed implementation and notice-window checks pass
If the announcement reverted or a check failed, stop the rollout. For the legacy bootstrap, recompute a fresh
AFTER_EPOCH, execute a superseding announcement, record the superseded transaction/plan, and repeat verification.Do not stage or execute the upgrade transaction until the observed checks pass
Record
OBSERVED_AFTER_EPOCHin the rollout status tableWait until the chain reaches
OBSERVED_AFTER_EPOCHConfirm Calibration upgrade and smoke tests completed successfully before proceeding to final Mainnet upgrade execution
Mainnet SAFE upgrade transaction payload generated
tools: support SAFE-owned PDP upgradesIf building the Safe transaction with ABI inputs:
method:
upgradeToAndCall(address,bytes)newImplementation:<IMPL>data:0x8fd3ab80Mainnet implementation address, verification links, calldata, and rollout notes shared for independent review
Stage the Mainnet SAFE transaction
Collect SAFE signer approvals
Confirm the Mainnet execution date/time
Confirm
nextUpgrade()still matches<IMPL>andOBSERVED_AFTER_EPOCHConfirm current epoch is greater than or equal to
OBSERVED_AFTER_EPOCHExecute the Mainnet SAFE upgrade transaction
Verify the Mainnet proxy implementation slot
Verify the Mainnet proxy is on
vX.Y.ZVerify
nextUpgrade()cleared to the zero address and0Verify
createDataSetsucceeds on Mainnet through a PDP integration pathPublish completion/update communication
Release Closeout
CHANGELOG.mdrelease date, deployed addresses, verification links, and deployment transactionsmaindocs(changelog): finalize vX.Y.Z release notesvX.Y.Zgit tag -a vX.Y.Z -m "vX.Y.Z" git push origin vX.Y.Zfilecoin-servicesservice_contracts/lib/pdpto the exact PDP release tag.fwss-subgraphdocs: update PDPVerifier upgrade issue templateDeployment / Verification Details
Fill these in as comments or update them here once known.
cc3f5eaffee7df80471b671a4e35a42b000685b8TBDCalibration
0x85e366Cf9DD2c0aE37E963d9556F5f4718d6417C0xd6b09b0f6D3C42B26a246E141ec701a20Dde2fA610x04D4CdB99E34D7e9a366E7eba7A835e034bc41b10x824aec5fd5694c7894985cea1b05545a01d8e09cf114300cf882c3ca79a3a27dTBDinitializerVersion:4challengeFinality:10Mainnet
Proxy address:
0xBADd0B92C1c71d02E7d520f64c0876538fa2557FPrevious implementation address:
0xb41A97FEDD2D9497C639A643ec75E56CbCeDe8BANew implementation address:
0x04D4CdB99E34D7e9a366E7eba7A835e034bc41b1Deployment transaction hash:
0xf39ea3a831d2b60035fbe894157f0ce78e0b13fff1ffed2e6cf77d462f0292ccPlanned-upgrade announcement transaction hash:
TBDConstructor values:
initializerVersion:4challengeFinality:150Verification links:
SAFE transaction link:
SAFE execution transaction hash:
Upgrade communication links:
Post-release follow-up links:
filecoin-servicesPR:fwss-subgraphissue:Suggested Comment Cadence
Recommended issue comments to post as the rollout progresses:
CHANGELOG, tag,filecoin-services,fwss-subgraph)