Payments
Send money as privately as you send messages.
Overview
RVNT includes an integrated payment system built on the Bitcoin Lightning Network. Payments are sent and received within conversations, using the same encrypted channel as messages. No bank account, no credit card, no identity verification. The payment system is designed with the same philosophy as the messaging system: the server knows nothing.
Why Lightning Network? On-chain Bitcoin transactions are pseudonymous but publicly visible on the blockchain. Lightning Network transactions are off-chain, routed through payment channels, and are not recorded on the public blockchain. This provides significantly stronger privacy for small, frequent payments.
Wallet Architecture
Wallet type: Non-custodial (you hold the keys)
Lightning impl: LDK (Lightning Dev Kit, Rust)
On-chain backend: Electrum (SPV, no full node required)
Key storage: Derived from RVNT identity key
wallet_seed = HKDF(identity_key, "rvnt-wallet-seed")
Wallet limits:
Maximum balance: $500 USD equivalent
Maximum single send: $200 USD equivalent
Maximum single receive: $200 USD equivalent
Daily send limit: $500 USD equivalent
These limits are designed to keep RVNT out of money transmitter
regulatory territory. RVNT is a messaging app with a payment
feature, not a financial services platform. Key Derivation
The wallet seed is derived from the RVNT identity key:
wallet_seed = HKDF-SHA256(
ikm: identity_private_key,
salt: "rvnt-lightning-wallet-v1",
info: "wallet-seed",
len: 32
)
// BIP-32 master key from seed
master_key = BIP32.from_seed(wallet_seed)
// Lightning-specific keys derived from master
node_key = master_key / 0' // Lightning node identity
funding_key = master_key / 1' // Channel funding
revocation = master_key / 2' // Revocation keys
htlc_key = master_key / 3' // HTLC signing
Backup:
The wallet seed is derived from your identity key.
If you back up your identity key (which you should),
the wallet is automatically recoverable.
No separate seed phrase needed. Sending a Payment
Payment flow:
1. Alice taps "$" icon in conversation with Bob
2. Alice enters amount (USD display, satoshi internally)
3. RVNT constructs a payment message:
PaymentMessage {
type: PAYMENT_REQUEST or PAYMENT_SEND
amount: u64 (satoshis)
currency: "USD" (display currency)
rate: f64 (BTC/USD rate at time of send)
memo: String (optional, encrypted)
invoice: String (BOLT 11 Lightning invoice, if request)
}
4. Payment message encrypted with Double Ratchet (same as text)
5. Wrapped in sealed sender envelope
6. Sent through Tor
Lightning payment routing:
7. Alice's LDK node finds a route to Bob's LDK node
8. Payment is routed through Lightning Network channels
9. Bob's node receives the payment
10. Bob sees payment notification in conversation Invoice Types
| Type | Initiated By | Flow |
|---|---|---|
| Direct Send | Sender | Alice sends payment directly. Bob receives notification in chat. No invoice needed (keysend/spontaneous payment). |
| Invoice Request | Recipient | Bob sends a BOLT 11 invoice in chat. Alice scans/clicks to pay. Standard Lightning invoice flow. |
| Payment Request | Recipient | Bob sends a payment request with amount and memo. Alice confirms. RVNT handles invoice generation internally. |
Currency Display
Internal: All amounts stored in satoshis (u64)
Display: User's preferred fiat currency
Conversion: Real-time rate from privacy-respecting API
(no user identification in rate queries)
Supported display currencies:
USD, EUR, GBP, CAD, AUD, CHF, JPY, CNY, BRL, MXN, ...
(50+ fiat currencies)
Display format:
"$12.50 (25,000 sats)"
"0.00025000 BTC ($12.50)"
Rate source:
Fetched via Tor from multiple aggregators
Cached for 60 seconds
No API key required (public rate feeds)
No user identification in requests Fiat Bridge (Planned)
Planned integration with privacy-preserving fiat on/off ramps:
On-ramp (fiat → Lightning):
- Peer-to-peer exchanges (Bisq, RoboSats)
- ATM integration (no-KYC Bitcoin ATMs, where available)
- Voucher systems (Azteco, etc.)
Off-ramp (Lightning → fiat):
- Peer-to-peer sales (Bisq, RoboSats)
- Lightning-to-gift-card services
RVNT will NEVER integrate KYC-required exchanges directly.
The fiat bridge is designed for users who need to move between
fiat and Lightning without providing identity documents.
Status: Planned for future release Privacy Properties
| Property | Mechanism |
|---|---|
| Payment amount hidden from server | Payment message encrypted end-to-end (Double Ratchet) |
| Sender hidden from server | Sealed sender envelope |
| Recipient hidden from server | Sealed sender + Tor routing |
| No KYC | Non-custodial wallet, no identity verification |
| No on-chain footprint | Lightning Network (off-chain transactions) |
| Payment-message unlinkability | Lightning payment routed separately from the RVNT message |
| IP hidden from Lightning peers | LDK node traffic routed through Tor |
Wallet UI
Wallet interface (within RVNT app):
Balance display:
┌──────────────────────────────┐
│ Balance: $127.50 │
│ 254,893 sats │
│ │
│ [Send] [Receive] [History]│
└──────────────────────────────┘
In-conversation payment:
┌──────────────────────────────┐
│ Alice sent $25.00 │
│ 50,123 sats │
│ "For coffee ☕" │
│ ✓ Confirmed │
└──────────────────────────────┘
Transaction history:
- Sortable by date, amount, contact
- Searchable by memo
- All history stored locally (encrypted)
- No server-side transaction history Regulatory note: Cryptocurrency regulations vary by jurisdiction. RVNT's payment feature is designed for personal peer-to-peer transactions under applicable limits. Users are responsible for compliance with local laws. RVNT does not provide financial advice, does not custody funds, and does not facilitate regulated financial activity.
Further Reading
- Messaging -- How payment messages are encrypted and delivered
- Tor Integration -- How LDK traffic is routed through Tor
- Panic Mode -- Wallet key destruction during emergency wipe