Documentation

How UNLISTED works

UNLISTED is a static web app. It has no backend, no database and no accounts. Everything below happens in your browser or on Robinhood Chain.

Overview

You connect a normal wallet and sign one message. From that signature your browser derives up to 20 vault accounts. Vaults hold USDG, ETH for gas and Robinhood stock tokens. Trades are signed by the vault key and sent to Uniswap v3. Your main wallet is only used to sign the unlock message and, if you choose, to fund a vault.

Vault derivation

The unlock message is fixed text, so the same wallet always produces the same signature. The key schedule is:

sig      = personal_sign(MESSAGE)            // by your main wallet
root     = keccak256("unlisted/v1/root" || r || s)
vault[i] = keccak256(root || uint256(i))     // i = 0, 1, 2 ...

Only r and s are used, so wallets that report v differently still land on the same vaults. The first time an address unlocks, UNLISTED asks for the signature twice and refuses to continue if they differ. Wallets that sign non deterministically would otherwise create vaults you could never recover.

Anyone who obtains this signature can rebuild your vault keys. Sign it only on the official UNLISTED site, never on a page that asks you to "verify" it.

Keys live in memory for the session. Locking, closing the tab or 15 minutes of inactivity wipes them. The only thing stored on your device is the number of vaults you use and their labels.

Token verification

Robinhood deploys every stock token as an EIP 1967 beacon proxy pointing at one beacon contract. UNLISTED reads the beacon storage slot of each token and only lists it when it matches Robinhood's beacon. A token called "Tesla • Robinhood Token" that was deployed by someone else fails this check and never appears in the app.

The token list is discovered from the explorer and verified on chain. You can also paste a token address; it goes through the same check.

Trading

Funding privately

A vault is only as private as the money that enters it. In order of privacy:

  1. Withdraw USDG and a little ETH from an exchange straight to the vault address.
  2. Send from a wallet that has no public connection to you.
  3. Send from your main wallet. This works, but anyone can see the transfer and link the two.

The same applies when you withdraw. Sending from a vault to your main wallet connects them. Moving between your own vaults does too.

Data and third parties

Robinhood Chain RPCBalances, quotes and transaction broadcast. Sees your IP address and the vault addresses you query.
BlockscoutToken discovery, holdings and history. Sees your IP address and the vault addresses you query.
jsDelivrServes the ethers library.
Google FontsServes the typefaces. Self host the fonts to remove this request.

Use a VPN if you do not want these providers to see your IP next to your vault addresses. UNLISTED itself logs nothing because there is nothing to log to.

Contracts

Robinhood Chain, chain ID 4663.

Uniswap v3 SwapRouter020xcaf681a66d020601342297493863e78c959e5cb2
Uniswap v3 QuoterV20x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7
Uniswap v3 Factory0x1f7d7550b1b028f7571e69a784071f0205fd2efa
USDG (Global Dollar)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Robinhood stock token beacon0xe10b6f6B275de231345c20D14Ab812db62151b00
Example: TSLA0x322F0929c4625eD5bAd873c95208D54E1c003b2d

Check any of them on Blockscout.

Recovery

Open UNLISTED on any device, connect the same wallet and sign. Your vaults come back. If you used more vaults than the app shows, add them again; they will have the same addresses.

For independence from this site, export each vault key from the app and import it into a regular wallet. With the key schedule above, a developer can also rebuild the keys from your signature with a few lines of code.

Risks