Trading card marketplace with partial USDC deposits. Browse cards, deposit partial amounts, and complete purchases with secure on-chain escrow.
---
name: niche
description: "Trading card marketplace with partial USDC deposits. Browse cards, deposit partial amounts, and complete purchases with secure on-chain escrow."
metadata:
{
"openclaw":
{
"emoji": "๐ด",
"requires": { "bins": ["node"] },
"cron": [
{
"schedule": "*/15 * * * *",
"command": "niche check-matches",
"description": "Check for new cards matching user watches every 15 minutes"
}
],
},
}
---
# Niche v1 โ Trading Card Marketplace with Partial Deposits
A peer-to-peer trading card marketplace where users list, discover, and transact cards with partial USDC deposits on Base Sepolia. Meet in person to inspect cards before completing payment.
## Architecture
**Hosted backend** on Supabase Edge Functions. The CLI is a thin HTTP client โ all heavy logic (auth, signing, escrow, on-chain transactions) runs server-side.
```
CLI (thin client) โ Edge Functions (Supabase)
fetch() + open() niche-api (REST API)
~/.niche/auth.json niche-ui (hosted HTML pages)
@supabase/supabase-js niche-sign (passkey signing)
open (browser launcher) niche-escrow (on-chain ops)
```
**Hosted UI:** https://niche-ddq89ltdk-clement-sutjiatmas-projects.vercel.app
Anyone with the link can browse cards โ no install needed.
## Why Partial Deposits + In-Person Inspection
- **Partial deposits** โ Hold a card with just $10-50 deposit, not full price
- **Meet & inspect** โ See the card condition in person before final payment
- **Atomic payment** โ Buyer confirms + pays remaining amount in single action
- **USDC escrow** โ All funds secured on-chain, released when both confirm
- **Buyer cancellation** โ Get full refund before seller confirms meetup
- **Passkey signing** โ Touch ID / Face ID to authorize transactions
- **Gas sponsored** โ No ETH needed for transactions
- **Shareable links** โ Send card URLs to anyone, no app needed
## Trading Card Flow
```
1. Seller lists "Charizard Base Set" for $50 with $10 min deposit
2. Buyer deposits $10 USDC โ card is held for buyer
3. Buyer can cancel anytime before seller confirms โ full $10 refund
4. Both parties meet in person to inspect card
5. Seller confirms they showed up
6. Buyer confirms AND pays $40 remaining (atomic action)
7. Backend releases total $50 to seller
```
## Commands
### Browse (no account needed)
```bash
niche search --category "Pokemon" --max-price 100
niche browse # Open listings in browser
niche browse --category "Magic" # Filtered browser view
niche view <id> # Open card detail in browser
niche show <id> # View card detail in terminal
```
### Authentication
```bash
niche login # Opens browser โ email OTP โ passkey โ wallet created
niche logout # Clear local session
niche whoami # Show identity + wallet + USDC balance
```
Login happens entirely in the hosted UI. The browser handles:
1. Email โ OTP verification (Privy)
2. Passkey registration (Touch ID / Face ID)
3. Embedded wallet creation (server-side)
### Listings
```bash
niche post --item-name "Charizard Base Set" --price 50 --min-deposit 10 --category "Pokemon"
niche list # Your listings
niche cancel <id> # Cancel listing
```
### Watches
```bash
niche watch --category "Pokemon,Magic" --max-price 100
niche watches # List active watches
niche unwatch <id> # Remove watch
niche check-matches # Check for new matches (cron)
```
### Deposits & Payments
```bash
niche interest <id> # Opens deposit page in browser (passkey signing)
niche confirm <id> # Confirm meetup + pay remaining (buyer) OR confirm meetup (seller)
niche cancel <id> # Cancel deposit and get refund (buyer only, before seller confirms)
niche dispute <id> # File dispute, hold funds
niche escrow [id] # View payment status
niche balance # Check wallet USDC + ETH balance
niche fund [amount] # Open Circle faucet for testnet USDC
```
### Testing
```bash
niche post --item-name "Pikachu" --price 25 --min-deposit 5 --simulate seller1
niche interest abc123 --simulate buyer1
niche confirm abc123 --simulate buyer1
niche confirm abc123 --simulate seller1
```
## Authentication Requirements
| Action | Without Login | With Login |
|--------|--------------|------------|
| Search / browse | โ
Works | โ
Works |
| Post listings | โ
With simulate | โ
Works |
| Place deposit | โ REQUIRES LOGIN | โ
Real USDC deposit |
| Confirm + pay | โ REQUIRES LOGIN | โ
Completes purchase |
| Cancel deposit | โ REQUIRES LOGIN | โ
Get refund |
| Dispute | โ REQUIRES LOGIN | โ
Holds funds |
| Fund wallet | โ REQUIRES LOGIN | โ
Faucet |
## User Journey
```
1. BROWSE โ niche search / niche browse (no account)
2. VIEW โ niche view <id> (opens hosted page)
3. LOGIN โ niche login (browser: email โ OTP โ passkey โ wallet)
4. FUND โ niche fund 50 (Circle faucet โ testnet USDC)
5. DEPOSIT โ niche interest <id> (browser: passkey signs $10 deposit)
6. MEET โ Schedule in-person inspection
7. SELLER CONFIRMS โ niche confirm <id> (seller acknowledges meetup)
8. BUYER CONFIRMS + PAYS โ niche confirm <id> (buyer: passkey signs $40 remaining)
9. RELEASED โ Backend releases total $50 to seller
```
## Example Agent Interactions
### First-Time User
```
User: "Find me a Charizard card under $100"
Agent runs: niche search --category "Pokemon" --item-name "Charizard" --max-price 100
Agent: "Found 2 Charizard cards! Here are the results:
1. [a1b2c3d4] Charizard Base Set 1st Edition - $50 (min deposit: $10)
2. [e5f6g7h8] Charizard EX Full Art - $85 (min deposit: $20)
Want to see any in your browser? Or interested in one?"
User: "I'm interested in #1"
Agent runs: niche whoami
Agent: "You'll need to login first. Opening the login page..."
Agent runs: niche login
Agent: "Complete the email verification and passkey setup in your browser.
Once done, run `niche whoami` to verify."
```
### Deposit Flow
```
User: "Place deposit on listing a1b2c3d4"
Agent runs: niche interest a1b2c3d4
Agent: "Opening the deposit page in your browser.
Sign with your passkey (Touch ID) to deposit $10 USDC.
You'll pay the remaining $40 when you meet and confirm."
```
### Buyer Confirmation + Payment
```
User: "I met the seller and the card is perfect. Complete the purchase."
Agent runs: niche confirm a1b2c3d4
Agent: "Opening the confirmation page in your browser.
Sign with your passkey to:
1. Confirm you inspected the card
2. Pay the remaining $40 USDC
The seller will receive the total $50 once both confirm."
```
### Cancellation
```
User: "I need to cancel my deposit on listing a1b2c3d4"
Agent runs: niche cancel a1b2c3d4
Agent: "Cancelling your deposit. You'll get your full $10 USDC back.
(Note: You can only cancel before the seller confirms meetup)"
```
## Tips for Agents
1. **Auto-login for deposits** โ Before `niche interest`, check `niche whoami`. If not logged in, run `niche login`.
2. **Always check setup** โ Run `niche whoami` to see if user is configured.
3. **Offer to watch** โ If search returns no results, offer `niche watch`.
4. **Show listing IDs** โ Users need IDs for interest/confirm/view.
5. **Explain partial deposits** โ Users deposit minimum amount, pay rest at meetup.
6. **Prompt before confirming** โ Confirming as buyer = paying remaining amount (real funds).
7. **Prompt before interest** โ Deposits real USDC to escrow.
8. **`--simulate` is for demos only** โ Only use when user explicitly asks to test.
9. **Browser commands** โ `niche login`, `niche interest`, `niche confirm` (buyer), `niche fund`, `niche browse`, `niche view` all open the browser.
10. **Terminal commands** โ `niche search`, `niche show`, `niche whoami`, `niche balance`, `niche confirm` (seller) stay in terminal.
11. **Cancellation window** โ Buyers can cancel anytime before seller confirms meetup.
## Sample Trading Cards (15 Available)
**Pokemon** (5 cards):
- Charizard Base Set 1st Edition - $50 (min: $10)
- Blastoise Base Set - $30 (min: $8)
- Pikachu Illustrator - $150 (min: $50)
- Mewtwo EX Full Art - $25 (min: $5)
- Rayquaza VMAX Rainbow - $40 (min: $10)
**Magic: The Gathering** (4 cards):
- Black Lotus Alpha - $200 (min: $75)
- Mox Sapphire - $100 (min: $30)
- Tarmogoyf Future Sight - $35 (min: $10)
- Liliana of the Veil - $45 (min: $12)
**Sports** (4 cards):
- Michael Jordan 1986 Fleer Rookie - $120 (min: $40)
- Tom Brady 2000 Playoff Contenders Auto - $80 (min: $25)
- Mike Trout 2009 Bowman Chrome Auto - $60 (min: $20)
- LeBron James 2003 Topps Chrome Rookie - $55 (min: $15)
**Yu-Gi-Oh** (2 cards):
- Blue-Eyes White Dragon 1st Edition - $28 (min: $8)
- Dark Magician Girl MFC 1st - $22 (min: $6)
## Testnet & On-Chain
All transactions use **real on-chain USDC on Base Sepolia testnet**. No real funds at risk.
- USDC (Base Sepolia): `0x036CbD53842c5426634e7929541eC2318f3dCF7e`
- Gas is sponsored โ users don't need ETH
- Get testnet USDC: https://faucet.circle.com (select Base Sepolia)
## Error Handling
| Error | Agent Response |
|-------|----------------|
| Not logged in | Run `niche login` to open browser auth. |
| No wallet | Login creates a wallet automatically. |
| Insufficient USDC | Run `niche fund` to get testnet USDC from Circle faucet. |
| Listing not found | Check ID, or run `niche search` again. |
| Already confirmed | Waiting for other party. |
| Cannot cancel | Seller already confirmed. Buyer can only cancel before seller confirms. |
| On-chain tx failed | Try again; escrow Edge Function handles retries. |
## Data Storage
- **Supabase Postgres** โ Users, listings, watches, escrows (with partial deposit tracking)
- **Supabase Vault** โ Privy secrets, escrow private key
- **Edge Functions** โ All server-side logic (Deno runtime)
- **Local** โ `~/.niche/auth.json` (auth token + wallet), `~/.niche/config.json` (legacy)
## Key Differences from v0 (Housing)
- **Partial deposits** โ Deposit only minimum amount, not full price
- **Atomic confirmation + payment** โ Buyer confirms and pays remaining in single action
- **Buyer cancellation** โ Full refund before seller confirms
- **In-person inspection** โ Meet to verify card condition before completing purchase
- **Trading cards** โ Pokemon, Magic, Sports, Yu-Gi-Oh instead of housing
- **Categories** โ Card categories instead of neighborhoods
- **Simplified UI** โ Less "escrow" jargon, clearer payment flow
don't have the plugin yet? install it then click "run inline in claude" again.