Devnet prototype · two phones, one escrow

Pay offline.
Settle on Solana.

Alice locks SOL in escrow, signs a voucher with no internet, Bob settles it later. Replay-protected. Self-custody. Real devnet transactions — not a mock.

Try the live demo How it works
3 instructions · create · settle · close 84-byte voucher · Ed25519 signed Need SOL? faucet.solana.com

Five steps. Three on-chain calls.

Bluetooth in this demo is simulated in-browser. Signing and settle are real.

  1. 01

    Open escrow

    Alice locks SOL into a PDA. Funds stay hers until a signed voucher is settled.

  2. 02

    Go offline

    No RPC. The phone still holds the escrow key and can sign locally.

  3. 03

    Sign voucher

    An 84-byte message names payee, amount, and nonce. Ed25519, not a transaction.

  4. 04

    Settle

    Bob (or any relayer) submits verify + settle. Receipt PDA blocks replay.

  5. 05

    Close

    After expiry, leftover SOL and rent return to Alice.

On-chain is small. Offline is a signature.

The program never sees Bluetooth. It only sees an Ed25519 verify ix, then settle.

Alice create_escrow Lock SOL in PDA
Offline sign voucher 84 bytes, no RPC
Relayer verify + settle Receipt PDA = nonce
Alice close_escrow After expiry

PDAs

escrow["escrow", authority, seed]

receipt["receipt", escrow, nonce]init makes replay fail.

Voucher layout

MORAescrow 32nonce 8payee 32amount 8

Signer must be escrow.authority. Payee is in the bytes, not a settle signer.

Settle tx

Ix 0: Ed25519 native (self-contained). Ix 1: settle reads instructions sysvar, checks previous ix.

Demo only

BT bus is BroadcastChannel. Hash chain lives in localStorage. Neither is in the program.

1 · Open escrow 2 · Go offline 3 · Sign voucher 4 · Settle 5 · Close
connect Phantom to begin
Alice · Pay

Mora Pay

— not connected — Idle
🔌
Connect your wallet
Phantom on devnet. Tap the button up top.
Bob · POS

Mora POS

— receiver pending — Idle
🔌
Connect your wallet
Same wallet acts as the relayer — pays receipt rent + tx fee.
Technical notes for judges
  1. Connect Phantom (top-right). Devnet only. Need SOL? faucet.solana.com.
  2. Open escrow: Alice locks SOL into a PDA (authority, seed). Real create_escrow.
  3. Sign voucher: 84-byte message "MORA" | escrow | nonce | payee | amount, Ed25519 locally. No RPC.
  4. Settle: Ed25519 native verify + settle. Receipt PDA makes the nonce unreplayable.
  5. Close: After expiry, close_escrow returns rent + remainder.