# canton-network/splice architecture

> Architecture diagram of the GitHub repository canton-network/splice, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/canton-network/splice
- Repository: https://github.com/canton-network/splice

## Overview

Splice is a Canton Network application platform for operating validators and super-validators, with wallet, Scan, ANS, and Splitwell applications. The available README does not describe a user journey, so the graph emphasizes the evidenced operational workflow: ledger updates and mediator verdicts are ingested, processed, and persisted, alongside validator topology ingestion. Frontend and other application capabilities are represented from the repository tree; their runtime connections are not inferred. Several nodes group Canton/common runtime primitives; unsampled subsystem links are omitted.

Main entry points: [`apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala) (Verdict ingestion), [`apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`](https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala) (Ledger update ingestion), [`apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala`](https://github.com/canton-network/splice/blob/main/apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala) (Party topology ingestion), [`apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation`](https://github.com/canton-network/splice/tree/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation) (Retry services)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_apps["Network applications"]
  node_wallet["Wallet app<br/>[App.tsx]"]
  node_ans["ANS app<br/>[App.tsx]"]
  node_splitwell["Splitwell app<br/>[App.tsx]"]
  node_sv["Super-validator app<br/>[App.tsx]"]
  node_scanui["Scan app<br/>[App.tsx]"]
end

subgraph group_ingestion["Ingestion and indexing"]
  node_scaningest["Verdict ingestion"]
  node_mediator["Mediator verdict client"]
  node_activity["Activity computation"]
  node_scanstore[("Scan verdict store")]
  node_bulk[("Bulk storage<br/>[BulkStorage.scala]")]
  node_updateingest["Ledger update ingestion"]
  node_partyingest["Party topology ingestion"]
end

subgraph group_operations["Operations and services"]
  node_ledger["Ledger connection"]
  node_acsstore[("Multi-domain ACS store")]
  node_partydb[("Party mapping store")]
  node_appenv["Application environment"]
end

subgraph group_shared["Shared runtime"]
  node_retry["Retry services"]
  node_sharedprimitives["Shared primitives"]
end

subgraph group_canton["Canton foundations"]
  node_cantoncore["Canton runtime primitives"]
  node_timestamp["Timestamp and clock"]
  node_pretty["Pretty formatting<br/>[Pretty.scala]"]
end

node_operator(("Operator"))

node_operator -.->|"uses"| node_wallet
node_operator -.->|"uses"| node_ans
node_operator -.->|"uses"| node_splitwell
node_operator -.->|"uses"| node_sv
node_operator -.->|"uses"| node_scanui
node_scaningest -->|"requests verdicts"| node_mediator
node_scaningest -->|"computes activity"| node_activity
node_scaningest -->|"inserts verdicts"| node_scanstore
node_scaningest -.->|"shares ingestion runtime"| node_updateingest
node_updateingest -->|"reads updates"| node_ledger
node_updateingest -->|"writes ingestion"| node_acsstore
node_updateingest -->|"extends retry service"| node_retry
node_partyingest -->|"reads topology updates"| node_ledger
node_partyingest -->|"initializes mappings"| node_partydb
node_partyingest -->|"extends retry service"| node_retry
node_scaningest -->|"parses record times"| node_timestamp
node_scaningest -.->|"uses services"| node_sharedprimitives
node_retry -.->|"uses retry provider"| node_sharedprimitives
node_appenv -.->|"hosts app services"| node_wallet
node_appenv -.->|"hosts app services"| node_sv
node_timestamp -.->|"uses runtime types"| node_cantoncore
node_pretty -->|"formats values"| node_cantoncore

click node_wallet "https://github.com/canton-network/splice/blob/main/apps/wallet/frontend/src/App.tsx"
click node_ans "https://github.com/canton-network/splice/blob/main/apps/ans/frontend/src/App.tsx"
click node_splitwell "https://github.com/canton-network/splice/blob/main/apps/splitwell/frontend/src/App.tsx"
click node_sv "https://github.com/canton-network/splice/blob/main/apps/sv/frontend/src/App.tsx"
click node_scanui "https://github.com/canton-network/splice/blob/main/apps/scan/frontend/src/App.tsx"
click node_scaningest "https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala"
click node_mediator "https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/mediator/MediatorVerdictsClient.scala"
click node_activity "https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala"
click node_scanstore "https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala"
click node_bulk "https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/bulk/BulkStorage.scala"
click node_updateingest "https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala"
click node_partyingest "https://github.com/canton-network/splice/blob/main/apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala"
click node_ledger "https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceLedgerConnection.scala"
click node_acsstore "https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/store/MultiDomainAcsStore.scala"
click node_partydb "https://github.com/canton-network/splice/blob/main/apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/store/PartyToParticipantStore.scala"
click node_appenv "https://github.com/canton-network/splice/blob/main/apps/app/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceEnvironment.scala"
click node_retry "https://github.com/canton-network/splice/tree/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation"
click node_sharedprimitives "https://github.com/canton-network/splice/tree/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice"
click node_cantoncore "https://github.com/canton-network/splice/tree/main/canton/community/base/src/main/scala/com/digitalasset/canton"
click node_timestamp "https://github.com/canton-network/splice/blob/main/canton/community/base/src/main/scala/com/digitalasset/canton/data/CantonTimestamp.scala"
click node_pretty "https://github.com/canton-network/splice/blob/main/canton/community/base/src/main/scala/com/digitalasset/canton/logging/pretty/Pretty.scala"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_wallet,node_ans,node_splitwell,node_sv,node_scanui toneBlue
class node_scaningest,node_mediator,node_activity,node_scanstore,node_bulk,node_updateingest,node_partyingest toneAmber
class node_ledger,node_acsstore,node_partydb,node_appenv toneMint
class node_retry,node_sharedprimitives toneRose
class node_cantoncore,node_timestamp,node_pretty,node_operator toneIndigo
```

## Components

### Network applications

- [Wallet app](https://github.com/canton-network/splice/blob/main/apps/wallet/frontend/src/App.tsx): `apps/wallet/frontend/src/App.tsx`
- [ANS app](https://github.com/canton-network/splice/blob/main/apps/ans/frontend/src/App.tsx): `apps/ans/frontend/src/App.tsx`
- [Splitwell app](https://github.com/canton-network/splice/blob/main/apps/splitwell/frontend/src/App.tsx): `apps/splitwell/frontend/src/App.tsx`
- [Super-validator app](https://github.com/canton-network/splice/blob/main/apps/sv/frontend/src/App.tsx): `apps/sv/frontend/src/App.tsx`
- [Scan app](https://github.com/canton-network/splice/blob/main/apps/scan/frontend/src/App.tsx): `apps/scan/frontend/src/App.tsx`

### Ingestion and indexing

- [Verdict ingestion](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala): `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`
- [Mediator verdict client](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/mediator/MediatorVerdictsClient.scala): `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/mediator/MediatorVerdictsClient.scala`
- [Activity computation](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala): `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/rewards/AppActivityComputation.scala`
- [Scan verdict store](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala): `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/db/DbScanVerdictStore.scala`
- [Bulk storage](https://github.com/canton-network/splice/blob/main/apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/bulk/BulkStorage.scala): `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/store/bulk/BulkStorage.scala`
- [Ledger update ingestion](https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala): `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`
- [Party topology ingestion](https://github.com/canton-network/splice/blob/main/apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala): `apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala`

### Operations and services

- [Ledger connection](https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceLedgerConnection.scala): `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceLedgerConnection.scala`
- [Multi-domain ACS store](https://github.com/canton-network/splice/blob/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/store/MultiDomainAcsStore.scala): `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/store/MultiDomainAcsStore.scala`
- [Party mapping store](https://github.com/canton-network/splice/blob/main/apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/store/PartyToParticipantStore.scala): `apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/store/PartyToParticipantStore.scala`
- [Application environment](https://github.com/canton-network/splice/blob/main/apps/app/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceEnvironment.scala): `apps/app/src/main/scala/org/lfdecentralizedtrust/splice/environment/SpliceEnvironment.scala`

### Shared runtime

- [Retry services](https://github.com/canton-network/splice/tree/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation): `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation`
- [Shared primitives](https://github.com/canton-network/splice/tree/main/apps/common/src/main/scala/org/lfdecentralizedtrust/splice): `apps/common/src/main/scala/org/lfdecentralizedtrust/splice`

### Canton foundations

- [Canton runtime primitives](https://github.com/canton-network/splice/tree/main/canton/community/base/src/main/scala/com/digitalasset/canton): `canton/community/base/src/main/scala/com/digitalasset/canton`
- [Timestamp and clock](https://github.com/canton-network/splice/blob/main/canton/community/base/src/main/scala/com/digitalasset/canton/data/CantonTimestamp.scala): `canton/community/base/src/main/scala/com/digitalasset/canton/data/CantonTimestamp.scala`
- [Pretty formatting](https://github.com/canton-network/splice/blob/main/canton/community/base/src/main/scala/com/digitalasset/canton/logging/pretty/Pretty.scala): `canton/community/base/src/main/scala/com/digitalasset/canton/logging/pretty/Pretty.scala`

### Other components

- **Operator**

## Connections

- Operator → Wallet app: uses
- Operator → ANS app: uses
- Operator → Splitwell app: uses
- Operator → Super-validator app: uses
- Operator → Scan app: uses
- Verdict ingestion → Mediator verdict client: requests verdicts (evidence: `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`)
- Verdict ingestion → Activity computation: computes activity (evidence: `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`)
- Verdict ingestion → Scan verdict store: inserts verdicts (evidence: `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`)
- Verdict ingestion → Ledger update ingestion: shares ingestion runtime
- Ledger update ingestion → Ledger connection: reads updates (evidence: `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`)
- Ledger update ingestion → Multi-domain ACS store: writes ingestion (evidence: `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`)
- Ledger update ingestion → Retry services: extends retry service (evidence: `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`)
- Party topology ingestion → Ledger connection: reads topology updates (evidence: `apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala`)
- Party topology ingestion → Party mapping store: initializes mappings (evidence: `apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala`)
- Party topology ingestion → Retry services: extends retry service (evidence: `apps/validator/src/main/scala/org/lfdecentralizedtrust/splice/validator/automation/PartyToParticipantIngestionService.scala`)
- Verdict ingestion → Timestamp and clock: parses record times (evidence: `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`)
- Verdict ingestion → Shared primitives: uses services (evidence: `apps/scan/src/main/scala/org/lfdecentralizedtrust/splice/scan/automation/ScanVerdictIngestionService.scala`)
- Retry services → Shared primitives: uses retry provider (evidence: `apps/common/src/main/scala/org/lfdecentralizedtrust/splice/automation/UpdateIngestionService.scala`)
- Application environment → Wallet app: hosts app services
- Application environment → Super-validator app: hosts app services
- Timestamp and clock → Canton runtime primitives: uses runtime types (evidence: `canton/community/base/src/main/scala/com/digitalasset/canton/data/CantonTimestamp.scala`)
- Pretty formatting → Canton runtime primitives: formats values (evidence: `canton/community/base/src/main/scala/com/digitalasset/canton/logging/pretty/Pretty.scala`)
