Dollars for every phone.
A dollar account you open with Face ID. Pay a shop, send to a friend abroad, or pay a phone
with no apps and no internet. Every payment settles on Monad in about a second, and Kova pays the fee.
Try it at mykova.app ·
iOS on TestFlight ·
Live users ·
For reviewers ·
A real run on Monad testnet: a Kova wallet pays a phone number, the phone gets a text, then dials Kova's USSD code (on Africa's Talking's simulator).
The problem
You live in London. Your grandmother lives in a village back home. She has a basic phone, no smartphone and no data. Sending her $50 today means agent fees, slow transfers, and a currency that loses value while it waits.
Stablecoins fixed the money, but not the experience. They still ask for an app, internet, a gas token, a seed phrase and a long address. Hundreds of millions of people have a phone but no internet, and most people never get past the seed phrase.
With Kova, you send dollars to her phone number. She gets a text. She dials a short code, enters her PIN, and checks or spends her dollars, with no app and no internet. You set her up once from your Kova app: her number, a PIN, a daily limit, and a code Kova texts to her phone.
We believe that if you solve a real problem, people use the product. This is the one we chose.
What it does
![]() Pay in about a second Scan a code or tap a till, approve with Face ID, paid. The fee is $0.00: Kova pays the gas. The passkey is the wallet, so there's no seed phrase. |
![]() Send to a phone number or a .nad name Type +234…, ada.nad or just ada. Kova finds who it is,
shows the address, and the money lands in about a second. Or send a link to anyone.
|
![]() Dollars on any phone No app, no data: a text when dollars arrive, then *384*53916# and a PIN to check
the balance, pay a till or send to another phone.
|
![]() Pay with no signal In a market or a basement, Face ID signs the payment on the phone and it travels as a code. Whichever phone gets signal first settles it on Monad. |
![]() Private payments Turn on "Send privately" and the dollars go to a one-time address only the recipient can open. The name and note travel sealed, for them alone. |
![]() Limits for cards, people and AI agents Every card, teammate or AI agent that spends from your account gets its own key and daily limit, kept in a contract on Monad. Claude can pay over MCP, within its limit. |
More in Kova
- Send by link, to anyone. Share a link on WhatsApp: "Ada sent you $20.00, about €18.40".
The friend claims it with Face ID, or with email or Google (Privy), in under a second. The key
lives only in the link (after the
#), and an unclaimed link can be taken back. - Their own currency. Amounts show in naira, euros, pounds and more, beside the dollars.
- Private notes. "For dinner" travels with the payment, sealed on the sender's phone for the two of them (X25519, XChaCha20-Poly1305). Kova stores text it can't read.
- A shop inside the wallet. A stall page, a catalogue, a till (the phone becomes a terminal), orders from the table, a stamp card with no sign-up, and the day's takings live. Private takings pay each sale to a one-time address, so nobody can add up a shop's sales.
- Kova for Business. Private payroll and supplier payments, each checked on Monad.
- Deposits from other chains. MON on Monad and tokens from other networks convert into dollars through Relay. See setup and verification.
- Naira in and out. Add money in naira and cash out to a Nigerian bank through Paystack (test mode on testnet).
- From guest to Kova. Someone who paid a shop with email or Google can keep their change in a new Kova wallet, gas-free.
- Also: Kova Travel (flights and hotels in dollars), "Snap your menu" (a photo becomes catalogue items), and spending insights. A US account number, a dollar card and savings are built behind partner keys and show "Request access" until a partner switches them on.
How it works for a phone with no internet
your Kova wallet ──signs──▶ Kova API ──relayer pays gas──▶ Monad: AUSD lands in her pocket
│
her phone ◀── text: "$1.00 arrived. Balance $9.25. Dial *384*53916#" (Africa's Talking SMS)
her phone ──dials *384*53916#──▶ Africa's Talking ──▶ Kova API: balance, pay a till, send
- Each phone number gets a pocket: its own address on Monad, holding AUSD, with a PIN and a daily limit (at most $200). The pocket's key is sealed on Kova's server (AES-256-GCM), the PIN is hashed (scrypt), and three wrong PINs lock it for 15 minutes.
- The wallet that set the pocket up can always take the dollars back, with no PIN, even if USSD is paused.
- A spend is signed from the pocket as an EIP-3009 authorization and relayed like any other Kova payment. Each USSD session pays once, however many times the network resends a screen.
- Sending to a number Kova doesn't know holds the dollars at a one-time address, texts an invite, and lets the sender take them back until they're claimed.
- Code:
ussd.ts,pockets.ts,phone-payments.ts,arrival-sms.ts.
Today this runs on Africa's Talking's simulator with test dollars. Next: a live USSD code per country, and cashing out to mobile money (M-Pesa, MTN MoMo) from the same menu.
How Kova uses Monad
- Payments are signatures. The payer signs an EIP-3009
transferWithAuthorizationfor AUSD. Kova's relayer submits it and pays the gas, so nobody holds MON. - One round-trip to paid. The relayer estimates gas, counts its nonce locally, signs and sends
with
eth_sendRawTransactionSync, so the receipt comes back with the send: about 0.4 to 0.5 s on the server, about a second from tap to paid on a phone in Lagos. - Why Monad. Finality fast enough for a checkout line, and gas cheap enough for Kova to pay it for every user. That's what makes a dollar app with no gas token possible. It also makes privacy affordable: a fresh address for every private payment, and a transaction to spend each one.
- Charges carry their reference on-chain. A checkout's reference rides in the authorization's nonce, so Kova's chain watcher settles a payment whoever submits it.
- Limits live on Monad.
KovaCardholds each spending key's daily limit, freeze and cosigner, so the limit is kept by the contract, not by Kova's database. - Names on Monad.
ada.nadcomes from Nad Name Service on Monad mainnet. A pasted address shows its own .nad name only when that name points back to it. - Privacy by permission. Private payments use ERC-5564 stealth addresses
(
stealth.ts), each posted to the standard announcer so any wallet can find its payments from the chain alone. The sender's memo is sealed for the recipient's viewing key. The amount is public; who it went to isn't. - Exchange rates from Chainlink CRE. A workflow (
apps/rates) checks two FX sources against each other, reaches consensus and writes a signed report toKovaRateson Monad testnet. Mainnet uses a fixed reference table, labelled as such.
Who's using it
mykova.app/stats counts Kova's users live, straight from Kova's database on each network, and refreshes every minute. It shows people, payments, money moved, shops, links and where new people came from. It counts totals only, never who someone is.
On 23 October 2026:
| Mainnet | Testnet | |
|---|---|---|
| People with a Kova wallet | 12 | 162 |
| Payments | 0 | 36 ($402.55 in test dollars) |
| Shops open | 2 | 21 |
| Links sent | 1 | 7 (4 claimed) |
These counts include our own testing, and the page says so. A person is a wallet that did
something only Kova wallets do: made its passkey backup, published a note key, took test dollars,
paid a Kova charge, sent or claimed a link, or opened a shop. Kova's demo account, which App Review
signs into, is left out. The numbers come from apps/api/src/routes/stats.ts,
and anyone can read them at GET /v1/public/stats on each network's API.
Proof on Monad
Kova's API, relayer and contracts are live on mainnet. This week mykova.app runs the testnet build, with free test dollars, for the phone-payment demo.
Mainnet (chain 143)
| What | Link |
|---|---|
| AUSD (Agora), the dollar every payment moves | 0x00000000eFE3…9012a |
| Kova's relayer, which pays everyone's gas | 0x67d18542…7fa967 |
| KovaCard, the contract behind every spending key | 0x9bee9F2D…Ef325E |
| ERC-5564 announcer and ERC-6538 registry | 0x55649E01…5564, 0x6538E6bf…6538 |
| Gas-free $1.00 transfers through Kova's relayer | 0x98b3d548…, 0x370e22dd…, 0xd7e2300f… |
Testnet (chain 10143), one receipt per feature
| Feature | Receipt |
|---|---|
| $3.00 to a phone number with no apps, straight into its USSD pocket | 0xe7957e6d… |
| $1.00 more to the same phone, arrived in 1.37 s | 0xa77fb146… |
| A coffee, $4.50, with a $0.00 fee | 0x6a52a3cf… |
| $20 to a friend abroad, arriving as ≈ €18.40 | 0xa92a1733… |
| $20 sent by link and claimed by a brand-new wallet in 0.7 s | 0x7feaee54… |
| Paid with no signal, carried as a code, settled in 0.66 s | 0x84a1ffae… |
| Ordered and paid from table 3, $7.75 in 0.76 s | 0x61749899… |
| The sixth croissant, free with the stamp card: a $0.00 payment with its receipt | 0x73001c6d… |
| A private send's announcement, with its sealed memo | 0x62b66ba6… |
| Paid straight from a one-time address | 0x969774c6… |
| Claude pays over MCP with its own key; the owner approves an ask-first payment | 0x47c9e9f5…, 0xd9c89c96… |
| A teammate spends the owner's dollars within their limit | 0xc7296af1… |
| Private payroll, each person paid at a one-time address | 0x7726357c… |
| A Chainlink CRE rate report written to KovaRates | 0x982e9045… |
Testnet contracts and more receipts
| What | Link |
|---|---|
| AUSD (Agora) | 0xa9012a05…5322dC |
| Kova's relayer | 0x5868C3C3…771940 |
| KovaRates | 0xb5322DC6…C9e8e |
| A bakery sale, $6.50, at a Kova till | 0x152be347… |
| A send from the web wallet, $2.50 | 0x3306403e… |
| $1.00 with a private note, web to phone, and $0.50 back | 0xc3645812…, 0x3d43cd4d… |
| Two private payments gathered into one address, then spent | 0x240552b3…, 0xcfdc9845… |
| ERC-5564's announcer, deployed by Kova at its canonical address | 0x6438a00e… |
| An AI agent's key switched on; a Claude Code run paying | 0xee1771f2…, 0xf7659c65… |
| A teammate's key switched on | 0x155d853c… |
| More payroll, and a supplier payment | 0x43935f81…, 0x2ab78661…, 0x94fb846d… |
| A CRE broadcast run | 0xb5f7efae… |
Architecture
flowchart LR
subgraph People
app["Kova app (iOS, Expo)"]
web["mykova.app (Next.js)"]
phone["Any phone (USSD, SMS)"]
end
subgraph Kova
api["Kova API (Hono)"]
db[("Postgres")]
watcher["Chain watcher"]
relayer["Relayer (pays gas)"]
end
subgraph Monad
ausd["AUSD (EIP-3009)"]
card["KovaCard (limits)"]
rates["KovaRates"]
nns["Nad Name Service"]
end
at["Africa's Talking"]
cre["Chainlink CRE"]
app -- "signed authorization" --> api
web -- "server-side calls" --> api
phone -- "*384*53916#" --> at -- "USSD callback" --> api
api -- "texts" --> at -- "SMS" --> phone
api --- db
api --> relayer -- "transferWithAuthorization" --> ausd
relayer --> card
watcher -- "reads transfers" --> ausd
watcher --- db
cre -- "signed report" --> rates
api -- "reads" --> rates
app -- "looks up names" --> nns
web -- "looks up names" --> nns
| Path | What it is |
|---|---|
apps/mobile |
The Kova app (Expo, React Native): the wallet, and shop mode with the till. Installs with npm, outside the pnpm workspace. |
apps/web |
mykova.app (Next.js): the web wallet (/wallet), shop mode (/dashboard), pay pages, stall pages and request links. Every API call is made server-side. |
apps/api |
The Kova API (Hono on Node): checkout, relaying, the chain watcher, wallets, phone payments, USSD pockets, texts, shops and tills. |
apps/card |
KovaCard, the contract behind every spending key (daily limit, freeze, cosigner), with Foundry tests. |
apps/rates |
The Chainlink CRE workflow and the KovaRates contract (Foundry). |
packages/monad |
Shared chain logic: networks and tokens, EIP-3009 authorizations, stealth addresses, sealed notes, the privacy router, spending keys, offline payments, phone payments and .nad names. |
packages/db |
Postgres schema and migrations (Drizzl |






