AERONDocs GitHub
swap.aeron.sh

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:

formula
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/marketsStock 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/quotePrice, fee, minimum, route, alternatives, and the issuer comparison.
POST /v1/buildThe quote plus the transactions to sign, in order. Nothing is sent for you.
GET /healthzChain, router, quoter, fee, and the countries the fence blocks.
bashquote
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.

jsonquote, abridged
{
  "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

bashbuild
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

StatusMeaning
400Bad body: unknown side, amount not a positive decimal, too many decimal places, slippage over the cap, or no taker on build.
404Symbol not in the catalogue, or inactive.
409No v3 pool would quote the amount. The token may be listed but its pools empty.
451Blocked region.
502The 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.