Live demo · Solana devnet
Alice signs a payment with no internet; Bob settles it on devnet later. Bluetooth is simulated in the browser; signing and settlement are real devnet transactions.
Architecture
The program never sees Bluetooth. It only sees an Ed25519 verify ix, then settle.
escrow ← ["escrow", authority, seed]
receipt ← ["receipt", escrow, nonce] — init makes replay fail.
MORAescrow 32nonce 8payee 32amount 8
Signer must be escrow.authority. Payee is in the bytes, not a settle signer.
Ix 0: Ed25519 native (self-contained). Ix 1: settle reads instructions sysvar, checks previous ix.
BT bus is BroadcastChannel. Hash chain lives in localStorage. Neither is in the program.
(authority, seed). Real create_escrow."MORA" | escrow | nonce | payee | amount, Ed25519 locally. No RPC.settle. Receipt PDA makes the nonce unreplayable.close_escrow returns rent + remainder.