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.

PRE-LAUNCHROBINHOOD CHAIN 4663

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:

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.

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

ACTIONFEENOTES
split10 bpstaken from the deposit on the way in, paid to the treasury in stock; hard cap 50 bps
merge0free in every state, before and after settlement
redeem pToken0the principal is never charged
redeem yToken5% of the drip500 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.

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.

  1. SPLITr ≤ 0.8
  2. GUARDIAN0.8 < r < 1
  3. DIVIDEND1 < r ≤ 1.03
  4. GUARDIAN1.03 < r < 1.2
  5. SPLITr ≥ 1.2
Not to scale. A move in a split zone also needs a clean num:den ratio; one that is not clean waits for the guardian too.

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.

  1. ACTIVEstate 0

    now < maturity

    Split while splits are not paused and the deposit cap has room. Merge, trade and provide liquidity.

  2. MATUREDstate 1

    maturity passed, not settled

    No new splits. Merge and trading continue, and anyone can call settle().

  3. 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.

ITEMTODAYNOTES
Contract addressnot postedappears behind Copy CA on this site and on X, nowhere else
Where to buynot postedthe Buy $STOCKIMUS link in the menu lights up when there is one
Role in the protocolnoneno vault, accountant, pToken or yToken reads it; you never need it to split, merge, trade or redeem
Claimsnoneit does not lower fees, vote on contract settings or give any claim on the stock a vault holds
Buy $STOCKIMUS · soon

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.

READRETURNSUSE IT FOR
isSynced()boolfalse while a change is recorded but not booked: treat the index as stale and pause if you hold the token
dividendIndex()uint256, 1e18 = 1.0cumulative classified dividend growth since the accountant began
splitFactor()uint256, 1e18 = 1.0cumulative classified split ratio: normalise share counts by this
dividendIndexAt(ts)uint256the 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.

MOMENTWHAT THE CHAIN SAYSWHAT A MARKET SHOULD DO
Issuer schedules the actionthe token's newUIMultiplier() and effectiveAt() are set days ahead; the oracle page shows SCHEDULEDread effectiveAt() and plan the pause; nothing is stale yet
effectiveAt passesthe token's uiMultiplier() flips on the next read, and in the same block isSynced() returns falseno 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 truefor a dividend, resume; for a split, resume once the price feed reflects the new share count
Change fits neither bandonly a guardian resolution or the 14 day default can book it; isSynced() stays false until thenstay 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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

NOT INVESTMENT ADVICE. NOT AVAILABLE WHERE ROBINHOOD STOCK TOKENS ARE NOT AVAILABLE. STOCKIMUS IS INDEPENDENT SOFTWARE AND IS NOT AFFILIATED WITH ROBINHOOD.

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.

Addresses for agents and integrators are published in /contracts.json and /llms.txt once the contracts are deployed.

Stockimus contracts

CONTRACTSTATUS
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

Maturity, first series31 Dec 2027 20:00 UTC
Split fee10 bps, cap 50 bps
Yield fee5% of the drip, cap 10%
Dividend band0 < r - 1 ≤ 3%
Split bandnum:den ≤ 50, at least 20% from 1
Guardian timelock2 days
Default resolutionafter 14 days
Guardian handover3 days
Minimum term, new series7 days
LendingUSDG on Morpho Blue, LLTV 62.5%

Who can do what

ROLECANCANNOT
Ownercreate 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 capmove vault stock, mint tokens, change a live series' fees, maturity or d0, or renounce ownership; handover takes two steps
Guardianpropose and cancel a resolution for the oldest waiting move outside both bandsskip 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
Treasuryreceive the split fee and the yield fee, in stockanything else
Anyonesplit, merge, redeem, settle, sync, classifyDividend, classifySplit, executeResolution after its delay, claimFeesnothing 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.