- MetaMask v13.20.0 (prod)
- agent-browser session: qabot (headed, 2 tabs: tab 0 = localhost:3000, tab 1 = MM popup)
- Wallet: 0x5daf...61c986
- Amount: 0.001159151 SOL ($0.10)
- To: ETpdrE...CvWYLp (Account #0, self-send)
- Flow: SOL page > Send > Select Account #0 > Enter amount > Preview > Confirm > MM popup approve
- Result: SUCCESS - "You have successfully sent 0.001159151 SOL"
- Balance updated from 0.10131915 to 0.10131415 SOL
- Tx shows in history as "Today"
-
solanaSendTx missing - Chain adapter calls
wallet.solanaSendTx?.()but native multichain wallet only hadsolanaSignTx. AddedsolanaSendTxusing Wallet Standardsolana:signAndSendTransactionfeature. -
Uint8Array signature not encoded - Wallet Standard returns
signature: Uint8Arraybut chain adapter expects a base58 string. Addedbs58.encode(signature)conversion. -
Modal reappears on reconnect - Both
Connect.tsxandMipdBody.tsxalways navigate to/metamask/native-multichainwhen flag is on, without checking if user already chose. Fixed: check localStorage fornativeMultichainPreference_{deviceId}before navigating. -
shouldShowDeprecationModal race condition - useEffect updates preference asynchronously but useMemo runs during render with stale null. Fixed: direct
getPreference(deviceId)localStorage read inside useMemo as sync fallback.
- agent-browser eval vs file eval: Inline
eval 'expr'works buteval /tmp/file.jsthrows SyntaxError on MetaMask extension pages (LavaMoat). Always use inline eval on the ShapeShift tab. - Tab switching: MUST use
tab 0/tab 1to switch between ShapeShift and MetaMask. Usinggototo navigate to MM extension URL kills the ShapeShift page state (lost send dialogs multiple times). - MetaMask popup timing: After clicking Confirm in ShapeShift, need ~2s delay before switching to tab 1 for MM to render the approval popup.
- Click timeouts: Some buttons (especially in modals) time out with
click @ref. Workaround: use inline eval to find elements by text content and.click()programmatically.
- MetaMask v13.20.0 only registers
solana:mainnet,solana:devnet,solana:testnetvia Wallet Standard - No
bitcoin:chains registered via Wallet Standard (even though MM shows BTC in its own UI) - Dynamic detection works correctly:
_supportsBTC=false, BTC not shown in native multichain modal - BTC asset page loads fine with $0.00 balance, no crash
- Accounts tab: no Bitcoin chain listed (only ETH, SOL, and EVM chains)
- Swap page shows "No Bitcoin address found" message for BTC receive - expected behavior
- MetaMask shows Tron natively in its UI (TRX $2.31, USDT $10.31 visible in MM popup)
- NOT exposed via Wallet Standard (no
tron:chains registered) wallet_createSession(CAIP-25) returns "method does not exist / is not available"- Conclusion: MetaMask Tron is UI-only, no programmable dApp API exists in prod v13.20.0
- Cannot implement Tron support until MetaMask ships a dApp-facing API for it
- Toggled
VITE_FEATURE_MM_NATIVE_MULTICHAIN=falsein.env.development, waited for HMR - Connected MetaMask via Connect Wallet > MetaMask > Pair
- No native multichain modal appeared - snap install modal showed instead
- Snap install modal shows correctly: "Multichain support is now available for MetaMask!" with "Add Snap" button
- All chain icons displayed (40+ chains supported by snap)
- "Don't ask again" checkbox present
- Zero regression: native multichain code paths not executed when flag OFF
- Modal correctly skipped on reconnect when preference already stored
- Preference key:
nativeMultichainPreference_io.metamask:0x5daf...61c986=native
- Cleared localStorage preferences, reloaded page
- Modal auto-opened: "MetaMask now natively supports Solana"
- Shows MetaMask fox logo, Solana chain icon, "Use native multichain" CTA
- Clicking "Use native multichain" stores preference, dismisses modal, re-pairs wallet
- After re-pair: SOL balance re-populated (0.10131415 SOL), accounts re-discovered
- Subsequent reloads: no modal (preference persisted)
- Flag toggled to false in .env.development, HMR picked up
- Cleared native multichain preferences from localStorage
- Disconnected wallet via wallet menu > Disconnect
- Reconnected via Connect Wallet > MetaMask > Pair
- Snap install modal appeared correctly (not native multichain modal)
- "Multichain support is now available for MetaMask!" with "Add Snap" button
- All 40+ chain icons displayed, "Don't ask again" checkbox present
- Zero regression from native multichain code paths
- 3 parallel review agents ran: native-multichain.ts, UI/hooks, state/portfolio
- Feature flag guards solid across all files - flag OFF = zero regression
- Portfolio cleanup on snap->native migration is comprehensive
- Race conditions in connect flows mitigated by promise deduplication locks
- Test coverage thin but functional for flag guard logic
- No showstopper bugs for happy path