Show level locks only on the next unlock tier on play (#334) #507

Merged
PlasticDigits merged 1 commit from issue-334-next-tier-level-locks into main 2026-06-19 06:32:34 +00:00
PlasticDigits commented 2026-06-19 06:22:18 +00:00 (Migrated from gitlab.com)

Summary

Implement issue #334: show progression level-lock chrome only on the immediate next unlock tier on the play route (/).

  • Add nextUnlockLevel, shouldShowLevelLock, and shouldShowPodiumLevelLock in arenaProgression.ts.
  • Update play-route consumers (timer carousel meta, side chips, WarBow gate/flag, ArenaLevelGate) to use the next-tier policy.
  • Disconnected wallets no longer show connect-wallet lock chrome on secondary podium tiers.
  • Onchain isFeatureUnlocked gates unchanged; only visual lock overlays narrow.

Verification checklist

Acceptance item Command / evidence Result
L1 wallet: at most one progression lock (L2), not L3–L5 ANVIL_E2E=1 npx playwright test debug: only arena-timer-chip-lock-1 (L2) among tier chips; L3/L4 chip locks absent PASS
L4 wallet: lock only on L5 WarBow flag shouldShowLevelLock(4, 5) unit test; WarBow flag gate uses showWarbowFlagLevelLock PASS
L5 wallet: no progression lock overlays shouldShowLevelLock(5, *) → false; nextUnlockLevel(5) → null PASS
Cyberminimalist glass styling preserved Screenshots on issue #334 (desktop/tablet/mobile) PASS
Screenshots desktop ≥1024, tablet ~768, mobile ~390 Uploaded to issue #334 comment PASS
cd frontend && npm run typecheck && npm run lint && npm test All 701 tests pass PASS
E2E mount smoke ANVIL_E2E=1 CI=1 npm run test:e2e -- --workers=5 e2e/anvil-arena-01-mount.spec.ts PASS
Primary wallet-surface locks (L1 last-buy) unchanged Fresh L1 wallet still shows wallet card + Last Buy chip activation locks (separate from tier progression) PASS (by design)
Locked buy buttons still respect isFeatureUnlocked No changes to write paths; mechanics gated onchain PASS

Screenshots (also on issue #334)

issue-334-play-l1-desktop
issue-334-play-l1-tablet
issue-334-play-l1-mobile

## Summary Implement issue #334: show progression level-lock chrome only on the **immediate next unlock tier** on the play route (`/`). - Add `nextUnlockLevel`, `shouldShowLevelLock`, and `shouldShowPodiumLevelLock` in `arenaProgression.ts`. - Update play-route consumers (timer carousel meta, side chips, WarBow gate/flag, `ArenaLevelGate`) to use the next-tier policy. - Disconnected wallets no longer show connect-wallet lock chrome on secondary podium tiers. - Onchain `isFeatureUnlocked` gates unchanged; only visual lock overlays narrow. ## Verification checklist | Acceptance item | Command / evidence | Result | |-----------------|-------------------|--------| | L1 wallet: at most one **progression** lock (L2), not L3–L5 | `ANVIL_E2E=1 npx playwright test` debug: only `arena-timer-chip-lock-1` (L2) among tier chips; L3/L4 chip locks absent | **PASS** | | L4 wallet: lock only on L5 WarBow flag | `shouldShowLevelLock(4, 5)` unit test; WarBow flag gate uses `showWarbowFlagLevelLock` | **PASS** | | L5 wallet: no progression lock overlays | `shouldShowLevelLock(5, *)` → false; `nextUnlockLevel(5)` → null | **PASS** | | Cyberminimalist glass styling preserved | Screenshots on issue #334 (desktop/tablet/mobile) | **PASS** | | Screenshots desktop ≥1024, tablet ~768, mobile ~390 | Uploaded to issue #334 comment | **PASS** | | `cd frontend && npm run typecheck && npm run lint && npm test` | All 701 tests pass | **PASS** | | E2E mount smoke | `ANVIL_E2E=1 CI=1 npm run test:e2e -- --workers=5 e2e/anvil-arena-01-mount.spec.ts` | **PASS** | | Primary wallet-surface locks (L1 last-buy) unchanged | Fresh L1 wallet still shows wallet card + Last Buy chip activation locks (separate from tier progression) | **PASS** (by design) | | Locked buy buttons still respect `isFeatureUnlocked` | No changes to write paths; mechanics gated onchain | **PASS** | ## Screenshots (also on issue #334) ![issue-334-play-l1-desktop](/uploads/24a3fac2845c26a7e372f7be369bdadb/issue-334-play-l1-desktop.png) ![issue-334-play-l1-tablet](/uploads/8f3d4f9c5653485e3938eafb4757c280/issue-334-play-l1-tablet.png) ![issue-334-play-l1-mobile](/uploads/a951c7053119b42323f34e86eff5d99a/issue-334-play-l1-mobile.png)
PlasticDigits commented 2026-06-19 06:22:28 +00:00 (Migrated from gitlab.com)

mentioned in issue #334

mentioned in issue #334
PlasticDigits commented 2026-06-19 06:25:35 +00:00 (Migrated from gitlab.com)

Security review — MR !507

Commit reviewed: 1c2eab8bdef408ae5718fef8ff7b2f6adbceee71
Scope: Frontend play-route progression lock chrome (arenaProgression.ts, ArenaLevelGate, podium/timer carousel components, WarBow gate/flag overlays). No contract, indexer, or buy-router changes in this diff.

Method: Traced attacker-controlled inputs to sinks; verified write paths (submitBuy, WarBow DOUB actions, plantWarBowFlag) remain gated by isFeatureUnlocked / plantFlagDisabled in the frontend and by gateLevel thresholds plus _requireWarbowLevel in TimeArena.sol. Lock overlays (LockedUntilLevel, ArenaLevelGate) are presentational only.

Prior threads: No earlier security-review notes on this MR; nothing to re-report.

Outcome: FINDINGS: 0 medium+ — NONE

This MR narrows when level-lock UI is shown (shouldShowLevelLock / shouldShowPodiumLevelLock). Removing connect-wallet or distant-tier lock chrome does not expose new write surfaces: podium/timer chips are read-only, WarBow hero panel still mounts only when warbowUnlocked (L4+), flag checkbox stays disabled via plantFlagDisabled when !warbowFlagUnlocked, and onchain _finishBuy still applies mechanics only at gateLevel >= N. No injection, authz bypass, XSS, SSRF, or EVM control-flow changes introduced.

Inline findings: None.

## Security review — MR !507 **Commit reviewed:** `1c2eab8bdef408ae5718fef8ff7b2f6adbceee71` **Scope:** Frontend play-route progression lock chrome (`arenaProgression.ts`, `ArenaLevelGate`, podium/timer carousel components, WarBow gate/flag overlays). No contract, indexer, or buy-router changes in this diff. **Method:** Traced attacker-controlled inputs to sinks; verified write paths (`submitBuy`, WarBow DOUB actions, `plantWarBowFlag`) remain gated by `isFeatureUnlocked` / `plantFlagDisabled` in the frontend and by `gateLevel` thresholds plus `_requireWarbowLevel` in `TimeArena.sol`. Lock overlays (`LockedUntilLevel`, `ArenaLevelGate`) are presentational only. **Prior threads:** No earlier security-review notes on this MR; nothing to re-report. **Outcome:** `FINDINGS: 0` medium+ — **NONE** This MR narrows when level-lock UI is shown (`shouldShowLevelLock` / `shouldShowPodiumLevelLock`). Removing connect-wallet or distant-tier lock chrome does not expose new write surfaces: podium/timer chips are read-only, WarBow hero panel still mounts only when `warbowUnlocked` (L4+), flag checkbox stays `disabled` via `plantFlagDisabled` when `!warbowFlagUnlocked`, and onchain `_finishBuy` still applies mechanics only at `gateLevel >= N`. No injection, authz bypass, XSS, SSRF, or EVM control-flow changes introduced. **Inline findings:** None.
PlasticDigits commented 2026-06-19 06:32:35 +00:00 (Migrated from gitlab.com)

mentioned in commit 3d6d3b217c

mentioned in commit 3d6d3b217c9ccef95cac31badc724e36c40e410c
PlasticDigits (Migrated from gitlab.com) merged commit 3d6d3b217c into main 2026-06-19 06:32:35 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
code/yieldomega!507
No description provided.