Stock Ledger Integrate
Corporate actions

The event model

An event is the unit of the registry. Every event is tied to one mapped contract, carries the factor before and after, the moment it takes effect, and the announcement it was reconciled against.

Event types

  • multiplier_step is the common case on this chain: a dividend accrued into uiMultiplier(), with no transfer and no change in balanceOf().
  • split and reverse_split arrive the same way, as a ratio applied to the multiplier.
  • cash_dividend and distribution cover issuers that pay out instead of accruing.
  • merger, spinoff, ticker_change and delisting are identity and termination events.

Fields

Factors are decimal strings with nine places, never floats. effective_at is the moment the factor applies, which is not the same as the block the event was emitted in.

{
  "id": "evt_aapl_2026_08_14",
  "type": "multiplier_step",
  "asset": { "ticker": "AAPL", "address": "0xaf3d…93f9", "chain_id": 4663 },
  "multiplier_before": "1.000000000",
  "multiplier_after":  "1.000566080",
  "effective_at": "2026-08-14T15:12:46Z",
  "emitted_at":   { "block": 36345344, "tx": "0x…" },
  "source": { "kind": "issuer_filing", "ref": "…", "url": "https://…" },
  "supersedes": null,
  "duplicate_of": null,
  "status": "applied"
}

Repeats and corrections

The log is young and it already contains both. Two events carry values identical to an earlier one with the same effective time, emitted at a different block. One contract was set to 2.000000000 and returned to 1.000000000 fifteen minutes later.

Neither is an accusation, a new mechanism gets corrections and a register is where corrections belong. What is missing is a second copy to check against, which is what these fields are for: a repeat is published with duplicate_of pointing at the first occurrence, a correction with supersedes pointing at the value it replaces. Both stay in the log. Nothing is quietly dropped.

Read absolutes, not deltas. Every event carries the value before and the value after. An integrator that reads multiplier_after lands in the right place even if an event arrives twice. An integrator that computes a delta and compounds it arrives at four times the correct factor on the two contracts where a repeat exists.

Sourcing

Every record carries the announcement it came from. When our record and the announcement disagree, the announcement wins: the record is corrected, the previous version stays addressable, and anything downstream that consumed the old figure is re-emitted.