--- id: TASK-109 title: QR Code Payment Requests for rCart status: Done assignee: [] created_date: '2026-03-11 23:43' labels: - rcart - payments - QR - crypto dependencies: [] references: - modules/rcart/mod.ts - modules/rcart/schemas.ts - modules/rcart/components/folk-payment-page.ts - modules/rcart/components/folk-payment-request.ts - shared/transak.ts priority: high --- ## Description Add shareable QR code payment system to rCart. When scanned, the QR opens a public payment page where anyone can pay via credit card (Transak), external wallet (MetaMask via EIP-6963), or EncryptID passkey-derived EOA. Includes: - PaymentRequestDoc schema with payment type, inventory limits, enabled methods - 7 API endpoints (create, list, get, update status, QR SVG, Transak session, page routes) - folk-payment-page.ts: payer-facing 3-tab payment page (Card/Wallet/EncryptID) - folk-payment-request.ts: self-service QR generator with passkey auth - Payment type: single (one-time) or subscription (reusable QR, accepts multiple payments) - Inventory limits: maxPayments cap with auto-fill status when limit reached - Payment method toggles: enable/disable card/wallet/encryptid per payment request - Extracted shared Transak utilities to shared/transak.ts - publicWrite on cartModule for public payment page access ## Acceptance Criteria - [ ] #1 POST /api/payments creates payment request with all fields - [ ] #2 GET /pay/:id renders public payment page with enabled tabs only - [ ] #3 GET /request renders self-service QR generator with passkey auth - [ ] #4 GET /api/payments/:id/qr returns SVG QR code - [ ] #5 Payment type toggle: single vs subscription - [ ] #6 Inventory limit: maxPayments with auto-fill when reached - [ ] #7 Payment method toggles: card/wallet/encryptid per request - [ ] #8 Wallet tab: EIP-6963 discovery + ERC-20/ETH transfer - [ ] #9 Card tab: Transak iframe integration - [ ] #10 EncryptID tab: passkey + viem signing ## Final Summary Implemented full QR code payment request system for rCart across two sessions: **Session 1** — Core implementation: - Created PaymentRequestDoc schema with Automerge CRDT storage - Added 7 API routes: create, list, get, status update, QR SVG, Transak session, page routes - Built folk-payment-page.ts (payer-facing, 3 tabs: Card/Wallet/EncryptID) - Built folk-payment-request.ts (self-service QR generator with passkey auth) - Extracted Transak utils to shared/transak.ts, updated rFlows import - Added amountEditable support for tip/donation use cases **Session 2** — Enhancements + 403 fix: - Fixed 403 "write access required" by adding publicWrite to cartModule - Added paymentType: 'single' | 'subscription' toggle - Added maxPayments inventory limit with paymentCount tracking + 'filled' status - Added enabledMethods toggles (card/wallet/encryptid) per payment request - Payment page only renders enabled tabs, shows inventory progress bar - Subscriptions reset to pending after each payment until filled Commits: 636fc13, deployed to production.