Offline payments on Solana.

Lock SOL into an on-chain escrow, sign voucher messages while offline, settle them later — replay-protected, expiry-bounded, fully self-custody. Every transaction below is a real call on devnet.

3 instructions: create_escrow · settle · close_escrow 84-byte voucher: "MORA" | escrow | nonce | payee | amount need devnet SOL? faucet.solana.com
1 · Open escrow 2 · Go offline 3 · Sign voucher 4 · Settle 5 · Close
connect Phantom to begin
Alice · Pay (you, signing offline)

Mora Pay

— not connected — Idle
🔌
Connect your wallet
Phantom on devnet. Tap the button up top.
Bob · POS (settles vouchers, fixed receiver)

Mora POS

— receiver pending — Idle
🔌
Connect your wallet
Same wallet acts as the relayer — pays receipt rent + tx fee.
  1. Connect Phantom (top-right). Devnet only — make sure Phantom shows the network as Devnet when it asks to approve transactions. Need SOL? Use faucet.solana.com.
  2. Open escrow: Alice locks SOL on-chain into a PDA derived from (your_pubkey, seed). Real create_escrow tx, real lamports moved.
  3. Go offline + sign voucher: Alice's phone produces an 84-byte canonical message ("MORA" | escrow | nonce | payee | amount) and Phantom's signMessage Ed25519-signs it. No RPC call — purely offline.
  4. Settle: Same wallet plays the relayer. Submits a 2-instruction tx: Solana's Ed25519 native verify + our settle ix. Contract validates the previous ix was Ed25519 over the canonical bytes, transfers lamports to the receiver, creates a Receipt PDA. Replay of the same nonce fails on init.
  5. Close: After expiry, close_escrow reclaims rent + remainder. Whole protocol is three on-chain instructions.