The one-secret protocol.
No contracts, no deploy scripts, no faucet. OUSD is already live — your app just moves it.
- 1Pick a chain
Base is cheapest, Tempo is built for payments, Solana is fastest, Ethereum has the deepest liquidity.
- 2Add one secret
PRIVY_APP_ID from dashboard.privy.io. Add your preview and published domains to Privy's allowed origins and turn on gas sponsorship for your chain.
- 3Paste the prompt
Every idea page gives a prompt preset for your chain. One message builds the whole app.
- 4Get a little OUSD
Through Stripe / Bridge / Privy, Coinbase, Visa, Mastercard, or Coinbase / Kraken / Uniswap. Demo with ≤ 1 OUSD.
- 5Prove it
Every payment shows a link to the chain explorer. That link is your demo.
Chain notes
ETH on Base (cheap). Turn on Privy gas sponsorship for Base so users never need ETH.
Proof links: https://basescan.org/tx/<hash>
ETH on L1 — the most expensive chain. Sponsor gas with Privy or warn users before every send.
Proof links: https://etherscan.io/tx/<hash>
SOL (fractions of a cent). Enable Privy Solana gas sponsorship or keep ~0.01 SOL in the user's wallet.
Proof links: https://solscan.io/tx/<hash>
Fees are paid in stablecoins, no native gas coin. Use Privy `sponsor: true`.
Proof links: https://explore.tempo.xyz/receipt/<hash>
Sending OUSD
import { encodeFunctionData, erc20Abi, parseUnits } from "viem";
const amount = parseUnits("1.00", decimals); // decimals read from the OUSD contract
await sendTransaction(
{ to: OUSD, data: encodeFunctionData({ abi: erc20Abi, functionName: "transfer", args: [to, amount] }), value: 0n, chainId },
{ address: wallet.address, sponsor: true },
);const mintInfo = await connection.getAccountInfo(OUSD_MINT); const programId = mintInfo!.owner; // Token or Token-2022 const mint = await getMint(connection, OUSD_MINT, "confirmed", programId); const from = getAssociatedTokenAddressSync(OUSD_MINT, owner, false, programId); const to = getAssociatedTokenAddressSync(OUSD_MINT, recipient, false, programId); tx.add( createAssociatedTokenAccountIdempotentInstruction(owner, to, recipient, OUSD_MINT, programId), createTransferCheckedInstruction(from, OUSD_MINT, to, owner, amount, mint.decimals, [], programId), );
Common traps
- · Tempo explorer links use
/receipt/, not/tx/, and native value transfers revert. - · Never hardcode decimals — read them from the token.
- · Load Privy only in the browser (lazy + ClientOnly) or the page crashes.
- · Never name a secret
VITE_…; read it on the server in a route loader. - · Wait for confirmation before showing success.