Skip to content
Lockvane

Client handbook

How it works, without the fine print

What the product does, what it keeps out of view, and the precise point where that discretion ends. Every claim on this page is tied to a check you can run yourself.

Chain 4663Revised with each release

First steps

No download, no registration. You open the app, create a key pair, and walk away with a meta-address that can stay on your letterhead indefinitely.

  1. 01Open the app. Choose the Numbered Account tab and press Generate keys. Both private keys are created inside your browser.
  2. 02Secure them. Save the JSON backup, or choose a passphrase so the keys sit encrypted on this device.
  3. 03Hand out the meta-address. Copy it as text or display the QR. Publishing it is harmless; it has no power to spend.
  4. 04Collect payment. Each payer derives a new one-time address from it. Scan their receipt QR to claim, then sweep.
No secret is required to run the app. A route that depends on a server key replies 503 and names the missing variable, and the interface displays that message rather than an empty screen.

Keys and the meta-address

Lockvane builds on ERC-5564 stealth addresses over secp256k1, with two private keys in your keeping. The spending key authorises transfers. The viewing key can only tell which incoming payments are yours, which means you can share it with an accountant and still keep sole control of the funds.

The meta-address is simply the two corresponding public keys placed side by side:

st:eth:0x <33-byte spending pubkey> <33-byte viewing pubkey>
              └─ 132 hex characters in total

From it, a payer computes a single-use address that does not point back to you:

ephemeral r,  R = r·G
S        = r · K_view              (sender)   ==  k_view · R   (you)
h        = keccak256(compress(S)),  view tag = h[0]
P_stealth = K_spend + h·G
address   = keccak256(uncompress(P_stealth)[1:])[12:]

The view tag is a single byte. A scan compares it before anything else and runs the full elliptic-curve computation only when it matches, so scanning stays quick once an announcer contract is in place.

KeyPermitsDoes not permit
Spending keyMoving funds out of any stealth addressThere is no limit; protect it accordingly
Viewing keyIdentifying the payments addressed to youSpending of any kind
Meta-addressReceiving paymentsSpending, or exposing your balance
If the spending key is lost, every balance not yet swept is lost with it. No server holds a copy, there is no recovery route, and no one at a help desk can bring it back. Make the backup before any real funds arrive.

Sealed Invoice

A sealed invoice takes three scans and involves no server. Each step runs in a browser, and until the on-chain announcer contract is deployed, the receipt QR is what carries the announcement.

StepPartyOutcome
RequestRecipientCreates a payment request from the meta-address, with an optional token, amount and memo. Presented as a link and a QR.
SendPayerScans the request, derives a one-time address, pays from any Robinhood Chain wallet, and is given a receipt QR.
ClaimRecipientScans the receipt. The viewing key checks it, the spending key opens it, and balances appear.
SweepRecipientSends the funds to any destination, signed in the page with the derived key.

Each format is an ordinary URL, so a phone camera lands on the correct screen without installing anything:

Payment request
https://lockvane.org/pay?to=st:eth:0x…&token=NVDA&amount=1.5&memo=invoice%2042

Receipt / announcement
https://lockvane.org/app?claim=1&addr=0x…&eph=0x…&tag=87&tx=0x…#receive

addr holds the one-time address, eph the compressed ephemeral public key, and tag the view tag. These three fields correspond exactly to the ERC-5564 announcement event, so when the scanner takes over from the QR, the format stays as it is.

Always pass the receipt along. Without the ephemeral key the recipient has no way to locate the payment, even though the funds already belong to them on chain.

Private Desk

Orders are filled by an intent router instead of a public order book, so a trade never waits in a mempool for others to read. Choose from 189 assets across 35 chains, type the amount in ordinary units, and the quote shows the filling venue and the flat fee before anything leaves your wallet.

With one click the destination can be a new stealth address derived from your own meta-address, which folds the trade and the private receipt into one step.

Live deposit addresses require a router partner key on the server. While it is missing, the quote route replies 503 and the card displays indicative quotes, plainly marked as such.

Security posture

Each release keeps five commitments, and every one of them is tested rather than simply promised.

  • Keys stay on your device. Key generation, derivation and recognition are client-side code only. No network request sits anywhere in the key path.
  • Nothing held on our side. No custody, no private keys, no sessions. The only secrets are server-side env vars used to reach third-party routers.
  • Encrypted when stored. An optional passphrase seals the keys with AES-256-GCM, using a key derived by PBKDF2-SHA256 over 310,000 rounds through WebCrypto.
  • Closed on failure. A missing key returns a 503 that names it, never a quiet fallback that could mislead or expose anything.
  • Tested against mainnet. Before each release, a read-only script simulates genuine transfers from genuine holders. It signs nothing.

The limits deserve equal weight. Settlement on chain is public. The venue that fills a trade sees both the deposit and the destination address. And your IP address is visible to whatever RPC you connect to, unless the node is your own.

If you find a vulnerability, please report it privately by email rather than in a public issue. The procedure is set out in the SECURITY.md file that ships with the source.

API routes

Each route is a Next.js handler served from the same deployment. Reads are cached where caching is safe, and nothing that handles a key is reachable.

MethodPathPurpose
GET/api/healthLiveness check and chain id
GET/api/chainChain parameters with the current block number
GET/api/tokensRegistry of stock tokens on Robinhood Chain
GET/api/router-tokensAssets the intent router can fill, cached for 10 minutes
POST/api/quoteQuote for a private fill; 503 without the router key
GET/api/order/:depositSettlement status of a routed order
GET/api/vaultVault totals, basket and audit trail
POST/api/rpcJSON-RPC relay: allow-listed read methods plus raw send

The relay is there because certain networks intercept the chain’s RPC domain at DNS. Sending requests through the app’s own origin keeps balance reads and sweeps working where the direct endpoint is blocked. Batch sizes are capped and log ranges are limited, so the public RPC cannot be abused through this route.

curl -X POST https://lockvane.org/api/rpc \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

Lockvane extension

A stealth address helps only if it is used at the moment an address is requested. The extension sits right at that moment: a small chip appears next to any address field, one click fills in a new one-time address, and the receipt is stored locally.

Its key format matches the app’s, so a single backup and a single passphrase serve both. There is no backend and no host permission request; the content script runs only in the tab where you pressed the toolbar icon.

# from a local checkout of the source
npm install
npm run build:extension       # output goes to extension/dist
# chrome://extensions → Developer mode → Load unpacked → extension/dist

Running a local copy

The source has not been published yet. With a checkout in hand, the app builds without any secrets.

cd lockvane
npm install
npm run hooks:install     # pre-push gate, run once per checkout
npm run dev               # http://localhost:3000

Four checks stand behind the statements on this page, and CI runs the same four:

CommandWhat it confirms
npm run check:stealthDerivation, recognition and recovery work, and an outsider cannot claim your payment.
npm run check:paymentRequest and receipt formats survive a round trip; malformed input is rejected.
npm run check:keycryptoKeys seal and open; a wrong passphrase and an altered blob are both refused.
npm run check:onchainRead-only mainnet checks of tokens, stealth receipt and vault feasibility.

Common questions

›Does it pool funds like a mixer?

No. There is no pool and no commingling. Every payment arrives at its own new address, controlled by you alone.

›Must I connect a wallet?

Only when you send. Creating keys, showing a request QR and claiming a receipt need no wallet.

›What happens if I clear my browser data?

Balances you have not swept can no longer be reached unless you hold the backup file or both private keys. Secure them beforehand.

›Does it work on a phone?

Yes. Request and receipt QRs are made for a phone camera, and each screen is designed for a small display.

›Why is ETH needed to sweep?

A new stealth address has to cover its own gas. The sponsored sweep on the roadmap will take that step away.

›Is the vault running?

No. It carries the planned label wherever it is shown, and keeps it until a contract is deployed and audited.