- **Motivations :** Assurer passage du lint strict et clarifier la logique paiements/publications. - **Root causes :** Fonctions trop longues, promesses non gérées et typages WebLN/Nostr incomplets. - **Correctifs :** Refactor PaymentModal (handlers void), extraction helpers articlePublisher, simplification polling sponsoring/zap, corrections curly et awaits. - **Evolutions :** Nouveau module articlePublisherHelpers pour présentation/aiguillage contenu privé. - **Page affectées :** components/PaymentModal.tsx, lib/articlePublisher.ts, lib/articlePublisherHelpers.ts, lib/paymentPolling.ts, lib/sponsoring.ts, lib/nostrZapVerification.ts et dépendances liées.
428 lines
13 KiB
Markdown
428 lines
13 KiB
Markdown
# Refonte zapwall4Science - Spécifications
|
|
|
|
**Date** : Décembre 2024
|
|
**Auteur** : Équipe 4NK
|
|
|
|
## 🎯 Objectif
|
|
|
|
Transformation de Nostr Paywall en **zapwall4Science** : plateforme de publication d'articles scientifiques et de science-fiction avec système de sponsoring, commissions et rémunération des avis.
|
|
|
|
---
|
|
|
|
## 📝 Wording et terminologie
|
|
|
|
### Acteurs
|
|
|
|
- **Auteur** : Utilisateur qui publie des articles (science-fiction ou recherche scientifique)
|
|
- **Lecteur** : Utilisateur qui lit les articles et peut poster des avis
|
|
- **Site** : La plateforme zapwall4Science (recevant les commissions)
|
|
|
|
### Contenus
|
|
|
|
- **Article** : Publication d'un auteur (science-fiction ou recherche scientifique)
|
|
- **Article de présentation** : Article obligatoire créé par chaque auteur lors de son inscription, contenant sa présentation, description de son contenu et adresse de sponsoring mainnet
|
|
- **Avis** : Commentaire/évaluation d'un article par un lecteur qui a acheté l'article
|
|
- **Message d'envoi de l'article** : Message privé chiffré (kind:4) envoyé automatiquement après paiement d'un article
|
|
|
|
### Paiements
|
|
|
|
- **Paiement** : Transaction Bitcoin/Lightning pour accéder à un article ou sponsoriser un auteur
|
|
- **Sponsoring** : Paiement unique de 0.05 BTC pour sponsoriser un auteur (0.004 BTC au site, 0.046 BTC à l'auteur)
|
|
- **Commission pour le site sur la vente d'un article** : 100 sats sur chaque achat d'article (800 sats total, 700 à l'auteur)
|
|
- **Commission pour le site sur le remerciement d'un avis** : 21 sats sur chaque rémunération d'avis (70 sats au lecteur, 21 sats au site)
|
|
- **Remerciement pour l'avis** : Paiement de 70 sats (21 sats commission site) par l'auteur à un lecteur pour son avis
|
|
|
|
---
|
|
|
|
## 🏗️ Architecture fonctionnelle
|
|
|
|
### 1. Article de présentation obligatoire
|
|
|
|
**Description** : Chaque auteur doit créer un article de présentation lors de sa première connexion.
|
|
|
|
**Contenu obligatoire** :
|
|
- Titre : "Présentation de [Nom auteur]"
|
|
- Présentation personnelle de l'auteur
|
|
- Description/aperçu du type de contenu qu'il publie
|
|
- Adresse Bitcoin mainnet pour le sponsoring (obligatoire)
|
|
|
|
**Caractéristiques** :
|
|
- Article gratuit (pas de paiement requis)
|
|
- Visible par tous
|
|
- Tag spécial : `presentation: true`
|
|
- Tag : `category: author-presentation`
|
|
- Tag : `mainnet_address: [adresse]`
|
|
- Non supprimable (peut être édité)
|
|
- Un seul par auteur
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `components/AuthorPresentationEditor.tsx` : Éditeur d'article de présentation
|
|
- `lib/articlePublisher.ts` : Vérification de l'existence d'un article de présentation
|
|
- `hooks/useAuthorPresentation.ts` : Hook pour gérer l'article de présentation
|
|
- `types/nostr.ts` : Ajout du type `AuthorPresentationArticle`
|
|
|
|
---
|
|
|
|
### 2. Division en 2 catégories
|
|
|
|
**Catégories** :
|
|
1. **Science-fiction** (`category: science-fiction`)
|
|
2. **Recherche scientifique** (`category: scientific-research`)
|
|
|
|
**Fonctionnalités** :
|
|
- Les auteurs peuvent publier dans les 2 catégories
|
|
- Filtrage par catégorie sur la page d'accueil
|
|
- Onglets ou sections distinctes pour chaque catégorie
|
|
- Tag obligatoire `category` sur chaque article (sauf article de présentation)
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `components/CategoryFilter.tsx` : Filtre par catégorie
|
|
- `pages/index.tsx` : Affichage par catégories
|
|
- `lib/articleFiltering.ts` : Filtrage par catégorie
|
|
- `types/nostr.ts` : Ajout de `ArticleCategory`
|
|
|
|
---
|
|
|
|
### 3. Tri des articles
|
|
|
|
**Ordre de tri** :
|
|
1. **Par sponsoring** : Auteurs les plus sponsorisés en premier
|
|
2. **Par date** : Articles les plus récents en premier (parmi les auteurs de même niveau de sponsoring)
|
|
|
|
**Calcul du sponsoring** :
|
|
- Somme totale des paiements de sponsoring reçus par l'auteur
|
|
- Stocké dans un tag sur l'article de présentation : `total_sponsoring: [montant en sats]`
|
|
- Mis à jour à chaque nouveau sponsoring
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `lib/articleFiltering.ts` : Tri par sponsoring puis date
|
|
- `lib/sponsoring.ts` : Service de gestion du sponsoring
|
|
- `types/nostr.ts` : Ajout de `totalSponsoring` dans `Article`
|
|
|
|
---
|
|
|
|
### 4. Système de sponsoring
|
|
|
|
**Montant** : 0.05 BTC (5 000 000 sats)
|
|
|
|
**Répartition** :
|
|
- **Site** : 0.004 BTC (400 000 sats) - frais de transaction payés par l'auteur
|
|
- **Auteur** : 0.046 BTC (4 600 000 sats) - frais de transaction payés par l'auteur
|
|
|
|
**Fonctionnement** :
|
|
- Paiement unique vers l'adresse mainnet de l'auteur (depuis l'article de présentation)
|
|
- Transaction Bitcoin mainnet (pas Lightning)
|
|
- Mise à jour du tag `total_sponsoring` sur l'article de présentation
|
|
- Affichage du montant total sponsorisé sur le profil de l'auteur
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `components/SponsorButton.tsx` : Bouton de sponsoring
|
|
- `lib/sponsoring.ts` : Service de sponsoring
|
|
- `lib/bitcoinMainnet.ts` : Service pour les paiements mainnet
|
|
- `types/sponsoring.ts` : Types pour le sponsoring
|
|
|
|
---
|
|
|
|
### 5. Paiement d'article modifié (BOLT12)
|
|
|
|
**Montant** : 800 sats
|
|
|
|
**Répartition** :
|
|
- **Auteur** : 700 sats - frais de transaction payés par l'auteur
|
|
- **Site** : 100 sats - frais de transaction payés par l'auteur
|
|
|
|
**Technologie** : BOLT12 (offers) pour diviser automatiquement le paiement
|
|
|
|
**Fonctionnement** :
|
|
- Création d'une offre BOLT12 avec split automatique
|
|
- 700 sats vers l'adresse Lightning de l'auteur
|
|
- 100 sats vers l'adresse Lightning du site
|
|
- Frais de transaction payés par l'auteur (déduits de sa part)
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `lib/bolt12.ts` : Service BOLT12 pour les offres avec split
|
|
- `lib/payment.ts` : Modification pour utiliser BOLT12
|
|
- `types/payment.ts` : Types pour BOLT12
|
|
|
|
---
|
|
|
|
### 6. Système de rémunération des avis
|
|
|
|
**Conditions** :
|
|
- Seuls les lecteurs qui ont acheté l'article peuvent poster un avis
|
|
- L'auteur peut rémunérer un avis avec 70 sats
|
|
|
|
**Répartition** :
|
|
- **Lecteur (auteur de l'avis)** : 70 sats - frais de transaction payés par l'auteur
|
|
- **Site** : 21 sats - frais de transaction payés par l'auteur
|
|
|
|
**Fonctionnement** :
|
|
- Bouton "Remercier" sur chaque avis (visible uniquement par l'auteur de l'article)
|
|
- Paiement Lightning avec split automatique (BOLT12)
|
|
- Tag sur l'avis : `rewarded: true`, `reward_amount: 70`
|
|
|
|
**Fichiers à créer/modifier** :
|
|
- `components/ArticleReview.tsx` : Composant d'avis avec bouton de rémunération
|
|
- `components/ReviewRewardButton.tsx` : Bouton de rémunération d'avis
|
|
- `lib/reviewReward.ts` : Service de rémunération des avis
|
|
- `types/reviews.ts` : Types pour les avis
|
|
|
|
---
|
|
|
|
## 🔧 Modifications techniques
|
|
|
|
### Structure de données
|
|
|
|
#### Article de présentation
|
|
```typescript
|
|
interface AuthorPresentationArticle extends Article {
|
|
category: 'author-presentation'
|
|
mainnetAddress: string
|
|
totalSponsoring: number // en sats
|
|
isPresentation: true
|
|
}
|
|
```
|
|
|
|
#### Article standard
|
|
```typescript
|
|
interface StandardArticle extends Article {
|
|
category: 'science-fiction' | 'scientific-research'
|
|
authorPresentationId: string // ID de l'article de présentation
|
|
lightningAddress: string // Adresse Lightning de l'auteur
|
|
}
|
|
```
|
|
|
|
#### Avis
|
|
```typescript
|
|
interface Review {
|
|
id: string
|
|
articleId: string
|
|
authorPubkey: string // Auteur de l'article
|
|
reviewerPubkey: string // Lecteur qui a écrit l'avis
|
|
content: string
|
|
rating?: number // 1-5 étoiles
|
|
createdAt: number
|
|
rewarded: boolean
|
|
rewardAmount?: number // 70 sats si rémunéré
|
|
rewardTransactionId?: string
|
|
}
|
|
```
|
|
|
|
### Tags Nostr
|
|
|
|
#### Article de présentation
|
|
```
|
|
- title: "Présentation de [Nom]"
|
|
- category: "author-presentation"
|
|
- presentation: "true"
|
|
- mainnet_address: "[adresse Bitcoin]"
|
|
- total_sponsoring: "[montant en sats]"
|
|
```
|
|
|
|
#### Article standard
|
|
```
|
|
- title: "[Titre]"
|
|
- category: "science-fiction" | "scientific-research"
|
|
- preview: "[Aperçu]"
|
|
- zap: "800"
|
|
- author_presentation_id: "[ID article présentation]"
|
|
- lightning_address: "[adresse Lightning auteur]"
|
|
- invoice: "[BOLT12 offer]"
|
|
```
|
|
|
|
#### Avis (kind:1 avec tag spécial)
|
|
```
|
|
- review: "true"
|
|
- e: "[ID article]"
|
|
- p: "[pubkey auteur]"
|
|
- rating: "[1-5]"
|
|
- rewarded: "true" | "false"
|
|
- reward_amount: "70" (si rémunéré)
|
|
```
|
|
|
|
---
|
|
|
|
## 📁 Fichiers à créer
|
|
|
|
### Nouveaux composants
|
|
- `components/AuthorPresentationEditor.tsx`
|
|
- `components/CategoryFilter.tsx`
|
|
- `components/CategoryTabs.tsx`
|
|
- `components/SponsorButton.tsx`
|
|
- `components/ArticleReview.tsx`
|
|
- `components/ReviewRewardButton.tsx`
|
|
- `components/ReviewForm.tsx`
|
|
|
|
### Nouveaux services
|
|
- `lib/sponsoring.ts`
|
|
- `lib/bitcoinMainnet.ts`
|
|
- `lib/bolt12.ts`
|
|
- `lib/reviewReward.ts`
|
|
- `lib/reviews.ts`
|
|
|
|
### Nouveaux hooks
|
|
- `hooks/useAuthorPresentation.ts`
|
|
- `hooks/useSponsoring.ts`
|
|
- `hooks/useReviews.ts`
|
|
- `hooks/useReviewReward.ts`
|
|
|
|
### Nouveaux types
|
|
- `types/sponsoring.ts`
|
|
- `types/reviews.ts`
|
|
- `types/bolt12.ts`
|
|
|
|
---
|
|
|
|
## 📁 Fichiers à modifier
|
|
|
|
### Pages
|
|
- `pages/index.tsx` : Ajout des catégories et tri par sponsoring
|
|
- `pages/publish.tsx` : Sélection de catégorie obligatoire
|
|
- `pages/profile.tsx` : Affichage de l'article de présentation et sponsoring
|
|
|
|
### Composants existants
|
|
- `components/ArticleCard.tsx` : Affichage catégorie et sponsoring
|
|
- `components/ArticleEditor.tsx` : Sélection de catégorie
|
|
- `components/UserProfile.tsx` : Affichage sponsoring total
|
|
|
|
### Services existants
|
|
- `lib/articlePublisher.ts` : Vérification article de présentation
|
|
- `lib/payment.ts` : Migration vers BOLT12
|
|
- `lib/articleFiltering.ts` : Tri par sponsoring
|
|
- `lib/nostr.ts` : Parsing des nouveaux tags
|
|
|
|
### Types existants
|
|
- `types/nostr.ts` : Ajout des nouveaux types
|
|
|
|
---
|
|
|
|
## 🔄 Flux utilisateur
|
|
|
|
### Inscription d'un auteur
|
|
1. Connexion avec Nostr
|
|
2. Redirection vers création d'article de présentation (obligatoire)
|
|
3. Remplissage : présentation, description, adresse mainnet
|
|
4. Publication de l'article de présentation
|
|
5. Accès à la plateforme
|
|
|
|
### Publication d'un article
|
|
1. Sélection de la catégorie (science-fiction ou recherche)
|
|
2. Remplissage du formulaire (titre, preview, contenu)
|
|
3. Création de l'offre BOLT12 avec split (700/100)
|
|
4. Publication avec tags appropriés
|
|
|
|
### Achat d'un article
|
|
1. Clic sur "Unlock for 800 sats"
|
|
2. Affichage de l'offre BOLT12
|
|
3. Paiement Lightning
|
|
4. Réception automatique du contenu (message privé)
|
|
5. Possibilité de poster un avis
|
|
|
|
### Sponsoring d'un auteur
|
|
1. Clic sur "Sponsor" sur l'article de présentation
|
|
2. Affichage de l'adresse mainnet
|
|
3. Paiement Bitcoin mainnet de 0.05 BTC
|
|
4. Mise à jour du sponsoring total
|
|
5. Tri mis à jour
|
|
|
|
### Rémunération d'un avis
|
|
1. Auteur voit l'avis d'un lecteur qui a acheté
|
|
2. Clic sur "Remercier (70 sats)"
|
|
3. Paiement Lightning avec split (70/21)
|
|
4. Tag `rewarded: true` sur l'avis
|
|
|
|
---
|
|
|
|
## ⚠️ Points d'attention
|
|
|
|
### BOLT12
|
|
- Vérifier la compatibilité avec Alby/WebLN pour BOLT12
|
|
- Implémenter le split automatique dans l'offre
|
|
- Gérer les frais de transaction
|
|
|
|
### Bitcoin Mainnet
|
|
- Intégration avec un service de paiement mainnet (ou QR code)
|
|
- Vérification des paiements mainnet
|
|
- Gestion des confirmations
|
|
|
|
### Sécurité
|
|
- Vérifier que seuls les acheteurs peuvent poster des avis
|
|
- Vérifier que seul l'auteur peut rémunérer les avis
|
|
- Vérifier l'authenticité des paiements
|
|
|
|
### Performance
|
|
- Indexer les articles par catégorie
|
|
- Indexer les auteurs par sponsoring total
|
|
- Cache des calculs de tri
|
|
|
|
---
|
|
|
|
## 📊 Priorités d'implémentation
|
|
|
|
### Phase 1 - Fondations
|
|
1. ✅ Wording et terminologie (documentation)
|
|
2. ⏳ Article de présentation obligatoire
|
|
3. ⏳ Division en catégories
|
|
4. ⏳ Tri par sponsoring puis date
|
|
|
|
### Phase 2 - Paiements
|
|
5. ⏳ Système de sponsoring (Bitcoin mainnet)
|
|
6. ⏳ Migration vers BOLT12 pour les articles
|
|
7. ⏳ Split automatique des paiements
|
|
|
|
### Phase 3 - Avis et rémunération
|
|
8. ⏳ Système d'avis (seulement pour acheteurs)
|
|
9. ⏳ Rémunération des avis par l'auteur
|
|
|
|
### Phase 4 - UI/UX
|
|
10. ⏳ Interface par catégories
|
|
11. ⏳ Affichage du sponsoring
|
|
12. ⏳ Interface de rémunération des avis
|
|
|
|
---
|
|
|
|
## 🎨 Renommage
|
|
|
|
- **Nom du site** : zapwall4Science
|
|
- **Titre** : "zapwall4Science - Science Fiction & Scientific Research"
|
|
- **Description** : "Plateforme de publication d'articles scientifiques et de science-fiction avec sponsoring et rémunération des avis"
|
|
|
|
**Fichiers à modifier** :
|
|
- `pages/index.tsx` : Titre et description
|
|
- `pages/_app.tsx` : Titre par défaut
|
|
- `README.md` : Nom et description
|
|
- Tous les composants avec "Nostr Paywall" → "zapwall4Science"
|
|
|
|
---
|
|
|
|
## 📝 Notes techniques
|
|
|
|
### BOLT12 Offers
|
|
- Utiliser `lightning:lno1...` pour les offres
|
|
- Split automatique via les métadonnées de l'offre
|
|
- Vérifier la compatibilité avec les wallets Lightning
|
|
|
|
### Bitcoin Mainnet
|
|
- Utiliser une API de vérification de transactions (blockchain.info, blockstream, etc.)
|
|
- QR code pour faciliter les paiements
|
|
- Affichage clair de l'adresse et du montant
|
|
|
|
### Stockage
|
|
- Stocker les montants de sponsoring dans IndexedDB
|
|
- Cache des calculs de tri
|
|
- Synchronisation avec les événements Nostr
|
|
|
|
---
|
|
|
|
## ✅ Checklist de validation
|
|
|
|
- [ ] Article de présentation créé pour chaque auteur
|
|
- [ ] Catégories fonctionnelles (science-fiction / recherche)
|
|
- [ ] Tri par sponsoring puis date opérationnel
|
|
- [ ] Sponsoring Bitcoin mainnet fonctionnel
|
|
- [ ] Paiements articles avec BOLT12 et split
|
|
- [ ] Avis uniquement pour les acheteurs
|
|
- [ ] Rémunération des avis fonctionnelle
|
|
- [ ] Wording cohérent partout
|
|
- [ ] Renommage complet en zapwall4Science
|