# IPFS Portal Feature Plan ## A. Payment / Blockchain Features ### A1. Multi-chain Support - **Status**: `getWalletClient()` en `getPublicClient()` hardcoden naar `zkSyncLocal` - **Wijzigingen**: - `src/lib/payment/read-service.ts`: `getPublicClient()` chain parameter toevoegen - `src/lib/payment/write-service.ts`: `getWalletClient()` chain configurable maken - `src/lib/payment/abi.ts`: `ChainConfig[]` type, default chains (zkSync Local + optioneel Polygon/Arbitrum) - `src/lib/payment/service.ts`: chain selector in constructor - `src/components/PaymentPanel.tsx`: chain switcher UI - `src/app/admin/payment/page.tsx`: multi-chain admin overzicht - **Bestanden**: `src/lib/payment/read-service.ts`, `write-service.ts`, `abi.ts`, `service.ts`, `src/components/PaymentPanel.tsx`, `src/app/admin/payment/page.tsx` ### A2. Gas Estimator - **Status**: Geen indicatie van transactiekosten voor gebruiker - **Wijzigingen**: - `src/lib/payment/read-service.ts`: `estimateGas()` methode - `src/lib/payment/write-service.ts`: gas estimation voor `payWithETH`, `approveAndPayWithToken` - `src/components/PaymentPanel.tsx`: gas fee display naast prijs - **Bestanden**: `src/lib/payment/read-service.ts`, `write-service.ts`, `src/components/PaymentPanel.tsx` ### A3. Batch Upload + Single Payment - **Status**: 1 file → 1 upload → 1 tx (sequentieel via `startUpload()`) - **Wijzigingen**: - `src/lib/payment/write-service.ts`: `payWithBatch(provider, cids[], totalBytes, priceWei)` — encodet meerdere CIDs in 1 tx - `src/app/upload/page.tsx`: batch selectie in crypto tab - `src/components/PaymentPanel.tsx`: multiple files support - **Bestanden**: `src/lib/payment/write-service.ts`, `src/app/upload/page.tsx`, `src/components/PaymentPanel.tsx` ### A4. Storage Quota UI - **Status**: `getUserStats()` returned `totalBytes/uploadCount/remainingFree` maar nergens getoond als overzicht - **Wijzigingen**: - Nieuw component: `src/components/StorageQuota.tsx` — balkje met used/free/total - `src/app/dashboard/page.tsx`: storage quota card toevoegen - `src/components/PaymentPanel.tsx`: quota status in payment panel - **Bestanden**: NIEUW `src/components/StorageQuota.tsx`, `src/app/dashboard/page.tsx`, `src/components/PaymentPanel.tsx` ### A5. On-chain Transaction History - **Status**: History page gebruikt alleen localStorage; contract heeft `getUserUploads(address)` met records - **Wijzigingen**: - `src/lib/payment/read-service.ts`: `getUserUploads()` bestaat al — wordt gebruikt in UsersPage - `src/app/history/page.tsx`: "On-chain History" tab toevoegen naast localStorage tab - Nieuw component: `src/components/ChainHistory.tsx` - **Bestanden**: `src/app/history/page.tsx`, NIEUW `src/components/ChainHistory.tsx` ### A6. Token Auto-router - **Status**: Gebruiker kiest handmatig token in PaymentPanel - **Wijzigingen**: - `src/components/PaymentPanel.tsx`: auto-select goedkoopste token op basis van `finalWei` / `weiPerToken` - Optioneel: "Auto" button naast token lijst - **Bestanden**: `src/components/PaymentPanel.tsx` ### A7. Subscription / Pre-paid Tegoed - **Status**: Per-file betaling; contract heeft `getUserStats()` met `remainingFree` - **Wijzigingen**: - Nieuw component: `src/components/DepositPanel.tsx` — stort ETH/tokens op contract - Nieuw component: `src/components/BalanceDisplay.tsx` — toon tegoed - `src/app/dashboard/page.tsx`: balance card - `src/lib/payment/write-service.ts`: `deposit(provider, amount)` methode - **Bestanden**: NIEUW `src/components/DepositPanel.tsx`, NIEUW `src/components/BalanceDisplay.tsx`, `src/app/dashboard/page.tsx`, `src/lib/payment/write-service.ts` --- ## B. IPFS Explorer — Content Viewing ### B1. Video Preview (.mp4, .webm, .mov) - **Status**: valt onder `'other'` → "Preview not available" - **Wijzigingen**: - `src/app/explorer/components/FilePreview.tsx`: `detectFileType()` uitbreiden met `'video'` type - `src/app/explorer/components/FilePreview.tsx`: `