Tap into trust
Tap. Pay. Done.
A Stellar wallet you pay with by tapping an NFC card. Each card gets its own x402 agent that signs the tap — no unlock, no app, no confirmation.
Beta 1.0.0 · Stellar Testnet · Android APK · Release notes · Google Play coming soon
- Settlement
- ~5s ledgers
- Network
- Stellar
- Contracts
- 3 on Soroban
Paying should be invisible. Noir debits the moment your tag touches the terminal — built for transit turnstiles, campus canteens, event gates and retail checkout, where every second in the queue counts.
- No app to open
- No screen to unlock
- No confirmation to tap
How it works
From tap to settlement in three steps.
- 01
Link a card
Hold an NFC card, sticker or wearable to your phone and sign once. Soroban’s
device_registryrecords its hashed ID against your wallet. - 02
Set its agent and fund it
Each card gets an agent key with a policy you sign: one asset, a per-payment cap and an optional expiry. Fund its escrow; your main balance stays untouched.
- 03
Tap
payment_escrow.authorizechecks the policy on-chain and moves funds to the merchant, who claims in batch. Stellar confirms in seconds.
Features
Built for zero-friction commerce.
Open contracts, self-custody and sub-cent fees — without asking anyone to change how they pay.
Zero-interaction payments
Tap an NFC card, sticker or wearable (NTAG213) to pay. No unlock required.
x402 tap-to-pay
The tap carries an x402 payment request; the card’s agent signs it and the escrow contract settles it.
Constrained agents
One agent per card, limited on-chain to one asset, a per-payment cap and an optional expiry.
Three Soroban contracts
device_registry,agent_registryandpayment_escrow— open, MIT-licensed, on Testnet.Self-custody
Owners sign their own registrations and policies via
require_auth. Keys never leave the phone.Built to integrate
TypeScript SDK, REST API with API keys, and signed webhooks for every on-chain event.
Security
Simple to use. Robust by design.
Lose a tag and unlink it — the agent loses its authority and the card’s escrow returns to your wallet.
Hashed device identity
Tag UIDs are SHA-256 hashed on the phone. Only the hash is ever written on-chain.
Blast-radius limits
A card can only spend its own escrow, within its cap, asset and expiry — never your main funds.
Replay protection
Every authorization carries a strictly increasing nonce; the contract rejects duplicates.
Encrypted on the phone
Wallet keys are sealed behind your wallet password; phone unlock is opt-in. Backups are disabled.
Scoped API keys
The Noir API stores only key hashes, scopes each key, rate-limits it, and never holds signing keys.
Architecture
Hardware tap to on-chain settlement.
- 01
Tag
NTAG213 card, sticker or wearable
- 02
Phone
Reads the tag and SHA-256 hashes its UID
- 03
Soroban contracts
device_registry- Binds the SHA-256 hash of an NFC tag to the wallet that owns it.
agent_registry- Stores each device’s agent policy: which key may spend, which asset, how much per payment, until when.
payment_escrow- Holds each device’s pre-funded balance; authorizes taps within policy and lets merchants claim in batch.
- 04
Stellar
Consensus and settlement in seconds
- 05
Merchant
Batch
claimof everything pending
Function-level reference and live Testnet IDs: Contracts documentation.
Developers
Accept Noir taps in your app.
Everything the wallet does is open on-chain. Use the SDK from JavaScript, or call the REST API from any language with an API key.
TypeScript SDK
Read policies, check and authorize payments, claim, and watch events. Node, browser and React Native.
SDK referenceREST API + API keys
Self-host the gateway: hashed keys, scopes, rate limits, and non-custodial prepare → sign → submit.
API referenceSigned webhooks
Get payment.authorized, escrow.funded and more, HMAC-signed with replay protection.
import { NoirAgentClient } from '@noir-wallet/agent-sdk'
const noir = new NoirAgentClient() // Stellar Testnet
const check = await noir.checkPayment({ deviceHash, agent, asset, amount: 10_000_000n })
if (check.ok) await noir.authorizePayment({ agent: agentSigner, deviceHash, merchant, asset, amount: 10_000_000n })Compared
What a card tap can’t do.
Every venue that hates checkout queues — transit, canteens, event gates, retail — is a Noir venue.
| Feature | EMV tap | Phone wallet | Noir |
|---|---|---|---|
| No phone unlock needed | Yes | — | Yes |
| Self-custody of funds | — | — | Yes |
| Sub-cent transaction fees | — | — | Yes |
| Stickers and wearables | — | — | Yes |
| Per-device on-chain limits | — | — | Yes |
| Open smart contracts + API | — | — | Yes |
Demo
Watch it tap and go.
Two minutes on the ground: the x402 tap-to-pay flow, per-device agents and the full app.
FAQ
Questions, answered.
What is Noir?
Noir is an open-source Stellar wallet for Android that lets you pay by tapping an NFC card, sticker or wearable. Each linked card is bound to a payment agent with on-chain limits, so a tap can pay without unlocking your phone.
What happens if I lose a card?
Revoke it from the app. The agent stops being able to spend immediately, and the card’s remaining escrow is returned to your main wallet. A card can never spend more than its per-payment cap, in its one asset, before its expiry.
Can other apps accept Noir payments?
Yes. The TypeScript SDK (@noir-wallet/agent-sdk) and the self-hostable REST API with API keys let any app read card policies, check a payment, run tap-to-pay, and receive signed webhooks.
Is Noir on mainnet?
Not yet. Noir runs on Stellar Testnet as a reference implementation funded by the Stellar Community Fund. Contracts, app and SDK are MIT-licensed.
Stack
- Stellar
- Soroban · Rust
- React Native
- Expo
- TypeScript
- NativeWind
- Zustand
- @stellar/stellar-sdk
- react-native-nfc-manager
- Vitest
- Next.js
Team
- Richie Christian De GuzmanFullstack developer
- Johnrick RabaraBackend developer
- Jefferson TuparanUI/UX designer

A world where paying is invisible.
Your wallet is your identity. Payments happen without friction. Settlement is instant.
Beta 1.0.0 · Stellar Testnet · Android APK · Release notes
View the pitch deck