Corporate actions for tokenized stocks

Every on-chain balance change, matched to the issuer’s record and booked as what it actually was.

See it workingRead the docs

654
Changes recorded
832
Stocks tracked
348
Stocks that moved
446
Days recorded

Chain data is live Solana mainnet, polled continuously. The counts below come from a verified recording of the issuer’s reference feed (fixtures/xstocks/recorded-20260913, 24 June 2025 to 13 September 2026), which Corpact runs from until that feed’s licence is signed.

See it working

A wallet, read end to end.

This demo view is a reference client with no logic of its own. Every number in it comes from the same public API. This is a real mainnet wallet: five positions, the dividend income Corpact will stand behind, and the two rows it refuses to.

  • KOx, 15 Sep 2026. The issuer has published only a scheduled announcement, not a confirmed record carrying the multipliers that were delivered. An announcement is never evidence, so nothing is booked and the row reads Classification pending.
  • NVDAx, 2 Apr 2026. A real dividend the issuer cancelled and re-published to correct a typo. The corrected version carries no net cash figure, so the units are booked and the USD is left Unknown.

Point it at the hosted API and run it. No database, no worker, no key of your own:

pnpm install \
CORPACT_API_URL=https://api-production-c0ce.up.railway.app \
CORPACT_API_KEY=cpk_Vte-IwZREtqx8NBgRdOu9e8nJfTWot3nsRQ_Y5ioRRM \
pnpm --filter @corpact/web dev

corpact demo view · mainnet wallet

The Corpact demo view showing five tokenized stock positions with quantity, protected floor and dividend income, above a list of balance adjustments. One row, KOx on 15 September 2026, is marked Classification pending with no USD value. Another, NVDAx on 2 April 2026, is a verified dividend whose USD value reads Unknown.

01 / What happens

What actually happens

This is HONx: what one share became after each on-chain multiplier change. Most steps are cash dividends, a fraction of a percent. Two are not. On 30 October the feed labelled a step Dividend; the issuer’s record is a spin-off. On 29 June a reverse split cut the units in half, and eight hours later a spin-off put them almost back. Corpact books each step from that record, not the feed label, and keeps doing so as new changes land.

HONx · what one share became · 8 changes
0.500.751.0030 Oct · spin-offfeed said “Dividend”29 Jun · reverse split −50%,then spin-off +95.11%eight hours apartSep 2025Sep 2026
HONx balance multiplier by activation
ActivationFeed reasonIssuer recordChangeMultiplier
2025-09-05T23:55:00.000ZDividendCash dividend+0.17%1.0016554
2025-10-30T23:55:00.000ZDividendSpin-off+1.10%1.0126918
2025-12-05T23:55:00.000ZDividendCash dividend+0.39%1.0166756
2026-02-27T01:30:00.000ZDividendCash dividend+0.35%1.0201914
2026-05-15T00:30:00.000ZDividendCash dividend+0.38%1.0240947
2026-06-29T15:30:00.000ZReverseSplitReverse split−50.00%0.5120474
2026-06-29T23:55:00.000ZAdministrativeSpin-off+95.11%0.9990655
2026-08-14T00:30:00.000ZDividendCash dividend+0.21%1.0011577

02 / Example

An example

ledger.cases · 1 of 654

TokenChangeFeed saysA naive ledger booksCorpact books
HONx29 Jun 2026+95.11%Administrative95.11% more shares as dividend incomeSpin-offNot income. 48.75% of the position’s value came from the spin-off, and the issuer reinvested the proceeds into the parent.

03 / Size

Why size doesn’t work

The largest real cash dividend in 446 days moved the multiplier 2.93%, and four of the six spin-offs moved it less. No threshold separates income from a change in basis.

WHGROx · cash dividend

+2.93%

GMEx · spin-off

+0.53%

HONx · spin-off

+1.10%

DFDVx · spin-off

+1.47%

OPENx · spin-off

+2.08%

CMCSAx · spin-off

+4.72%

HONx · spin-off

+95.11%

One cell is 0.1%. Top row: the largest cash dividend in the recording. Below it: every spin-off. The last is cut at the chart edge, where it would need 951 cells.

04 / API

The API

Register a wallet, sync it, read typed actions - each with its treatment, lifecycle state, the issuer revision it resolved on, and the SHA-256 of its evidence.

  • POST/v1/wallets/syncregister a wallet, pull its Token-2022 balances
  • GET/v2/actionstyped actions with evidence and validation state
  • GET/v2/actions/{id}every issuer revision, its hash, the journal history
  • GET/v1/portfoliopositions with basis after each action
  • GET/v1/journalthe append-only trail of recognitions and reversals
  • GET/v1/exportCSV of the journal, RFC 4180
API reference

curl · read-only · public key

curl -s "https://api-production-c0ce.up.railway.app/v2/actions?owner=6kn8Vj9YkvNLo8peW2fzebQdSLtX33A3TkRJwXqMCy1U&limit=5" \
  -H "x-api-key: cpk_Vte-IwZREtqx8NBgRdOu9e8nJfTWot3nsRQ_Y5ioRRM"

That key is read-only, on its own tenant, and public on purpose. The host sleeps when idle, so the first request can take a few seconds.

05 / Status

Status

Data
Chain data is live Solana mainnet: the worker polls mint state continuously and classifies each change as it activates. The issuer’s reference feed is a licensed third-party product, and Corpact runs it from a verified recording of 654 changes over 446 days because the provider’s terms prohibit automated retrieval until that licence is signed. Switching to the live feed is one environment variable, ISSUER_SOURCE=live, and no code change.
Evidence
244 tests, and 59 of 59 end-to-end checks on both Surfpool and solana-test-validator. The journal is append-only, enforced by forbid_mutation() triggers on ten tables.
Scope
Corpact accounts for corporate actions. It does not move, convert or harvest anything, and nothing is priced or billed.