{
  "prNumber": 47119,
  "prTitle": "release: 13.54.0",
  "generatedAt": "2026-10-24T00:53:06.063Z",
  "modelUsed": "gpt-5",
  "summary": {
    "totalFilesChanged": 588,
    "totalCommitsInRelease": 113,
    "releaseRiskScore": "63/100",
    "highRiskScenarios": 8,
    "mediumRiskScenarios": 8
  },
  "testScenarios": {
    "cherryPickScenarios": [
      {
        "area": "Snaps — Solana transaction signing and permissions",
        "riskLevel": "high",
        "testSteps": [
          "1. Connect to a Solana dApp that requests the Solana Snap; approve the Snap install/update and required permissions.",
          "2. Create/derive a Solana account via the Snap; request a devnet airdrop.",
          "3. Send a SOL transfer on devnet; confirm fee/lamports display correctly and the transaction succeeds.",
          "4. Sign a message and verify the signature is accepted by the dApp."
        ],
        "whyThisMatters": "Cherry-pick 47122 bumps the Solana Snap; Snap permission/transaction changes can break account derivation and signing, directly impacting user funds and dApp compatibility."
      },
      {
        "area": "Snaps — Tron transaction signing and account management",
        "riskLevel": "high",
        "testSteps": [
          "1. Connect to a Tron dApp that requests the Tron Snap; approve the Snap install/update.",
          "2. Create a Tron account via the Snap and ensure the address appears in the accounts list under Snaps.",
          "3. Send a TRX transfer; confirm the UI displays correct fees and the transaction is confirmed on a Tron explorer.",
          "4. Sign a personal message; verify success on the dApp."
        ],
        "whyThisMatters": "Cherry-pick 47122 bumps the Tron Snap; any signing or address-derivation regression will block Tron dApp usage and risk failed transactions."
      },
      {
        "area": "UI Navigation — bottom navbar responsiveness and visibility",
        "riskLevel": "medium",
        "testSteps": [
          "1. Resize the extension popup to a small viewport; verify the bottom navbar is anchored correctly and all tabs are tappable/clickable.",
          "2. Switch between tabs using the navbar, then start a Send flow; verify the navbar behaves correctly on confirm screens (hidden if intended, restored after).",
          "3. Switch networks and open a notification (e.g., connect request), then close it; ensure the navbar’s active state and layout remain correct with no overlaps."
        ],
        "whyThisMatters": "Cherry-pick 47322 fixes bottom navbar issues; navigation is core to usability in the popup, and regressions can block users from reaching key screens."
      }
    ],
    "initialScenarios": [
      {
        "area": "State Migrations (231–233) — data preservation",
        "riskLevel": "high",
        "testSteps": [
          "1. Start from a 13.53.x profile containing: 3+ HD accounts, 1 Ledger/Hardware account, custom networks (e.g., Linea, BSC), custom tokens (ERC-20) and NFTs, address book entries, and token/NFT detection set differently per network.",
          "2. Upgrade to 13.54.0 and unlock the wallet.",
          "3. Verify all accounts (names, order, hardware label) are present and selectable.",
          "4. For each network, check Assets and NFTs tabs for exact parity with pre-upgrade (no loss, no duplicates, correct balances).",
          "5. Confirm settings (token/NFT detection, privacy/analytics opt-in, primary currency) persist across upgrade and remain consistent after a browser restart."
        ],
        "whyThisMatters": "Migrations can silently corrupt or drop user state; validating end-to-end preservation avoids asset loss, wrong balances, and broken preferences after upgrade."
      },
      {
        "area": "State Migrations (231–233) — resilience to partial/corrupt state",
        "riskLevel": "high",
        "testSteps": [
          "1. Using a test profile, intentionally remove or null specific persisted slices (e.g., assetsController, networkEnablement, appState) before launching 13.54.0.",
          "2. Unlock and navigate across Home, Assets, NFTs, and Settings.",
          "3. Confirm the extension loads without a white screen or fatal error; defaults are applied where data is missing.",
          "4. Switch between at least two networks and re-enter Assets/NFTs to ensure controllers recover and render without console errors.",
          "5. Lock and unlock once more to confirm stable state post-recovery."
        ],
        "whyThisMatters": "Defensive migrations must handle missing or malformed data to prevent bricked UIs and user lockouts."
      },
      {
        "area": "Transaction Flow — EIP-1559 gas editing, speed up/cancel (Transaction Pay Controller patch)",
        "riskLevel": "high",
        "testSteps": [
          "1. On Ethereum Mainnet or Sepolia, send an ETH transfer; on the confirm screen open Advanced gas controls.",
          "2. Edit max priority fee and max fee; verify ETA/fee labels update in real time and total changes accordingly.",
          "3. Submit and, while pending, use Speed up with higher fees; confirm only the replacement txn remains (original is dropped).",
          "4. Repeat with Cancel on a new pending txn; verify it executes and the original is marked canceled.",
          "5. Inspect Activity for correct statuses and nonces with no duplicate or stuck pending entries."
        ],
        "whyThisMatters": "Core transaction payment logic changes can break fee calculations and nonce management, risking stuck transactions or user overpayment."
      },
      {
        "area": "Transaction Flow — token approvals and swaps fee estimation",
        "riskLevel": "high",
        "testSteps": [
          "1. From a dApp, initiate an ERC-20 approval with a large allowance; review the confirm screen’s gas/fee estimates and risk messaging.",
          "2. Switch between preset gas options (Low/Market/Aggressive) and Advanced to confirm estimates and times adjust correctly.",
          "3. Confirm the approval and verify it succeeds on-chain and appears correctly in Activity.",
          "4. Initiate a Swap on a supported network; verify quote refreshes, fee breakdown appears accurately, and the swap completes.",
          "5. Ensure the fiat total reflects both gas and protocol fees without rounding errors."
        ],
        "whyThisMatters": "Approvals and swaps are high-frequency flows; mis-estimated or misapplied fees can cause failed txns, stuck approvals, or financial loss."
      },
      {
        "area": "Network Enablement Gating — Buy/Swap/Bridge feature visibility per network",
        "riskLevel": "high",
        "testSteps": [
          "1. On Ethereum Mainnet, confirm Buy, Swap, and Bridge CTAs are visible and enabled on Home/Asset screens.",
          "2. Switch to a custom or less-supported network and check that unsupported features are hidden or disabled with clear tooltips.",
          "3. Switch back to Mainnet and ensure controls immediately re-enable (no stale gating).",
          "4. Lock, unlock, and re-check gating remains accurate.",
          "5. Resize the popup (small/large) and verify no layout overlap or missing buttons."
        ],
        "whyThisMatters": "Incorrect feature gating confuses users and can route them to broken flows or unsupported services."
      },
      {
        "area": "Assets Controller Initialization — first-run defaults and token detection",
        "riskLevel": "high",
        "testSteps": [
          "1. Fresh install; create a new wallet; land on Home.",
          "2. Verify default token visibility on Mainnet: native asset appears, and auto-detected tokens match detection setting.",
          "3. Turn Token Detection off in Settings; return to Assets to confirm no new auto-added tokens appear after a refresh.",
          "4. Switch networks and verify each network has an independent, correct token list without duplicates carrying over.",
          "5. Manually import a token and ensure it persists only on the network where added."
        ],
        "whyThisMatters": "Initialization regressions can cause missing or duplicate assets, leading to user distrust and support incidents."
      },
      {
        "area": "NFTs — detection notice and manual import flow",
        "riskLevel": "medium",
        "testSteps": [
          "1. With NFT detection off, open the NFTs tab and confirm a clear notice explaining detection is disabled plus a Settings link.",
          "2. Click the Settings link, enable NFT detection, and return; confirm the notice disappears without reload.",
          "3. Manually import a known NFT; verify it renders correctly and is not duplicated after enabling detection.",
          "4. Switch networks and confirm the notice and imported items behave per-network."
        ],
        "whyThisMatters": "Users rely on clear guidance when NFTs aren’t auto-detected; incorrect notices or duplication undermine confidence."
      },
      {
        "area": "NFTs — empty state behavior across networks",
        "riskLevel": "medium",
        "testSteps": [
          "1. On two networks with no NFTs (e.g., Sepolia and another testnet), open NFTs and verify the empty state text and CTAs display correctly.",
          "2. Add an NFT on one network and confirm the empty state disappears only on that network.",
          "3. Rapidly switch networks and re-enter NFTs to ensure the empty state updates without stale content or flicker."
        ],
        "whyThisMatters": "Accurate empty states prevent user confusion and encourage correct next actions (import, detection)."
      },
      {
        "area": "Account Group Balance — aggregate fiat/native display",
        "riskLevel": "medium",
        "testSteps": [
          "1. Hold assets across 3+ accounts; verify the group/aggregate balance equals the sum of visible accounts’ fiat values.",
          "2. Toggle primary currency between Fiat and Native; confirm consistent recalculation and formatting.",
          "3. Hide one account (if supported) or switch active accounts and ensure the aggregate updates immediately.",
          "4. Trigger a refresh or network switch to confirm no transient wrong totals or flicker."
        ],
        "whyThisMatters": "Incorrect totals or formatting can mislead users about their portfolio value and cause financial mistakes."
      },
      {
        "area": "App State — lock/unlock, routing, and recovery from interrupts",
        "riskLevel": "medium",
        "testSteps": [
          "1. Navigate to the Activity tab, then lock the wallet.",
          "2. Unlock and verify return to Activity (not a wrong or onboarding screen).",
          "3. While on Home, trigger an external connect request and reject it; ensure overlays close and state is consistent.",
          "4. Close and reopen the popup; verify last-viewed screen persists correctly."
        ],
        "whyThisMatters": "App-state regressions trap users on wrong routes or overlays, breaking core wallet usability."
      },
      {
        "area": "Analytics opt-in/out — preference, persistence, and behavior",
        "riskLevel": "medium",
        "testSteps": [
          "1. During onboarding, opt out of analytics; finish and verify the toggle state in Settings.",
          "2. Toggle analytics on in Settings, close the popup, reopen, and confirm persistence.",
          "3. With DevTools Network open, perform common actions (open Home, switch network); verify telemetry calls align with the toggle state (no calls when opted out).",
          "4. Lock/unlock and re-check the toggle remains correct."
        ],
        "whyThisMatters": "Privacy controls must be trustworthy; unexpected telemetry erodes user trust and may have compliance implications."
      },
      {
        "area": "Asset List Control Bar — sorting/filter persistence",
        "riskLevel": "medium",
        "testSteps": [
          "1. On a list with many tokens, change sort (e.g., by name/balance if available).",
          "2. Switch tabs (Assets/NFTs) and networks, then return to confirm the chosen sort persists.",
          "3. Verify keyboard navigation and focus states work and controls do not overlap or truncate on small popup sizes."
        ],
        "whyThisMatters": "Small UI regressions in high-traffic lists quickly degrade usability and accessibility."
      },
      {
        "area": "Online/Offline initialization — controller rehydration",
        "riskLevel": "medium",
        "testSteps": [
          "1. With DevTools set to Offline, open the extension; verify Home/Assets render an offline-safe state (no crashes).",
          "2. Switch networks while offline and return to Home.",
          "3. Go back online and confirm assets, balances, and feature gating refresh automatically without a manual reload.",
          "4. Open NFTs to confirm data and notices update post-reconnect."
        ],
        "whyThisMatters": "Robust initialization must handle connectivity changes; failures here cause blank screens or stale balances."
      }
    ]
  }
}