Transfers you did not initiate
An investor transfers to another investor directly, or moves to self-custody, or moves between their own wallets. The tokens moved; your ledger was not asked.
Investment Ledger · one module, on its own
Your platform's ledger records what it issued. This derives ownership from what actually happened on chain — lot by lot, with lineage — and reports where the two disagree. It runs against the contracts and the index you already have.
Every tokenization platform has an internal ledger. It knows what it issued because it issued it. That is a record the platform writes. The chain is a record of what happened. The two coincide exactly as long as the platform is the only thing that ever moves tokens.
A platform cannot audit itself with the record it is being audited against.
An investor transfers to another investor directly, or moves to self-custody, or moves between their own wallets. The tokens moved; your ledger was not asked.
A transfer executes somewhere other than your platform. The position changed and nothing in your systems recorded why.
Someone with the role makes a correction on chain — a freeze, a forced transfer, a recovery. Correct on chain, invisible to the book that is supposed to describe it.
An instrument arrives from elsewhere with holders whose history you never saw. Their positions are asserted rather than derived.
Each of those leaves the internal ledger holding a claim. Reconciliation is what tells you the claim is wrong, and which position it is wrong about.
Most platforms track a position: how many units an investor holds. That answers how much and nothing else. This tracks lots with provenance — which issuance a unit came from, consumed oldest first, with lineage preserved across an ownership transfer.
Two transfers can be identical on chain and mean opposite things. Nothing in the log separates them; the difference lives in the wallet-to-investor mapping, which comes from your systems.
| On chain | Who the wallets belong to | What it means |
|---|---|---|
| 0xAAA → 0xBBB, 100 units | Same investor, two wallets | Reallocation — custody changed, ownership did not |
| 0xAAA → 0xCCC, 100 units | Different investors | Ownership transfer — a disposal, with lineage to preserve |
Reporting the first as a disposal is a reporting error. Missing the second is a worse one. A wallet with no mapping is modelled as its own economic owner rather than guessed at, so an unrecognised holder is a visible state rather than a silent misattribution — and naming it later re-derives the affected history.
Nothing is redeployed and nothing is migrated. The service reads transfers for tokens that already exist, whoever issued them and whatever standard they implement.
Transfers arrive through a single interface rather than an RPC endpoint. Feeding that interface from an index you already run is an adapter, not a re-architecture; adapters onto a customer's own index are scoped per deployment.
The service reads. It signs nothing, holds no key, moves no tokens and cannot. Vendor risk review is a shorter conversation than it is for anything that transacts.
Identity and eligibility stay in your systems. This consumes the wallet-to-investor mapping and nothing else about your investors.
Worth saying plainly. Reconciliation earns its place in proportion to how much moves outside your control, and how expensive it is to be wrong about ownership.
If that is true today and will stay true, your ledger and the chain will not drift. The question is whether it stays true once investors self-custody.
No cost-basis, tranche or lineage requirement, and no auditor asking which issuance a unit came from. Lots are a narrower claim than positions and you may not need them.
Yours is a record your platform writes from what it did. This derives ownership independently from chain state and compares the two. They agree until something moves tokens that your platform did not initiate — an investor-to-investor transfer, a move to self-custody, a venue you do not operate, an on-chain administrative correction. It is assurance over your ledger, not a replacement for it.
The engine consumes transfers through one interface rather than talking to an RPC node, so the source is swappable by design. An adapter onto your own index — a subgraph, Ponder, or a log reader — is scoped as part of the deployment. What it needs from any source is ordered, canonical transfers with block hash, transaction hash, from, to and amount.
No. It derives the book from chain history for the tokens you point it at. Nothing is redeployed, no holder records move, and your platform keeps writing its own ledger exactly as it does now.
No. It reads. It holds no key, signs nothing and cannot move a token. That is also why it carries none of the smart-contract risk that a signing or issuance component would bring into a vendor review.
It becomes its own economic owner in the ledger, and is visible as unmapped rather than silently attributed to somebody. When you later map it to an investor, the affected history is re-derived rather than patched.
If the answer is a spreadsheet, a script or a person who checks, that is what this replaces. If the answer is that nothing has ever moved outside the platform, you may genuinely not need it yet.
Your ledger says an investor holds 1,050 units. Show us the book and we will tell you what it takes to derive the same number from chain state.
Reconcile your book