Nicolas Cantu 2a191f35f4 Fix all TypeScript errors and warnings
- Fix unused function warnings by renaming to _unusedExtractTags
- Fix type errors in nostrTagSystem.ts for includes() calls
- Fix type errors in reviews.ts for filter kinds array
- Fix ArrayBuffer type errors in articleEncryption.ts
- Remove unused imports (DecryptionKey, decryptArticleContent, extractTagsFromEvent)
- All TypeScript checks now pass without disabling any controls
2025-12-27 22:26:13 +01:00

6.0 KiB

Documentation technique

Auteur : Équipe 4NK

Architecture

Zapwall est une plateforme décentralisée basée sur Nostr pour la publication et la monétisation de contenu. Le système utilise Lightning Network pour les paiements et Bitcoin mainnet pour le sponsoring.

Services principaux

  • Nostr (lib/nostr.ts) : Pool de connexions, publication/récupération d'événements, profils, zap requests
  • Paiements (lib/payment.ts, lib/paymentPolling.ts) : Invoices Lightning via Alby/WebLN, vérification zap receipts (NIP-57), envoi automatique contenu privé
  • Commissions (lib/platformCommissions.ts) : Configuration centralisée, calcul splits, validation montants
  • Tracking (lib/platformTracking.ts, lib/sponsoringTracking.ts) : Événements Nostr (kind 30078/30079) pour audit
  • Intégrations :
    • lib/mempoolSpace.ts : Vérification transactions Bitcoin via mempool.space API
    • lib/lightningAddress.ts : Récupération adresses Lightning depuis profils Nostr (lud16/lud06)

Stockage

  • IndexedDB : Contenu privé chiffré (AES-GCM)
  • localStorage : Métadonnées articles, invoices
  • Nostr : Contenus publics et événements de tracking

Système de commissions

Configuration (lib/platformCommissions.ts)

  • Articles : 800 sats (700 auteur, 100 plateforme)
  • Avis : 70 sats (49 reviewer, 21 plateforme)
  • Sponsoring : 0.046 BTC (0.042 auteur, 0.004 plateforme)

Implémentation

Articles (lib/paymentPolling.ts, lib/articleInvoice.ts) :

  • Validation montant 800 sats à chaque étape
  • Tracking avec author_amount et platform_commission dans événements Nostr
  • Récupération adresse Lightning auteur via lightningAddressService
  • Transfert automatique déclenché (logs, nécessite nœud Lightning pour exécution)

Sponsoring (lib/sponsoringPayment.ts, lib/sponsoringTracking.ts) :

  • Validation montant 0.046 BTC
  • Vérification transactions Bitcoin via mempoolSpaceService (sorties auteur + plateforme)
  • Tracking sur Nostr (kind 30079) avec confirmations

Avis (lib/reviewReward.ts) :

  • Validation montant 70 sats
  • Mise à jour événement Nostr avec tags rewarded: true et reward_amount: 70
  • Récupération adresse Lightning reviewer
  • Transfert automatique déclenché (logs, nécessite nœud Lightning)

Tracking

Tous les paiements sont trackés sur Nostr :

  • Kind 30078 : Livraisons de contenu (lib/platformTracking.ts)
  • Kind 30079 : Paiements de sponsoring (lib/sponsoringTracking.ts)

Les événements incluent author_amount, platform_commission, zap_receipt (si applicable), et sont signés par l'auteur avec tag p pour la plateforme.

Système de tags Nostr

Nouveau système de tags (tous en anglais)

Tous les contenus sont des notes Nostr (kind 1) avec un système de tags unifié :

  • Type : #author, #series, #publication, #quote (tags simples sans valeur)
  • Catégorie : #sciencefiction ou #research (tags simples sans valeur)
  • ID : #id_<id> (tag avec valeur : ['id', '<id>'])
  • Paywall : #paywall (tag simple, pour les publications payantes)
  • Payment : #payment (tag simple optionnel, pour les notes de paiement)

Utilitaires (lib/nostrTagSystem.ts)

  • buildTags() : Construit les tags à partir d'un objet typé
  • extractTagsFromEvent() : Extrait les tags d'un événement
  • buildTagFilter() : Construit les filtres Nostr pour les requêtes

Internationalisation (i18n)

Système de traduction (lib/i18n.ts)

  • Chargement depuis fichiers texte plats (public/locales/fr.txt, public/locales/en.txt)
  • Format : key=value avec support des paramètres {{param}}
  • Hook useI18n pour utiliser les traductions dans les composants
  • Initialisé dans _app.tsx avec locale par défaut (fr)

Langues supportées

  • Français (fr) : langue par défaut
  • Anglais (en) : disponible
  • Extensible : ajout de nouvelles langues via fichiers de traduction

Financement IA

Jauge de financement (components/FundingGauge.tsx)

  • Affiche le montant collecté, la cible (0.27 BTC) et le pourcentage
  • Calcul des fonds via lib/fundingCalculation.ts
  • Agrégation de toutes les commissions (articles, avis, sponsoring)
  • Description de l'usage des fonds pour le développement IA

Calcul des fonds (lib/fundingCalculation.ts)

  • Estimation basée sur les taux de commission
  • Agrégation des zap receipts par type (purchase, review_tip, sponsoring)
  • Calcul du pourcentage de progression vers la cible

Flux de paiement article

  1. Lecteur clique "Unlock for 800 sats"
  2. Création invoice Lightning via Alby/WebLN (lib/articleInvoice.ts)
  3. Publication zap request sur Nostr (NIP-57)
  4. Lecteur paie l'invoice
  5. Polling vérification zap receipt (lib/paymentPolling.ts)
  6. Envoi automatique contenu privé (message chiffré NIP-04, lib/articlePublisher.ts)
  7. Tracking livraison avec commissions (lib/platformTracking.ts)

Flux de sponsoring

  1. Utilisateur demande sponsoring 0.046 BTC (lib/sponsoringPayment.ts)
  2. Service calcule split (0.042/0.004 BTC)
  3. Retourne deux adresses Bitcoin (auteur + plateforme)
  4. Utilisateur crée transaction avec deux sorties
  5. Vérification via mempool.space (lib/mempoolSpace.ts)
  6. Tracking sur Nostr (lib/sponsoringTracking.ts)

Vérification livraison contenu

Le système vérifie l'envoi du contenu privé à trois niveaux :

  1. Publication : publishEvent() retourne l'ID de l'événement publié
  2. Vérification relay : verifyPrivateMessagePublished() confirme présence sur relay (timeout 5s)
  3. Tracking : Événement Nostr (kind 30078) avec verified: true/false

Tous les événements sont loggés avec IDs, timestamps et statuts.

Limitations

Transferts Lightning automatiques : Nécessitent un nœud Lightning de la plateforme. Actuellement, les transferts sont loggés dans lib/automaticTransfer.ts et peuvent être exécutés manuellement. Les adresses Lightning sont récupérées automatiquement depuis les profils Nostr.