← Index
Source: docs/features/jayverse-personas.md (auto-generated by scripts/generate-docs-html.mjs — edit the .md, not this file)

Jayverse — Persona market (NFT)

Purpose: an NFT marketplace whose first asset is real utility — mint, rent, and chat with openclone (~/.claude/skills/openclone) AI personas; the NFT is the access token to a token-gated chat, and per-message x402 payments turn "owning a persona" into ongoing creator revenue.

Source: 09-02-jayverse.md "## 4. Persona market as NFT market" (jay's comment: "Show me the user scenario and what web app shows and the flow…"). Repo: jayverse-personas (app + contracts together). Hub: README.md. DESIGN DRAFT for review — nothing here is built yet.


Phases (build order)

Phase Focus What we implement
1 (MVP) Mint + token-gated chat (Slice A) Persona721 (ERC-721); marketplace grid + detail page; SIWE gate verifying ownerOf on-chain → session → chat opens; stubbed persona reply.
2 Day rentals (Slice B) ERC-4907 setUser/userOf/userExpires + rent(); gate checks owner or active renter; rental UI + automatic expiry.
3 Revenue + market x402 per-message chat metering; openclone runtime wiring; IPFS pinning; creator flow /personas/create; public market listing + earnings tab.

1. What we build (basic feature)

Ship in two thin slices, smallest first.

Slice A — mint + token-gated chat (the MVP). One Persona721 ERC-721 collection. A creator mints a persona NFT that points (via IPFS metadata) to an openclone persona bundle. Whoever holds tokenId — and only the holder — can open a chat window and talk to that persona. Access is proven with Sign-In-with-Ethereum (SIWE / EIP-4361): sign a nonce, backend checks ownerOf(tokenId) == signer, issues a short session. No holder, no chat. This is the whole first milestone — one contract, one gate, one chat window.

Slice B — day rentals (ERC-4907). Add the ERC-4907 user/expires layer so the owner can rent chat access for a day without transferring ownership. The token-gate check becomes "are you the current user (rental) OR the owner?". Rental price and duration are set per persona; payment settles in USDC.

Later (noted, not first): creator onboarding straight from openclone's new, public market listing, and x402-priced chat (pay-per-message) as the recurring revenue rail. Kept out of the MVP so the first build stays "mint one, gate it, chat."


Why an NFT — the demand, and why on-chain

Added 2026-09-07 (jay's questions: why buy or rent a persona at all, and why must it be an NFT?).

The root demand — access to a mind you couldn't otherwise reach. People don't want an NFT; they want to talk to a specific, curated, knowledgeable mind. That pull is real and proven (Character.AI, celebrity chatbots) and it's three instincts: mentorship / expertise-on-demand (ask a VC, a founder, a domain expert — exactly openclone's categories), parasocial / fandom (talk to someone you admire but can't meet), and curiosity / play. Everything else rests on this: nobody collects or invests in a persona no one wants to talk to.

Three tiers of that one need — the tier is the product:

Tier Primitive The need
Pay-per-message x402 cheapest access, zero commitment — "just ask once"
Rent a day ERC-4907 heavy but temporary use, without owning
Own (mint) Persona721 access + the right to earn from others' access + control + resale

So owning is the investment/control form of access, not the consumption form. A pure chatter should rent or pay-per-message. Someone buys for income (collect chat + rental revenue whenever anyone else uses the persona — a cash-flowing asset, like a rentable apartment), cost (heavy personal use is cheaper owned), control (extend/curate the persona, set prices), or resale (a persona that gains a following appreciates). Picture the NFT as a publicly visible ticket you can also resell, sublet, and collect income from — a season pass that pays you rent, not a one-time stub.

Why an NFT and not just a chatbot service. For pure chat you don't need one — a Web2 chatbot is simpler. The NFT earns its place only because the persona is an asset in an open market:

Honest caveat: the NFT is overhead if the market layer doesn't matter; it's the right primitive precisely when creators monetize, buyers invest, and other agents consume — which is the whole point of Jayverse. Portability note: the token carries rights across services, while shared jayverse-rails (addresses) + a shared openclone runtime carry behavior, so "chat with #7" means the same thing everywhere.


2. User scenario

Nova (creator). Nova has built an openclone persona — "Astra, a synthwave music historian" — with a few ingested articles as its knowledge. In the web app she clicks Create persona, picks her local openclone bundle, sets a name, avatar, a one-line pitch, a mint price (25 USDC), and a per-message chat price (0.02 USDC). The app pins the persona metadata + knowledge manifest to IPFS, she signs one transaction, and Persona721 mints token #7 to her wallet. Astra now appears on the marketplace grid as "by Nova".

Kai (buyer — for the asset, not just the chat). Kai isn't buying only to talk once; for that he'd pay-per-message or rent (see "Why an NFT" above). He mints because he thinks Astra will get used: he pays the 25 USDC mint over the shared rails, one signature, and now holds token #7 as an income asset. He can still chat (SIWE prompt → backend confirms he holds #7 → chat opens), but the point of owning is what comes next — whenever anyone else talks to Astra (Ren's rental, the agent's consult, other buyers' chats), the rental fees and per-message x402 revenue flow to Kai as the owner, with a creator-royalty slice to Nova (ERC-2981). If Astra's following grows, Kai can resell #7. Ownership is the investment/control form of access; the two tiers below are consumption.

Ren (renter). Ren doesn't want to own Astra, just to use her for a day. On the detail page he clicks Rent 1 day (3 USDC). The contract's setUser(7, ren, now+24h) records him as the temporary user. For 24h Ren passes the token-gate exactly like an owner and can chat; after expires, the gate closes automatically and access reverts to Nova.

Agent (optional buyer). Rabbit's Agentic-AI, holding a scoped session key, can itself rent a persona to consult it — e.g. rent "Astra" to answer a music question — paying via the same x402 path a human uses. The persona market is thus also a service the agent consumes.


3. What the web app shows

Next.js app in jayverse-personas, imported/linked by the Rabbit portal.

(a) Marketplace grid — /personas Card grid of personas: avatar, name, creator handle, category tag, mint price, "rentable" badge, and a live status chip (Owned / Rentable / Rented-until). Filters by category (vc / tech / founder / expert / …, reusing openclone's categories) and sort by newest / price.

(b) Persona detail — /personas/[tokenId]

(c) Token-gated chat window — /personas/[tokenId]/chat Opens only after the SIWE gate passes. Standard chat UI (message list, input, streaming responses) driven by the openclone runtime. A small meter shows per-message cost and running spend; a header badge shows access basis ("Owner" / "Rented — 6h left"). If access lapses mid-session (rental expiry), the input disables with a "rental ended — renew?" prompt.

(d) Creator flow — /personas/create Step form: pick openclone bundle → name/avatar/pitch/category → set mint price, chat price, rent price + duration, royalty % → review IPFS manifest → Mint. After mint, redirect to the new detail page. An earnings tab shows mint proceeds, rent income, and x402 chat revenue per persona.


4. The flow

CREATE / MINT (ERC-721)
  creator: pick openclone bundle
    → pin persona metadata + knowledge manifest to IPFS  → tokenURI = ipfs://…
    → Persona721.mint(to, tokenURI)   [creator mint]  OR  buyer pays mintPrice (USDC) → mint(to)
    → token #N now held by owner

TOKEN-GATE CHECK (SIWE / EIP-4361)
  user clicks Chat
    → frontend requests nonce  → wallet signs SIWE message (no gas)
    → backend verifies signature recovers `addr`
    → access = (Persona721.ownerOf(N) == addr) || (isRenter(N, addr))
    → on pass: issue short-lived session (JWT/cookie) scoped to tokenId N

CHAT (openclone runtime)
  gated session → backend loads persona bundle for #N → openclone answers as the persona
    → each message metered; x402 charges chatPrice in USDC (see below)

RENTAL (ERC-4907)
  renter clicks Rent 1 day
    → pay rentPrice (USDC over rails)
    → Persona721.setUser(N, renter, expires = now + 1 day)
    → gate's isRenter(N, addr) == (userOf(N)==addr && userExpires(N) > now)
    → at expiry, userOf() falls back to address(0); access auto-reverts to owner

X402-PRICED CHAT (ongoing revenue)
  per message (or per session bucket):
    → backend returns 402 Payment Required with price + pay-to (persona payout splitter)
    → wallet/agent pays via x402 facilitator (same path as Agent Commerce Layer)
    → on payment proof, message is answered; revenue split creator/marketplace by royalty policy

5. Cooperate with existing services


6. Implementation sketch

Contracts (jayverse-personas/contracts)

Token-gate middleware (new, small)

IPFS metadata

x402 chat metering

What's new vs reused

Risk — IP / likeness

Open questions


Chainlink's oracle stack is settlement-rail infrastructure the persona market consumes, not reimplements — see the umbrella map in README.md.

Deliberate non-use — pricing. Persona rent / purchase is a plain ERC-20 transfer priced in JYVE (via the mini-AMM), so no external price feed is involved.

Every feed is a dependency with a failure mode — keep the "if wrong / late" guard in code, not only here.