How Stockimus works.
Stockimus splits a tokenized stock into two things you can trade on their own: the price of the share, and the drip, every dividend it earns until a date. This page is the whole mechanism, plainly, with each number written the way the contracts use it.
01The split
Stock tokens on Robinhood Chain never pay out cash. When the company pays a dividend, the issuer reinvests it for every holder at once by raising the token's on-chain multiplier, uiMultiplier() (ERC-8056). Raw balances never move. Each token simply stands for a little more stock than it did the day before, and that quiet climb is income. Stockimus gives that income a token of its own.
Everything happens inside a series: one stock token and one maturity date, named by a tag such as SPY-DEC27. Deposit the stock and the series vault mints two ERC-20s in equal amounts:
- pToken, the price (pSPY-DEC27, named Stockimus Principal SPY Dec 2027). The share with its dividends peeled off until maturity. It should trade a little below one share and redeems at settlement for the share count you deposited, measured when the series began. In bond terms, a zero coupon bond made out of equity.
- yToken, the drip (ySPY-DEC27). Every dividend the deposit earns before maturity, and nothing else. It costs a small slice of the share price, carries no leverage and cannot be liquidated. At settlement it redeems for the extra stock those dividends added, less 5% of that extra.
Merge is the anchor. One pToken plus one yToken always turn back into one stock token, in full, for free: while the series is active, after it matures and after it settles. Because that door never closes, the two halves cannot wander far from the share they came from.
"How do I claim my dividend?" You do not, here or anywhere else. On Robinhood Chain the payout is already inside every holder's stock tokens the moment the multiplier moves, whether a wallet shows it or not. What Stockimus adds is a market price for that income and a way to buy or sell it on its own. If a site asks you to connect a wallet and press a button to claim stock token dividends, treat it as a scam and close the tab.
02Where this comes from
Separating an asset from the income it throws off is one of the oldest moves in finance. Bond dealers do it every day, a family of 1980s trusts did it to blue chip shares, and futures exchanges list contracts on nothing but dividends. Stockimus makes the same cut on stock tokens.
- Treasury STRIPS, 1985 onward. A US Treasury note or bond can be separated into its principal payment and each of its interest payments, and every piece then trades as its own zero coupon security. A principal strip sells below face value and pays face value at maturity. The pToken has the same shape: you hold the asset without its income and collect the full principal at the end.
- PRIMES and SCORES, 1983 to 1992. The Americus Trusts took in shares of large US companies and issued two units against each one, listed on the American Stock Exchange. The PRIME collected the dividends and the price gains up to a cap, the SCORE took whatever gain ran past that cap, and the pair turned in together came back out as the share. Tax changes in 1986 ended new trusts. It is the nearest equity ancestor, with the knife in a different place: Stockimus cuts income away from principal instead of cutting the price at a cap.
- Dividend futures. Exchanges list futures on the dividends of index members and of single stocks. Each contract settles on the dividends actually paid over a fixed window, which is the exposure a yToken holds. Those contracts sit behind futures accounts and margin rules. A yToken is an ERC-20 in any wallet.
What Stockimus changes is the plumbing. The split is self-serve, the bookkeeping reads the token's own multiplier on chain, and a matched pair merges back into the stock at any moment, with no trust to wind up and no desk to call.
03The math
Every stock token gets one accountant. It keeps a dividend index d that starts at 1 and is multiplied by each classified dividend, and by nothing else. Stock splits go into a separate split factor, so they never touch d. A series writes down d0, the index on the day it was created, and at settlement freezes dT, the index in force at maturity.
Rounding always favours the vault. Every division rounds down, so redeeming a of each half pays out exactly a, or one wei less when both results round. The vault can never owe more stock than it holds. A split mints a minus the fee, never more than it took in, and the vault checks by balance that it received exactly the amount it asked for.
A worked example
Illustrative numbers, not a forecast.
The 98.42365 SPY tokens the principal gets back are worth 99.9 tokens as they stood at d0, which is exactly what was split. The dividend growth on top belongs to the yield half, and the treasury keeps 5% of it. A stock split changes the multiplier and the split factor but leaves d0 and dT alone, so both halves keep the same raw amounts and the split washes straight through.
From pool prices to rates
The app and the rates page read both prices from the pools, in stock per token, and turn them into yearly numbers:
Buying the pToken at px and holding it to maturity turns px into one share's worth of stock: that is the fixed rate, earned in the stock itself. While a series is active, previewRedeemPT, previewRedeemYT and accruedDripFactor use today's index, so they show what has accrued so far; after maturity they use the index in force at maturity. They are estimates until dT is frozen.
04Fees
| ACTION | FEE | NOTES |
|---|---|---|
| split | 10 bps | taken from the deposit on the way in, paid to the treasury in stock; hard cap 50 bps |
| merge | 0 | free in every state, before and after settlement |
| redeem pToken | 0 | the principal is never charged |
| redeem yToken | 5% of the drip | 500 bps of the dividend growth only, never of principal; hard cap 10% |
Fees are fixed per series. The factory owner can change the split and yield fee for series created afterwards, within the hard caps. Each vault copies both fees the moment it is created and keeps them for life, so nobody can raise the fee on a series you already hold. A holder of both halves after settlement can merge at par instead of redeeming, so the yield fee is paid only on yTokens redeemed on their own.
Where fees go. Both fees are paid in the stock token itself, to the treasury address the factory names at that moment. If the stock token refuses that transfer, the fee waits in the vault as unclaimedFees instead of blocking the split or the redemption, and anyone can send it on later with claimFees(). What the treasury does with fees after that is a treasury decision, not contract code, and its transactions are public.
Swaps pay the ordinary Uniswap pool fee: 0.05% on pToken/stock, 1% on yToken/stock and 0.3% on pPFE/USDG. That fee goes to whoever provides the liquidity. One line: a thin fee on the way in, a thin slice of the drip, nothing on exit.
05The pools
Each series trades in two Uniswap v3 pools on Robinhood Chain, both priced in the stock itself: pToken/stock (pSPY/SPY) on the 0.05% tier and yToken/stock (ySPY/SPY) on the 1% tier. Pfizer also gets one dollar pool, pPFE/USDG on the 0.3% tier. Every pToken and yToken price in the app is read from these pools.
- Why pair with the stock. A pToken is the same share minus a thin slice of dividends, so measured in the stock it hardly moves: it sits a little under 1 and drifts up to 1 as maturity gets close. When both sides of a pool move together, liquidity providers carry far less impermanent loss, and nobody in the pool is short a rally in the share.
- Fair value. Call G the whole dividend growth of the series, dT / d0 - 1. Part of it has already happened and the rest is a forecast, so every fair value is an estimate: pToken ≈ 1 / (1 + G) and yToken ≈ G / (1 + G), less 5% of it if you redeem.
- The pair polices itself. Splitting turns one stock into 0.999 of each half, and merging turns one of each back into a full stock for free. When the pools price pToken plus yToken clearly above one stock, splitting and selling both pays. Below one stock, buying both and merging pays. Whoever makes either trade pockets the gap and closes it, so the pair stays close to one share without anyone's permission.
- Tiers and ranges. The pToken pool uses the 0.05% tier because its price moves slowly in a narrow band. The yToken pool uses the 1% tier and a wide range, because a small token with a forecast inside it swings much harder in percentage terms. The seeding script's default ranges run from 1.5% under fair value to 0.1% over par for the pToken, and from a quarter of fair value to four times it for the yToken.
- The dollar pool. pPFE/USDG lets the principal trade against dollars. The app's pool flow takes PFE and USDG, splits the PFE, places pPFE beside the USDG in one Uniswap position and hands you the yPFE, in a single deposit through the StockimusLP helper once your wallet has approved both tokens. The helper holds nothing between transactions, and anything the pool does not take comes back to you.
- Who provides. The treasury seeds the first positions from its own stock with
seed-pools.sh. After that anyone can add liquidity: they are ordinary Uniswap v3 pools, so the app and any tool that talks to the position manager both work. Swap fees go to whoever holds the positions.
No Stockimus pool exists yet. Pools are created after the contracts are deployed, so until then the app shows no pToken or yToken prices.
One line: the two halves trade against the share they came from, and free merge keeps their sum at one.
06Dividends vs stock splits
The multiplier goes up for two very different reasons. A dividend adds value, and that value belongs to the yToken. A stock split adds nothing: there are more shares and each one is worth less. Confusing the two would hand value from one half to the other, so the StockimusAccountant sorts every change with rules the contract checks on each call. Write r for the new multiplier divided by the old one.
- SPLITr ≤ 0.8
- GUARDIAN0.8 < r < 1
- DIVIDEND1 < r ≤ 1.03
- GUARDIAN1.03 < r < 1.2
- SPLITr ≥ 1.2
- A change is a dividend only when 0 < r - 1 ≤ 3%. Exactly 3% passes and one wei more does not.
sync()books an in-band dividend the moment it sees it, and anyone can also callclassifyDividend(). - A change is a stock split only when r is a clean ratio num:den, both terms from 1 to 50, at least 20% away from 1 in either direction. 2:1, 3:2, 7:1 and 1:10 qualify; 23:20 sits too close to 1 and does not. Anyone can call
classifySplit(num, den). - The bands never overlap. Nothing can be a dividend and a split at once, so calling the wrong classifier simply reverts. Nobody can misclassify; a keeper can only be late.
- Everything else waits for the guardian. A special dividend above 3%, an odd ratio, or a drop that is not a clean reverse split. The guardian proposes how much of the oldest waiting move was dividend, bounded to the move itself and never above 1.2, and the proposal sits in public behind a 2 day timelock before anyone can execute it.
- Nobody can stall a move forever. Once a move has waited 14 days, anyone can call
executeResolution()to book the default: a rise under 20% counts as a dividend of the whole move, anything else as none.
While a move is waiting, isSynced() returns false in the same block the multiplier moved, because it reads the token live on every call. Merge keeps working throughout. Every classification writes a checkpoint, a timestamp and an index, readable forever with checkpointAt(i), and every step emits an event, so the full history can be rebuilt from the chain alone. The tracked tokens are live on the oracle page.
07Lifecycle
A series runs ACTIVE, then MATURED, then SETTLED, read from state(). Nothing can send it back.
- ACTIVEstate 0
now < maturity
Split while splits are not paused and the deposit cap has room. Merge, trade and provide liquidity.
- MATUREDstate 1
maturity passed, not settled
No new splits. Merge and trading continue, and anyone can call settle().
- SETTLEDstate 2
dT frozen for good
Redeem both halves at the formulas in 03. Merge still works.
Settlement is permissionless and patient. Once maturity passes, anyone can call settle(). It first calls sync() on the accountant, waits until every move dated at or before maturity is booked (isFinalAt(maturity)), then sets dT = dividendIndexAt(maturity), never below d0, and never changes it again. A move dated after maturity does not hold it up. If the stock token ever stops answering uiMultiplier(), the series settles on the index already booked 30 days after maturity.
Maturity is a timestamp, not a block. When the token's own schedule explains a change, the accountant dates it by the token's effectiveAt() instead of by the block that noticed it, so a dividend that took effect before maturity counts toward dT even if nobody synced until afterwards. Every series in the first set matures on 31 December 2027 at 20:00 UTC (unix 1830283200), and new series need a maturity at least 7 days out.
08$STOCKIMUS
$STOCKIMUS is the Stockimus community coin. It has not launched yet. When it does, the official contract address is posted on this site, behind the Copy CA button in the menu and below, and on @PayStockimus. Any token calling itself $STOCKIMUS at an address not posted there is not ours.
| ITEM | TODAY | NOTES |
|---|---|---|
| Contract address | not posted | appears behind Copy CA on this site and on X, nowhere else |
| Where to buy | not posted | the Buy $STOCKIMUS link in the menu lights up when there is one |
| Role in the protocol | none | no vault, accountant, pToken or yToken reads it; you never need it to split, merge, trade or redeem |
| Claims | none | it does not lower fees, vote on contract settings or give any claim on the stock a vault holds |
Nothing more is promised. Fees go to the treasury as described in 04, and no contract sends any of them to the coin.
09The oracle
Every series runs on a StockimusAccountant, and the accountant does not need the series. It watches one stock token's ERC-8056 multiplier, records each change with its date, classifies it as a dividend or a stock split using the bands in 06, and holds anything that fits neither for the guardian. All of it is readable by any contract, for free, with no key. Stockimus publishes it as the dividend oracle for Robinhood Chain.
Why a lender should care. A stock token's raw balance never moves; the multiplier does. So a 4 for 1 split and a dividend both look like "the multiplier changed" to anything reading balances. Valuing collateral depends on your feed: a feed that prices the token already has the multiplier inside, so value is rawBalance × feed, and multiplying by uiMultiplier() again would double count; a per-share feed needs rawBalance × uiMultiplier() × pricePerShare. Either way the feed cannot tell you which corporate action happened, cannot warn you before it lands, and does not refuse a change that fits neither band. The accountant does all three. Wire isSynced() into a market pause and you have a circuit breaker against a bad multiplier push, plus the dates of every window in advance.
| READ | RETURNS | USE IT FOR |
|---|---|---|
isSynced() | bool | false while a change is recorded but not booked: treat the index as stale and pause if you hold the token |
dividendIndex() | uint256, 1e18 = 1.0 | cumulative classified dividend growth since the accountant began |
splitFactor() | uint256, 1e18 = 1.0 | cumulative classified split ratio: normalise share counts by this |
dividendIndexAt(ts) | uint256 | the index as of any past timestamp, for accruing payouts to depositors |
checkpointAt(i) | (timestamp, index) | the full classified history, with checkpointCount() |
pending() | (exists, collapsed, ts, old, new) | the oldest waiting change, if any; pendingCount() and pendingAt(i) for the rest of the queue |
scheduled() | (bool, newMultiplier, effectiveAt) | the issuer's next announced change, read from the token |
No keeper to trust. sync(), classifyDividend(), classifySplit() and executeResolution() after its delay are open to anyone. Classification is validated by the contract itself, so a late or missing caller can cost time but cannot move value; the worst case for a consumer is a stale flag, which is exactly what isSynced() reports.
Coverage without capital. An accountant can exist for a token that has no series, no pools and no vault. The first deployment creates one for each of 14 stock tokens (AAPL, SPY, QQQ, PFE, SCHD, NVDA, MSFT, SGOV, JNJ, GOOGL, META, COST, XOM and AVGO), four of them with a series.
Ex-date handling
The question a lender asks first is what happens between a corporate action landing and the accountant booking it. The answer is that the window is announced in advance and the stale signal has no latency, so a correctly wired market is never open inside it.
| MOMENT | WHAT THE CHAIN SAYS | WHAT A MARKET SHOULD DO |
|---|---|---|
| Issuer schedules the action | the token's newUIMultiplier() and effectiveAt() are set days ahead; the oracle page shows SCHEDULED | read effectiveAt() and plan the pause; nothing is stale yet |
effectiveAt passes | the token's uiMultiplier() flips on the next read, and in the same block isSynced() returns false | no liquidations, no new borrows, no withdrawals of that collateral while it is false |
Someone calls sync() | the move is recorded with its date; an in-band dividend is booked on the spot, a clean split by classifySplit; isSynced() returns true | for a dividend, resume; for a split, resume once the price feed reflects the new share count |
| Change fits neither band | only a guardian resolution or the 14 day default can book it; isSynced() stays false until then | stay paused; the clock is public |
There is no block in which the accountant reports synced while the multiplier has moved. isSynced() is not a flag anyone sets; it is a view that reads the token live, so the stale signal is atomic with the change itself. Classification does not change collateral value either; what it tells a market is whether its price feed is about to move by a split ratio, which is why a split waits on the feed and a dividend does not.
Liability, plainly: the oracle is free infrastructure with no service agreement, and Stockimus does not underwrite positions on markets it does not run. What it gives an integrator is a design in which acting on stale data means ignoring a signal available in the same block.
The dispute path
- Automatic path. Growth above 0 and up to 3% is a dividend. A clean ratio at least 20% away from 1 is a split. The bands cannot overlap and the contract rejects any tag outside them.
- Anything else waits. Up to four moves queue, oldest first, each with its own date; a fifth folds into the last and marks it collapsed. For the oldest one, the guardian proposes a dividend ratio that has to explain the move: none, the whole move, or at most 3% inside a clean split.
- Two days in public. The proposal is readable on chain before it executes and the guardian can cancel it. Holders can leave through
merge(), which never depends on the index. - Fourteen days at most. A move that has waited 14 days can be booked by anyone with the default, so a missing guardian cannot freeze settlement. A replacement guardian only takes over 3 days after it is named, longer than the timelock.
- The record. Every booking is a checkpoint and every proposal and resolution emits an event with its date. Anyone can recompute the history from the token's own multiplier and disagree in public with a specific checkpoint.
The lending price
A pToken can be collateral on Morpho Blue. Its StockimusPtOracle prices one pToken as the stock feed times what the pToken redeems for in stock: d0 / d discounted for the time left while active, and exactly the settled amount afterwards, never above one share. No pool price goes in, so a pool pushed around for a few seconds cannot move a loan. The price stops when the feed is older than its limit or older than the latest booked split, and while an unbooked move is the size of a split. See lend for the market itself.
Accuracy so far. The record starts when the accountants are deployed. Rather than a percentage made of a handful of events, the record itself is the number: the checkpoint log on each accountant against each token's own multiplier history.
10Risks, plainly
- Smart contract bugs. A flaw in the vault, accountant, tokens, pool helper or oracle could lock or misprice funds. No admin function can move a vault's stock, which also means nobody can rescue it, or stock sent to a vault by mistake. What is tested is on the security page.
- Issuer and custody. Every series rests on a stock token and the company that issues it, Robinhood Assets (Jersey) Ltd.: that it holds the shares, reinvests dividends faithfully through the multiplier and keeps the token running. The token has a pause switch Stockimus cannot override. A yToken tracks the dividends the issuer reinvests; it is not a claim on cash dividends or on shares.
- Classification. Changes inside the bands sort themselves by rule. Anything outside them depends on the guardian's judgment, bounded to the move, visible for 2 days, and replaced by a fixed default after 14 days. If you disagree with a proposal, merge out during that window, which is always free.
- Liquidity. New pools start thin. A large trade can move the price a lot, and leaving one half early means selling into whatever depth exists. Merge and redemption never touch the pools.
- Lending. A stale feed, a feed that has not updated since a split, or an unbooked split-sized move halts the lending price, the fixed discount can sit away from where the pool trades, and a Morpho Blue market liquidates without asking.
- Series capacity. Each series accepts deposits up to an on-chain cap, and the owner can pause new splits. Neither can stop merge, settlement or redemption.
11Contracts
Stockimus is a small set of contracts. StockimusFactory keeps the list and the admin settings. StockimusAccountant follows one stock token's multiplier. StockimusVault is one series and creates its two StockimusToken halves, ERC-20s with permit and 18 decimals that only their vault can mint or burn. StockimusLP is the pool helper behind the pPFE/USDG flow. StockimusPtOracle prices a pToken for a lending market.
PRE-LAUNCH. The contracts are written and tested but not deployed yet, so every row below reads PLANNED. Until the deployment is recorded in this site, nothing on chain is a Stockimus vault, whatever it calls itself.
DEPLOYED. These rows come from the deployment record in this site's config. This site names contracts and never prints their addresses, so nothing here can be mistaken for the $STOCKIMUS coin; your wallet shows the contract behind every transaction before you sign.
Addresses for agents and integrators are published in /contracts.json and /llms.txt once the contracts are deployed.
Stockimus contracts
| CONTRACT | STATUS |
|---|---|
| StockimusFactoryThe registry and admin. Creates one accountant per stock token and one vault per series, and holds the treasury, guardian and fees for new series. | PLANNED |
| StockimusAccountant × 14One per stock token: AAPL, SPY, QQQ, PFE, SCHD, NVDA, MSFT, SGOV, JNJ, GOOGL, META, COST, XOM, AVGO. | PLANNED |
| StockimusVault · SPY-DEC27Mints pSPY-DEC27 and ySPY-DEC27. Deposit cap 330 SPY. | PLANNED |
| StockimusVault · QQQ-DEC27Mints pQQQ-DEC27 and yQQQ-DEC27. Deposit cap 350 QQQ. | PLANNED |
| StockimusVault · AAPL-DEC27Mints pAAPL-DEC27 and yAAPL-DEC27. Deposit cap 770 AAPL. | PLANNED |
| StockimusVault · PFE-DEC27Mints pPFE-DEC27 and yPFE-DEC27. Deposit cap 9,100 PFE. | PLANNED |
| StockimusLPThe pool helper: splits PFE, places pPFE with USDG in the 0.3% pool, returns the yPFE and anything unplaced. | PLANNED |
| StockimusPtOracleOne per lending market, deployed by create-market.sh once the pSPY pool has 30 minutes of price history. | LATER |
Parameters
Who can do what
| ROLE | CAN | CANNOT |
|---|---|---|
| Owner | create accountants and series, name the treasury and guardian, set fees for future series within the caps, pause new splits in a vault, change a vault's deposit cap | move vault stock, mint tokens, change a live series' fees, maturity or d0, or renounce ownership; handover takes two steps |
| Guardian | propose and cancel a resolution for the oldest waiting move outside both bands | skip the 2 day timelock, classify anything a band covers, book more than the move or above 1.2, or hold a move past 14 days |
| Treasury | receive the split fee and the yield fee, in stock | anything else |
| Anyone | split, merge, redeem, settle, sync, classifyDividend, classifySplit, executeResolution after its delay, claimFees | nothing here needs a key |
Robinhood Chain contracts Stockimus uses
The 14 stock tokens above, issued by Robinhood Assets (Jersey) Ltd.; Uniswap v3 (factory, position manager, SwapRouter02 and QuoterV2) for every pool and swap; WETH; USDG, the dollar with 6 decimals; Multicall3 for batched reads; Morpho Blue and its Adaptive Curve IRM for lending; and the Chainlink-style price feeds with 8 decimals for each stock that has one.
Source and licence
Every contract the deploy creates is submitted to Sourcify for an exact match during deploy.sh, so the explorer shows its source. The contracts are published under the MIT licence: the SPDX-License-Identifier: MIT header on every source. Read, test, integrate and build on them.