Banking should feel
like a conversation.
Corvane is an AI agent on top of a non-custodial wallet for Robinhood Chain. Hold crypto and tokenized stocks, ask for what you want in plain language, and confirm every transaction before it signs.
// PRODUCT
A wallet you can talk to,
and keys only you can use.
Say what you want in plain language. The agent turns it into a structured request, code checks it against the address checksum, the pinned asset list and your balance, and the same validated object builds both the confirmation card and the transaction you sign. Reads answer instantly: balance, history, price.
┌────────────────────────┐
│ send 50 USDG to 0x… ▍│
└────────────────────────┘
text in, JSON outChat-native transactions
Send, swap, buy, sell. Say it the way you would say it. The agent reads your intent and returns structured parameters, ready for you to review.
┌────┬────┬────┐ │ETH │USDG│NVDA│ └────┴────┴────┘ one chain, one wallet
Crypto and stocks, one place
ETH, WETH and USDG sit beside NVDA, TSLA and SPY. On Robinhood Chain they settle on the same rails, so one wallet holds both.
╔═══╗ ║ ◈ ║ ┌╨───╨┐ │░░░░░│ └─────┘
Non-custodial by construction
An embedded wallet, created at login. No seed phrase, no extension. The keys are yours, and yours is the only signature that moves anything.
┌───┐ ┌───┐
│ ai├───►│you│
└───┘ └─┬─┘
┌─▼──┐
│sign│
└────┘You hold the last step
The agent drafts; you approve. Execution is reachable only from the Confirm button. That rule is enforced in code, not requested in a prompt.
0x4b6F…a1C3 ✗ ────────────────────── 0x4b6F2c9d1E7a3B58C0dF 41927aA6E5D3B2c8a1C3▏
Full addresses, never truncated
You see the whole recipient address, in monospace, at the moment you confirm. Nothing is hidden behind an ellipsis.
┌ pinned 27 ─── | ┐ │ USDG pinned ✓ │ │ NVDA pinned ✓ │ │ USDG fake ✗ │ └─────────────────┘
Every asset pinned in code
27 contract addresses taken from the official Robinhood Chain list and verified on-chain. Corvane resolves a symbol to a pinned address. It never discovers a token by searching.
// HOW IT WORKS
Three steps to
a signed transaction.
That’s all the model ever emits. It never writes calldata, and it never signs. The confirmation card and the signed transaction are both built by code, from that same validated object.
// THE NETWORK
Built on Robinhood Chain.
Robinhood Chain is a permissionless, EVM-compatible Ethereum L2 on the Arbitrum stack. Crypto and tokenized equities settle on the same rails, so a single chat box reaches both.
{}EVM-compatible
The same bytecode, addresses, and signatures you already know
∅
Permissionless
Anyone can deploy and transact. The chain is open by design
Ξ
ETH for gas
Fees are paid in ETH, the same gas token as Ethereum
⇌
One set of rails
Stocks and crypto settle on the same chain, so one sentence can move either
Chain ID
46630
┌───┐
│ ◉ │
└─┬─┘
│
Gas token
ETH
┌───┐
│ ◉ │
└─┬─┘
│
Stack
Arbitrum
┌───┐
│ ◉ │
└─┬─┘
│
Execution
EVM
┌───┐
│ ◉ │
└─┬─┘
│
Access
Permissionless
┌───┐
│ ◉ │
└─┬─┘
│
Custody
Yours
┌───┐
│ ◉ │
└─┬─┘
│
Corvane is an independent project. It is not affiliated with, endorsed by, or sponsored by Robinhood Markets, Inc.
// THE ALLOWLIST
28 assets.
Every address pinned.
Corvane builds transactions against a fixed set of assets. A symbol resolves to a contract address taken from Robinhood’s official list and verified on-chain. It never resolves to one found by searching.
// WHAT YOU CAN SAY
Say it plainly.
Confirm what spends.
Say what you want in your own words. The agent turns it into structured parameters, never calldata. Reads answer on the spot. Anything that spends waits for your confirmation.
╭─╮ │◦│ ╰─╯
“what’s my balance?”
Reads. Answers instantly.
╭─╮ │◦│ ╰─╯
“show my transaction history”
Reads. Answers instantly.
╭─╮ │◦│ ╰─╯
“what’s NVDA trading at?”
Reads. Answers instantly.
╭─╮ │◦│ ╰─╯
“how much USDG do I hold?”
Reads. Answers instantly.
┌─┐ │▲│ └─┘
“send 50 USDG to 0x4A8f2Cb9…”
Drafts a transfer. Stops at Confirm.
┌─┐ │▲│ └─┘
“buy 100 USDG of NVDA”
Drafts a swap. Stops at Confirm.
┌─┐ │▲│ └─┘
“swap 0.1 ETH to USDG”
Drafts a swap. Stops at Confirm.
┌─┐ │▲│ └─┘
“sell my TSLA for USDG”
Drafts a swap. Stops at Confirm.
It asks instead of assuming.
A missing amount, an unspecified asset, or an unfamiliar address gets a question, not a guess. The confirmation card and the signed calldata are built from the same validated parameters, never from the model’s prose. The address you see in full is the address that gets signed.
Open the app// THE HARD RULE
The agent can draft. Only you can sign.
Corvane separates intent from authority. The model reads your words and drafts a transaction. The keys stay with you, and the signer answers to one thing only: your tap on Confirm.
╔═══╗ ║ ✗ ║ ╚═══╝
The model never signs
The agent returns a structured intent, never calldata. Signing happens in your wallet, after your tap. Execution is reachable from the Confirm button and nowhere else.
┌───┐ │ = │ └───┘
One object, two uses
The card you read and the calldata you sign are built from the same validated object. What you approve is exactly what executes.
╭───╮ │ 0x│ ╰───╯
Full addresses, always
Recipients are shown in full, in monospace, at confirmation. No truncation, no ellipsis. You approve an address you can actually read.
[===] [===]
A pinned allowlist
Assets resolve to contract addresses fixed in code and verified over RPC against the official docs. Symbols are pinned, never discovered at runtime.
◉─?─◉ │ │ │
Ambiguity becomes a question
Corvane asks instead of assuming. A missing amount or an unfamiliar address gets a question, not a guess.
▪ ▪ ▪ ▪ ▪ ▪
Your keys stay yours
The wallet is embedded and non-custodial. Corvane holds no custody and cannot sign on your behalf, which is exactly why nobody else can either.
Pinned, not discovered
Every asset Corvane can touch resolves to an address fixed in code and read back over RPC. Symbols are resolved by pin, never by search.
⚠
A name can be copied. A contract address cannot.
Search the explorer for USDG and a second token appears, also named “Global Dollar”, same ticker, different address. Alongside it sit impostors calling themselves “unstable degen” and “Upside Down Gorilla” under the same symbol. This is why Corvane pins every contract address in code and verifies it over RPC. The real one is the only one it can reach.Check it yourself →
// UNDER THE HOOD
The model proposes.
Code disposes.
You type a sentence. The model turns it into structured JSON. It is an intent, not a transaction. Code takes it from there: it checks the address, resolves the asset against a pinned allowlist, weighs the amount against your balance, and builds your confirmation card from the exact object it will sign. Three things the model is structurally incapable of doing, and one answer it is always free to give:
It cannot write calldata
The model returns JSON. The transaction is assembled by code, from fields that already passed validation.
It cannot invent an asset
Every symbol resolves to one of 27 contract addresses pinned in code from the official chain docs. Corvane never finds a token by searching.
It cannot sign
Keys stay in your embedded non-custodial wallet. The signature is yours, and it happens on your tap.
Refusal is a first-class result
An address that fails checksum, a ticker outside the allowlist, an amount above your balance: each comes back with a reason, never a best guess.
1// the model returns an intent, never calldata2const intent = await parseIntent(message, walletContext)34// { action: 'transfer',5// asset: 'USDG',6// recipient: '0x...',7// amount: '50' }Say it. Confirm it. Done.
Speak plainly. The agent reads your intent and fills out the transaction; you read the full address and sign it. Nothing moves without your tap.
Built for Robinhood Chain. Non-custodial, your keys, no seed phrase to write down.
