How i-on works
This is the whole method, written out so that anyone can rebuild it. Where a number came from a paper, the paper is linked. Where a number is ours, it says so. There is no step here that is hidden, because the only private thing in this project is a balance, and even that can be seen with a key.
The tissue
The neurons are from the MICrONS dataset, the minnie65 volume, a 1.4 by 0.87 by 0.84 millimetre block of visual cortex from a mouse aged 87 days. It was imaged with serial section electron microscopy and segmented automatically, then proofread by people. We use static release v1300 from January 13, 2025. From it we take the cells whose axon and dendrite were both marked proofread, keep the eleven classes listed on the slab page, sort by id, and stop at 2,048. The slab is a sample, not the volume. It is not a whole circuit. Every cell in it is missing most of what it connects to in life, and we say so on every page where that matters.
plate one, the slab in the volume
The cells
Each cell is one point in the model. Its shape is only for drawing: we sample its proofread skeleton down to at most 400 points and draw those. Its type comes from the published cell type model, and its type decides only one thing in the model: whether it excites or inhibits the cells it connects to. Pyramidal cells excite. Basket, bipolar, Martinotti and neurogliaform cells inhibit.
the constants
| constant | value |
|---|---|
| membrane time constant tau_m | 20 ms |
| synaptic time constant tau_s | 5 ms |
| resting potential V_rest | -52 mV |
| reset potential V_reset | -52 mV |
| threshold V_th | -45 mV |
| refractory period t_ref | 2.2 ms |
| membrane resistance R_m | 10 MOhm |
| integration step dt | 0.1 ms |
| synaptic weight per synapse w_1 | 0.275 mV |
| weight scale s | 8 |
The model
The model is leaky integrate and fire. Every tenth of a millisecond, each cell's voltage relaxes toward rest, is pushed by the current injected into it, and is pushed by the synaptic drive it received. When it reaches threshold it spikes, resets, and ignores everything for 2.2 milliseconds. The constants are the ones used for a whole fly brain in Shiu, Sterne and colleagues, 2024, because they are published, they are plain, and they make a network of this size fire at rates that look like tissue. The weight scale of 8 exists because the slab sees only a small fraction of each cell's real inputs.
I_syn_i <- I_syn_i * exp(-dt / tau_s) + sum over presynaptic spikes at this step of (sign_pre * w_1 * s * n_syn_pre_i) V_i <- V_i + (dt / tau_m) * ((V_rest - V_i) + R_m * I_ext_i + I_syn_i) when not refractory if V_i >= V_th: emit spike, V_i <- V_reset, refractory until t + t_ref
plate two, one cell for one second
The wiring
Synapses come from the published synapse table, counted per ordered pair of cells that are both in the slab. A pair with more synapses pushes harder. Excitatory cells add to the target's drive, inhibitory cells subtract. We do not know the real strength of any synapse; we know how many there are and how big they are, and we use the count.
wiring in numbers
| what | value |
|---|---|
| cells | |
| pairs | |
| synapses counted | |
| mean synapses per pair | |
| cells with no input in the slab | |
| cells with no output in the slab | |
| excitatory pairs | |
| inhibitory pairs |
The channels
A one minute price move becomes a current. A quarter of a percent is one unit, three quarters saturate. The current goes into that stock's listeners, twenty four cells near the middle of that stock's run along the slab. The voters are twenty four cells at the ends of the run. Between them is the field, which hears only through synapses. ZEC is the ninth channel and it goes into every inhibitory cell with the opposite sign of what you might expect: a rise makes them fire and the slab goes quiet.
from move to current
| one minute move | stock current nA | chloride current nA |
|---|---|---|
| -1.00% | -1.50 | -1.00 |
| -0.75% | -1.50 | -0.75 |
| -0.50% | -1.00 | -0.50 |
| -0.25% | -0.50 | -0.25 |
| -0.10% | -0.20 | -0.10 |
| +0.00% | 0.00 | 0.00 |
| +0.10% | 0.20 | 0.10 |
| +0.25% | 0.50 | 0.25 |
| +0.50% | 1.00 | 0.50 |
| +0.75% | 1.50 | 0.75 |
| +1.00% | 1.50 | 1.00 |
The rule
At the end of each minute the voters' spikes are counted against what is usual for them, which is the median of their count over the last thirty quiet minutes. A rise with one and a half times the usual firing is a buy. A fall with half the usual firing is a sell. A stock that was acted on in the last fifteen minutes is left alone. A position is never more than a quarter of the book.
if d > 0 and r >= 1.5 and no buy of this stock in the last 15 minutes and position value < 25 percent of book: BUY if d < 0 and r <= 0.5 and position > 0 and no sell of this stock in the last 15 minutes: SELL otherwise: HOLD
sizing
| parameter | value |
|---|---|
| buy size | 10 percent of the book |
| position cap | 25 percent of the book |
| sell size | the whole position |
| lockout after acting | 15 minutes |
| buy threshold | 1.5 times usual |
| sell threshold | 0.5 times usual |
| usual | median of the last 30 quiet minutes |
| quiet minute | a move under 0.05 percent |
| minimum quiet minutes before acting | 5 |
The bath
The book is one account on Robinhood Chain. It holds USDG and stock tokens. Stock tokens are ERC-20 tokens with eighteen decimals issued against real shares, and their balances carry a multiplier that changes on corporate actions, so we convert balance to shares with the multiplier and never touch the price with it. Prices are Chainlink feeds on the chain, eight decimals, read with latestRoundData. A feed older than an hour is stale and its channel injects nothing. Orders are swaps on Uniswap on Robinhood Chain, signed by a keeper that is not this site.
how an order is sent
| step | detail |
|---|---|
| route | USDG to the stock token, or back, on Uniswap on Robinhood Chain |
| slippage | 50 basis points, or the order fails |
| confirmation | polled every 5 seconds for 2 minutes |
| soft confirmation | under one second from the sequencer |
| hard finality | about 13 minutes, after Ethereum finality |
| who signs | the keeper, never the site |
The membrane
The inside is a Zcash Orchard address. Its full viewing key is public; its spending key is not. Once a day, half of what the bath has gained above its best goes inside, through a swap to ETH, the canonical bridge to Ethereum, and a NEAR Intents swap from ETH to ZEC delivered to the inside address. The bridge takes seven days. The note that arrives carries a memo with the run's receipt. If the bath falls under 85 percent of where it started, the pump runs the other way, and that is the only time the spending key is used.
the route
| hop | what happens | where it is public | how long |
|---|---|---|---|
| 1 | the bath swaps USDG for ETH on Robinhood Chain | the transaction on Robinhood Chain | one block |
| 2 | the ETH is withdrawn through the canonical bridge to Ethereum | the withdrawal on Robinhood Chain and the claim on Ethereum | seven days, the refractory period |
| 3 | the ETH is swapped for ZEC through NEAR Intents, sent to the inside address | the deposit on Ethereum | minutes |
| 4 | the ZEC arrives as an Orchard note with a memo | only with the viewing key | one block |
plate three, the two sides
Time
One second of your time is ten seconds of the slab's. A real minute is ten model minutes. Spikes are stored every hundred model milliseconds. The map, the slab and the clamp on the bench replay the server's steps; the server is the only authority on what fired.
clocks
| what | how long |
|---|---|
| wall second | 10 model seconds |
| wall minute | 10 model minutes |
| step | 0.1 ms |
| stored resolution | 100 ms |
| voter window | the last 10 model minutes |
| price read | every wall minute at second 0 |
| book read | every wall minute at second 20 |
| pump check | 21:00 UTC daily |
| inside read | every 5 minutes |
A minute walked through
At second zero the feeds are read. Suppose one stock has moved. Its listeners get a current for the next ten model minutes. Its voters fire, or do not. At the end of the minute the voters' count is compared with what is usual. If the move was up and the count was high, the rule buys a tenth of the book, unless it already acted or the position is full. The order goes to the keeper, which signs a swap and returns a hash. The hash is written down. The log line is written down. The next minute starts.
What can go wrong
failure and what you see
| failure | what the site shows |
|---|---|
| a feed is stale | the channel status reads stale and it injects nothing |
| the sequencer is down | every channel reads sequencer down |
| the market is closed | the channel reads closed |
| no keeper | orders are written with the status not sent |
| no address | the book slots are empty and the label says no address configured |
| no cave token | the wiring tables show their headers and say the token is not set |
| a font failed to load | the header says so in teal |
| the model stalled | the log header reads stalled with the age in seconds |
Glossary
| word | meaning |
|---|---|
| slab | the set of cells we simulate |
| bath | the public side, the account on Robinhood Chain |
| inside | the private side, the Zcash Orchard address |
| membrane | the boundary between them and the pump across it |
| channel | one input: a stock, or ZEC |
| listener | a cell that receives a channel's current |
| voter | a cell whose spikes are counted for a channel |
| field | a cell that hears only through synapses |
| usual | the median voter count over quiet minutes |
| the pump | the daily move of excess inside |
| refractory | the seven day bridge wait |
| note | a received amount inside, with its memo |
| keeper | the service that signs, off this site |
Run it here
plate four, your run
| channel | fired |
|---|---|
| AAPL | |
| MSFT | |
| NVDA | |
| AMZN | |
| GOOGL | |
| META | |
| TSLA | |
| SPY |