@t402/streaming-payments 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/settlement/types.ts","../../src/settlement/checkpoint.ts","../../src/settlement/final.ts","../../src/settlement/dispute.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Settlement state\n */\nexport const SettlementState = z.enum([\n 'pending', // Settlement not yet initiated\n 'in_progress', // Settlement process started\n 'challenging', // In challenge period\n 'disputed', // Dispute raised\n 'finalizing', // Finalizing on-chain\n 'completed', // Successfully settled\n 'failed', // Settlement failed\n]);\nexport type SettlementState = z.infer<typeof SettlementState>;\n\n/**\n * Checkpoint type\n */\nexport const CheckpointType = z.enum([\n 'periodic', // Regular interval checkpoint\n 'manual', // Manually triggered\n 'balance', // Triggered by balance threshold\n 'pre_close', // Before channel close\n 'dispute', // Checkpoint for dispute\n]);\nexport type CheckpointType = z.infer<typeof CheckpointType>;\n\n/**\n * Settlement checkpoint - extends channel checkpoint with settlement data\n */\nexport const SettlementCheckpoint = z.object({\n id: z.string(),\n channelId: z.string(),\n sequence: z.number(),\n type: CheckpointType,\n\n // Balances\n payerBalance: z.string(),\n payeeBalance: z.string(),\n totalStreamed: z.string(),\n\n // Signatures\n payerSignature: z.string(),\n payeeSignature: z.string().optional(),\n\n // Verification\n stateHash: z.string(),\n merkleRoot: z.string().optional(),\n\n // Timing\n createdAt: z.number(),\n expiresAt: z.number().optional(),\n\n // On-chain reference\n txHash: z.string().optional(),\n blockNumber: z.number().optional(),\n});\nexport type SettlementCheckpoint = z.infer<typeof SettlementCheckpoint>;\n\n/**\n * Settlement request\n */\nexport const SettlementRequest = z.object({\n channelId: z.string(),\n initiator: z.string(),\n finalCheckpoint: SettlementCheckpoint,\n reason: z.enum(['mutual', 'unilateral', 'timeout', 'dispute_resolution']),\n signature: z.string(),\n metadata: z.record(z.unknown()).optional(),\n});\nexport type SettlementRequest = z.infer<typeof SettlementRequest>;\n\n/**\n * Settlement result\n */\nexport const SettlementResult = z.object({\n success: z.boolean(),\n settlementId: z.string().optional(),\n error: z.string().optional(),\n finalBalances: z.object({\n payer: z.string(),\n payee: z.string(),\n }).optional(),\n txHash: z.string().optional(),\n timestamp: z.number(),\n});\nexport type SettlementResult = z.infer<typeof SettlementResult>;\n\n/**\n * Dispute reason\n */\nexport const DisputeReason = z.enum([\n 'invalid_checkpoint', // Checkpoint signature or data invalid\n 'stale_state', // Challenger has newer valid state\n 'balance_mismatch', // Balance doesn't match expected\n 'unauthorized_close', // Unauthorized party initiated close\n 'fraud', // Fraudulent activity detected\n 'other', // Other reason\n]);\nexport type DisputeReason = z.infer<typeof DisputeReason>;\n\n/**\n * Dispute evidence\n */\nexport const DisputeEvidence = z.object({\n type: z.enum(['checkpoint', 'signature', 'transaction', 'state_proof']),\n data: z.string(),\n description: z.string(),\n timestamp: z.number(),\n verified: z.boolean().default(false),\n});\nexport type DisputeEvidence = z.infer<typeof DisputeEvidence>;\n\n/**\n * Dispute record\n */\nexport const Dispute = z.object({\n id: z.string(),\n channelId: z.string(),\n initiator: z.string(),\n respondent: z.string(),\n reason: DisputeReason,\n description: z.string(),\n\n // Claimed state\n claimedPayerBalance: z.string(),\n claimedPayeeBalance: z.string(),\n claimedCheckpoint: SettlementCheckpoint.optional(),\n\n // Evidence\n evidence: z.array(DisputeEvidence),\n responseEvidence: z.array(DisputeEvidence).optional(),\n\n // Resolution\n status: z.enum(['pending', 'under_review', 'resolved', 'rejected', 'timeout']),\n resolution: z.object({\n winner: z.string().optional(),\n finalPayerBalance: z.string(),\n finalPayeeBalance: z.string(),\n reason: z.string(),\n timestamp: z.number(),\n }).optional(),\n\n // Timing\n createdAt: z.number(),\n responseDeadline: z.number(),\n resolutionDeadline: z.number(),\n});\nexport type Dispute = z.infer<typeof Dispute>;\n\n/**\n * Settlement configuration\n */\nexport const SettlementConfig = z.object({\n challengePeriod: z.number().default(86400), // 24 hours\n disputeResponsePeriod: z.number().default(43200), // 12 hours\n disputeResolutionPeriod: z.number().default(172800), // 48 hours\n minCheckpointInterval: z.number().default(60), // 60 seconds\n maxCheckpointsStored: z.number().default(100),\n settlementFee: z.string().default('0'),\n disputeBond: z.string().default('0'), // Bond required to raise dispute\n});\nexport type SettlementConfig = z.infer<typeof SettlementConfig>;\n\n/**\n * On-chain settlement data\n */\nexport const OnChainSettlement = z.object({\n channelId: z.string(),\n settlementId: z.string(),\n txHash: z.string(),\n blockNumber: z.number(),\n payerReceived: z.string(),\n payeeReceived: z.string(),\n fee: z.string(),\n timestamp: z.number(),\n finalized: z.boolean(),\n});\nexport type OnChainSettlement = z.infer<typeof OnChainSettlement>;\n","import {\n SettlementCheckpoint,\n CheckpointType,\n SettlementConfig,\n} from './types.js';\n\n/**\n * Checkpoint manager configuration\n */\nexport interface CheckpointManagerConfig {\n autoCheckpoint?: boolean;\n intervalSeconds?: number;\n balanceThreshold?: string;\n onCheckpoint?: (checkpoint: SettlementCheckpoint) => void;\n}\n\n/**\n * Checkpoint creation request\n */\nexport interface CheckpointRequest {\n channelId: string;\n sequence: number;\n payerBalance: string;\n payeeBalance: string;\n totalStreamed: string;\n type?: CheckpointType;\n payerSignature: string;\n payeeSignature?: string;\n}\n\n/**\n * Checkpoint manager for creating and validating checkpoints\n */\nexport class CheckpointManager {\n private checkpoints: Map<string, SettlementCheckpoint[]> = new Map();\n private config: Required<CheckpointManagerConfig>;\n private settlementConfig: SettlementConfig;\n private lastCheckpointTime: Map<string, number> = new Map();\n\n constructor(\n settlementConfig: SettlementConfig,\n config: CheckpointManagerConfig = {},\n ) {\n this.settlementConfig = settlementConfig;\n this.config = {\n autoCheckpoint: config.autoCheckpoint ?? false,\n intervalSeconds: config.intervalSeconds ?? 3600,\n balanceThreshold: config.balanceThreshold ?? '1000000',\n onCheckpoint: config.onCheckpoint ?? (() => {}),\n };\n }\n\n /**\n * Create a new checkpoint\n */\n create(request: CheckpointRequest): SettlementCheckpoint {\n const now = Date.now();\n const channelCheckpoints = this.checkpoints.get(request.channelId) ?? [];\n\n // Validate sequence\n const expectedSequence = channelCheckpoints.length;\n if (request.sequence !== expectedSequence) {\n throw new Error(`Invalid sequence: expected ${expectedSequence}, got ${request.sequence}`);\n }\n\n // Validate interval\n const lastTime = this.lastCheckpointTime.get(request.channelId) ?? 0;\n const elapsed = (now - lastTime) / 1000;\n if (elapsed < this.settlementConfig.minCheckpointInterval && channelCheckpoints.length > 0) {\n throw new Error(`Checkpoint interval too short: ${elapsed}s < ${this.settlementConfig.minCheckpointInterval}s`);\n }\n\n // Generate state hash\n const stateHash = this.generateStateHash(request);\n\n const checkpoint: SettlementCheckpoint = {\n id: this.generateCheckpointId(request.channelId, request.sequence),\n channelId: request.channelId,\n sequence: request.sequence,\n type: request.type ?? 'manual',\n payerBalance: request.payerBalance,\n payeeBalance: request.payeeBalance,\n totalStreamed: request.totalStreamed,\n payerSignature: request.payerSignature,\n payeeSignature: request.payeeSignature,\n stateHash,\n createdAt: now,\n };\n\n // Store checkpoint\n channelCheckpoints.push(checkpoint);\n this.checkpoints.set(request.channelId, channelCheckpoints);\n this.lastCheckpointTime.set(request.channelId, now);\n\n // Prune old checkpoints if needed\n this.pruneCheckpoints(request.channelId);\n\n // Notify callback\n this.config.onCheckpoint(checkpoint);\n\n return checkpoint;\n }\n\n /**\n * Get latest checkpoint for channel\n */\n getLatest(channelId: string): SettlementCheckpoint | undefined {\n const checkpoints = this.checkpoints.get(channelId);\n if (!checkpoints || checkpoints.length === 0) return undefined;\n return checkpoints[checkpoints.length - 1];\n }\n\n /**\n * Get checkpoint by sequence\n */\n getBySequence(channelId: string, sequence: number): SettlementCheckpoint | undefined {\n const checkpoints = this.checkpoints.get(channelId);\n if (!checkpoints) return undefined;\n return checkpoints.find(cp => cp.sequence === sequence);\n }\n\n /**\n * Get all checkpoints for channel\n */\n getAll(channelId: string): SettlementCheckpoint[] {\n return [...(this.checkpoints.get(channelId) ?? [])];\n }\n\n /**\n * Validate checkpoint\n */\n validate(checkpoint: SettlementCheckpoint): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n // Validate balance consistency\n const payerBalance = BigInt(checkpoint.payerBalance);\n const payeeBalance = BigInt(checkpoint.payeeBalance);\n const totalStreamed = BigInt(checkpoint.totalStreamed);\n\n if (payerBalance < 0n) {\n errors.push('Payer balance cannot be negative');\n }\n\n if (payeeBalance < 0n) {\n errors.push('Payee balance cannot be negative');\n }\n\n if (totalStreamed < 0n) {\n errors.push('Total streamed cannot be negative');\n }\n\n // Validate total streamed equals payee balance (for standard streaming)\n if (payeeBalance !== totalStreamed) {\n errors.push('Total streamed should equal payee balance');\n }\n\n // Validate signature presence\n if (!checkpoint.payerSignature) {\n errors.push('Payer signature is required');\n }\n\n // Validate state hash\n const expectedHash = this.generateStateHash({\n channelId: checkpoint.channelId,\n sequence: checkpoint.sequence,\n payerBalance: checkpoint.payerBalance,\n payeeBalance: checkpoint.payeeBalance,\n totalStreamed: checkpoint.totalStreamed,\n payerSignature: checkpoint.payerSignature,\n });\n\n if (checkpoint.stateHash !== expectedHash) {\n errors.push('State hash mismatch');\n }\n\n // Validate timestamp\n if (checkpoint.createdAt > Date.now()) {\n errors.push('Checkpoint timestamp is in the future');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /**\n * Compare two checkpoints\n */\n compare(a: SettlementCheckpoint, b: SettlementCheckpoint): {\n isNewer: boolean;\n balanceDifference: { payer: string; payee: string };\n } {\n const isNewer = a.sequence > b.sequence ||\n (a.sequence === b.sequence && a.createdAt > b.createdAt);\n\n const payerDiff = BigInt(a.payerBalance) - BigInt(b.payerBalance);\n const payeeDiff = BigInt(a.payeeBalance) - BigInt(b.payeeBalance);\n\n return {\n isNewer,\n balanceDifference: {\n payer: payerDiff.toString(),\n payee: payeeDiff.toString(),\n },\n };\n }\n\n /**\n * Check if checkpoint is needed\n */\n needsCheckpoint(\n channelId: string,\n currentPayeeBalance: string,\n ): { needed: boolean; reason: string } {\n const lastCheckpoint = this.getLatest(channelId);\n const now = Date.now();\n\n // No checkpoint exists\n if (!lastCheckpoint) {\n return { needed: true, reason: 'No existing checkpoint' };\n }\n\n // Time-based check\n const elapsed = (now - lastCheckpoint.createdAt) / 1000;\n if (elapsed >= this.config.intervalSeconds) {\n return { needed: true, reason: 'Interval elapsed' };\n }\n\n // Balance threshold check\n const balanceChange = BigInt(currentPayeeBalance) - BigInt(lastCheckpoint.payeeBalance);\n if (balanceChange >= BigInt(this.config.balanceThreshold)) {\n return { needed: true, reason: 'Balance threshold exceeded' };\n }\n\n return { needed: false, reason: '' };\n }\n\n /**\n * Build merkle root from checkpoint history\n */\n buildMerkleRoot(channelId: string): string {\n const checkpoints = this.checkpoints.get(channelId);\n if (!checkpoints || checkpoints.length === 0) {\n return '0x' + '0'.repeat(64);\n }\n\n // Simple merkle root - hash all state hashes together\n const hashes = checkpoints.map(cp => cp.stateHash);\n return this.hashArray(hashes);\n }\n\n /**\n * Verify checkpoint is in merkle tree\n */\n verifyMerkleProof(\n checkpoint: SettlementCheckpoint,\n merkleRoot: string,\n _proof: string[],\n ): boolean {\n const channelRoot = this.buildMerkleRoot(checkpoint.channelId);\n return channelRoot === merkleRoot;\n }\n\n /**\n * Export checkpoints for backup\n */\n export(channelId: string): string {\n const checkpoints = this.checkpoints.get(channelId) ?? [];\n return JSON.stringify({\n channelId,\n checkpoints,\n exportedAt: Date.now(),\n });\n }\n\n /**\n * Import checkpoints from backup\n */\n import(data: string): { success: boolean; imported: number } {\n try {\n const parsed = JSON.parse(data);\n const { channelId, checkpoints } = parsed;\n\n // Validate and import\n let imported = 0;\n const existing = this.checkpoints.get(channelId) ?? [];\n\n for (const cp of checkpoints as SettlementCheckpoint[]) {\n const validation = this.validate(cp);\n if (validation.valid) {\n const exists = existing.some(e => e.sequence === cp.sequence);\n if (!exists) {\n existing.push(cp);\n imported++;\n }\n }\n }\n\n // Sort by sequence\n existing.sort((a, b) => a.sequence - b.sequence);\n this.checkpoints.set(channelId, existing);\n\n return { success: true, imported };\n } catch {\n return { success: false, imported: 0 };\n }\n }\n\n /**\n * Clear checkpoints for channel\n */\n clear(channelId: string): void {\n this.checkpoints.delete(channelId);\n this.lastCheckpointTime.delete(channelId);\n }\n\n private generateCheckpointId(channelId: string, sequence: number): string {\n return `cp_${channelId.slice(-8)}_${sequence}_${Date.now().toString(36)}`;\n }\n\n private generateStateHash(request: CheckpointRequest): string {\n const data = [\n request.channelId,\n request.sequence.toString(),\n request.payerBalance,\n request.payeeBalance,\n request.totalStreamed,\n ].join(':');\n\n // Simple hash implementation\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return '0x' + Math.abs(hash).toString(16).padStart(64, '0');\n }\n\n private hashArray(hashes: string[]): string {\n const combined = hashes.join('');\n let hash = 0;\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return '0x' + Math.abs(hash).toString(16).padStart(64, '0');\n }\n\n private pruneCheckpoints(channelId: string): void {\n const checkpoints = this.checkpoints.get(channelId);\n if (!checkpoints) return;\n\n const maxStored = this.settlementConfig.maxCheckpointsStored;\n if (checkpoints.length <= maxStored) return;\n\n // Keep first, last N-1 checkpoints\n const first = checkpoints[0];\n const recent = checkpoints.slice(-(maxStored - 1));\n\n this.checkpoints.set(channelId, [first, ...recent]);\n }\n}\n\n/**\n * Sign checkpoint data\n */\nexport function signCheckpoint(\n checkpoint: SettlementCheckpoint,\n _privateKey: string,\n): string {\n // In production, would use actual cryptographic signing\n const dataToSign = [\n checkpoint.channelId,\n checkpoint.sequence.toString(),\n checkpoint.payerBalance,\n checkpoint.payeeBalance,\n checkpoint.totalStreamed,\n checkpoint.createdAt.toString(),\n ].join(':');\n\n // Mock signature\n let hash = 0;\n for (let i = 0; i < dataToSign.length; i++) {\n const char = dataToSign.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return '0x' + Math.abs(hash).toString(16).padStart(128, '0');\n}\n\n/**\n * Verify checkpoint signature\n */\nexport function verifyCheckpointSignature(\n _checkpoint: SettlementCheckpoint,\n signature: string,\n _publicKey: string,\n): boolean {\n // In production, would use actual signature verification\n // For now, just check signature format\n return signature.startsWith('0x') && signature.length === 130;\n}\n","import {\n SettlementState,\n SettlementCheckpoint,\n SettlementRequest,\n SettlementResult,\n SettlementConfig,\n OnChainSettlement,\n} from './types.js';\nimport { CheckpointManager } from './checkpoint.js';\n\n/**\n * Final settlement manager configuration\n */\nexport interface FinalSettlementConfig {\n autoFinalize?: boolean;\n retryAttempts?: number;\n retryDelayMs?: number;\n}\n\n/**\n * Settlement status\n */\nexport interface SettlementStatus {\n state: SettlementState;\n channelId: string;\n initiator: string;\n checkpoint: SettlementCheckpoint;\n challengeDeadline: number;\n finalizedAt?: number;\n txHash?: string;\n error?: string;\n}\n\n/**\n * Final settlement manager\n */\nexport class FinalSettlementManager {\n private settlements: Map<string, SettlementStatus> = new Map();\n private checkpointManager: CheckpointManager;\n private settlementConfig: SettlementConfig;\n private onChainSettlements: Map<string, OnChainSettlement> = new Map();\n\n constructor(\n checkpointManager: CheckpointManager,\n settlementConfig: SettlementConfig,\n _config: FinalSettlementConfig = {},\n ) {\n this.checkpointManager = checkpointManager;\n this.settlementConfig = settlementConfig;\n }\n\n /**\n * Initiate settlement\n */\n initiate(request: SettlementRequest): SettlementResult {\n const now = Date.now();\n\n // Validate request\n const validation = this.validateRequest(request);\n if (!validation.valid) {\n return {\n success: false,\n error: validation.errors.join(', '),\n timestamp: now,\n };\n }\n\n // Check if settlement already exists\n const existing = this.settlements.get(request.channelId);\n if (existing && existing.state !== 'completed' && existing.state !== 'failed') {\n return {\n success: false,\n error: 'Settlement already in progress',\n timestamp: now,\n };\n }\n\n // Create settlement status\n const settlementId = this.generateSettlementId(request.channelId);\n const challengeDeadline = now + this.settlementConfig.challengePeriod * 1000;\n\n const status: SettlementStatus = {\n state: 'pending',\n channelId: request.channelId,\n initiator: request.initiator,\n checkpoint: request.finalCheckpoint,\n challengeDeadline,\n };\n\n this.settlements.set(request.channelId, status);\n\n // Transition to in_progress\n this.transitionState(request.channelId, 'in_progress');\n\n return {\n success: true,\n settlementId,\n finalBalances: {\n payer: request.finalCheckpoint.payerBalance,\n payee: request.finalCheckpoint.payeeBalance,\n },\n timestamp: now,\n };\n }\n\n /**\n * Process mutual settlement (both parties agree)\n */\n processMutual(\n channelId: string,\n payerSignature: string,\n payeeSignature: string,\n finalCheckpoint: SettlementCheckpoint,\n ): SettlementResult {\n const now = Date.now();\n\n // Validate signatures\n if (!payerSignature || !payeeSignature) {\n return {\n success: false,\n error: 'Both signatures required for mutual settlement',\n timestamp: now,\n };\n }\n\n // Update checkpoint with both signatures\n const mutualCheckpoint: SettlementCheckpoint = {\n ...finalCheckpoint,\n payerSignature,\n payeeSignature,\n };\n\n // Create settlement\n const status: SettlementStatus = {\n state: 'finalizing',\n channelId,\n initiator: 'mutual',\n checkpoint: mutualCheckpoint,\n challengeDeadline: now, // No challenge period for mutual\n };\n\n this.settlements.set(channelId, status);\n\n // Skip challenge period and finalize immediately\n return this.finalize(channelId);\n }\n\n /**\n * Check if challenge period has elapsed\n */\n canFinalize(channelId: string): { canFinalize: boolean; timeRemaining: number } {\n const status = this.settlements.get(channelId);\n if (!status) {\n return { canFinalize: false, timeRemaining: -1 };\n }\n\n if (status.state === 'completed' || status.state === 'failed') {\n return { canFinalize: false, timeRemaining: 0 };\n }\n\n if (status.state === 'disputed') {\n return { canFinalize: false, timeRemaining: -1 };\n }\n\n const now = Date.now();\n const timeRemaining = Math.max(0, status.challengeDeadline - now);\n\n return {\n canFinalize: timeRemaining === 0,\n timeRemaining,\n };\n }\n\n /**\n * Finalize settlement after challenge period\n */\n finalize(channelId: string): SettlementResult {\n const now = Date.now();\n const status = this.settlements.get(channelId);\n\n if (!status) {\n return {\n success: false,\n error: 'No settlement found',\n timestamp: now,\n };\n }\n\n // Check if can finalize\n const { canFinalize: canFinalizeNow, timeRemaining } = this.canFinalize(channelId);\n if (!canFinalizeNow && status.state !== 'finalizing') {\n return {\n success: false,\n error: `Cannot finalize: ${timeRemaining}ms remaining in challenge period`,\n timestamp: now,\n };\n }\n\n // Transition to finalizing\n this.transitionState(channelId, 'finalizing');\n\n // Simulate on-chain settlement\n const settlementId = this.generateSettlementId(channelId);\n const mockTxHash = this.generateMockTxHash(channelId);\n\n const onChainSettlement: OnChainSettlement = {\n channelId,\n settlementId,\n txHash: mockTxHash,\n blockNumber: Math.floor(Date.now() / 1000),\n payerReceived: status.checkpoint.payerBalance,\n payeeReceived: status.checkpoint.payeeBalance,\n fee: this.settlementConfig.settlementFee,\n timestamp: now,\n finalized: true,\n };\n\n this.onChainSettlements.set(channelId, onChainSettlement);\n\n // Transition to completed\n this.transitionState(channelId, 'completed');\n status.finalizedAt = now;\n status.txHash = mockTxHash;\n\n return {\n success: true,\n settlementId,\n finalBalances: {\n payer: status.checkpoint.payerBalance,\n payee: status.checkpoint.payeeBalance,\n },\n txHash: mockTxHash,\n timestamp: now,\n };\n }\n\n /**\n * Get settlement status\n */\n getStatus(channelId: string): SettlementStatus | undefined {\n return this.settlements.get(channelId);\n }\n\n /**\n * Get on-chain settlement\n */\n getOnChainSettlement(channelId: string): OnChainSettlement | undefined {\n return this.onChainSettlements.get(channelId);\n }\n\n /**\n * Cancel pending settlement (before challenge period ends)\n */\n cancel(\n channelId: string,\n canceller: string,\n reason: string,\n ): { success: boolean; error?: string } {\n const status = this.settlements.get(channelId);\n\n if (!status) {\n return { success: false, error: 'No settlement found' };\n }\n\n if (status.state !== 'pending' && status.state !== 'in_progress' && status.state !== 'challenging') {\n return { success: false, error: 'Cannot cancel settlement in current state' };\n }\n\n // Only initiator can cancel\n if (status.initiator !== canceller && status.initiator !== 'mutual') {\n return { success: false, error: 'Only initiator can cancel' };\n }\n\n this.transitionState(channelId, 'failed');\n status.error = `Cancelled: ${reason}`;\n\n return { success: true };\n }\n\n /**\n * Calculate settlement amounts\n */\n calculateSettlementAmounts(\n checkpoint: SettlementCheckpoint,\n ): {\n payerReceives: string;\n payeeReceives: string;\n fee: string;\n total: string;\n } {\n const payerBalance = BigInt(checkpoint.payerBalance);\n const payeeBalance = BigInt(checkpoint.payeeBalance);\n const fee = BigInt(this.settlementConfig.settlementFee);\n\n // Deduct fee from payer's balance\n const payerReceives = payerBalance > fee ? payerBalance - fee : 0n;\n const payeeReceives = payeeBalance;\n const total = payerReceives + payeeReceives + fee;\n\n return {\n payerReceives: payerReceives.toString(),\n payeeReceives: payeeReceives.toString(),\n fee: fee.toString(),\n total: total.toString(),\n };\n }\n\n /**\n * Build settlement transaction data\n */\n buildSettlementTransaction(\n channelId: string,\n ): { to: string; data: string; value: string } | null {\n const status = this.settlements.get(channelId);\n if (!status) return null;\n\n const amounts = this.calculateSettlementAmounts(status.checkpoint);\n\n // In production, this would encode actual contract call\n const methodId = '0x' + 'settle'.split('').map(c => c.charCodeAt(0).toString(16)).join('').slice(0, 8);\n\n const data = [\n methodId,\n channelId.replace(/^ch_/, '').padStart(64, '0'),\n amounts.payerReceives.padStart(64, '0'),\n amounts.payeeReceives.padStart(64, '0'),\n status.checkpoint.payerSignature.replace('0x', '').padStart(128, '0'),\n ].join('');\n\n return {\n to: '0x' + '0'.repeat(40), // Contract address placeholder\n data,\n value: '0',\n };\n }\n\n private validateRequest(request: SettlementRequest): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n // Validate checkpoint\n const cpValidation = this.checkpointManager.validate(request.finalCheckpoint);\n if (!cpValidation.valid) {\n errors.push(...cpValidation.errors);\n }\n\n // Validate signature\n if (!request.signature) {\n errors.push('Settlement signature is required');\n }\n\n // Validate reason\n const validReasons = ['mutual', 'unilateral', 'timeout', 'dispute_resolution'];\n if (!validReasons.includes(request.reason)) {\n errors.push('Invalid settlement reason');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private transitionState(channelId: string, newState: SettlementState): void {\n const status = this.settlements.get(channelId);\n if (status) {\n status.state = newState;\n }\n }\n\n private generateSettlementId(channelId: string): string {\n return `stl_${channelId.slice(-8)}_${Date.now().toString(36)}`;\n }\n\n private generateMockTxHash(channelId: string): string {\n const data = channelId + Date.now().toString();\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n const char = data.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash;\n }\n return '0x' + Math.abs(hash).toString(16).padStart(64, '0');\n }\n}\n\n/**\n * Estimate settlement gas cost\n */\nexport function estimateSettlementGas(\n hasDispute: boolean,\n checkpointCount: number,\n): string {\n const baseGas = 100000n;\n const disputeGas = hasDispute ? 50000n : 0n;\n const checkpointGas = BigInt(checkpointCount) * 5000n;\n\n return (baseGas + disputeGas + checkpointGas).toString();\n}\n\n/**\n * Verify settlement transaction on-chain\n */\nexport function verifySettlementOnChain(\n settlement: OnChainSettlement,\n): { verified: boolean; error?: string } {\n // In production, would verify against actual blockchain data\n if (!settlement.txHash || !settlement.txHash.startsWith('0x')) {\n return { verified: false, error: 'Invalid transaction hash' };\n }\n\n if (!settlement.finalized) {\n return { verified: false, error: 'Settlement not finalized' };\n }\n\n return { verified: true };\n}\n","import {\n Dispute,\n DisputeReason,\n DisputeEvidence,\n SettlementCheckpoint,\n SettlementConfig,\n} from './types.js';\nimport { CheckpointManager } from './checkpoint.js';\n\n/**\n * Dispute manager configuration\n */\nexport interface DisputeManagerConfig {\n requireBond?: boolean;\n autoResolve?: boolean;\n notifyParties?: (dispute: Dispute, event: string) => void;\n}\n\n/**\n * Dispute creation request\n */\nexport interface DisputeRequest {\n channelId: string;\n initiator: string;\n respondent: string;\n reason: DisputeReason;\n description: string;\n claimedPayerBalance: string;\n claimedPayeeBalance: string;\n claimedCheckpoint?: SettlementCheckpoint;\n evidence: DisputeEvidence[];\n bond?: string;\n}\n\n/**\n * Dispute response\n */\nexport interface DisputeResponse {\n disputeId: string;\n responder: string;\n counterClaim?: {\n payerBalance: string;\n payeeBalance: string;\n };\n evidence: DisputeEvidence[];\n signature: string;\n}\n\n/**\n * Dispute manager for handling payment disputes\n */\nexport class DisputeManager {\n private disputes: Map<string, Dispute> = new Map();\n private config: Required<DisputeManagerConfig>;\n private settlementConfig: SettlementConfig;\n private checkpointManager: CheckpointManager;\n\n constructor(\n checkpointManager: CheckpointManager,\n settlementConfig: SettlementConfig,\n config: DisputeManagerConfig = {},\n ) {\n this.checkpointManager = checkpointManager;\n this.settlementConfig = settlementConfig;\n this.config = {\n requireBond: config.requireBond ?? true,\n autoResolve: config.autoResolve ?? false,\n notifyParties: config.notifyParties ?? (() => {}),\n };\n }\n\n /**\n * Raise a dispute\n */\n raise(request: DisputeRequest): {\n success: boolean;\n dispute?: Dispute;\n error?: string;\n } {\n const now = Date.now();\n\n // Validate request\n const validation = this.validateRequest(request);\n if (!validation.valid) {\n return { success: false, error: validation.errors.join(', ') };\n }\n\n // Check for existing dispute\n const existingDispute = this.getByChannel(request.channelId);\n if (existingDispute && existingDispute.status === 'pending') {\n return { success: false, error: 'Dispute already pending for this channel' };\n }\n\n // Check bond requirement\n if (this.config.requireBond && this.settlementConfig.disputeBond !== '0') {\n if (!request.bond || BigInt(request.bond) < BigInt(this.settlementConfig.disputeBond)) {\n return {\n success: false,\n error: `Dispute bond of ${this.settlementConfig.disputeBond} required`,\n };\n }\n }\n\n const disputeId = this.generateDisputeId(request.channelId);\n const responseDeadline = now + this.settlementConfig.disputeResponsePeriod * 1000;\n const resolutionDeadline = now + this.settlementConfig.disputeResolutionPeriod * 1000;\n\n const dispute: Dispute = {\n id: disputeId,\n channelId: request.channelId,\n initiator: request.initiator,\n respondent: request.respondent,\n reason: request.reason,\n description: request.description,\n claimedPayerBalance: request.claimedPayerBalance,\n claimedPayeeBalance: request.claimedPayeeBalance,\n claimedCheckpoint: request.claimedCheckpoint,\n evidence: request.evidence,\n status: 'pending',\n createdAt: now,\n responseDeadline,\n resolutionDeadline,\n };\n\n this.disputes.set(disputeId, dispute);\n\n // Notify parties\n this.config.notifyParties(dispute, 'raised');\n\n return { success: true, dispute };\n }\n\n /**\n * Respond to a dispute\n */\n respond(response: DisputeResponse): {\n success: boolean;\n error?: string;\n } {\n const dispute = this.disputes.get(response.disputeId);\n\n if (!dispute) {\n return { success: false, error: 'Dispute not found' };\n }\n\n if (dispute.status !== 'pending') {\n return { success: false, error: 'Dispute is not pending' };\n }\n\n if (response.responder !== dispute.respondent) {\n return { success: false, error: 'Only the respondent can respond' };\n }\n\n const now = Date.now();\n if (now > dispute.responseDeadline) {\n return { success: false, error: 'Response deadline has passed' };\n }\n\n // Add response evidence\n dispute.responseEvidence = response.evidence;\n dispute.status = 'under_review';\n\n // Notify parties\n this.config.notifyParties(dispute, 'responded');\n\n return { success: true };\n }\n\n /**\n * Resolve a dispute\n */\n resolve(\n disputeId: string,\n winner: string,\n finalPayerBalance: string,\n finalPayeeBalance: string,\n reason: string,\n ): {\n success: boolean;\n error?: string;\n } {\n const dispute = this.disputes.get(disputeId);\n\n if (!dispute) {\n return { success: false, error: 'Dispute not found' };\n }\n\n if (dispute.status === 'resolved' || dispute.status === 'rejected') {\n return { success: false, error: 'Dispute already resolved' };\n }\n\n const now = Date.now();\n\n dispute.resolution = {\n winner,\n finalPayerBalance,\n finalPayeeBalance,\n reason,\n timestamp: now,\n };\n dispute.status = 'resolved';\n\n // Notify parties\n this.config.notifyParties(dispute, 'resolved');\n\n return { success: true };\n }\n\n /**\n * Reject a dispute\n */\n reject(\n disputeId: string,\n reason: string,\n ): { success: boolean; error?: string } {\n const dispute = this.disputes.get(disputeId);\n\n if (!dispute) {\n return { success: false, error: 'Dispute not found' };\n }\n\n if (dispute.status === 'resolved' || dispute.status === 'rejected') {\n return { success: false, error: 'Dispute already resolved' };\n }\n\n dispute.status = 'rejected';\n dispute.resolution = {\n finalPayerBalance: dispute.claimedPayerBalance,\n finalPayeeBalance: dispute.claimedPayeeBalance,\n reason: `Rejected: ${reason}`,\n timestamp: Date.now(),\n };\n\n // Notify parties\n this.config.notifyParties(dispute, 'rejected');\n\n return { success: true };\n }\n\n /**\n * Handle timeout (no response)\n */\n handleTimeout(disputeId: string): {\n success: boolean;\n resolution?: Dispute['resolution'];\n } {\n const dispute = this.disputes.get(disputeId);\n\n if (!dispute) {\n return { success: false };\n }\n\n const now = Date.now();\n\n // Check response deadline\n if (dispute.status === 'pending' && now > dispute.responseDeadline) {\n // Respondent didn't respond - initiator wins by default\n return this.resolve(\n disputeId,\n dispute.initiator,\n dispute.claimedPayerBalance,\n dispute.claimedPayeeBalance,\n 'Timeout: No response from respondent',\n ).success ? { success: true, resolution: dispute.resolution } : { success: false };\n }\n\n // Check resolution deadline\n if (dispute.status === 'under_review' && now > dispute.resolutionDeadline) {\n // Resolution timeout - need arbitration or default resolution\n dispute.status = 'timeout';\n return { success: true };\n }\n\n return { success: false };\n }\n\n /**\n * Get dispute by ID\n */\n get(disputeId: string): Dispute | undefined {\n return this.disputes.get(disputeId);\n }\n\n /**\n * Get dispute by channel ID\n */\n getByChannel(channelId: string): Dispute | undefined {\n for (const dispute of this.disputes.values()) {\n if (dispute.channelId === channelId &&\n dispute.status !== 'resolved' &&\n dispute.status !== 'rejected') {\n return dispute;\n }\n }\n return undefined;\n }\n\n /**\n * Get all disputes\n */\n getAll(): Dispute[] {\n return Array.from(this.disputes.values());\n }\n\n /**\n * Get disputes by status\n */\n getByStatus(status: Dispute['status']): Dispute[] {\n return Array.from(this.disputes.values()).filter(d => d.status === status);\n }\n\n /**\n * Add evidence to existing dispute\n */\n addEvidence(\n disputeId: string,\n party: string,\n evidence: DisputeEvidence,\n ): { success: boolean; error?: string } {\n const dispute = this.disputes.get(disputeId);\n\n if (!dispute) {\n return { success: false, error: 'Dispute not found' };\n }\n\n if (dispute.status !== 'pending' && dispute.status !== 'under_review') {\n return { success: false, error: 'Cannot add evidence to resolved dispute' };\n }\n\n if (party !== dispute.initiator && party !== dispute.respondent) {\n return { success: false, error: 'Only parties can add evidence' };\n }\n\n if (party === dispute.initiator) {\n dispute.evidence.push(evidence);\n } else {\n dispute.responseEvidence = dispute.responseEvidence ?? [];\n dispute.responseEvidence.push(evidence);\n }\n\n return { success: true };\n }\n\n /**\n * Evaluate dispute based on evidence\n */\n evaluateEvidence(disputeId: string): {\n initiatorScore: number;\n respondentScore: number;\n recommendation: string;\n } {\n const dispute = this.disputes.get(disputeId);\n\n if (!dispute) {\n return { initiatorScore: 0, respondentScore: 0, recommendation: 'Dispute not found' };\n }\n\n let initiatorScore = 0;\n let respondentScore = 0;\n\n // Score initiator evidence\n for (const evidence of dispute.evidence) {\n if (evidence.verified) {\n initiatorScore += this.getEvidenceWeight(evidence.type);\n } else {\n initiatorScore += this.getEvidenceWeight(evidence.type) * 0.5;\n }\n }\n\n // Score respondent evidence\n for (const evidence of dispute.responseEvidence ?? []) {\n if (evidence.verified) {\n respondentScore += this.getEvidenceWeight(evidence.type);\n } else {\n respondentScore += this.getEvidenceWeight(evidence.type) * 0.5;\n }\n }\n\n // Check if initiator has newer checkpoint\n if (dispute.claimedCheckpoint) {\n const latestCheckpoint = this.checkpointManager.getLatest(dispute.channelId);\n if (latestCheckpoint) {\n const comparison = this.checkpointManager.compare(\n dispute.claimedCheckpoint,\n latestCheckpoint,\n );\n if (comparison.isNewer) {\n initiatorScore += 10;\n } else {\n respondentScore += 10;\n }\n }\n }\n\n let recommendation: string;\n if (initiatorScore > respondentScore * 1.5) {\n recommendation = 'Initiator has stronger evidence';\n } else if (respondentScore > initiatorScore * 1.5) {\n recommendation = 'Respondent has stronger evidence';\n } else {\n recommendation = 'Evidence is inconclusive - may need arbitration';\n }\n\n return { initiatorScore, respondentScore, recommendation };\n }\n\n private validateRequest(request: DisputeRequest): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (!request.channelId) {\n errors.push('Channel ID is required');\n }\n\n if (!request.initiator) {\n errors.push('Initiator address is required');\n }\n\n if (!request.respondent) {\n errors.push('Respondent address is required');\n }\n\n if (request.initiator === request.respondent) {\n errors.push('Initiator and respondent must be different');\n }\n\n if (!request.reason) {\n errors.push('Dispute reason is required');\n }\n\n if (!request.description || request.description.length < 10) {\n errors.push('Description must be at least 10 characters');\n }\n\n if (request.evidence.length === 0) {\n errors.push('At least one piece of evidence is required');\n }\n\n // Validate balance claims\n if (BigInt(request.claimedPayerBalance) < 0n) {\n errors.push('Claimed payer balance cannot be negative');\n }\n\n if (BigInt(request.claimedPayeeBalance) < 0n) {\n errors.push('Claimed payee balance cannot be negative');\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n private getEvidenceWeight(type: DisputeEvidence['type']): number {\n const weights: Record<DisputeEvidence['type'], number> = {\n checkpoint: 10,\n signature: 8,\n transaction: 9,\n state_proof: 10,\n };\n return weights[type] ?? 5;\n }\n\n private generateDisputeId(channelId: string): string {\n return `dsp_${channelId.slice(-8)}_${Date.now().toString(36)}`;\n }\n}\n\n/**\n * Create evidence from checkpoint\n */\nexport function createCheckpointEvidence(\n checkpoint: SettlementCheckpoint,\n description: string,\n): DisputeEvidence {\n return {\n type: 'checkpoint',\n data: JSON.stringify(checkpoint),\n description,\n timestamp: Date.now(),\n verified: false,\n };\n}\n\n/**\n * Create evidence from signature\n */\nexport function createSignatureEvidence(\n signature: string,\n signedData: string,\n description: string,\n): DisputeEvidence {\n return {\n type: 'signature',\n data: JSON.stringify({ signature, signedData }),\n description,\n timestamp: Date.now(),\n verified: false,\n };\n}\n\n/**\n * Create evidence from transaction\n */\nexport function createTransactionEvidence(\n txHash: string,\n description: string,\n): DisputeEvidence {\n return {\n type: 'transaction',\n data: txHash,\n description,\n timestamp: Date.now(),\n verified: false,\n };\n}\n"],"mappings":"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","names":[]}