SMStocks
Documentation

Five commands, one phone number

Everything SMStocks does is a text message. There is no app to install, no SDK to import and no dashboard you are required to log into. This page is the whole interface.

Transfers, trades and withdrawals are live on Robinhood Chain, and the numbers in the examples are illustrative. What is not yet live is listed under what is live. Nothing here is an offer to buy or sell securities.

How it works

When you buy, the protocol takes your USDC, opens a hedged position against the underlying, and mints you a synthetic share that settles on Robinhood Chain. Because every synthetic is backed by that hedge, the protocol never takes a view on price, and your position tracks the instrument rather than our balance sheet.

When you send, that synthetic moves to another phone number. The account behind a number is derived deterministically, so it exists before its owner has ever heard of us. That is the part which makes a transfer to someone with no wallet possible at all.

Robinhood's own tokenized shares are transfer restricted and can only move between whitelisted addresses, which is why SMStocks issues its own hedged synthetics instead of wrapping them.

Getting started

Text START to your regional number. The reply gives you an account, asks you to choose a four digit PIN, and tells you where to fund it. Any command that moves value carries that PIN at the end, and reading your own balance never needs one.

If someone sends you shares before you have an account, you get a message explaining what arrived and what to reply. Claiming it creates the account for you, so the first thing you ever do can be receiving rather than signing up.

Commands

Case does not matter and extra spaces are ignored. Every command that moves value ends with your PIN.

SENDSEND <qty> <ticker> TO <number>

Move shares to any phone number on earth.

> SEND 5 sTSLA TO +14155550182

Sent. 5.0000 TSLA held for +1 415 555 0182.
They reply CLAIM to take custody.
Unclaimed transfers return to you in 7 days.

The recipient needs no wallet and no app. Their account is derived from the number itself and comes into existence the moment they reply. If nobody claims the transfer within seven days the position returns to you automatically, and you are told when that happens.

BUYBUY <amount> <ticker>

Open a position against your USDC balance.

> BUY 100 sAAPL

Filled. 0.4658 AAPL at 214.62 USDC.
Hedge opened in the same block as the mint.
USDC balance 892.31.

Sizing is denominated in dollars rather than shares, because fractional quantities are easier to reason about that way. The desk contract reads the mark from the oracle and does the arithmetic itself, so a fill is something you can check rather than something we assert.

SELLSELL <qty> <ticker>

Close all of a position or part of it.

> SELL 0.5 sAAPL

Filled. Sold 1.2500 NVDA at 441.08.
Realised +182.40. Hedge unwound in the same tx.
USDC balance 1,443.81.

Selling moves the position back to the desk and credits you the proceeds in the same transaction, so there is never a half-finished trade. Proceeds are spendable immediately, with no withdrawal window.

BALBAL

Return the whole book in one reply.

> BAL

AAPL  0.4658  cost 214.62  now 221.28
TSLA  5.0000  cost 443.00  now 441.08
NVDA  1.2500  cost 402.10  now 441.08
------------------------------------------
USDC  892.31     Book  $1,204.88

No PIN is needed to read your own balance. The reply is deliberately built to survive a narrow screen, so it stays readable on a feature phone with a twenty character display.

CLAIMCLAIM <code>

Take custody of a transfer sent to your number.

> CLAIM

Done. 5.0000 TSLA is yours.
PIN set. Reply OUT <address> to self-custody.

The first CLAIM also creates your account and sets your PIN. From that point the balance is yours, and you can move it to a wallet you control at any time. Gas is sponsored, so you never have to acquire ETH to receive or claim anything.

Utility commands

CommandSyntaxWhat it does
HISTHIST [days]Recent activity, read from the vault's event log. Live
LIMITLIMITWhat is left of your transfer ceiling before you hit it. Live
OUTOUT <address>Move a claimed balance out to a wallet you control. Live, signed by you
PINPIN <old> <new>Rotate the code that authorises value-moving commands. Planned
BLOCKBLOCK <number>Stop a number from sending to you. Planned
HELPHELP [command]The command list, or the syntax for one command. Live

Security

A phone number is a weak identity on its own, and we treat it that way. Sender ID is trivial to spoof, so it can never be sufficient by itself.

What is enforced today: possession of a number is proven with a one-time code before it can be bound to a wallet, and once bound, withdrawal is signed by that wallet rather than by us. Transfer size and rate are capped at the relayer.

What is designed but not enforced yet: the per-command PIN and the carrier-change freeze described below. They belong to the version that carries real money, and pretending they are live today would be worse than saying this.

The attack we design against most carefully is the SIM swap. If the carrier reports that your number moved to a new SIM, withdrawals freeze for twenty four hours while ordinary transfers keep working. That window belongs to you rather than to whoever took the number, and every command during it is reported to your recovery contact.

You can also cap what a single message is allowed to move. Anything above your ceiling needs a second confirmation sent from the same handset.

Fees

Today a fill executes at the published mark with no spread taken, transfers between numbers are free, and gas on Robinhood Chain is paid by us, which is why a recipient never has to hold ETH. A spread will exist once positions are hedged, because someone has to carry that cost, and it will be quoted in the confirmation rather than buried in a schedule.

Exact numbers are not published yet, because publishing a fee we have not finished testing would be worse than saying nothing.

Limits

Every account has an hourly and a daily ceiling. Text LIMIT and the reply tells you what is left instead of making you discover it by hitting a wall. Ceilings rise as an account ages, and you can lower your own at any time, which is useful if the handset is shared.

What is live

Five contracts are deployed and verified on Robinhood Chain. Transfers, buys, sells, claiming a number and withdrawing to a wallet all execute on chain, and every one of them produces a transaction you can open in the explorer. Prices come from the market and are published to an oracle contract that halts trading when it goes stale.

Two things are not live, and both matter. The synthetics are not hedged, so they track the published price without a position standing behind them. Delivery over SMS is not connected, so the product currently speaks through this site rather than through your inbox.

ContractAddress
PhoneVault0xEdDbF875…987b
Desk0xE38A8cF5…cdFb
PriceOracle0x3Cd37d4D…C1FA
sAAPL0x259bEe7a…078d
sTSLA0xbC22b9Fb…287F
sUSD0x91a0CFE3…2E3E

When something fails

A failed command replies in plain words and prints the exact message that would have worked, because retyping a command on a numeric keypad is expensive. Duplicate messages are safe: every command carries an implicit nonce, so a carrier retry comes back flagged and free rather than doubling your position.

> BUY AAPL 100

Could not read that. Amount comes before the ticker.
Try: BUY 100 sAAPL