story-research-zapwall/lib/reviewReward.ts

93 lines
2.9 KiB
TypeScript

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<ReviewRewardResult> {
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<boolean> {
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()