Pay gas with work, not ETH.
Your browser solves a small proof-of-work puzzle and an ERC-4337 paymaster pays the gas. A fresh address never needs ETH from your main wallet, so no gas top-up ever links the two on-chain.
Review
Send an amount (hidden on screen)USDG
- From
- your fresh account (hidden on screen)0 ETH
- To
- a recipient (hidden on screen)
- Gas
- $0.00 · sponsored
- Funding transaction
- None needed
- Difficulty
- 2 to the power of 17 hashes each
- Elapsed
- 0.0 s
- Expected
- ~3.5 s
- Challenge received—
- Work found—
- Proof valid, checked in this tab—
- Accepted by relayNever sent · demo
- Robinhood ChainMainnet, chain 4663
- Arbitrum OrbitNitro
- ERC-4337EntryPoint v0.9
- EIP-7702Simple7702Account
- AltoBundler
- viemSDK
- AlchemyRPC
Built on open standards · running on Robinhood Chain mainnet
Privacy shouldn’t start with a funding transaction. Unlinked swaps the ETH top-up for a few seconds of browser work, so a fresh address starts clean and stays unlinked from your main wallet.
- Fig 0.1
No funding link
A fresh address starts with 0 ETH and never receives a top-up from your main wallet.
- Fig 0.2
Work, not ETH
Eight keccak sub-solutions found in your tab replace the gas money as the anti-spam cost.
- Fig 0.3
Checked on-chain
The paymaster verifies every hash against the epoch's target before it pays for the op.
01 · Zero ETH
One top-up. One public link. Permanently.
A fresh address can’t move until it holds ETH for gas. Send it 0.002 ETH from your main wallet and that funding transaction ties the two together on a public ledger. Unlinked never needs it.
How it worksToday
With Unlinked
No funding transaction
The fresh address holds 0 ETH before, during and after its first op.
ERC-4337 paymaster
Gas comes from the paymaster's EntryPoint deposit, on-chain.
EIP-7702 account
Same address as the key. No deployment tx: the bundler carries the delegation.
02 · Browser mining
Seconds of work. In your browser.
Your tab searches for nonces whose keccak hashes fall under the paymaster’s target: 8 sub-solutions, the same preimage the contract checks. This panel hashes live, right here.
The proof of workA live stream of keccak256 hashes computed in this tab. Hashes with at least 16 leading zero bits count as sub-solutions.
CPU use
- Web Workers at the thread count you pick. Gentle uses one core.
- Stops at 8 hits. Nothing runs in the background.
- Seconds, not minutes: about 3 s for a first op on a mid laptop.
- WASM keccak, the same preimage the contract checks.
This panel hashes on the main thread at a deliberately tiny rate. The app mines in Web Workers, far faster.
03 · Sponsorship
Checked on-chain. Then paid for.
The relay checks policy and co-signs. Our Alto bundler submits a type-4 transaction, and the paymaster verifies every hash against the epoch’s target before the EntryPoint charges its deposit.
Read the contractRun · Send 25 USDG
Sponsored. 0 ETH spent.
- Challenge received0.1 s
- Work found2.6 s
- UserOp signed12 ms
- Accepted by relay0.3 s
- Included in a block1.1 s
- Confirmed0.4 s
epochs[epochId]write-once epoch existsmaxFeePerGaswithin the epoch's capssender codedelegated to Simple7702Account v0.98 × keccakevery hash ≤ target, nonces sortedrelay signatureco-signed this userOpHash
→ validationData: valid until epoch end
15-minute epochs
Write-once parameters and a capped budget per epoch.
Difficulty follows load
More traffic, more work per op. Spam costs CPU time.
One proof, one op
Bound to your op's hash: it can't be stolen or replayed.
Fails safe
A failed op never costs you ETH. You mine again.
04 · Privacy by default
Redacted on screen, until you hold.
Addresses and amounts sit under redaction bars, so a shoulder or a screen share sees nothing linkable. Hold to read, release to reseal. Your key is made in your tab and never leaves it. Try it on this demo card.
Privacy guideFresh account
Demo account · Private view on
- ETH0
- USDGDemo USDG balance: 1,240 (hidden on screen)
- NVDADemo NVDA balance: 3.5 (hidden on screen)
Press and hold to read. Release, switch tabs or look away, and it reseals.
Who sees what
- A gas top-up linking your wallets
- Never exists
- Your fresh account's key
- Only you
- Addresses and amounts on screen
- Only you
- Your IP address and send time
- The relay
- Your fresh address and its ops
- Everyone
- Your main wallet's history
- Everyone
05 · Assets
Send ETH and tokenized stocks.
Native ETH, USDG, WETH, cbBTC and 195 Robinhood stock tokens, each verified on-chain. The app shows and sends only what your fresh account holds, with sponsored gas.
Open SendThe Send screen lists native ETH, USDG, WETH, cbBTC and 195 Robinhood stock tokens such as NVDA, TSLA and AAPL, each with its logo. Balances stay redacted until you hold to read them. Stock tokens carry a notice: Robinhood stock tokens are not offered to persons in the United States, Canada, the United Kingdom or Switzerland. This app does not check who you are: only hold or send them where you are allowed to.
Native ETH
execute(to, value): the ETH moves, the gas stays sponsored.
Pinned implementations
The relay checks each listed token against its pinned implementation.
Jurisdiction notice
Stock tokens are not offered in the US, Canada, the UK or Switzerland.
06 · For builders
Gasless UserOps, in three lines.
The SDK fetches the epoch, mines in Web Workers and attaches the proof to paymasterAndData. Built on viem, with EIP-7702 accounts. No API key, no signup, no wallet connection.
$ npm i @unlinked/sdk @unlinked/miner viem
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
import { createRelayClient, sendPowUserOperation, startEpochPolling } from '@unlinked/sdk'
const owner = privateKeyToAccount(generatePrivateKey()) // never funded
const relay = createRelayClient(RELAY_URL)
const epochs = startEpochPolling(relay) // at app start: reads on a fixed schedule
const { receipt } = await sendPowUserOperation({ relay, epochs, owner, call })
// call = claimCall(faucet, token) or transferCall(token, to, amount)$ npm i @unlinked/miner
import { createMiner, verifySolutions } from '@unlinked/miner'
const miner = createMiner({ threads: 4 }) // one Web Worker per thread
const hashesPerSecond = await miner.calibrate() // 1.5 s, cached per session
// 8 sorted nonces with keccak256(challenge ‖ nonce) ≤ target
const nonces = await miner.mine({ challenge, targetPerSolution })
verifySolutions(challenge, targetPerSolution, nonces) // same rules as the contract# Current epoch: work price, fee caps, gas profiles, headroom
curl -s "$UNLINKED_RELAY_URL" -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"pow_getEpoch","params":[]}'
# Then submit the mined op. The relay re-checks the proof first.
# eth_sendUserOperation [userOp, ENTRY_POINT_V09]@unlinked/sdk. The full 20-line example is in the quickstart.$ npx tsx packages/e2e/scripts/mainnet-smoke.ts fresh sender (0 ETH, never funded) → 0 USDG → fresh recipient mining 8/8 signing · submitting · included userOpHash 0x2da1354e05e2…ab8754 success true bundle tx 0xe9a85ca0ad58…c670e5 · type 4 sender ETH 0
Install the SDK
npm i @unlinked/sdk @unlinked/miner viem. No API key, no signup.
Create a fresh key
In the browser, never funded. Point it at the relay URL.
Send the UserOperation
The proof rides along in the v0.9 paymasterSignature; the gas is sponsored.
07 · Live on Robinhood Chain
Real numbers, read from the chain.
Every figure here is read from the paymaster contract through a public RPC, refreshed every 30 s. Senders are public on-chain; this page keeps them redacted.
Status and full history- Ops sponsored
- —
- Median solve, mid laptop
- —s
- Work per op
- not read yet
- Treasury runway
- —days
- EntryPoint deposit
- —
- Treasury
- —
- Budget in force
- —
- Gas spent, all time
- —
Commitments
What the paymaster does. What it never does.
Six commitments, each one checkable in the contract source and the relay's policy.
Read the contractNot a mixer
We pay gas for one UserOperation. We never hold, pool or move your tokens. Assets someone sends your fresh account still link that sender to it.
Keys stay in your tab
Your fresh account’s key is generated locally and never sent to us or to the relay.
CPU capped
Web Workers only, at the thread count you pick. Stops once the proof is done. The demos on this page pause when hidden.
Funded by its operator
The operator funds the treasury, and anyone can top it up with
fund(). Each epoch gets a capped budget. You never pay per transaction.Rate-limited by work
Difficulty rises with load, so spam costs CPU time, not your identity.
Verified contracts
Open source, not upgradeable, verified on the Robinhood Chain explorer at deployment. Audit linked when published.
Limits, stated plainly. Live on Robinhood Chain mainnet with a small, capped budget. Proof-of-work is a rate limiter, not a security guarantee: the per-epoch budget is what bounds losses. The relay sees your IP address unless you connect through Tor.
Changelog
Mainnet config tuned
maxPreVerificationGas set to 300k on the live paymaster, with an early epoch roll so the new config applies at once.
· 4c0c12d
Live on mainnet
Relay and Alto bundler online. First sponsored op: a fresh key with 0 ETH, bundled in block 76,756,332.
· 68c1065
Sponsored ETH sends
Send native ETH with sponsored gas, plus a verified token list: ETH, USDG, WETH, cbBTC and every Robinhood stock token.
· e8f9d5f
PowPaymaster deployed
EntryPoint v0.9, keccak proof of work with 8 sub-solutions, write-once epochs, relay co-signature and an EIP-7702 delegate check.
· 188425b
A fresh key holding 0 ETH sent its first transaction on Robinhood Chain, and the paymaster paid the gas.
0 ETH
sent to a fresh account before its first op. No funding transaction, ever.
Questions, answered plainly.
More in the docsIs this a mixer?
No. The paymaster pays the gas of one UserOperation at a time. It never holds, pools or moves your tokens, and it does not hide where tokens came from. It removes one specific link: the ETH top-up a fresh address would otherwise need.
Who pays for the gas?
The paymaster's EntryPoint deposit, refilled from its treasury at each 15-minute epoch with a capped budget. The operator funds the treasury, and anyone can add to it with fund(). You never pay per transaction, and a failed op never costs you ETH.
How much CPU does it use?
Mining runs in Web Workers at the thread count you pick (Gentle uses one core), stops at the eighth valid hash and never runs in the background. A first op takes seconds on a laptop. You can stop at any time: nothing is sent until the proof is done.
Which tokens can I send?
Native ETH, and on mainnet the verified list: USDG, WETH, cbBTC and every Robinhood stock token (NVDA, TSLA, AAPL and the rest), each checked on-chain. The app shows and sends only what your fresh account holds.
Can US persons use stock tokens?
Robinhood stock tokens are not offered to persons in the United States, Canada, the United Kingdom or Switzerland. Unlinked does not check who you are (no KYC, by design), so only hold or send them where you are allowed to.
What does the relay see?
Your IP address, your ops and when you sent them, like any RPC. Never your key: it is made in your tab and never leaves it. Connect through Tor Browser to hide your IP.
Can a GPU farm drain it?
It can use up an epoch's budget quickly: proof of work is a rate limiter, not economic security. The per-epoch budget and an immutable daily cap bound the loss, and honest users wait for the next epoch.
Zero ETH. Zero link.
Available today on Robinhood Chain mainnet. A fresh account's first op takes seconds of mining. No email, no wallet connection.