Lend the stock you hold. Short the stock you don't.

Locate is a stock lending market for Robinhood Chain stock tokens, open every hour of the week. Lenders earn the borrow fee in USDG. Shorts post USDG once and borrow any listed ticker.

1. Holders lend. Deposit NVDA you already own. You keep its price moves, splits and dividends.

Live on the testnet

Fourteen markets read straight from Robinhood Chain testnet. Every ticker publishes its borrow rate, a short interest signal tokenized stocks did not have.

Borrow ticket

NVDA

…

reading chain
Borrow APR…
Supply APY, paid in USDG…
Utilisation…
Available to borrow…
Initial ratio / liquidation…
ERC-8056 multiplier…
Last print…

Live from Robinhood Chain testnet. Prices are the mainnet Chainlink prints, mirrored.

Markets live

…

Lent to the pools

…

at the current prints

Best supply APY right now

…

rates follow utilisation

TickerPriceSessionSupply APYBorrow APRAvailable
Reading the chain…

How a market works

One pool per ticker, one USDG account per borrower. The pool is an ERC-4626 vault over raw token units; everything the protocol owes or is owed is counted in those units.

Who lends, who borrows, where USDG flowsLenders deposit stock tokens into a pool; borrowers post USDG collateral, borrow tokens from the pool and sell them on Uniswap; borrow fees in USDG flow back to lenders and to the insurance fund.DEPOSIT NVDAlNVDA SHARESBORROW RAWREPAY RAWSELL, BUY BACKUSDG FEES10% SHARELendershold stock tokensONE PER TICKERLending poolERC-4626, raw unitsBorrowersUSDG collateralUniswap v3NVDA / USDG poolLender rewards90% of fees, claim any timeInsurance fundpays bad debt first
  • The pool, where every market lives
  • Lender side
  • Borrower side
  • USDG held by the Controller
  • Dashed: returns and small flows
Lenders hold shares over raw token units. Borrowers hold one USDG balance and owe raw units per ticker. Fees are USDG: 90 percent to the pool's shareholders, 10 percent to insurance.
Read the mechanics

A lender deposits NVDA and receives lNVDA shares. The pool lends raw units to borrowers up to 90 percent utilisation and keeps the rest idle so lenders can always leave. The fee a borrower pays accrues in USDG against the borrower's collateral and is credited to the pool's shareholders as it accrues; a lender claims it whenever they like.

A borrower deposits USDG once and can borrow any listed ticker against it. The initial ratio is 1.5 times the debt value for the large names and 2 times for the thinner ones; liquidation starts at 1.25 and 1.5 times. One account can hold several shorts, and the health factor adds them up.

A short, step by step

A short in one transactionSequence of calls: the trader calls the ShortRouter, which borrows through the Controller with a callback, sells the tokens on Uniswap, deposits the USDG proceeds as collateral, and the Controller checks the initial ratio only then.SHORT 10 NVDA, MIN OUTBORROW WITH CALLBACKBORROW 10 RAW TO ROUTERSELL 10 NVDA FOR USDG≈ 2,370 USDGDEPOSIT PROCEEDS AS MARGINDONE: DEBT 10 NVDA, HEALTH ↑CHECK INITIAL RATIO ≥ 1.5TraderShortRouterControllerLending poolUniswap v3
  • Controller, the only check that matters
  • Dashed: returns
The check runs after the callback, so the proceeds already count as margin. A trader needs 1.5 times the position in total, of which the sale itself provides one times, the same shape as a brokerage margin requirement.
Read the mechanics

The ShortRouter is an operator the trader approves once. It borrows through a deferred-check call: the Controller hands the tokens over, lets the router sell them on Uniswap and deposit the USDG, and only then checks the ratio. The whole thing reverts if the ratio is missed, so nothing half-happens.

Corporate actions cost no code

A 2-for-1 splitBeforeAfter
Raw balance (what the ledger stores)10.00000010.000000
uiMultiplier1.0000002.000000
Effective shares (what the holder owns)1020
Borrower owes10 raw10 raw
Chainlink price per raw token$480.00$240.00
Debt value$4,800$2,400 x 2 = $4,800
Read the mechanics

Robinhood Chain Stock Tokens follow ERC-8056: a split or a reinvested dividend never changes a raw balance, it changes a multiplier. Because Locate counts raw units and the Chainlink feed already prices one raw token, a 2-for-1 split moves nothing in the protocol.

Prices, around a 24/5 feed

The tokens trade every hour of the week on Uniswap. Chainlink's equity feeds on Robinhood Chain update only while the US session runs. The oracle router treats that gap as a state, not a surprise.

Robinhood's 24/5 session across the weekTimeline of a week with the trading session marked from Sunday 20:00 Eastern to Friday 20:00 Eastern, and the weekend gap where only the pool trades.SunMonTueWedThuFriSatSESSION OPEN, FEEDS LIVECLOSED: POOL ONLYSUN 20:00 ETFRI 20:00 ETUS MARKET HOLIDAYS CLOSE THEIR SESSION DAY
Chainlink's equity feeds on Robinhood Chain update inside this window. Outside it the oracle keeps the last print and lets the pool price move it within a band that starts at 2 percent and widens 0.1 percent per hour, to 10 percent at most. Debt is always valued at the higher of the two.
The four price regimesState machine with Open, Closed, Paused and Degraded states; the session calendar moves between Open and Closed, stale or disagreeing prices move to Degraded, and a paused token or sequencer moves any state to Paused.FRI 20:00 ET, SESSION ENDSSUN 20:00 ET, FRESH PRINTPRINT OLDER THAN 25 HFRESH PRINTTOKEN PAUSED / SEQUENCER DOWNHEALTHY FOR 1 HOpenfresh Chainlink printClosedlast print, TWAP in a bandDegradedstale, or pool off by > 10%Pausedno new borrows
  • Normal trading state
  • States that block new borrows
  • Dashed: recovery
New borrows are allowed in Open and Closed, never in Paused or Degraded, and never in the last 30 minutes before a session opens. Repaying, covering, withdrawing and liquidating work in every state.
Read the mechanics

Inside the session a fresh print is the price. Outside it, the router reads the pool's 30-minute TWAP, clamps it into a band around the last print, and values debt at the higher of the two. Sunday-night news that moves the pool therefore raises collateral requirements before Monday's first print.

The token's own flags matter too: a Stock Token sets oraclePaused() while a corporate action is processed and paused() if transfers halt. Either one, or a sequencer outage, pauses new borrows.

Liquidations that need no capital

Below health 1.00 an auction opens. The discount on the borrower's USDG grows with time, so the first liquidator to show up pays the fairest price and a slow weekend still clears.

Auction discount over the first 30 minutesLine chart of the liquidation discount rising linearly from 1 percent at the start of an auction to 12 percent at 20 minutes, then holding flat.0%5%10%15%0 min10 min20 min30 min1% AT OPEN12% FROM 20 MINAUCTION CLEARS WHEN HEALTH IS BACK AT 1.00
A liquidator repays raw units and receives USDG at the current discount. Half of a position may be taken, or all of it below health 0.95. The flash path borrows the units from the pool itself and buys them back on Uniswap, so no capital is needed.
Read the mechanics

The flash path lives in the Liquidator contract: it borrows the raw units from the pool's own ERC-3156 flash loan at 5 basis points, repays the unhealthy account, receives USDG at the discount, buys the units back on Uniswap, returns the loan and keeps the difference. The pool's lenders earn the flash fee. A keeper runs this every ten seconds on testnet; anyone can run one.

If an account runs out of USDG with debt left, anyone can absorb it: the insurance fund, fed by its 10 percent of every fee, compensates lenders in USDG, and only the remainder becomes a pro-rata haircut on that pool.

What runs on Stylus

Two contracts do the arithmetic the Controller depends on every time money moves: the risk engine and the oracle router. Both are Rust, compiled to WebAssembly and activated on Robinhood Chain.

Solidity contracts around a Stylus coreArchitecture: the Solidity Controller calls a Rust risk engine and a Rust oracle router on Stylus; the oracle router reads a Rust market calendar, Chainlink feeds and Uniswap pools; the Controller moves tokens through the Solidity lending pools and the periphery.EVALUATE, RATESQUOTE, REGIMESESSIONLATEST PRINTOBSERVE TWAPBORROW, REPAYCALLBACKSSOLIDITYControllerSolidity, accounts and auctionsRUSTRisk engineRust on Stylus, 14.1 KBRUSTOracle routerRust on Stylus, 29.6 KBLending pools14 ERC-4626 vaultsShortRouter, LiquidatorSolidity periphery, Uniswap routesChainlinkper token, 24/5CalendarRust on StylusUniswap v3 poolstoken / USDG
  • Rust on Stylus, the two contracts the Controller calls
  • Rust on Stylus, read by the router
  • Solidity
  • External
The Controller is Solidity and only knows two interfaces. Their production implementations are Rust on Stylus; Solidity reference copies stay deployed, and the live chain showed both identical to the wei before the switch.
14.1 KB
risk engine, compressed
29.6 KB
oracle router, two fragments
10.9 KB
market calendar
100
Foundry tests, requirements first
6
invariants over 8,192 random calls each
17
Rust unit tests
Read the mechanics

The risk engine evaluates every position of an account in one call over 512-bit intermediates, rounding debt up and health down. The oracle router ports Uniswap's tick math to read the pool TWAP, runs the band and regime rules, and reads the token flags with tolerant static calls. The market calendar knows the session, US daylight saving and the holiday list.

Each has a Solidity reference. scripts/diff-check.ts ran both on the live chain across 40 random health evaluations, nine rate points, six auction points and all 14 quotes, found them identical to the wei, and switched the Controller. The references stay deployed for anyone to repeat it.

Where it can go wrong, and what stops it

The threat model is written down with the controls that answer each risk and a self-audit checklist that has to be ticked before any mainnet deployment.

RiskControl
Thin weekend poolDebt valued at the higher of print and banded TWAP; borrow caps tied to pool depth; pre-open guard
Stale or paused feedDegraded or Paused regime: no new borrows, everything else open
Reentrancy and callbacksGuards on every entry that can hurt an account; deposit and repay are the only calls allowed inside a callback
ERC-4626 inflationDecimals offset of six, zero-share deposits revert, deployer seeds every pool
RoundingDebt rounds up, health rounds down, flash fee rounds up
Bad debtInsurance fund first, then a pro-rata haircut on that market's lenders, stated on the Markets page
Admin keysGuardian can only pause borrows and listings; owner moves behind a multisig and timelock before mainnet
Read the mechanics

Still open: weekend pricing on thin pools is contained, not removed; an outside review of the Stylus and liquidation code is the first milestone; and securities lending of tokenized stock may draw regulatory comment even for non-custodial software, which is why the app carries the issuer's regional notice.

Try it on the testnet

Sign in with an email or a wallet, take mock USDG from the faucet, lend a token or short one. Robinhood's own faucet hands out ETH and the real AMD, AMZN, NFLX, PLTR and TSLA tokens that Locate lists.