---
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

<!-- SECTION:DESCRIPTION:BEGIN -->
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
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #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
<!-- AC:END -->

## Final Summary

<!-- SECTION:FINAL_SUMMARY:BEGIN -->
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.
<!-- SECTION:FINAL_SUMMARY:END -->
