import { calculateReviewSplit } from './platformCommissions' import type { ReviewRewardRequest, ReviewRewardResult } from './reviewRewardTypes' import { createReviewInvoice } from './reviewRewardInvoice' import { transferReviewerPortionIfAvailable } from './reviewRewardTransfer' import { trackReviewReward } from './reviewRewardTracking' import { updateReviewWithReward } from './reviewRewardUpdate' /** * Review reward service * Handles Lightning payments for rewarding reviews with automatic commission split * * Review reward: 70 sats total * - Reviewer: 49 sats * - Platform: 21 sats */ export type { ReviewRewardRequest, ReviewRewardResult } from './reviewRewardTypes' export class ReviewRewardService { async createReviewRewardPayment(request: ReviewRewardRequest): Promise { try { const split = calculateReviewSplit() const invoice = await createReviewInvoice(split, request) console.log('Review reward invoice created', { reviewId: request.reviewId, articleId: request.articleId, reviewerPubkey: request.reviewerPubkey, amount: split.total, reviewerPortion: split.reviewer, platformCommission: split.platform, timestamp: new Date().toISOString(), }) return { success: true, invoice, paymentHash: invoice.paymentHash, split, } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error' console.error('Error creating review reward payment', { reviewId: request.reviewId, articleId: request.articleId, error: errorMessage, timestamp: new Date().toISOString(), }) return { success: false, error: errorMessage, split: calculateReviewSplit(), } } } /** * Process review reward payment after confirmation * Transfers reviewer portion and tracks commission */ async processReviewRewardPayment( request: ReviewRewardRequest, paymentHash: string ): Promise { try { const split = calculateReviewSplit() await transferReviewerPortionIfAvailable(request, split) await trackReviewReward(request, split, paymentHash) await updateReviewWithReward(request.reviewId, request.authorPrivateKey) console.log('Review reward processed', { reviewId: request.reviewId, articleId: request.articleId, reviewerPubkey: request.reviewerPubkey, reviewerAmount: split.reviewer, platformCommission: split.platform, timestamp: new Date().toISOString(), }) return true } catch (error) { console.error('Error processing review reward payment', { reviewId: request.reviewId, error: error instanceof Error ? error.message : 'Unknown error', timestamp: new Date().toISOString(), }) return false } } } export const reviewRewardService = new ReviewRewardService()