# infinityabir/blockchain-pension-system architecture

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

- Interactive diagram: https://gitdiagram.com/infinityabir/blockchain-pension-system
- Repository: https://github.com/infinityabir/blockchain-pension-system

## Overview

This prototype provides pension registration, document review, contributions and pension withdrawals, plus nominee death claims, through role-specific browser pages backed by Solidity contracts. Users connect a wallet and are routed by role and registration status; they then submit documents, make contributions or file claims, while administrators review applications and documents. Uploaded files go to Pinata/IPFS and their CIDs are submitted on-chain. Contract-specific source was not sampled, so links from the browser contract adapter to individual contracts reflect its named contract accessors, not inspected Solidity call internals.

Main entry points: [`pension-ui/vanilla-ui/js/contracts.js`](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/contracts.js) (Contract adapter), [`pension-ui/vanilla-ui/js/ipfs.js`](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/ipfs.js) (File upload), [`pension-ui/vanilla-ui/js/app.js`](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app.js) (Role routing), [`pension-ui/vanilla-ui/js/app-login.js`](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-login.js) (Wallet login)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ui["Web interface"]
  node_router["Role routing<br/>[app.js]"]
  node_login["Wallet login<br/>[app-login.js]"]
  node_registration["Pension registration<br/>[app-register.js]"]
  node_documents["Document submission<br/>[app-upload.js]"]
  node_pension_dashboard["Pension dashboard<br/>[app-dashboard.js]"]
  node_admin_panel["Admin review<br/>[app-admin.js]"]
  node_nominee_panel["Nominee claims<br/>[app-nominee.js]"]
  node_navbar["Role navigation<br/>[navbar.js]"]
end

subgraph group_adapter["Wallet and storage"]
  node_session["Account session<br/>[auth.js]"]
  node_contract_adapter["Contract adapter<br/>[contracts.js]"]
  node_configuration["Network configuration<br/>[config.js]"]
  node_ipfs_upload["File upload<br/>[ipfs.js]"]
end

subgraph group_contracts["Pension contracts"]
  node_registry["Pension registry"]
  node_document_contract["Document records"]
  node_fund["Contribution fund<br/>[PensionFund.sol]"]
  node_disbursement["Pension disbursement"]
end

subgraph group_external["External services"]
  node_pinata[("Pinata / IPFS")]
  node_wallet_provider(("MetaMask"))
end

node_pensioner(("Pensioner"))
node_administrator(("Administrator"))
node_nominee(("Nominee"))

node_pensioner -->|"connects"| node_login
node_pensioner -->|"registers"| node_registration
node_pensioner -->|"submits documents"| node_documents
node_pensioner -->|"manages pension"| node_pension_dashboard
node_administrator -->|"reviews cases"| node_admin_panel
node_nominee -->|"files claim"| node_nominee_panel
node_router -->|"reads account"| node_session
node_router -->|"checks status"| node_contract_adapter
node_router -->|"loads navigation"| node_navbar
node_login -->|"connects wallet"| node_contract_adapter
node_login -->|"saves account"| node_session
node_registration -->|"submits registration"| node_contract_adapter
node_documents -->|"uploads files"| node_ipfs_upload
node_documents -->|"submits CIDs"| node_contract_adapter
node_pension_dashboard -->|"reads and writes"| node_contract_adapter
node_admin_panel -->|"reviews and verifies"| node_contract_adapter
node_nominee_panel -->|"uploads proof"| node_ipfs_upload
node_nominee_panel -->|"reports and claims"| node_contract_adapter
node_navbar -->|"loads role state"| node_contract_adapter
node_contract_adapter -->|"uses addresses"| node_configuration
node_contract_adapter -->|"requests accounts"| node_wallet_provider
node_ipfs_upload -->|"reads credentials"| node_configuration
node_ipfs_upload -->|"pins files"| node_pinata
node_contract_adapter -->|"accesses contract"| node_registry
node_contract_adapter -->|"accesses contract"| node_document_contract
node_contract_adapter -->|"accesses contract"| node_fund
node_contract_adapter -->|"accesses contract"| node_disbursement

click node_router "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app.js"
click node_login "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-login.js"
click node_registration "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-register.js"
click node_documents "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-upload.js"
click node_pension_dashboard "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-dashboard.js"
click node_admin_panel "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-admin.js"
click node_nominee_panel "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-nominee.js"
click node_navbar "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/navbar.js"
click node_session "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/auth.js"
click node_contract_adapter "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/contracts.js"
click node_configuration "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/config.js"
click node_ipfs_upload "https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/ipfs.js"
click node_registry "https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionRegistry.sol"
click node_document_contract "https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionDocuments.sol"
click node_fund "https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionFund.sol"
click node_disbursement "https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionDisbursement.sol"

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_router,node_login,node_registration,node_documents,node_pension_dashboard,node_admin_panel,node_nominee_panel,node_navbar toneBlue
class node_session,node_contract_adapter,node_configuration,node_ipfs_upload toneAmber
class node_registry,node_document_contract,node_fund,node_disbursement toneMint
class node_pinata,node_wallet_provider toneRose
class node_pensioner,node_administrator,node_nominee toneIndigo
```

## Components

### Web interface

- [Role routing](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app.js): `pension-ui/vanilla-ui/js/app.js`
- [Wallet login](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-login.js): `pension-ui/vanilla-ui/js/app-login.js`
- [Pension registration](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-register.js): `pension-ui/vanilla-ui/js/app-register.js`
- [Document submission](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-upload.js): `pension-ui/vanilla-ui/js/app-upload.js`
- [Pension dashboard](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-dashboard.js): `pension-ui/vanilla-ui/js/app-dashboard.js`
- [Admin review](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-admin.js): `pension-ui/vanilla-ui/js/app-admin.js`
- [Nominee claims](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/app-nominee.js): `pension-ui/vanilla-ui/js/app-nominee.js`
- [Role navigation](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/navbar.js): `pension-ui/vanilla-ui/js/navbar.js`

### Wallet and storage

- [Account session](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/auth.js): `pension-ui/vanilla-ui/js/auth.js`
- [Contract adapter](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/contracts.js): `pension-ui/vanilla-ui/js/contracts.js`
- [Network configuration](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/config.js): `pension-ui/vanilla-ui/js/config.js`
- [File upload](https://github.com/infinityabir/blockchain-pension-system/blob/master/pension-ui/vanilla-ui/js/ipfs.js): `pension-ui/vanilla-ui/js/ipfs.js`

### Pension contracts

- [Pension registry](https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionRegistry.sol): `Hardhat/contracts/PensionRegistry.sol`
- [Document records](https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionDocuments.sol): `Hardhat/contracts/PensionDocuments.sol`
- [Contribution fund](https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionFund.sol): `Hardhat/contracts/PensionFund.sol`
- [Pension disbursement](https://github.com/infinityabir/blockchain-pension-system/blob/master/Hardhat/contracts/PensionDisbursement.sol): `Hardhat/contracts/PensionDisbursement.sol`

### External services

- **Pinata / IPFS**
- **MetaMask**

### Other components

- **Pensioner**
- **Administrator**
- **Nominee**

## Connections

- Pensioner → Wallet login: connects (evidence: `README.md`)
- Pensioner → Pension registration: registers (evidence: `README.md`)
- Pensioner → Document submission: submits documents (evidence: `README.md`)
- Pensioner → Pension dashboard: manages pension (evidence: `README.md`)
- Administrator → Admin review: reviews cases (evidence: `README.md`)
- Nominee → Nominee claims: files claim (evidence: `README.md`)
- Role routing → Account session: reads account (evidence: `pension-ui/vanilla-ui/js/app.js`)
- Role routing → Contract adapter: checks status (evidence: `pension-ui/vanilla-ui/js/app.js`)
- Role routing → Role navigation: loads navigation (evidence: `pension-ui/vanilla-ui/js/app.js`)
- Wallet login → Contract adapter: connects wallet (evidence: `pension-ui/vanilla-ui/js/app-login.js`)
- Wallet login → Account session: saves account (evidence: `pension-ui/vanilla-ui/js/app-login.js`)
- Pension registration → Contract adapter: submits registration (evidence: `pension-ui/vanilla-ui/js/app-register.js`)
- Document submission → File upload: uploads files (evidence: `pension-ui/vanilla-ui/js/app-upload.js`)
- Document submission → Contract adapter: submits CIDs (evidence: `pension-ui/vanilla-ui/js/app-upload.js`)
- Pension dashboard → Contract adapter: reads and writes (evidence: `pension-ui/vanilla-ui/js/app-dashboard.js`)
- Admin review → Contract adapter: reviews and verifies (evidence: `pension-ui/vanilla-ui/js/app-admin.js`)
- Nominee claims → File upload: uploads proof (evidence: `pension-ui/vanilla-ui/js/app-nominee.js`)
- Nominee claims → Contract adapter: reports and claims (evidence: `pension-ui/vanilla-ui/js/app-nominee.js`)
- Role navigation → Contract adapter: loads role state (evidence: `pension-ui/vanilla-ui/js/navbar.js`)
- Contract adapter → Network configuration: uses addresses (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
- Contract adapter → MetaMask: requests accounts (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
- File upload → Network configuration: reads credentials (evidence: `pension-ui/vanilla-ui/js/ipfs.js`)
- File upload → Pinata / IPFS: pins files (evidence: `pension-ui/vanilla-ui/js/ipfs.js`)
- Contract adapter → Pension registry: accesses contract (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
- Contract adapter → Document records: accesses contract (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
- Contract adapter → Contribution fund: accesses contract (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
- Contract adapter → Pension disbursement: accesses contract (evidence: `pension-ui/vanilla-ui/js/contracts.js`)
