Offline payment primitive · Live on Solana devnet
Pay on Solana
without internet.
The payer signs with no internet; the receiver settles on-chain later. Self-custody, replay-protected, no trusted middleman.
First market: freight drivers paying at borders. Wallets and POS apps can build it in with the SDK.
Watch the pitch ↗ · tech walkthrough ↗

- MORA
- 4 B
- domain tag
- escrow
- 32 B
- escrow PDA
- nonce
- 8 B
- seeds the receipt PDA
- payee
- 32 B
- who can be paid · 9zS1…ajkx
- amount
- 8 B
- lamports · 0.0030 SOL
- Oct 10
- A real phone paid in airplane mode, collected on devnet
- 0 RPC calls
- At the moment of payment
- No double-spend
- On Solana, every voucher settles once · see the replay rejected ↓
Proof
Verify it on Solana Explorer.
Every step below is a real devnet transaction. Open them to see the instructions, accounts and, for the replay, the failure.
- create_escrow
Payer locks SOL into the escrow PDA.
3DvM…UbLA - Ed25519 verify + settle
Receiver submits the offline voucher; the native program checks the signature.
5nFd…urdf - Replay the same voucherRejected, as designed
Rejected on-chain: the receipt PDA for this nonce already exists ("already in use").
3zko…YtUA - close_escrow
After expiry, the remainder and rent return to the payer.
5gMF…SHRu - On a real Android phone · 2026-10-10
- Offline balance from the phone
The Mora Android app, approved in Solflare, locks 0.1 SOL into the escrow.
4cWR…oMYi - Collect the phone's offline payment
Signed on the phone with no connection; the receiver settled it later and 0.01 SOL reached their wallet.
2xKX…LWoz
Real, on devnet
- Anchor program deployed on Solana devnet
- Android app on a real phone: balance loaded with Solflare, payment signed in airplane mode, collected on devnet
- Ed25519 verification via the native program
- Replay protection at the account layer
- create_escrow, settle and close_escrow
- Local voucher signing with no RPC call
- Many vouchers per escrow, capped by the locked amount
- Expiry enforced; payments to the escrow owner rejected
- Anchor tests for create, settle, replay and close on localnet and devnet
- CLI for create, offline voucher, settle and close
Simulated or not yet built
- In the first phone test the signed payment reached the receiver by copy and paste; phone-to-phone QR is next
- Device-to-device hop uses BroadcastChannel in the browser demo
- Settlement is in SOL to keep the prototype simple; stablecoins are not wired yet. Real trip budgets need them: a company can't carry SOL price risk
Next
- Real Bluetooth transport. Voucher handoff between two physical phones.
- Seed Vault on Seeker. Keep the signing key in secure hardware while offline.
- Stablecoin settlement. Settle vouchers in stablecoins, not only SOL.
- Freight pilots, then wallets and POS. A pilot with our design partner Sigma Logistics first; then integrations with wallet and POS teams.
The problem
When the signal drops, the payment disappears.
Solana Pay and wallets need a connection at the moment of payment; without one, the fallback is cash.
And sometimes the whole network goes down: after the February 2023 earthquakes, 1,154 of Turkey's 4,131 ATMs were still down, according to the Banks Association of Turkey.
First market · Freight drivers at the border
2.1 millionroad export trips left Turkey in 2024 (UND)
A driver carries the company's trip budget and has to pay a partner on the spot. At borders and on long routes the signal drops and the payment fails.
Next markets
Merchants on unreliable 4G
The signal drops and the sale falls back to cash. With Mora the customer pays on the spot; it settles when either side reconnects.
Remittance corridors
One side of the transfer is often offline. A signed voucher can travel over any channel and still be checked on-chain later.
Field payroll
Pay workers where there is no coverage. Funds stay in an escrow the employer controls until each voucher is settled.
How it works
Five steps. Three on-chain calls.
A payment is a signature, not a transaction: it doesn't expire like a blockhash and can travel by QR today, or Bluetooth, SMS or mesh. On-chain, the program sees an Ed25519 verify, then settle.
- 01On-chain
Open escrow
The payer locks SOL into a PDA once, with an expiry. Funds stay theirs until a signed voucher is settled.
- 02Offline
Go offline
No RPC, no gas. The phone keeps the escrow key and can still sign.
- 03Offline
Sign a voucher
An Ed25519 message names payee, amount and nonce.
- 04On-chain
Settle
The receiver, or any relayer, submits verify + settle when back online. The receipt PDA blocks replay.
See it on devnet - 05On-chain
Close
After expiry, leftover SOL and rent return to the payer.
What a receiver can rely on offline, and what they can't.
Offline payments always leave a window between accepting a voucher and settling it. Mora makes that window explicit and bounds it.
Checked offline
- The escrow belongs to the signer: its address derives from the owner's key and seed.
- The owner signed the payee, amount and nonce: none of them can be altered.
- The amount fits inside the escrow the voucher draws from.
Only known at settle
- Whether the funds are still there. A payer can promise the same escrow twice; whoever settles first is paid.
- Expiry. Settle must land before the escrow expires; after that the payer can reclaim the rest.
How Mora bounds the risk
- An offline limit per receiver, like a card terminal's floor limit. Larger payments wait for a connection.
- When the receiver is online, the voucher is checked against the escrow on-chain before it is accepted.
- Short escrows and settling as soon as a connection returns keep the window small.
How it compares
Ways to pay offline, by what the receiver can rely on.
| Approach | Pays with no signal | Receiver can verify offline | Double-spend | Who you trust | Special hardware | Status |
|---|---|---|---|---|---|---|
| SMS and USSD wallets | No: needs a cell signal and a server | No | Kept out by the server's ledger | The server or custodian | No | Live services and prototypes |
| Signed transactions relayed over a mesh | Yes | Signature only; no funds until it lands | Not bounded until it settles | No one | No | Prototypes |
| Offline card terminals | Yes, up to a floor limit | Yes: the card's cryptogram | Capped by the floor limit; the merchant carries losses | The card network | Certified chip card and terminal | Live |
| Offline central-bank money | Yes | Yes | Secure chip and low caps; detected afterwards | The central bank | Secure chip | Pilots |
| Mora | Yes, on both sides | Yes: signature, escrow and amount | None on-chain. Offline: capped per receiver, known in advance | No one: the funds sit in an on-chain escrow | No: any Android phone | Devnet prototype |
Use it today · The app
Offline payments, on the phone.
An Android app built on the Mora SDK. Wallet approval goes through Mobile Wallet Adapter, so on Seeker the key can stay in Seed Vault.
- Android
- Mobile Wallet Adapter
- Built for Seeker
Android only, about 146 MB. Devnet preview, not audited. Connect Solflare set to Devnet.

01
No signal, still paying
Load an offline balance once. When the connection drops, the app says so and keeps working.

02
Paid with a signed code
Scan the receiver's payment request, confirm, and show the signed code. No RPC call.

03
Collected when back online
The receiver checks the code offline, then the app settles it on Solana as soon as there is a connection.
Use it today · The SDK
A TypeScript SDK for wallets and POS apps.
The protocol code the Mora app runs: build, sign and verify vouchers offline, plus the three escrow instructions. Works with the deployed program as is.
Preview 0.1.0. Devnet only, not audited. Source is in the private Mora repo; wallet and POS teams can request access.
Who calls what
- Payer
- online, once
- createEscrowIx
- Payer
- offline
- buildVoucherMessage → sign → encodeVoucherQr
- Receiver
- offline
- decodeVoucherQr → verifyVoucherOffline
- Receiver
- back online
- settleIxs → send
- Payer
- after expiry
- closeEscrowIx
import {
buildVoucherMessage, encodeVoucherQr, escrowPda,
decodeVoucherQr, verifyVoucherOffline, settleIxs,
} from "@mora/sdk";
// Payer — offline: an Ed25519 signature over 84 bytes, no RPC
const escrow = escrowPda(payer.publicKey, seed);
const message = buildVoucherMessage({ escrow, nonce, payee, amount });
const signature = nacl.sign.detached(message, payer.secretKey);
const qr = encodeVoucherQr({ message, signature },
{ authority: payer.publicKey, seed, expiresAt, escrowAmount });
// Receiver — check offline, settle once back online
const voucher = decodeVoucherQr(qr);
const check = verifyVoucherOffline(voucher);
if (!check.ok) throw new Error(check.reason);
const tx = new Transaction().add(
...settleIxs(receiver.publicKey, voucher.meta!.authority, voucher));Voucher layout: 84 bytes, signed with Ed25519.
- MORA
- 4 B
- domain tag
- escrow
- 32 B
- escrow PDA
- nonce
- 8 B
- seeds the receipt PDA
- payee
- 32 B
- who can be paid
- amount
- 8 B
- lamports
Replay protection lives in the account model.
Settling a voucher initializes a receipt PDA seeded by the escrow and the nonce. A second settle of the same voucher tries to create an account that already exists, so the transaction fails during account validation, before settle's own logic runs. There is no hand-written nonce check to get wrong.
// PDA seeds
escrow ← ["escrow", authority, seed]
receipt ← ["receipt", escrow, nonce]
// settle tx
ix 0 Ed25519 native verify
ix 1 settle (reads instructions sysvar)See the rejected replay on devnet Market and model
What the first market is worth.
Companies pay; drivers and their partners use it; wallets and point-of-sale apps build it in.
- 5,638
- Turkish companies licensed for international road transport
- 246,758
- vehicles they run
- ≈ $30M
- a year at $10 per user per month, one user per vehicle (ceiling, Turkey only)
Source: Turkish Ministry of Transport (UHDGM), end of September 2024, as reported in UND'nin Sesi, October 2024, p. 36.
How we make money
- Now
- B2B subscription: $10 per user per month. Price discussed with our pilot partner; we are not charging yet.
- Mainnet
- A small fee on each collected payment.
- Scale
- Wallets and point-of-sale apps that build Mora in share that fee.
Design partner
Team
Three people in Turkey: two full time, one part time.
An engineer who built the protocol, a go-to-market lead from logistics and fintech, and an economist.
Core engineer · full time
Furkan Duran
Built the protocol, the SDK and the Android app; leads product. Superteam Türkiye member.
Payments & go-to-market · full time
Özgün İbiş
Logistics, fintech and marketing background; leads go-to-market and the freight pilots.
Research · part time
Assoc. Prof. Özgün Burak Kaymakçı
Economist at the Faculty of Economics, Istanbul University; leads our market research.
Work with us
Run a pilot with your drivers, or build Mora into your wallet.
Freight companies run a pilot with their drivers and partners; wallets and POS apps get SDK access; partners talk to us about an integration.