Libertum is a distributed system: three end-user web applications, a constellation of backend services, a smart-contract layer on Base Mainnet plus Cardano Mainnet and Preview, and a cluster of third-party integrations.
┌─────────────────────────────────────────────────────────────────────┐ │ END-USER LAYER │ │ Investor / Issuer / AM Admin Portal Transfer Agent Portal │ │ React 18 / TypeScript / Vite — Cloudflare Pages │ └─────────────────────────┬─────────────────────────┬─────────────────┘
│ HTTPS / WSS │
┌─────────────────────────▼─────────────────────────▼─────────────────┐ │ SERVICE LAYER │ │ Marketplace · Admin · Transfer Agent · Notification │ │ Event indexer · Dividend · Bonding/DEX · Cardano │ │ Node.js / Express / TypeScript — gRPC + Kafka │ └─────────────────────┬───────────────────────────────┬───────────────┘
│ │
┌─────────────▼──────────┐ ┌──────────▼──────────────┐
│ DATA LAYER │ │ INTEGRATION LAYER │
│ MongoDB · Redis · │ │ SumSub · Stripe · │
│ PostgreSQL · Kafka │ │ DocuSign · SendGrid · │
│ │ │ Twilio · Transak · │
│ │ │ Bridge · Blockfrost │
└────────────────────────┘ └─────────────────────────┘
│
┌───────────────────▼──────────────────┐
│ BLOCKCHAIN LAYER │
│ Base Mainnet (8453) ERC-3643 stack │
│ Cardano Mainnet — CIP-20 native │
│ Cardano Preview — CIP-113 + CIP-20 │
└──────────────────────────────────────┘
Three React 18 single-page apps, all on Cloudflare Pages.
Investor + Issuer + Asset Management UI. The largest and most feature-rich SPA — combines all three primary platform experiences and routes by user role.
Stack: React 18, TypeScript, Vite, Redux Toolkit + redux-persist, TanStack React Query, RainbowKit + wagmi + viem + ethers v6, Formik + Yup/Zod, React Bootstrap + SCSS, Recharts, Sentry.
Mode detection: the app inspects the request hostname and switches between three modes:
Libertum platform administration. Dashboard, user management, KYC review queue, offering approvals, sub-admin RBAC, fee config, transaction history, transfer-agent management, gas treasury, multi-chain ops.
Cap table, wallet whitelist approval, force transfer journal, transaction history. Heavy direct contract interaction via ethers.
A set of cleanly-separated Node.js / Express / TypeScript services. Each owns a domain:
| Service | Domain |
|---|---|
| Marketplace | Users, offerings, orders, payments, KYC mediation, P2P, NFT, subscriptions, whitelabel, custodian wallets |
| Admin | Admin operations, sub-admin RBAC, fee config, plan/module sync, gas treasury |
| Transfer Agent | Cap-table queries, force transfer, freeze/unfreeze, wallet whitelist |
| Notification | Email (SendGrid) + SMS (Twilio) + WebSocket in-app push |
| Event Indexer | Listens for on-chain Token Transfer, Mint, Burn, Pause, Identity Registry updates, Escrow deposits, Marketplace orders, Bonding buys/sells |
| Dividend | Dividend snapshot + distribution |
| Bonding / DEX | Bonding curve operations, staking rewards |
| Cardano (×2 instances) | CIP-20 + CIP-113 operations on Cardano. One instance per network (mainnet, preview). |
JWT-based with refresh-token rotation. 2FA gates sensitive operations.
Token lifecycle:
Roles:
Investor — Marketplace investor surfacesInstitution — Marketplace investor surfaces (institutional investor variant)Issuer — Marketplace issuer surfaces (in addition to investor)Admin — Admin Portal full accessSubAdmin — Admin Portal subset filtered by RBAC permissionsTransferAgent — Transfer Agent PortalKYC vs KYB. Both run via SumSub. Status: NOT_STARTED → IN_PROGRESS → PENDING → APPROVED / REJECTED / RESUBMIT. KYC is for individuals; KYB is for entities.
Services that need synchronous answers from each other use gRPC. Examples:
Async events flow through Kafka topics. Producers and consumers loosely coupled.
| Topic | Producer | Consumer | Examples |
|---|---|---|---|
| Cron-to-user | Event indexer, dividend service | Marketplace | OrderCreated, TokensMinted, DividendDistributed, NAVUpdated |
| Admin-to-user | Admin | Marketplace | KYC approved/rejected, Offering approved/rejected |
| Realtime notifications | Marketplace | Notification | In-app notifications |
| Realtime email | Marketplace | Notification | Email dispatch triggers |
| Realtime socket | Marketplace | Notification | WebSocket push events |
| Job | Frequency | Service |
|---|---|---|
| Dividend snapshot + push | Frequent (sub-minute) | Marketplace / dividend service |
| P2P order expiration check | Every 2 minutes (orders past their 20-min payment window) | Marketplace |
| Monthly staking rewards | Monthly | Bonding / DEX |
| Service | Used for |
|---|---|
| SumSub | KYC + KYB identity verification |
| Stripe | Card payments + Connect for issuer payouts + subscription billing |
| DocuSign | E-signatures on legal documents |
| Transak | Fiat on/off-ramp |
| Bridge | Stablecoin / fiat conversion |
| SendGrid | Transactional email |
| Twilio | SMS OTP |
| Azure Blob Storage | Document and image upload |
| Blockfrost | Cardano RPC + indexing |
| Sentry | Error tracking |
| WalletConnect / Thirdweb | Wallet UX |
Email is sent via SendGrid; SMS via Twilio; in-app via WebSocket. Email templates exist for: order created/minted/cancelled/rejected, wallet whitelist sent/approved/rejected, dividend distributed, P2P order created/payment confirmed/tokens released/cancelled/expired, investor invite. Brand colours and logo are configured per tenant for whitelabel.