Docs

Sextant keeps a portfolio of tokenized stocks on course. You choose stocks and the share each should be — the course. Sextant turns that into one transaction that buys the whole portfolio, and later into one transaction that sells what grew past its share and buys what fell behind. It can also cash out any slice of everything you hold.

It is a web page, nothing more. There is no Sextant contract, token, server-side account or key. Every trade goes to Uniswap's SwapRouter02, already deployed on Robinhood Chain; every price is checked against Robinhood's own price feeds. The page reads the chain through a same-origin relay and writes only by asking your wallet to sign.

How a plan is made

The page reads, in one multicall: the price of every stock's deepest USDG pool, every Robinhood feed, and — once a wallet is connected — your balances and router allowances.

  1. Value. The portfolio's value V is the value of every stock you hold at its pool price, plus the dollars you chose to put in.
  2. Target. Each stock's target is its share of V. A stock you hold but left off the course has a target of zero and is sold to the last unit.
  3. Legs. Stocks above target become sales; stocks below target become buys. Differences under a dollar — or under the "leave alone within" band you choose — are left alone.
  4. Quote. Each sale is quoted by Uniswap's QuoterV2 in every fee tier the stock trades in; the best one wins.
  5. Budget. The buys may spend the dollars you put in plus the minimum each sale can return — never more, so the transaction cannot run short half-way, and never the rest of your wallet. They split that budget in proportion to how far each stock is below target, to the unit.
  6. Check. Every leg is held against Robinhood's feed for that stock (below).

The transaction

The whole plan is one call: SwapRouter02.multicall(deadline, [every sale, then every buy]). Each leg is an exactInputSingle that pays its output straight to your wallet and carries its own amountOutMinimum — its quote less your price limit (0.3%, 0.5% or 1%). The deadline is ten minutes after the page builds it, measured by the chain's own clock.

Before the first trade in a stock, your wallet approves Uniswap's router to take that token — once per token. The page asks only for the approvals the plan needs, and you can revoke them at any time. At most 16 legs go in one transaction; the tested maximum used well under half a Robinhood Chain block.

Whatever the sales return above their minimums comes back to your wallet as USDG, and the page shows how much to expect before you sign.

What protects you

All or nothing

If any leg would pay less than its minimum, or the deadline has passed, the router reverts the entire call and nothing moves. Tested on live chain state: one of 5 legs asking 1% more than its quote undid all 5; nothing moved.

A second opinion on every price

For stocks with a Robinhood feed, each leg's execution price is compared with the feed before you sign. A leg priced more than 3% worse than a feed updated in the last 20 hours is refused and named. When the stock market is closed the feed stops printing; then the page warns instead of refusing, because the pool may rightly have moved. Tested: NVDA 5% dearer than a fresh Robinhood price: refused; against a two-day-old price: warned, not refused.

Never your other dollars

Buys are sized from the dollars you put in plus the sales' minimums. Tested: $500 put in beside $10,000 of idle USDG: the wallet paid $499.58, never more.

No custody

Tokens go from your wallet to a Uniswap pool and back to your wallet inside one transaction. Sextant has nowhere to keep them.

Robinhood's feeds

Robinhood publishes Chainlink-style price feeds on its chain (8 decimals, latestRoundData). They are not listed on the explorer by name. Sextant found them by deriving every address their deployer's account ever created and asking each one for its description(): 26 of the 42 stocks and funds have one. The feeds print while the market is open and when the price moves, so a weekend feed can be days old; the page always shows a feed's age beside its price. Every feed address →

How it's tested

The page's own planning module — the same file the browser runs — is executed against live Robinhood Chain state through eth_simulateV1, from test wallets funded by state override. Nothing is broadcast. Every expected value is computed independently, from balances and Transfer logs read back from the chain.

SuiteResult
Properties on live state (block 71,320,868)9/9 passed, 6099 checks
Planted bugs caught by the property named for them13/13
Real browser, real app, test wallet on live state5/5 stages, 18 checks

Buying: $1,000 into 6 stocks in one transaction, every weight within 0.02 points of its target. The sabotage sweep plants one bug at a time — no price limit, buys before sales, one unit of dust left behind, the guard switched off, the deadline ignored — and requires the property written for it to fail. A crash does not count as a catch.

Contracts it uses

None of these is Sextant's. Each was checked by what it answers on chain, not by its name (Blockscout lists several look-alike routers on this chain; only one has the stock pools' factory).

Uniswap v3 SwapRouter02 (every trade)0xCaf681a66D020601342297493863E78C959E5cb2
Uniswap v3 QuoterV2 (every quote)0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7
Uniswap v3 factory (the stock pools)0x1f7d7550B1b028f7571E69A784071F0205FD2EfA
USDG, the dollar (Paxos)0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Multicall3 (batched reads)0xcA11bde05977b3631167028862bE2a173976CA11

Risks

  • You hold real exposure to every stock you pick, and it can fall. Rebalancing keeps your split; it does not protect your money.
  • Tokenized stocks on Robinhood Chain are issued by Robinhood, which can pause transfers or block addresses.
  • Thin pools cost more; the page shows every leg's pool fee and the plan's total cost before you sign.
  • This interface is not audited. Not investment advice.