Rialto

Documentation

Everything Rialto does, in order

One wallet on Robinhood Chain pays for x402 endpoints in USDG and funds private Venice inference. Below: install, fund, run, connect an agent, read the chain without installing anything, and the limits that keep the wallet safe.

1. Install and create the wallet

Node 20 or newer. The command creates a private key in your home folder, prints the address, and tells you what to send to it.

npx https://rialto.casa/downloads/rialto-kit-0.9.0.tgz init

To keep the command short afterwards, install it once globally:

npm install -g https://rialto.casa/downloads/rialto-kit-0.9.0.tgz

2. Fund it

Send USDG (contract 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168) and a few cents of ETH to the printed address on Robinhood Chain, chain id 4663. Bridges such as relay.link and across.to deliver USDG there from Base, Arbitrum or Ethereum in seconds. Then:

rialto fund 10

The command quotes Relay (Across as fallback), approves and deposits USDG, waits for USDC on Base at the same address, then signs a gasless USDC authorization that Venice settles into a prepaid balance. Venice needs at least 5 USD per top-up, so the bridged amount is raised when fees would push it under.

3. Run

rialto chat "What is NVDA trading at on Robinhood Chain?" --web
rialto agent "Compare AAPL, TSLA and NVDA on Robinhood Chain and name the deepest pool" -b 0.25
rialto pay https://api.naven.network/x402-test/ping --max 0.01

Commands

Configuration

Stored in ~/.rialto/config.json (mode 600). Environment variables win over the file.

KeyEnvMeaning
privateKeyRIALTO_PRIVATE_KEYThe wallet. Generated by init, stored with mode 600.
veniceApiKeyVENICE_API_KEYUse an API key instead of the wallet ledger.
defaultModelRIALTO_MODELVenice model id. Default zai-org-glm-5-2.
agentBudgetUsdRIALTO_AGENT_BUDGET_USDHard cap per agent run. Default 1.
maxPaymentUsdgRIALTO_MAX_PAYMENT_USDGHard cap per x402 payment. Default 1.
payAllowlist·Hostnames the payer may pay. Empty means any HTTPS host.
·RIALTO_RPC_ROBINHOODOverride the Robinhood Chain RPC. Public fallbacks are built in.

MCP

Local server over stdio, with every tool and the wallet. Claude Desktop, Claude Code, Cursor, Hermes, OpenClaw:

{ "mcpServers": { "rialto": { "command": "npx", "args": ["-y", "https://rialto.casa/downloads/rialto-kit-0.9.0.tgz", "mcp"] } } }

Hosted, read-only, no install (Streamable HTTP, stateless): chain status, balances, wallet reports, stock prices, pools.

https://rialto.casa/mcp

Tools: rialto_wallet, rialto_access, rialto_access_sign, hood_usdg_transfers, hood_recent_trades, hood_token_check, hood_chain_status, hood_balances, hood_wallet_report, hood_stock_price, hood_stock_find, hood_top_pools, hood_send_usdg, x402_pay, venice_chat, venice_web_search, venice_models, venice_balance, venice_transactions, rialto_quote_bridge, rialto_fund_venice, rialto_agent.

Hosted API

Index at /api, full description at /openapi.json (OpenAPI 3.1), one-page brief for agents at /llms.txt, dependency health at /status.

curl https://rialto.casa/api/chain
curl https://rialto.casa/api/stocks/NVDA
curl "https://rialto.casa/api/stocks?q=TSLA"
curl https://rialto.casa/api/wallet/0xb9A67f59bcfd3b45fe1ca2c55A55C19B2b35B58f
curl "https://rialto.casa/api/pools?limit=10"
curl https://rialto.casa/api/check/0xe0fb5d77c627ba9c7950fc0d62d1d96603e7b7c6

Responses are JSON with ok and data. Prices come from GeckoTerminal (30 requests per minute); chain reads use a pool of public RPCs with a short cache.

Live feeds and playground

Three feeds read straight from the chain and GeckoTerminal, on the live page, the API and the MCP (hood_pulse, hood_usdg_transfers, hood_recent_trades):

curl https://rialto.casa/api/live/pulse
curl "https://rialto.casa/api/live/transfers?blocks=150&limit=25"
curl "https://rialto.casa/api/live/trades?token=NVDA"
curl https://rialto.casa/api/token/burns
curl "https://rialto.casa/api/token/holders?top=10"
curl "https://rialto.casa/api/token/ohlcv?hours=48"
curl https://rialto.casa/api/token/wallet/0x987e58beD5028b28cFe5E8c709b8533D6F908ebE
curl "https://rialto.casa/api/token/leaderboard?limit=25"

The token ledger endpoints read the chain directly: burns are Transfer events to the dead address, holders come from replaying every transfer of the contract, candles come from GeckoTerminal. MCP tools: rialto_burns, rialto_holders, rialto_price_history, rialto_rank, rialto_leaderboard. Any wallet gets a badge at /badge/{address}.svg: rank, balance, never sold, day one.

The playground proxies one Venice chat request per signed SIGN-IN-WITH-X header. Any client can use it: sign a SIWE message for api.venice.ai (chainId 8453, uri = the chat completions URL, 5 minute expiry, fresh nonce) and POST it:

curl -X POST -H "content-type: application/json" -d '{"siwx":"<base64 header>","messages":[{"role":"user","content":"hi"}],"live":true}' https://rialto.casa/api/chat

The server forwards the header once and keeps nothing. Venice bills the signing wallet. A wallet without credit gets a 402 with funding instructions.

Pay per call (x402) and the flywheel

Rialto is also an x402 seller on Robinhood Chain. Four endpoints answer 402 with a PAYMENT-REQUIRED challenge in USDG; any x402 v2 client (the kit included) signs an EIP-3009 authorization, the Naven facilitator settles it on chain, and the answer comes back with a PAYMENT-RESPONSE receipt. No account, no tier, no rate limit on this lane.

rialto pay https://rialto.casa/x402/check/0xe0fb5d77c627ba9c7950fc0d62d1d96603e7b7c6 --max 0.05
rialto pay https://rialto.casa/x402/portfolio/0x000000000000000000000000000000000000dEaD --max 0.05
rialto pay https://rialto.casa/x402/pulse --max 0.05
rialto pay https://rialto.casa/x402/batch -X POST -d '{"calls":[{"tool":"hood_chain_status"},{"tool":"hood_stock_price","args":{"symbol":"NVDA"}}]}' --max 0.1
curl -i https://rialto.casa/x402/pulse

Prices: check 0.02 USDG, portfolio 0.01, pulse 0.005, batch 0.05. Every USDG received lands in the treasury, which buys Rialto back and sends it to the dead address. Revenue, buybacks and burns are read from the chain at /api/flywheel and shown on the home page.

Two more ways to pay on that lane. Sign in (the kit does it automatically on rialto.casa; otherwise send x-rialto-auth) and the 402 is priced for your tier: Holder 50% off, Pro 75% off. Or pay in Rialto: the 402 body carries payInRialto.amount; burn that many Rialto (a transfer to the dead address), then retry with header x-rialto-burn: <tx hash>. rialto pay <url> --burn does both steps. A burn pays for one call and must be less than 30 minutes old.

Burn to unlock: every 10,000 Rialto a wallet sends to the dead address buys it 24 hours of Pro tier (up to 30 days per burn), read from the logs when the wallet signs in. rialto burn 10000 --yes.

Holder tiers

The hosted API and MCP apply a tier from the Rialto token balance of the wallet that signs in. Free without signing: 30 requests per minute per IP. Holder, 300,000 Rialto: 120 per minute plus hood_portfolio and GET /api/portfolio/{address}. Pro, 1,000,000 Rialto: 600 per minute plus hood_batch and POST /api/batch (20 calls in one request).

Sign a 24 hour token with the kit, or with a browser wallet on the explorer. The message is plain text; nothing moves and no gas is spent.

rialto access sign
curl -H "x-rialto-auth: $TOKEN" https://rialto.casa/api/access
curl -H "x-rialto-auth: $TOKEN" https://rialto.casa/api/portfolio/0x000000000000000000000000000000000000dEaD
curl -X POST -H "x-rialto-auth: $TOKEN" -H "content-type: application/json" -d '{"calls":[{"tool":"hood_chain_status"},{"tool":"hood_stock_price","args":{"symbol":"NVDA"}}]}' https://rialto.casa/api/batch
curl https://rialto.casa/api/access/0x000000000000000000000000000000000000dEaD

The token also works as ?auth= on the MCP URL for clients that cannot set headers. Every response carries x-rialto-tier, x-ratelimit-limit and x-ratelimit-remaining. Over the limit: HTTP 429 with retry-after.

Security and limits

Facts the code relies on

Source and downloads on the home page. Updates on X.