Skip to content

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.

Or watch the latest update.

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.

First market

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).

Next

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.

Next

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.

Next

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.

  1. 01on-chain

    Open escrow

    The payer locks SOL into a PDA once, with an expiry. Funds stay theirs until a signed voucher is settled.

  2. 02offline

    Go offline

    No RPC, no gas. The phone keeps the escrow key and can still sign.

  3. 03offline

    Sign a voucher

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

  4. 04on-chain

    Settle

    The receiver, or any relayer, submits verify + settle when back online. The receipt PDA blocks replay.

  5. 05on-chain

    Close

    After expiry, leftover SOL and rent return to the payer.

Voucher layout · 84 bytes

Voucher fields and their sizes
FieldBytesPurpose
MORA4domain tag
escrow32escrow PDA
nonce8seeds the receipt PDA
payee32who can be paid
amount8lamports

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.

  1. Mora app: No signal, still paying
    01

    No signal, still paying

    Load an offline balance once. When the connection drops, the app says so and keeps working.

  2. Mora app: Paid with a signed code
    02

    Paid with a signed code

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

  3. Mora app: Collected when back online
    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.

SeekerSolana Mobile

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

SDK calls by role
WhoWhen
Payeronline, oncecreateEscrowIx
PayerofflinebuildVoucherMessage → sign → encodeVoucherQr
ReceiverofflinedecodeVoucherQr → verifyVoucherOffline
Receiverback onlinesettleIxs → send
Payerafter 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

Open on Explorer
  • 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 voucher· rejected, 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

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

  1. NowB2B subscription: $10 per user per month. Price discussed with our pilot partner; we are not charging yet.
  2. MainnetA small fee on each collected payment.
  3. 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.

  1. 01

    Real Bluetooth transport

    Voucher handoff between two physical phones.

  2. 02

    Seed Vault on Seeker

    Keep the signing key in secure hardware while offline.

  3. 03

    Stablecoin settlement

    Settle vouchers in stablecoins, not only SOL.

  4. 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.

Work with us

Run a pilot with your drivers, or build Mora into your wallet.

Applyor ask on Telegram
  • Freight companies

    Run a pilot with your drivers and partners.

  • Wallets and POS apps

    Get SDK access and build offline payments in.

  • Partners

    Talk to us about an integration.