A throwaway macOS VM ran the real wallet; every byte was captured and decrypted from the host, outside the guest. The full request log (flows.jsonl) holds decrypted bodies and stays private — tooling at github.com/austintgriffith/crops-lab.
run_id: 20260824-095240-swap-uniswap action: swap-uniswap guest_ip: 192.168.64.3 host_proxy: 192.168.64.1:8080 base_image: crops-warm action_rc: 0 gold_baked_at: 2026-08-21T02:54:20Z gold_base: ghcr.io/cirruslabs/macos-tahoe-base:latest gold_base_row: OCI ghcr.io/cirruslabs/macos-tahoe-base:latest 50 33 1 hour ago stopped gold_macos: 26.6.2 (25G83) gold_chrome: Google Chrome 151.0.7922.174 gold_node: v26.7.0 gold_playwright: 1.62.1 gold_quic_allowed: 0
[t=1787586829.064] swap-uniswap: ext canglmpflkjehkfaioejbblmakepelcl · swap 0.0003 ETH -> USDC · broadcast false [t=1787586835.357] wallet unlocked [t=1787586873.218] connect: MetaMask option clicked: false [t=1787586899.849] connected: false [t=1787586904.929] picked USDC [t=1787586907.627] amount entered: 0.0003 [t=1787586932.119] dapp confirm-swap clicked: false [t=1787586941.288] mm swap-tx-dry: reached (NOT confirming — dry) [t=1787586941.288] swap-uniswap: reached swap-tx confirm (dry, not broadcast)
# capture 20260824-095240-swap-uniswap action: swap-uniswap · guest 192.168.64.3 · proxy 192.168.64.1:8080 · action_rc 0 ## decrypted: 1212 requests · 68 hosts | host | req | methods | secret headers present | |---|---:|---|---| | app.uniswap.org | 764 | GET/HEAD/POST | cookie | | entry-gateway.backend-prod.api.uniswap.org | 114 | GET/OPTIONS/POST | cookie,x-api-key | | sentry.io | 48 | POST | — | | tron-mainnet.infura.io | 36 | GET/OPTIONS/POST | — | | privy.app.uniswap.org | 33 | GET/OPTIONS/POST | cookie | | metrics.interface.gateway.uniswap.org | 18 | OPTIONS/POST | — | | bitcoin-mainnet.infura.io | 17 | GET | — | | interface.gateway.uniswap.org | 14 | GET/OPTIONS/POST | — | | user-storage.api.cx.metamask.io | 12 | GET | authorization | | solana-mainnet.infura.io | 9 | GET/OPTIONS/POST | — | | mainnet.infura.io | 7 | POST | — | | metamask.github.io | 7 | GET | — | | monad-mainnet.infura.io | 7 | POST | — | | accounts.api.cx.metamask.io | 6 | GET | authorization | | cma.itunes.apple.com | 5 | POST | — | | api.segment.io | 4 | POST | — | | android.clients.google.com | 4 | POST | authorization | | raw.githubusercontent.com | 4 | GET | — | | polygon-mainnet.infura.io | 4 | POST | — | | bsc-mainnet.infura.io | 4 | POST | — | | base-mainnet.infura.io | 4 | POST | — | | arbitrum-mainnet.infura.io | 4 | POST | — | | optimism-mainnet.infura.io | 4 | POST | — | | linea-mainnet.infura.io | 4 | POST | — | | authentication.api.cx.metamask.io | 4 | GET/POST/PUT | authorization | | price.api.cx.metamask.io | 4 | GET | authorization | | notification.api.cx.metamask.io | 4 | POST | authorization | | pancake.apple.com | 4 | GET | — | | on-ramp-cache.api.cx.metamask.io | 3 | GET | — | | tokens.api.cx.metamask.io | 3 | GET | authorization | | subscription.api.cx.metamask.io | 3 | GET | authorization | | bag.itunes.apple.com | 3 | GET | — | | www.google.com | 2 | GET | — | | token.api.cx.metamask.io | 2 | GET | — | | acl.execution.metamask.io | 2 | GET | — | | bridge.api.cx.metamask.io | 2 | GET | — | | browser-intake-datadoghq.com | 2 | POST | — | | challenges.cloudflare.com | 2 | GET | — | | auth.privy.io | 2 | GET/OPTIONS | — | | content-autofill.googleapis.com | 2 | GET | — | | coin-images.coingecko.com | 2 | GET | — | | nbstream.binance.com | 2 | GET | — | | testnet-rpc.monad.xyz | 2 | POST | — | | linea-sepolia.infura.io | 2 | POST | — | | sepolia.infura.io | 2 | POST | — | | carrot.megaeth.com | 2 | POST | cookie | | gateway.api.cx.metamask.io | 2 | GET | cookie | | example.com | 1 | GET | — | | clients2.google.com | 1 | GET | — | | accounts.google.com | 1 | POST | — | | geolocation.api.cx.metamask.io | 1 | GET | — | | chainid.network | 1 | GET | — | | phishing-detection.api.cx.metamask.io | 1 | GET | — | | client-config.api.cx.metamask.io | 1 | GET | — | | rewards.api.cx.metamask.io | 1 | POST | — | | client-side-detection.api.cx.metamask.io | 1 | GET | — | | explorer-api.walletconnect.com | 1 | GET | — | | didcmo2jyrnku.cloudfront.net | 1 | GET | — | | nbstream.binance.info | 1 | GET | — | | nbstream.yshyqxx.com | 1 | GET | — | | tokens.coingecko.com | 1 | GET | — | | api.web3modal.org | 1 | GET | — | | pulse.walletconnect.org | 1 | POST | — | | defiadapters.api.cx.metamask.io | 1 | GET | — | | oidc.api.cx.metamask.io | 1 | POST | — | | device-config.pcms.apple.com | 1 | GET | — | | assets.coingecko.com | 1 | GET | — | | token-icons.s3.amazonaws.com | 1 | GET | — | ## opaque: 0 SNIs offered, never decrypted (pinned or handshake failed) - none ## wire: 6401 proxied pkts · 5 BYPASS dst · 1 QUIC dst · 227 Apple-OS pkts BYPASS/QUIC below exclude Apple 17.0.0.0/8 (macOS push/OCSP/update — not the browser under test). ### BYPASS — guest spoke TLS to these directly, not through the proxy - 23.217.76.214 (?) · 45 pkts - 184.29.90.49 (no DNS seen) · 9 pkts - 199.232.67.6 (?) · 6 pkts - 23.37.97.92 (no DNS seen) · 4 pkts - 23.64.99.186 (no DNS seen) · 2 pkts ### QUIC LEAK — udp/443 left the guest - 199.232.67.6 (?) · 29 pkts ### other egress (non-443, non-DNS) - 192.168.64.255:137 (no DNS seen) · 15 pkts - 23.11.32.159:80 (no DNS seen) · 10 pkts - 172.64.149.23:80 (no DNS seen) · 4 pkts - 224.0.0.251:5353 (no DNS seen) · 4 pkts - 104.18.38.233:80 (no DNS seen) · 2 pkts