Tokenized stocks, quoted and built.
USDG to Robinhood stock tokens through Uniswap v3: quote, compare against the issuer’s price, and get the unsigned transactions for your own wallet to sign.
USDG to Robinhood stock tokens, 24/7, routed through Uniswap v3 on Robinhood Chain. The service quotes and builds; the wallet that owns the funds signs. An agent holding USDG uses the same three routes the page does.
The number most 24/7 markets leave out
A stock token trades around the clock; the stock it tracks does not. Every quote prints the issuer’s price next to the pool’s:
reference = underlying share price × ERC-8056 multiplier deviation = (pool execution price − reference) / reference
The deviation is signed so that positive is always worse for the taker: above the issuer’s ask when buying, below the bid when selling. It comes back in reference.comparison on every quote.
Endpoints
| Endpoint | |
|---|---|
GET /v1/markets | Stock tokens with a live v3 pool against USDG or WETH, and which pools. Read from the factory, so a token appears only while a pool holds liquidity. |
POST /v1/quote | Price, fee, minimum, route, alternatives, and the issuer comparison. |
POST /v1/build | The quote plus the transactions to sign, in order. Nothing is sent for you. |
GET /healthz | Chain, router, quoter, fee, and the countries the fence blocks. |
curl -X POST https://swap.aeron.sh/v1/quote \
-H 'content-type: application/json' \
-d '{"side":"buy","symbol":"NVDA","amount":"100","slippageBps":50}'side is buy (pay USDG, receive the token) or sell. amount is what you pay, as a decimal string in that asset’s decimals: 6 for USDG, 18 for the tokens. slippageBps defaults to 50 and is capped at 300.
{
"side": "buy",
"sell": { "symbol": "USDG", "amount": "100" },
"buy": { "symbol": "NVDA", "amountGross": "0.4431…", "amount": "0.4420…", "minimum": "0.4398…" },
"fee": { "bps": 25, "amount": "0.0011…", "symbol": "NVDA" },
"price": { "usdgPerToken": "225.63…" },
"reference": { "token": { "ask": "225.50" }, "multiplier": "1", "halted": false,
"comparison": { "against": "ask", "deviationBps": 6, "deviationPct": "+0.06" } },
"route": { "kind": "via-weth", "hops": [ { "from": "USDG", "to": "WETH", "fee": 100 }, { "from": "WETH", "to": "NVDA", "fee": 500 } ] },
"expiresAt": "…"
}Building the transactions
curl -X POST https://swap.aeron.sh/v1/build \
-H 'content-type: application/json' \
-d '{"side":"buy","symbol":"NVDA","amount":"100","taker":"0xYourWallet"}'steps is an ordered list of {kind, to, data, value, description}. The Universal Router pulls the input through Permit2, so a first swap has three steps: an ERC-20 approval of the input token to Permit2, a Permit2 approval of the router for 30 days, and the swap. Both allowances are read on chain first and only the missing ones are returned, so a repeat swap is one step. Send them in order from taker; each must confirm before the next.
The swap step calls execute on the router with three commands: V3_SWAP_EXACT_IN into the router, PAY_PORTION of the output to the treasury (the interface fee), and SWEEP of the rest to msg.sender with the net minimum as its floor. If the pools move past the slippage, the whole call reverts and nothing changes hands. The deadline is expiresAt.
Region
Robinhood stock tokens are not offered to residents of several jurisdictions. Every /v1/ route answers 451 with the resolved country when the request comes from one of them; /healthz lists which. The check uses Cloudflare’s geolocation of the connecting address.
Errors
| Status | Meaning |
|---|---|
400 | Bad body: unknown side, amount not a positive decimal, too many decimal places, slippage over the cap, or no taker on build. |
404 | Symbol not in the catalogue, or inactive. |
409 | No v3 pool would quote the amount. The token may be listed but its pools empty. |
451 | Blocked region. |
502 | The issuer’s registry is unreachable. |
Not investment advice. Robinhood stock tokens are issued by Robinhood Assets (Jersey) Ltd, are economic exposure rather than shares, and can be paused by the issuer.
Updated 3 September 2026. Everything on this page is read from the running services; report a drift at github.com/aeronlabs.