atproto-wallet-mvp · attested-wallet-flow

Measured TDX wallet — production smoke test

@daviddao

A production smoke test of the fail-closed Vercel client and its measured dstack wallet workload on GCP Intel TDX, using satyam2.climateai.org.

Date: 2026-07-17 · partial · Target: atproto-wallet-mvp.vercel.app


Headline result

8
Steps passed
0
Open blockers
2
Warnings
7
Automated tests

The measured wallet works end to end. The production attestation route verified exact app, compose, and OS measurements; the browser enrolled a WebAuthn PRF request key, created a 2-of-3 wallet, signed an EIP-191 message, locally recovered the same EVM address, exported through a 200 response, and saved a passkey-protected recovery copy. One API mismatch found during the run was fixed and deployed before the successful rerun.

Walkthrough

The 7m26s recording covers the final uninterrupted path from the authenticated dashboard through passkey enrollment, wallet creation, signing, export, and recovery protection. A CDP virtual authenticator exercised the real WebAuthn PRF code path.

Wallet dashboard showing 2-of-3 ready and TDX verified badges
01Wallet creation completed. The dashboard displays 2-of-3 ready, TDX verified, and the new Sepolia address.
EIP-191 signature result with recovered address match
02The enclave-produced EIP-191 signature recovers 0x8c94…6236 and matches the wallet locally.
Wallet dashboard showing local passkey-protected recovery status
03The recovery share is marked passkey-protected locally; no recovery secret is included in this report.

Verification evidence

App IDa354b5ef24506a31adf86ffe4ad0792856d97d99 Composed4d4abd7761f79e8…d0f0d2fae30ba3b OS image9f037b4919004c86…998f8814e13fe7ea Service DIDdid:web:wallet.136-64-29-13.sslip.io EVM address0x8c94a59B9fe27014bCe2fBAe724a35B325de6236 Public statewallet-public.json — active, version 1 Attestationattestation.json — fail-closed production route returned verified Negative probesnegative-probes.txt — missing service auth: 401; malformed challenge: 400

Findings

Fixed during run — write endpoints omitted idempotency keys

The first wallet-creation attempt reached the measured service but failed with requestId is required. The MVP lagged the hardened wallet-service write contract. Commit 0d5825d now generates wallet-service-compatible request IDs for create, sign, export, recovery, and recovery-from-export. Seven tests, typecheck, build, and the live rerun passed.

OAuth access tokens are not refreshed automatically

After the test was paused for several hours, the dashboard surfaced "exp" claim timestamp check failed. Signing out and back in minted a fresh DPoP-bound session and restored operation. This is not a TDX or wallet clock failure, but the MVP should refresh OAuth tokens or convert this low-level error into a clear reauthentication prompt.

Active-wallet VM recreation remains unverified

The deployment tooling previously proved that the workload disk is reused with autoDelete=false, and KMS identity stayed stable across this run's clean-state redeployment. The final stronger check—recreate the TDX VM after wallet creation and sign again—was blocked when the local GCP CLI demanded interactive reauthentication. The live instance remains healthy with deletion protection enabled.

Attestation and authorization fail closed

The Vercel gate accepted only the pinned dstack evidence bundle and exact encryption JWK. Direct unauthenticated wallet-info access returned 401, while a malformed attestation challenge returned 400. Browser console and runtime error logs were empty during the final path.

Governance boundary

The authorization allowlist is operator-managed static policy. TDX, measured boot, digest pinning, and external KMS reduce mutable workload risk, but this deployment is intentionally operator-trusted rather than decentralized or fully operator-proof.

Reproducing

Production gatecurl https://atproto-wallet-mvp.vercel.app/api/wallet/attestation Testsnpm test && npm run typecheck && npm run build Videohappy-path-final.webm (2.0 MB) Screenshotsassets/05-wallet-created.png through 07-passkey-backup.png Accountsatyam2.climateai.org; password intentionally omitted