Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,10 @@
local networks zero the window right after lane 39, and the lane skips wherever every retired window already reads
zero. Base executed the call at Safe nonce 80 on 2026-08-28 (safeTxHash `0x16a7…4650`, tx `0x4824…6f8a`, artifacts
`base_retire_cashapp_risk_window*`, whose Safe origin/description say "lane 41" — the retirement lane's number
before lane 41 was claimed by the UPI payment method), so Base evidence is already `0`. Base staging is still pending: the package
extractor's `LIVE_DISPUTABLE_PAYMENT_METHODS.base_staging` override, the staging evidence, and the spec's staging
window keep Cash App at 1209600 until the staging write executes, and that recording PR also pins lane 42.
before lane 41 was claimed by the UPI payment method). Base staging executed the deployer-EOA write on 2026-09-02
(tx `0x5cde17a0c59ba4b606b19b9d09b468af06cd283d256984160e9627aaff4dc451`), so Cash App reads a zero window on both
networks, the evidence and package manifest carry `0` everywhere, and the lane — immutable and pinned after that
first execution — stays mounted and skips wherever every retired window already reads zero.
- `deployments/predecessorDisputeStack.ts` keeps two pinned maps: `PREDECESSOR_DISPUTE_STACKS` describes the
predecessor of the currently selected stack and feeds the lane-30 wrapper, the package's recognized-predecessor
identities, and lane-34 tooling; `METHOD_SCOPED_PREDECESSOR_DISPUTE_STACKS` describes what lane 37 replaces (the
Expand Down
8 changes: 4 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,10 @@ Current numbered lanes include:
- `40` (immutable): dedicated-vault activation (tag-only; staging EOA steps,
one guarded Base cutover batch, deferred predecessor writer removal);
- `41`: generic UPI/INR payment method (tag-only, Base staging only);
- `42`: dispute risk-window retirement (tag-only on live networks; zeroes the
`RETIRED_DISPUTABLE_PAYMENT_METHODS` windows on the lane-39 policy; Base
executed at Safe nonce 80 on 2026-08-28, staging EOA write and its evidence
flip still pending; pin after that execution).
- `42` (immutable): dispute risk-window retirement (tag-only on live networks;
zeroes the `RETIRED_DISPUTABLE_PAYMENT_METHODS` windows on the lane-39
policy; Base executed via the Safe 2026-08-28, staging via the deployer
2026-09-02; still mounted, skips while every retired window reads zero).

There is no `26` script. Numbered files are identities, not proof that every
script should execute. A numbered script is immutable after any production
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -803,10 +803,10 @@ the `RETIRED_DISPUTABLE_PAYMENT_METHODS` risk windows on `DisputeProtectionPolic
14-day windows. Base executed it at Safe nonce 80 on 2026-08-28 (safeTxHash `0x16a7…4650`, tx
`0x4824a78931e3785cd69e4aa1c669c2f86cf0ccbaf22066d54f7f7ace55156f8a`; batch and chunk plan under
`deployments/outputs/safe-batches/base_retire_cashapp_risk_window*`; their "lane 41" label predates the UPI
payment method claiming that number), so the lane's tagged Base run now skips. Base
staging still carries the 14-day Cash App window until `yarn deploy:dispute-risk-windows:base_staging` executes the
deployer-EOA write; after that, the recording PR drops Cash App from the package extractor's staging
`LIVE_DISPUTABLE_PAYMENT_METHODS` override, flips the staging evidence and spec windows, and pins lane 42.
payment method claiming that number). Base staging executed the deployer-EOA write on 2026-09-02
(tx `0x5cde17a0c59ba4b606b19b9d09b468af06cd283d256984160e9627aaff4dc451`). Cash App therefore reads a zero risk
window on both networks, the evidence and package manifest say `0` everywhere, and lane 42 is immutable and pinned
after that first execution; it stays mounted and its tagged runs skip while every retired window reads zero.

### Whitelist Bootstrap

Expand Down
2 changes: 1 addition & 1 deletion deployments/dispute-stack-evidence.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"0xf752c7d19698ecb0bb8988abf9b9a53a4c3657f3bc8850a6fb59fdf3e3ce8cd3": "0"
},
"base_staging": {
"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d": "1209600",
"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d": "0",
"0x1d966dbd6aeb8674d7c05174bd0ded7b56a798672bfb862ef20bbe8c2bbfce18": "0",
"0x3ccc3d4d5e769b1f82dc4988485551dc0cd3c7a3926d7d8a4dde91507199490f": "1209600",
"0x554a007c2217df766b977723b276671aee5ebb4adaea0edb6433c88b3e61dac5": "0",
Expand Down
12 changes: 12 additions & 0 deletions deployments/immutableDeploymentLanes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,18 @@ export const IMMUTABLE_DEPLOYMENT_LANES = {
"V3DisputeMethodScopedVaultActivation",
],
},
// Executed on Base staging 2026-09-02 from dfe1060 (tx 0x5cde17a0…4dc451); the Base window was zeroed by the
// Safe at nonce 80 on 2026-08-28 before this lane's first run. Lane stays mounted; its skip reads live windows.
"42_retire_dispute_risk_windows.ts": {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Update the exact immutable-lane manifest fixture

Whenever the release-surface checks run yarn test:dispute-lifecycle-deployment, the exact assert.deepEqual(IMMUTABLE_DEPLOYMENT_LANES, ...) assertion in scripts/test-opt-in-dispute-lifecycle-deployment.cjs:410-511 fails because its expected object still ends at lane 40 and does not contain this new lane 42 entry. Add lane 42 to that fixture so the required deployment-lane check and Release readiness workflow can pass.

AGENTS.md reference: AGENTS.md:L237-L238

Useful? React with 👍 / 👎.

deployedSourceSha: "dfe1060e09a5d7d9c1b57dbfd835ecf378e1e9f4",
sha256: "5aeddc6c46ad489fefbe53cf537c0c70eefebf3ce531a56149a4f2e67e3ad014",
activeSource: undefined,
retired: false,
tags: [
"42_retire_dispute_risk_windows",
"DisputeRiskWindowRetirement",
],
},
} as const;

export type DeploymentLanes = Readonly<
Expand Down
6 changes: 3 additions & 3 deletions deployments/parameters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,9 +168,9 @@ export const DISPUTABLE_PAYMENT_METHODS: string[] = [
"venmo",
];

// Payment methods governance removed from dispute protection after lane 39 configured them. Lane 42 zeroes
// their risk windows wherever they are still set (Base executed at Safe nonce 80 on 2026-08-28; Base staging
// pending). DISPUTABLE_PAYMENT_METHODS already excludes them; staging evidence flips after the staging write.
// Payment methods governance removed from dispute protection after lane 39 configured them. Lane 42 zeroed
// their risk windows on both live networks (Base Safe nonce 80 on 2026-08-28; Base staging deployer write on
// 2026-09-02) and now skips everywhere; DISPUTABLE_PAYMENT_METHODS and the evidence exclude them.
export const RETIRED_DISPUTABLE_PAYMENT_METHODS: string[] = [
"cashapp",
];
Expand Down
25 changes: 3 additions & 22 deletions packages/contracts/scripts/extractors/disputeStack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,19 +114,6 @@ const NETWORKS = [
},
] as const;

/**
* The risk windows currently active on-chain. Staging still carries the legacy
* Cash App window until its governed policy update is executed; deployment
* parameters intentionally omit it from every future configuration.
*/
const LIVE_DISPUTABLE_PAYMENT_METHODS: Record<
(typeof NETWORKS)[number]["manifestName"],
readonly string[]
> = {
base: DISPUTABLE_PAYMENT_METHODS,
base_staging: [...DISPUTABLE_PAYMENT_METHODS, "cashapp"],
};

const RUNTIME_IDENTITY_NAMES: RuntimeIdentityName[] = [
"Orchestrator",
"OrchestratorV2",
Expand Down Expand Up @@ -425,16 +412,10 @@ function deploymentBlockNumber(
return blockNumber.toString();
}

function configuredRiskWindows(
network: keyof typeof LIVE_DISPUTABLE_PAYMENT_METHODS,
): Record<string, string> {
function configuredRiskWindows(network: string): Record<string, string> {
const activePaymentMethods = getActivePaymentMethods(network);
const liveDisputablePaymentMethods = LIVE_DISPUTABLE_PAYMENT_METHODS[network];
if (!liveDisputablePaymentMethods) {
throw new Error(`Unsupported dispute stack network ${network}`);
}
const configured = new Set(liveDisputablePaymentMethods);
if (liveDisputablePaymentMethods.some((method) => !activePaymentMethods.includes(method))) {
const configured = new Set(DISPUTABLE_PAYMENT_METHODS);
if (DISPUTABLE_PAYMENT_METHODS.some((method) => !activePaymentMethods.includes(method))) {
throw new Error("Disputable payment methods must be active");
}
const entries = activePaymentMethods.map((method) => [
Expand Down
2 changes: 0 additions & 2 deletions scripts/active-dispute-stack.spec.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,6 @@ const RISK_WINDOWS_BY_NETWORK = {
base: BASE_RISK_WINDOWS,
baseStaging: {
...BASE_RISK_WINDOWS,
"0x10940ee67cfb3c6c064569ec92c0ee934cd7afa18dd2ca2d6a2254fcb009c17d":
"1209600",
"0x1d966dbd6aeb8674d7c05174bd0ded7b56a798672bfb862ef20bbe8c2bbfce18": "0",
"0xe99a5081226cbbff9440a63da5caa04fa30f210c12c4dd9976132ac075054cd9": "0",
"0xf81480907d808d639ad3230869e4b05a3b01b2d34e323af40f2efab807effd32": "0",
Expand Down
11 changes: 11 additions & 0 deletions scripts/test-opt-in-dispute-lifecycle-deployment.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,17 @@ test("immutable lane manifest pins the exact deployed sources", () => {
"V3DisputeMethodScopedVaultActivation",
],
},
"42_retire_dispute_risk_windows.ts": {
deployedSourceSha: "dfe1060e09a5d7d9c1b57dbfd835ecf378e1e9f4",
sha256:
"5aeddc6c46ad489fefbe53cf537c0c70eefebf3ce531a56149a4f2e67e3ad014",
activeSource: undefined,
retired: false,
tags: [
"42_retire_dispute_risk_windows",
"DisputeRiskWindowRetirement",
],
},
});
});

Expand Down
Loading