00 · What is listed
Robinhood Chain, chain 4663
The vault holds USDG (Global Dollar) as cash and the tokens below, each swapped against USDG on Uniswap v3. Nothing else can be traded — not BTC spot, not perpetuals, options, leverage or short positions. A value can still watch a symbol the agent cannot trade (BTC, HOOD, MSTR, INTC, any US ticker); the action has to land on a listed token.
01 · The rule grammar
Seven values, one comparator, one number, one action
The compiler is Claude, told exactly this page and the state of your account, and asked for the one typed rule the sentence means. If any part is missing or impossible it refuses and names the part. Numbers may be digits or words; company names map to tickers; other languages are fine.
price([X])
$
X's price in dollars. For a listed token it is the Uniswap pool's own price, 24/7.
from: the pool for listed tokens; the tape (Yahoo Finance) for other US tickers; Binance for BTC
says: trades above / below, hits, reaches, crosses, is at
drawdown([X] or [Account])
%
How far X sits below its highest high of the last 30 sessions, as a positive percentage that grows as the price falls. "Falls eight percent from its high" is drawdown ≥ 8, and the comparator is always ≥. For the account: below its highest value of the last 7 days.
from: 30 sessions of daily highs from the tape; the vault's own value history for the account
says: falls N% from its high, is N% off its high, draws down
ratio([A, B])
%
A's 30-session return minus B's, in percentage points — how far one leg has outrun the other. Two symbols.
from: 30 sessions of closes from the tape
says: outruns, outperforms, beats, is ahead of
spread([A, B])
%
The same divergence over 5 sessions. Two symbols.
from: 5 sessions of closes from the tape
says: spread, over the week
funding([BTC] or [ETH])
bp/h
A perpetual's funding rate, in basis points per hour. Watchable for BTC and ETH only. A rule may watch funding, but its action must trade a listed token (ETH), never a perpetual.
from: Binance futures
says: funding
volume([X])
M
Today's volume in millions: shares for stocks, quote-currency for crypto. "Falls under thirty million" is volume ≤ 30.
from: the tape; Binance for crypto
says: volume
clock([monday…friday] or [daily])
no unit
A schedule with no threshold: op ≥, value 0. Runs at the first evaluation after 16:00 New York on that weekday, or every weekday.
from: the calendar
says: every Friday, at the close, daily, each morning
Comparators
≥ for above, over, past, exceeds, outruns, hits, reaches, by. ≤ for below, under, less than, falls, drops, narrows. A drawdown is a magnitude that rises as the price falls, so its comparator is always ≥, however the sentence phrases it.
Actions, and what they do when they run
close
Sells every named holding in full, to USDG.
args: ["pair"] when two legs were named, else ["position"]
says: close the pair, close the position, get out
sell
Sells that share of the named holding. "Half" is 50%, "everything" is 100%.
args: ["50%"], ["100%"], or the stated share
says: sell half, sell it all, trim a quarter
convert
Sells the named holdings — or, for the account, every holding — to USDG.
args: ["cash"]
says: move everything to cash, go to cash, hold the proceeds in cash
halt
Marks the token halted: no rule may buy it afterwards. Nothing is sold.
args: ["entries"]
says: stop adding, stop buying
ladder
Buys the token in equal tranches, one each time the condition is true, that many times. Without a budget each tranche is an equal share of the cash on hand.
args: ["3"] — the number of tranches — optionally with a budget: ["3", "$6000"]
says: buy in thirds, buy the dip in three tranches, ladder in
rebalance
Buys and sells to the weights between the two named holdings; if only one is named, that holding and cash; if none are named, the two largest holdings (or the one holding and cash). Unnamed legs are allowed — compile it, do not refuse for a missing subject; the account below says what the legs will be.
args: ["60/40"] — the weights
says: rebalance to sixty forty, hold 70/30
buy
Buys the token with that much USDG, never more than the cash on hand or the key's remaining cap.
args: ["$5000"] a dollar amount, ["25%"] a share of the cash on hand, or ["all"]. Default ["25%"] when the sentence names no size.
says: buy, buy the dip, add, put $2,000 into
Refusals
value
no measurable value named ("looks toppy", "feels weak")
subject
no market named, or a ratio/spread with one leg
comparator
no direction
number
no threshold
action
nothing to do
venue
the action would trade something not listed (BTC spot, HOOD, a perpetual, options, shorting, leverage, a limit order)
scope
no live key covers the tokens it trades — name the key and its scope so a wider one can be signed
holding
the action needs a holding or cash the vault does not have (selling what is not held, buying with no USDG)
meaning
not a rule about this account, two rules in one sentence, a question to Roby, or a sentence that cannot be read without guessing
question
the sentence is a rule, but one thing is genuinely open — which two legs, which of two holdings, whether 'half' means the position or the cash — and the person can settle it in a word. Ask one short question instead of guessing or refusing; their next message answers it and the rule compiles then
Cadence and fills
Every armed rule is evaluated once a minute for as long as its key verifies. A listed token’s price is read from its pool; tape values are re-read at most every thirty seconds. A fill is a Uniswap v3 swap against USDG, routed across the fee tiers that have liquidity and measured against a small probe at the same instant; an order that would move the pool past the impact cap is cut to the slice that fits and the rest is worked a minute at a time. Every leg carries slippage protection; the pool’s fee applies.
Dry run
Any sentence that compiles can be run against the last 180 sessions before it is signed. The same value is computed for each day from daily history and tested against the same comparator; the dates it would have fired are reported into the conversation, and nothing is signed.
02 · The session key
One signature, three limits, enforced by a contract
Every account owns a vault contract on Robinhood Chain (RobyVault.sol). The server generates a fresh keypair for the agent; the account signs the vault’s EIP-712 Grant naming that agent’s address, the token scope, the cap in USDG and the expiry; a relayer submits it and pays the gas. The vault stores the grant. Every execution is an Instruction signed by the agent that the vault verifies against scope, cap and expiry before it calls Uniswap — the agent never holds funds and cannot widen a limit it does not control. Sign-in is a separate Sign-In-With-Ethereum message from the same account key.
{
"domain": {
"name": "RobyVault",
"version": "1",
"chainId": 4663,
"verifyingContract": "<the account's vault>"
},
"primaryType": "Grant",
"types": {
"Grant": [
{
"name": "agent",
"type": "address"
},
{
"name": "scope",
"type": "address[]"
},
{
"name": "cap",
"type": "uint128"
},
{
"name": "expiry",
"type": "uint64"
},
{
"name": "nonce",
"type": "uint256"
},
{
"name": "deadline",
"type": "uint64"
}
]
}
}Scope
Every token an order touches must be in the key's scope. A token outside it cannot be quoted, let alone traded.
Cap
The USDG moved by every fill under the key is summed, on buys and sells alike. An execution that would push the sum past the cap reverts on chain.
Clock
A key past its expiry, or revoked, stops verifying. Every rule under it pauses, mid-sentence.
Balance
A sell needs the tokens; a buy needs the USDG. The vault is never short, and only the owner can withdraw.
Re-signing a key signs a new expiry over the same agent address; rules it had paused for expiry resume. Revoking it is immediate and one-way. The account’s own key is never sent to the server: a key made or imported in the browser stays in that browser, and a wallet keeps its own.
03 · The ledger
Every action, and every non-action, on the record
check
Every evaluation: the value read, and idle, fired, refused or error.
receipt
Every execution: the fills, prices and notional, and the Robinhood Chain transaction hash of each swap.
transfer
Every deposit noticed on chain and every withdrawal signed, with the counterparty address and transaction hash.
turn
What Roby said, and when — including the hourly line that nothing happened.
Checks are kept for thirty days; receipts and transfers are kept for the life of the account. The whole ledger exports as one CSV from the desk’s Wallet tab. A refusal is written in the same place as a fill, with the clause that refused it. Every fill and every transfer links to its transaction on Blockscout.
