Skip to content

🐛 Wallet Connection State Persisted Without Verification #41

@Mosas2000

Description

@Mosas2000

Description

The wallet connection state is persisted in localStorage and restored on page load without verifying if the wallet is still connected or if the address is still valid.

Current Behavior

// WalletProvider.tsx (Lines 19-26)
useEffect(() => {
  // Check localStorage for saved address
  const savedAddress = localStorage.getItem(STORAGE_KEY);
  if (savedAddress) {
    setIsConnected(true);  // Assumes connected without verification!
    setAddress(savedAddress);
  }
}, []);

Problems

  1. Stale State: User may have disconnected from wallet extension
  2. Wrong Account: User may have switched accounts in wallet
  3. Wallet Uninstalled: User may have removed wallet extension
  4. Session Expired: Wallet session may have timed out

Impact

  • UI shows connected but operations fail
  • User sees wrong address
  • Confusing error messages when transactions fail

Suggested Fix

useEffect(() => {
  const savedAddress = localStorage.getItem(STORAGE_KEY);
  if (savedAddress) {
    // Verify connection is still valid
    verifyConnection(savedAddress).then((isValid) => {
      if (isValid) {
        setIsConnected(true);
        setAddress(savedAddress);
      } else {
        // Clear stale data
        localStorage.removeItem(STORAGE_KEY);
      }
    });
  }
}, []);

async function verifyConnection(savedAddress: string): Promise<boolean> {
  try {
    // Attempt to get current wallet state
    const accounts = await getAccounts();
    return accounts.some(a => a.address === savedAddress);
  } catch {
    return false;
  }
}

Additional Improvements

  1. Listen for wallet disconnect events
  2. Listen for account change events
  3. Show reconnect prompt if verification fails
  4. Add "Connected as" indicator with current address

Files Affected

  • frontend/src/components/WalletProvider.tsx

Priority

🟡 Medium - Can cause confusing UX

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions