STRK20 PRIVATE SPRINT

Stealth Checkout

The accepting side of private payments on Starknet. STRK20 gives wallets a way to send money privately; this gives applications a way to get paid that way: an embeddable widget, per-invoice addresses, receipts, and a headless watcher that confirms payments over public RPC with no proving service in the loop.

Try it

Stealth Arcade →

A coin-op arcade that sells credits through the widget. Runs on a mock wallet, so the whole flow works with nothing installed.

NO WALLET NEEDED

Hosted invoice page →

Create a shareable payment link, or open one and pay it with a real wallet on Starknet mainnet.

MAINNET · NEEDS READY X

Merchant dashboard →

Create invoices, watch them settle, export the ledger. Talks to the watcher, the bundled confirmation server, and falls back to sample rows when it cannot reach one.

NEEDS THE WATCHER

Embed it

Not on npm yet: publishing is pending. Until then, clone the repo and npm install ./packages/strk20-pay.

import { mountCheckout, WalletApiAdapter } from "strk20-pay";

mountCheckout(document.getElementById("checkout")!, {
  invoice: {
    id: "order_1042",
    token: "STRK",
    amount: "25",
    mode: "address",
    receiveAddress: "0x…",   // fresh, one per invoice
    network: "mainnet",
    createdAt: Date.now(),
  },
  wallet: new WalletApiAdapter({ network: "mainnet", rpcUrl: "https://rpc.starknet.lava.build" }),
  // Must resolve to a BOOLEAN meaning "the money arrived". `r.ok` is only
  // "the server answered", and an unpaid invoice answers 200 too.
  confirm: (invoice) => fetch(`/api/paid/${invoice.id}`).then((r) => r.json()).then((b) => b.paid === true),
  onPaid: (receipt) => console.log(receipt),
});

What it does that nothing else here does

What it deliberately does not do