Offline payment primitive · live on Solana devnet
Pay on Solana without internet.
Every Solana payment assumes a live connection at the moment you pay. Mora removes that assumption: the payer signs an 84-byte voucher with no internet, and the receiver settles it on-chain later. Self-custody, replay-protected, no trusted middleman.
First market: freight companies whose drivers pay at borders and on long routes. Wallets and point-of-sale apps can build it in with the SDK.
- a real phone paid in airplane mode, collected on devnet
- Oct 10
- a real phone paid in airplane mode, collected on devnet
- at the moment of payment
- 0 RPC calls
- at the moment of payment
- per signed voucher
- 84 bytes
- per signed voucher
The problem
When the signal drops, the payment disappears.
Solana Pay and wallet flows need an RPC connection at the exact moment of payment. Without it, 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 Turkish business press.
Freight drivers at the border
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. 2.1 million road export trips left Turkey in 2024 (UND).
Merchants on unreliable 4G
The customer has funds and a wallet, the signal drops, and the sale falls back to cash. With Mora the payment is authorized on the spot and 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.
Mora is a payment layer, not a transport. A payment is an 84-byte signature, not a transaction: it does not expire like a blockhash and does not care how it travels. QR today; Bluetooth, SMS or a mesh network can carry it too. The program only sees an Ed25519 verify instruction, 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 84-byte Ed25519 message names payee, amount and nonce. It is a signature, not a transaction.
- 04on-chain
Settle
The receiver, or any relayer, submits verify + settle when back online. The receipt PDA blocks replay.
- 05on-chain
Close
After expiry, leftover SOL and rent return to the payer.
Voucher layout · 84 bytes
| Field | Bytes | Purpose |
|---|---|---|
| MORA | 4 | domain tag |
| escrow | 32 | escrow PDA |
| nonce | 8 | seeds the receipt PDA |
| payee | 32 | who can be paid |
| amount | 8 | 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.
escrow ← ["escrow", authority, seed]
receipt ← ["receipt", escrow, nonce]
settle tx:
ix 0 Ed25519 native verify
ix 1 settle (reads instructions sysvar)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. Devnet preview.
- 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.
Android · Mobile Wallet Adapter · built for Seeker
Download the Android app (APK)Android only, about 146 MB. Devnet preview, not audited. Connect Solflare set to Devnet.
For integrators
A TypeScript SDK for wallets and POS apps.
The same protocol code the Mora Android app runs. Build, sign and verify vouchers offline, and build the three escrow instructions. It works with the deployed program as is.
Who calls what
| Who | When |
|---|---|
| Payer | online, oncecreateEscrowIx |
| Payer | offlinebuildVoucherMessage → sign → encodeVoucherQr |
| Receiver | offlinedecodeVoucherQr → verifyVoucherOffline |
| Receiver | back onlinesettleIxs → send |
| Payer | after expirycloseEscrowIx |
Preview 0.1.0. Devnet only, not audited. Source is in the private Mora repo; wallet and POS teams can apply for SDK access.
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));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.
Program (devnet)
9fcXHD3pHDKLX79JuVgCEKQiqYkvVqFtpoAEVjBq4aJ8
- 3DvM…UbLA
create_escrow
Payer locks SOL into the escrow PDA.
- 5nFd…urdf
Ed25519 verify + settle
Receiver submits the offline voucher; the native program checks the signature.
- 3zko…YtUA
Replay the same voucher· rejected, as designed
Rejected on-chain: the receipt PDA for this nonce already exists ("already in use").
- 5gMF…SHRu
close_escrow
After expiry, the remainder and rent return to the payer.
On a real Android phone · 2026-10-10
Trust model
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 exactly these 84 bytes: payee, amount and nonce cannot 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.
Status
What is real today, and what is simulated.
Real, on devnet
- Anchor program deployed on Solana devnet
- create_escrow, settle and close_escrow
- Ed25519 verification via the native program
- Replay protection at the account layer
- 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
- Android app on a real phone: balance loaded with Solflare, payment signed in airplane mode, collected on devnet
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; stablecoins are not wired yet
Market and model
First market: Turkey's licensed freight carriers.
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 via the UND bulletin, October 2024 (September 2024 figures).
How we make money
- NowB2B subscription: $10 per user per month. Price discussed with our pilot partner; we are not charging yet.
- MainnetA small fee on each collected payment.
- ScaleWallets and point-of-sale apps that build Mora in share that fee.
Design partners
Sigma Logistics Design partner
Istanbul road freight. Written permission for a pilot.
Vera Logistics In talks
Istanbul freight (sea, road, air, rail), no tie to the team. Wants to become a design partner; talks are ongoing.
Want to be a design partner? Apply
Next
From devnet to real drivers and partners.
- 01
Real Bluetooth transport
Voucher handoff between two physical phones.
- 02
Seed Vault on Seeker
Keep the signing key in secure hardware while offline.
- 03
Stablecoin settlement
Settle vouchers in stablecoins, not only SOL.
- 04
Freight pilots, then wallets and POS
A pilot with our design partner Sigma Logistics first; then integrations with wallet and POS teams.
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.
Furkan Duran
Core engineer · full time
Built the protocol, the SDK and the Android app; leads product. Superteam Türkiye member.
Özgün İbiş
Payments & go-to-market · full time
Logistics, fintech and marketing background; leads go-to-market and the freight pilots.
Assoc. Prof. Özgün Burak Kaymakçı
Research · part time
Economist at the Faculty of Economics, Istanbul University; leads our market research.