Live on Robinhood Chain
Receive privately. Stay verifiable.
Every payment to your wallet on Robinhood Chain shows up under your address for anyone to read. Velpo gives each payment its own one-time stealth address, so your main wallet stays out of it. Who paid, how much and when stay public.
One payment
As a stranger on an explorer sees it · example
| Fact | Normal | Velpo |
|---|---|---|
| Paid to | 0x7Hx2…kP4q, your wallet | 0x3e9a…11c0, used once |
| Your other payments | Listed on the same page | Not linked by address |
| Your balance | 3.18 ETH, readable | Not in this payment |
| Paid by | 0xCq3V…uM9d | 0xCq3V…uM9d |
| Amount and time | 0.25 ETH, 4 min ago | 0.25 ETH, 4 min ago |
| Anyone can read this column. | Amber stays public. |
01 · Keys
Two keys from one signature
Sign one fixed message and your browser turns it into a spending key and a viewing key. Nothing to back up, nothing sent anywhere, and nobody at Velpo can move what you receive.
Make your keys02 · Contract
One small send desk
It moves the payment straight to the one-time address and posts the announcement in the same transaction. It never holds a balance and has no admin key.
What it can and cannot do03 · Scanner
Your browser finds your payments
Everyone downloads the same public list of announcements. Your viewing key picks out yours on your device, so no server learns which payments are yours.
Scan and withdrawLive from chain: .
The problem
Robinhood Chain is fast, cheap and readable by anyone.
Paste a wallet into an explorer and you get every payment it ever received: who pays it, how much and how often. Stealth addresses take your wallet off that page. They do not hide the payment itself.
Payments to one public address · example
0.80 ETH
0xCq3V…uM9d → 0x7Hx2…kP4q
0.02 ETH
0x4mNe…Zr8s → 0x7Hx2…kP4q
1.40 ETH
0x9aBq…Qe1L → 0x7Hx2…kP4q
0.15 ETH
0xRz9k…3wYb → 0x7Hx2…kP4q
0.30 ETH
0x2xWe…Lk6h → 0x7Hx2…kP4q
0.06 ETH
0xBv8n…Tq5e → 0x7Hx2…kP4q
2.50 ETH
0xNs5g…Ej2w → 0x7Hx2…kP4q
The same payments to stealth addresses
0.80 ETH
0xCq3V…uM9d → 0x3e9a…11c0
0.02 ETH
0x4mNe…Zr8s → 0xb81d…9a2e
1.40 ETH
0x9aBq…Qe1L → 0x0e7c…f415
0.15 ETH
0xRz9k…3wYb → 0xd2a6…13cc
0.30 ETH
0x2xWe…Lk6h → 0x5c11…7b80
0.06 ETH
0xBv8n…Tq5e → 0x91e0…e6d2
2.50 ETH
0xNs5g…Ej2w → 0xa47f…08f9
0.80 ETH
0xCq3V…uM9d → 0x3e9a…11c0
0.02 ETH
0x4mNe…Zr8s → 0xb81d…9a2e
1.40 ETH
0x9aBq…Qe1L → 0x0e7c…f415
0.15 ETH
0xRz9k…3wYb → 0xd2a6…13cc
0.30 ETH
0x2xWe…Lk6h → 0x5c11…7b80
0.06 ETH
0xBv8n…Tq5e → 0x91e0…e6d2
2.50 ETH
0xNs5g…Ej2w → 0xa47f…08f9
Amber: the receiving wallet repeated on every payment. Amounts and payers stay visible in both columns.
Live demo · runs in your browser
Try it, then look at what the chain sees.
Make keys, pay yourself a few times and scan. On the right, two views side by side: what you see, and what a stranger on an explorer sees. No wallet or money needed.
Make a pair of throwaway stealth keys: a spending key and a viewing key.
Registering a meta-address is public: anyone can see that your wallet published one. Payments to it are not listed under your wallet.
Your meta-address (public once registered)
No keys yet.
Payments found by your scan
None yet.
Nothing in this list says which rows are yours. Amber stays public.
Real ERC-5564 math in your browser. No wallet, no money, nothing sent anywhere.
Where the secret lives
Your keys never
leave your device.
The viewing key decides which payments are yours, and the spending key moves them. Both stay in the browser tab. The server only hands everyone the same public list.
01
Your device
Holds both keys, scans, signs withdrawals
keys stay here02
Registry
Holds your public meta-address, nothing secret
03
Payer
Computes a fresh address from the meta-address
04
Robinhood Chain
Records the payment and the announcement, in public
Other designs: a pool holds the money
Deposits wait in a shared contract.
That can hide more, but the pool holds everyone’s funds at once and needs heavy cryptography and review. Velpo does not do this today; a pool is planned only after a design and an independent review.
Velpo: nothing is held
Each payment lands at its own address.
Funds go straight from the payer to an address only your keys control. Less is hidden: the payer, the amount and the time stay public. Nothing is pooled to steal.
Who it’s for
For payments that point at a person.
A wallet address is easy to share and hard to take back. A meta-address lets people pay you without learning the rest of your history.
Freelance invoices
Each client pays a different address, so no client can open your wallet and read what the others pay you.
Tips and support
Post one meta-address. Supporters can pay it without turning your income into a public list under one wallet.
Team payouts
Pay several people in one transaction. Each gets a new address; your list of who is who stays with you.
Selling online
Give every order its own receiving address without managing a pile of wallets: one viewing key finds them all.
Keeping savings apart
Receive into addresses that do not point back to the wallet you use every day, then decide where the money goes.
Builders
Standard ERC-5564 and ERC-6538 contracts already on Robinhood Chain, plus open code you can read and reuse.
Batch send · in the app
Pay a team without a public list of who is who.
Up to 32 payments in one transaction through the send desk. Every recipient gets a fresh address. Your names and roles stay on your device; the payer and every amount stay public.
- Add meta-addresses and amountsETH or a token
- Check the public viewAddresses and amounts only
- Sign onceAll or nothing
Example batch
4 recipients · ETH · one transaction
- DE0.62
Design
computing…
- ED0.40
Editing
computing…
- QA0.35
Testing
computing…
- OP0.28
Operations
computing…
Scanner · reads the real record
Find your payments without saying which are yours.
The scanner downloads every announcement on Robinhood Chain and tests each one on your device. On the right it runs right now, on the real list, with a throwaway key.
- The same full list for every visitor, cached for everyone
- A one-byte view tag skips almost all strangers' payments
- Payments from other ERC-5564 wallets are found too
- Gaps in the record are shown, never skipped silently
reading the announcer and the registry…
For developers · open code
Stealth payments in three calls.
The functions the app runs, tested against the vectors published with the standard. Standard contracts mean other ERC-5564 wallets can pay and scan the same addresses.
Try it in the appimport { generateStealthAddress } from "@/lib/stealth/core";
// The receiver's registered meta-address (ERC-6538) or one they shared.
const meta = "st:rh:0x02a1…f3";
// A fresh address for this payment only. The ephemeral key and view tag
// are what the receiver needs to find it later; both go in the announcement.
const { stealthAddress, ephemeralPublicKey, viewTag } = generateStealthAddress(meta);
// Then one transaction: VelpoSendDesk.sendEth(stealthAddress, ephemeralPublicKey, viewTag)
// moves the ETH and calls the canonical announcer. Payer and amount stay public.Trust the code,
not us.
Read the privacy model Nothing is held
The desk forwards every payment in the same transaction. A test checks that its balance is zero after every call.
No admin key
No owner, no pause, no fee, no upgrade. Nobody can redirect or freeze a payment through the desk.
Keys stay on your device
Keys live in this tab's memory. The server sends everyone the same list and never sees a key.
The send desk is new and has not had an independent security review. It moves user funds, so it needs one before real volumes; start with small amounts.
FAQ
Fair questions.
How does it work, in plain English?
You publish one public "meta-address". A payer's browser turns it into a brand-new address for each payment and posts a short public note (an announcement) next to the payment. Your browser reads every note with a viewing key only you hold and recognises the ones meant for you. The money sits at that one-time address until you move it.
What exactly stays public?
The payer's address, the amount, the token, the time, the one-time address, the announcement, and later where you move the money from it. What is missing is the link between that one-time address and your main wallet, as long as you do not create one yourself.
Is Velpo a mixer or a privacy pool?
No. Nothing is pooled, mixed or held. Each payment goes straight from the payer to its own address in the same transaction. A shielded pool is planned only after a separate design and an independent review; it is not part of Velpo today.
Where do my keys come from?
From one signature of a fixed message in your wallet: the first half of the signature becomes the spending key, the second half the viewing key. The same wallet gives the same keys again, so there is nothing new to back up. You can also make random keys and save them as a file. Keys stay in this tab's memory and are never sent anywhere.
Who pays gas when I withdraw from a stealth address?
The stealth address itself, which is why ETH payments are easiest. A token payment arrives without ETH for gas, so the payer can add a small ETH tip in the same transaction. Without a tip you must send ETH to the stealth address first, and that funding transaction is public: funding it from your main wallet links the two. There is no relayer.
Which tokens work?
ETH and standard ERC-20 tokens. The desk refuses tokens that deliver less than the amount sent (fee-on-transfer) instead of announcing a wrong number. Tokens that can freeze or blocklist addresses can still do so at a stealth address.
What are the risks?
The send desk is a new contract that has not had an independent security review; it should be used with small amounts first. Anyone who obtains your key signature can find and spend your stealth payments, so sign the key message only on a site you trust. Losing access to the wallet that signed means losing the keys, unless you saved them.
Do I need $VELPO to use it?
No. Sending, receiving, scanning and withdrawing never need the token. $VELPO is planned for relayer fees once a relayer exists, and that utility is not proven.
Your next payment doesn’t need your address.
Make your keys, register a meta-address and share it. It takes a signature and one transaction.