Peer-to-peer ads marketplace · Solana · Sept 2026
A response to Josip Volarević's request for a startup. The marketplace half is easy; the half nobody had built is the escrow that only releases against verified display. That half is live on devnet.
displaid.pages.dev · Matthew Karsten · @expertvagabond
Your request, 7 Sept
14.6K impressions, 45 replies, 46 bookmarks in a week. Then today: "If nobody builds this by mid next week, I'll be very tempted to just vibe code it myself."
You don't have to. Here is what exists, what it proves, and what ships before your deadline.
The part everyone skips
How does a sponsor know the banner stayed up for the full seven days?
Cointraffic, AADS, Coinbound answer that by being the middleman — publisher-side, curated, 20–40% take. A peer-to-peer marketplace deletes exactly that role, and with it the only thing that made the money safe.
So every Solana-logo, Fabiano-banner, forehead deal today is struck on trust and settled by hand. It works between friends. It does not scale past them.
USDC on Solana is the obvious rail. Every entrant will have it. It is not a moat.
Any team in the Colosseum field can ship a grid of slots with a bid button.
Escrow that only releases against what a verifier actually observed. Built, tested, running on devnet.
How it works
A rectangle on their X banner or their avatar, priced per day. They prove control by putting displaid:<code> in their bio.
Full amount into a vault PDA at booking. The booking stores a perceptual hash of the creative.
Every 5 min: fetch the real banner, crop to the slot, hash, sign pass / fail on-chain. One sample per interval, enforced by the program.
Anyone can crank settle after the window. Seller gets the delivered share, buyer gets the rest. No middleman, nothing stranded.
The program knows nothing about X, HTTP, or images. It trusts one key — the verifier — so upgrading the verifier's trust model is a config change, not a rewrite.
Live on Solana devnet · verified end to end
The booked creative is @expertvagabond's actual current banner (pHash 97606587df00794f). The verifier fetched it from X, matched it at distance 0, and submitted signed samples that the page reads back from chain — no backend, no wallet, every figure decoded in the browser.
| program | 4LU9iy7C…6x9XA |
|---|---|
| config | interval 300 s · grace 2 · fee 250 bps |
| booking | 8ngiZHCs…KTq5e · 1.000000 escrowed · settled |
| settle tx | 4Uax66aP…f5zRF |
| window | 2026-09-08 13:15Z → 09-09 13:15Z |
| ui | displaid.pages.dev |
Zones · built from your mock-up
The zone is part of the listing's on-chain address — seven slots are seven listings, seven escrows, seven independent checks.
Hashing the whole banner was wrong in both directions. Measured on a real 1500×500 banner:
| case | whole image | per zone |
|---|---|---|
| own slot 05 (3.2%) removed | PASS · wrong | FAIL · right |
| neighbour resold, 05 intact | FAIL · wrong | PASS · right |
| own slot 01 (18.6%) swapped | FAIL | FAIL |
| X re-encode drift | 0 bits | 0–2 bits |
Threshold calibrated on 7 live crypto-brand banners: re-encode drift ≤ 2 bits, separation between distinct creatives ≥ 20, median 30. The check has 4 bits of headroom either side.
Settlement policy
Verifier only managed 60 of 100 checks? Seller settles on 60. Charging a compliant seller for our downtime is not a fee, it is a bug.
forgiven = min(failed, grace, passed). Drop the last term and a seller who showed nothing still collects the grace share. A grace budget becomes a theft budget.
The protocol never earns on money it is refunding. Zero observations → buyer refunded in full, protocol earns nothing, cost lands on whoever runs the verifier.
Rate-limited or network dropped: nothing recorded. Account renamed or deleted: fail. Conflating the two was a griefing vector the live dry-run caught.
Conservation is structural: gross computed once, fee carved from it, refund is the remainder. Rounding dust lands in the refund and cannot escape.
Who owns the surface?
verified: false and cannot be booked.displaid:<first 16 chars of their seller key> in their bio — one code covers every slot that key lists.We measured it: sha256 of every X handle that has ever existed is 0.1 core-hours on a laptop (2.26M hashes/s, pure Python). So handles are stored in clear and validated on write — [a-z0-9_]{1,15}, lowercase, no path characters — because the verifier interpolates them into an api.x.com URL.
Impersonation was never a theft vector (the creative is buyer-supplied, so samples would fail and the buyer is refunded) — but a buyer must not be induced to escrow against a surface the seller does not control.
The first use
You said you have a way to help founders and creators raise money to attend Breakpoint. This is the app that makes those deals safe for the sponsor.
Creator lists seven slots for the four-week run-up. Sponsors escrow USDC. The creator is paid as each day is verified; the sponsor watches every sample land in public. Nobody chases anybody, and nobody has to already know and trust the creator to back them.
Bio code proves it is your handle. Price per day, minimum window. Done in five minutes.
USDC locked at booking. Pass / fail ticks accrue in public. Refund is automatic for anything not delivered.
Every booking, sample, and settlement is on-chain. Who sponsored whom, and whether it was delivered, is a fact — not a screenshot.
Next build · your "highest bid at close" model
| instruction | status |
|---|---|
| initialize_config · create_listing · set_listing_active | live · zones on-chain since 09-14 |
| verify_listing · book · submit_sample · settle | live |
| bid · close_auction | this week |
| wallet-connected book / bid UI | this week |
| mainnet + real USDC | next week |
Fixed-price listings stay — a creator who wants a known number should be able to name it.
What is not done · said plainly
Upgrade: run the whole fetch → crop → hash → sign loop inside a measured Intel TDX enclave (Attestbox / dstack). The verifier is pure TypeScript with no native binaries specifically so the container hashes identically on every build. Not claimed until it runs measured.
Pinned posts need a media lookup and can carry several images. Other networks and physical surfaces need their own fetcher. The program does not care — it only sees pass / fail / abstain.
Fine for one booking, throttled by public RPC before it is slow. Needs a memcmp filter on booking state plus pagination before real volume. Known, scoped, small.
Nothing yet stops a seller listing two rects that intersect. Featureless creatives cannot be perceptually hashed and the UI should refuse them. Both measured, both documented.
Colosseum · Crypto World's Fair · 14 Sept – 12 Oct
Judges will see a dozen slot grids with bid buttons. They will see one where the money provably cannot move without evidence, where the verifier's failure modes are priced into the payout formula, and where every claim on the pitch page is a devnet account they can read themselves.
The protocol is also usable by other marketplaces: any front end can list, book, and settle against the same program. "Winning" here means being the rail the category settles on.
100 tests. Live dry-run caught two bugs no fixture could, both fixed and covered.
Then the first ten creators list for Breakpoint.
Proposal
You bring the demand side; I ship the rail.
1 · Your reply on the RFS thread pointing at the live page.
2 · Names of the first creators who want to raise for Breakpoint.
3 · One sponsor willing to escrow the first real booking — $200 is enough to prove the loop end to end on mainnet.
Take rate is 2.5% of delivered value, from the seller's side only. Nothing is charged on refunds.
Matthew Karsten
Founder, Purple Squirrel Media. 4× blockchain hackathon winner, ETHDenver judge. Ships Rust / Anchor / TypeScript and the AI infrastructure around it — 78 MCP servers, 132 published packages.
matthewkarstenconnects@gmail.com · program 4LU9iy7CrKgDpFkQBjzqfD9ycXSSu62As78JnZq6x9XA