┌─────────────────────────────────────────────────────────────┐
│ Frontend (UI) │
└──────────┬──────────────────────────────────┬───────────────┘
│ deposit / withdraw / create │ read state
▼ ▼
┌─────────────────────┐ ┌──────────────────────────┐
│ VaultFactory(s) │ │ VaultRegistry │
│ Politician / User │ │ on-chain discovery │
└────────┬────────────┘ └──────────────────────────┘
│ deploys (BeaconProxy)
▼
┌─────────────────────────────────────────────────────────────┐
│ BaseVault (ERC-4626) │
│ ┌─────────────────┐ ┌──────────────────┐ │
│ │ PoliticianVault │ │ UserVault │ │
│ │ (oracle-driven) │ │ (curator-managed) │ │
│ └────────┬────────┘ └────────┬─────────┘ │
│ │ getTargetWeights() │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌──────────────────┐ │
│ │ PortfolioOracle │ │ Internal weights │ │
│ └─────────────────┘ └──────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│ rebalance / allocate
▼
┌─────────────────────┐
│ RebalanceEngine │
│ trade calculation │
└──────────┬──────────┘
│ swap
▼
┌─────────────────────┐
│ TokenRouter │
│ price oracle + │
│ swap execution │
└─────────────────────┘
┌──────────────┐ ┌───────────────────┐
│ FeeManager │ │ PriceOracle │
│ fee splits │ │ ticker → price │
└──────────────┘ └───────────────────┘