@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.
- package/README.md +422 -0
- package/dist/channels/index.d.ts +1560 -0
- package/dist/channels/index.js +1135 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3482 -0
- package/dist/index.js.map +1 -0
- package/dist/settlement/index.d.ts +867 -0
- package/dist/settlement/index.js +1030 -0
- package/dist/settlement/index.js.map +1 -0
- package/dist/streaming/index.d.ts +1004 -0
- package/dist/streaming/index.js +1321 -0
- package/dist/streaming/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/channels/types.ts","../../src/channels/state.ts","../../src/channels/opening.ts","../../src/channels/closing.ts","../../src/channels/recovery.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Chain identifier (CAIP-2)\n */\nexport type ChainId = string;\n\n/**\n * Asset identifier (contract address or native)\n */\nexport type AssetId = string;\n\n/**\n * Channel state\n */\nexport const ChannelState = z.enum([\n 'created', // Channel created but not funded\n 'funding', // Waiting for funding transaction\n 'open', // Channel is active and streaming\n 'paused', // Channel temporarily paused\n 'closing', // Channel close initiated\n 'disputing', // Dispute in progress\n 'closed', // Channel fully closed\n 'expired', // Channel expired without proper close\n]);\nexport type ChannelState = z.infer<typeof ChannelState>;\n\n/**\n * Channel configuration\n */\nexport const ChannelConfig = z.object({\n // Funding requirements\n minDeposit: z.string().default('1000000'), // Minimum deposit (in smallest units)\n maxDeposit: z.string().optional(),\n\n // Timing\n challengePeriod: z.number().default(86400), // Dispute window in seconds (24h default)\n expirationTime: z.number().optional(), // Optional expiration timestamp\n\n // Checkpointing\n checkpointInterval: z.number().default(3600), // Checkpoint every hour\n minCheckpointAmount: z.string().default('100000'), // Min amount change to checkpoint\n\n // Fees\n channelFee: z.string().default('0'), // One-time channel opening fee\n settlementFee: z.string().default('0'), // Fee for final settlement\n});\nexport type ChannelConfig = z.infer<typeof ChannelConfig>;\n\n/**\n * Channel participant\n */\nexport const ChannelParticipant = z.object({\n address: z.string(),\n role: z.enum(['payer', 'payee']),\n publicKey: z.string().optional(), // For off-chain signature verification\n});\nexport type ChannelParticipant = z.infer<typeof ChannelParticipant>;\n\n/**\n * Channel balance\n */\nexport const ChannelBalance = z.object({\n payer: z.string(), // Payer's remaining balance\n payee: z.string(), // Payee's accrued balance\n total: z.string(), // Total channel capacity\n locked: z.string().default('0'), // Amount locked in disputes\n});\nexport type ChannelBalance = z.infer<typeof ChannelBalance>;\n\n/**\n * Payment channel checkpoint\n */\nexport const ChannelCheckpoint = z.object({\n channelId: z.string(),\n sequence: z.number(), // Monotonically increasing sequence number\n timestamp: z.number(),\n balance: ChannelBalance,\n amountStreamed: z.string(), // Total amount streamed so far\n payerSignature: z.string(),\n payeeSignature: z.string().optional(), // Payee signature for mutual checkpoints\n stateRoot: z.string().optional(), // Merkle root of channel state\n});\nexport type ChannelCheckpoint = z.infer<typeof ChannelCheckpoint>;\n\n/**\n * Streaming payment channel\n */\nexport const StreamingChannel = z.object({\n id: z.string(),\n state: ChannelState,\n chain: z.string(), // CAIP-2 chain ID\n asset: z.string(), // Token contract address\n\n // Participants\n payer: ChannelParticipant,\n payee: ChannelParticipant,\n\n // Financial state\n balance: ChannelBalance,\n\n // Streaming parameters\n ratePerSecond: z.string(), // Amount per second\n startTime: z.number().optional(), // When streaming started\n pausedAt: z.number().optional(), // When paused (if paused)\n\n // Configuration\n config: ChannelConfig,\n\n // On-chain references\n contractAddress: z.string().optional(), // Payment channel contract\n fundingTxHash: z.string().optional(),\n closingTxHash: z.string().optional(),\n\n // Checkpointing\n checkpoints: z.array(ChannelCheckpoint),\n latestCheckpoint: ChannelCheckpoint.optional(),\n\n // Timestamps\n createdAt: z.number(),\n updatedAt: z.number(),\n closedAt: z.number().optional(),\n});\nexport type StreamingChannel = z.infer<typeof StreamingChannel>;\n\n/**\n * Channel creation request\n */\nexport const ChannelCreateRequest = z.object({\n chain: z.string(),\n asset: z.string(),\n payerAddress: z.string(),\n payeeAddress: z.string(),\n depositAmount: z.string(),\n ratePerSecond: z.string(),\n config: ChannelConfig.optional(),\n});\nexport type ChannelCreateRequest = z.infer<typeof ChannelCreateRequest>;\n\n/**\n * Channel funding transaction\n */\nexport const FundingTransaction = z.object({\n channelId: z.string(),\n txHash: z.string(),\n amount: z.string(),\n sender: z.string(),\n blockNumber: z.number().optional(),\n timestamp: z.number(),\n confirmed: z.boolean(),\n});\nexport type FundingTransaction = z.infer<typeof FundingTransaction>;\n\n/**\n * Channel close request\n */\nexport const ChannelCloseRequest = z.object({\n channelId: z.string(),\n initiator: z.string(), // Address of closer\n reason: z.enum(['mutual', 'unilateral', 'timeout', 'dispute']),\n finalCheckpoint: ChannelCheckpoint.optional(),\n signature: z.string(),\n});\nexport type ChannelCloseRequest = z.infer<typeof ChannelCloseRequest>;\n\n/**\n * Channel dispute\n */\nexport const ChannelDispute = z.object({\n channelId: z.string(),\n disputeId: z.string(),\n initiator: z.string(),\n reason: z.string(),\n claimedBalance: ChannelBalance,\n evidence: z.array(z.object({\n type: z.enum(['checkpoint', 'signature', 'transaction']),\n data: z.string(),\n timestamp: z.number(),\n })),\n status: z.enum(['pending', 'resolved', 'rejected']),\n resolution: z.object({\n winner: z.string().optional(),\n finalBalance: ChannelBalance.optional(),\n timestamp: z.number().optional(),\n }).optional(),\n createdAt: z.number(),\n expiresAt: z.number(),\n});\nexport type ChannelDispute = z.infer<typeof ChannelDispute>;\n\n/**\n * Channel state transition\n */\nexport const StateTransition = z.object({\n from: ChannelState,\n to: ChannelState,\n trigger: z.string(),\n timestamp: z.number(),\n metadata: z.record(z.unknown()).optional(),\n});\nexport type StateTransition = z.infer<typeof StateTransition>;\n\n/**\n * Recovery data for channel state restoration\n */\nexport const RecoveryData = z.object({\n channelId: z.string(),\n checkpoints: z.array(ChannelCheckpoint),\n transactions: z.array(FundingTransaction),\n disputes: z.array(ChannelDispute),\n stateHistory: z.array(StateTransition),\n recoveredAt: z.number(),\n});\nexport type RecoveryData = z.infer<typeof RecoveryData>;\n","import {\n StreamingChannel,\n ChannelState,\n StateTransition,\n ChannelCheckpoint,\n} from './types.js';\n\n/**\n * Valid state transitions for payment channels\n */\nconst STATE_TRANSITIONS: Record<ChannelState, ChannelState[]> = {\n created: ['funding', 'closed'],\n funding: ['open', 'closed', 'expired'],\n open: ['paused', 'closing', 'disputing'],\n paused: ['open', 'closing', 'disputing'],\n closing: ['closed', 'disputing'],\n disputing: ['closing', 'closed'],\n closed: [],\n expired: [],\n};\n\n/**\n * State machine event\n */\nexport type StateEvent =\n | { type: 'FUND'; txHash: string; amount: string }\n | { type: 'CONFIRM_FUNDING' }\n | { type: 'START_STREAMING' }\n | { type: 'PAUSE' }\n | { type: 'RESUME' }\n | { type: 'INITIATE_CLOSE'; initiator: string }\n | { type: 'MUTUAL_CLOSE'; signature: string }\n | { type: 'DISPUTE'; reason: string }\n | { type: 'RESOLVE_DISPUTE'; winner: string }\n | { type: 'FINALIZE' }\n | { type: 'TIMEOUT' };\n\n/**\n * Channel state machine\n */\nexport class ChannelStateMachine {\n private channel: StreamingChannel;\n private transitions: StateTransition[] = [];\n private listeners: Map<string, Set<(channel: StreamingChannel) => void>> = new Map();\n\n constructor(channel: StreamingChannel) {\n this.channel = { ...channel };\n }\n\n /**\n * Get current channel state\n */\n getChannel(): StreamingChannel {\n return { ...this.channel };\n }\n\n /**\n * Get current state\n */\n getState(): ChannelState {\n return this.channel.state;\n }\n\n /**\n * Get state history\n */\n getTransitions(): StateTransition[] {\n return [...this.transitions];\n }\n\n /**\n * Check if a transition is valid\n */\n canTransition(to: ChannelState): boolean {\n const allowedTransitions = STATE_TRANSITIONS[this.channel.state];\n return allowedTransitions.includes(to);\n }\n\n /**\n * Get allowed transitions from current state\n */\n getAllowedTransitions(): ChannelState[] {\n return STATE_TRANSITIONS[this.channel.state];\n }\n\n /**\n * Process a state event\n */\n process(event: StateEvent): { success: boolean; error?: string } {\n const currentState = this.channel.state;\n let nextState: ChannelState | null = null;\n let metadata: Record<string, unknown> = {};\n\n switch (event.type) {\n case 'FUND':\n if (currentState !== 'created') {\n return { success: false, error: 'Channel must be in created state to fund' };\n }\n nextState = 'funding';\n metadata = { txHash: event.txHash, amount: event.amount };\n this.channel.fundingTxHash = event.txHash;\n break;\n\n case 'CONFIRM_FUNDING':\n if (currentState !== 'funding') {\n return { success: false, error: 'Channel must be in funding state' };\n }\n nextState = 'open';\n this.channel.startTime = Date.now();\n break;\n\n case 'START_STREAMING':\n if (currentState !== 'open' && currentState !== 'paused') {\n return { success: false, error: 'Channel must be open or paused to stream' };\n }\n if (currentState === 'paused') {\n nextState = 'open';\n this.channel.pausedAt = undefined;\n }\n break;\n\n case 'PAUSE':\n if (currentState !== 'open') {\n return { success: false, error: 'Channel must be open to pause' };\n }\n nextState = 'paused';\n this.channel.pausedAt = Date.now();\n break;\n\n case 'RESUME':\n if (currentState !== 'paused') {\n return { success: false, error: 'Channel must be paused to resume' };\n }\n nextState = 'open';\n this.channel.pausedAt = undefined;\n break;\n\n case 'INITIATE_CLOSE':\n if (currentState !== 'open' && currentState !== 'paused') {\n return { success: false, error: 'Channel must be open or paused to close' };\n }\n nextState = 'closing';\n metadata = { initiator: event.initiator };\n break;\n\n case 'MUTUAL_CLOSE':\n if (currentState !== 'closing') {\n return { success: false, error: 'Channel must be in closing state' };\n }\n nextState = 'closed';\n this.channel.closedAt = Date.now();\n metadata = { signature: event.signature };\n break;\n\n case 'DISPUTE':\n if (!['open', 'paused', 'closing'].includes(currentState)) {\n return { success: false, error: 'Cannot dispute in current state' };\n }\n nextState = 'disputing';\n metadata = { reason: event.reason };\n break;\n\n case 'RESOLVE_DISPUTE':\n if (currentState !== 'disputing') {\n return { success: false, error: 'No dispute to resolve' };\n }\n nextState = 'closing';\n metadata = { winner: event.winner };\n break;\n\n case 'FINALIZE':\n if (currentState !== 'closing') {\n return { success: false, error: 'Channel must be in closing state' };\n }\n nextState = 'closed';\n this.channel.closedAt = Date.now();\n break;\n\n case 'TIMEOUT':\n if (currentState === 'funding') {\n nextState = 'expired';\n } else if (currentState === 'disputing') {\n // Timeout during dispute - use last valid checkpoint\n nextState = 'closed';\n this.channel.closedAt = Date.now();\n } else {\n return { success: false, error: 'Timeout not applicable in current state' };\n }\n break;\n\n default:\n return { success: false, error: 'Unknown event type' };\n }\n\n if (nextState && nextState !== currentState) {\n if (!this.canTransition(nextState)) {\n return { success: false, error: `Invalid transition from ${currentState} to ${nextState}` };\n }\n\n const transition: StateTransition = {\n from: currentState,\n to: nextState,\n trigger: event.type,\n timestamp: Date.now(),\n metadata,\n };\n\n this.channel.state = nextState;\n this.channel.updatedAt = Date.now();\n this.transitions.push(transition);\n\n this.notifyListeners(nextState);\n }\n\n return { success: true };\n }\n\n /**\n * Update channel balance\n */\n updateBalance(payerBalance: string, payeeBalance: string): void {\n this.channel.balance = {\n ...this.channel.balance,\n payer: payerBalance,\n payee: payeeBalance,\n };\n this.channel.updatedAt = Date.now();\n }\n\n /**\n * Add checkpoint\n */\n addCheckpoint(checkpoint: ChannelCheckpoint): void {\n this.channel.checkpoints.push(checkpoint);\n this.channel.latestCheckpoint = checkpoint;\n this.channel.updatedAt = Date.now();\n }\n\n /**\n * Get current streamed amount\n */\n getCurrentStreamedAmount(): string {\n if (!this.channel.startTime) return '0';\n if (this.channel.state !== 'open' && this.channel.state !== 'paused') {\n return this.channel.balance.payee;\n }\n\n const now = this.channel.pausedAt ?? Date.now();\n const elapsed = Math.floor((now - this.channel.startTime) / 1000);\n const streamed = BigInt(this.channel.ratePerSecond) * BigInt(elapsed);\n const maxStreamed = BigInt(this.channel.balance.total);\n\n return (streamed > maxStreamed ? maxStreamed : streamed).toString();\n }\n\n /**\n * Calculate remaining balance\n */\n getRemainingBalance(): string {\n const total = BigInt(this.channel.balance.total);\n const streamed = BigInt(this.getCurrentStreamedAmount());\n return (total - streamed).toString();\n }\n\n /**\n * Check if channel needs checkpoint\n */\n needsCheckpoint(): boolean {\n const config = this.channel.config;\n const lastCheckpoint = this.channel.latestCheckpoint;\n\n if (!lastCheckpoint) return true;\n\n // Check time interval\n const timeSinceCheckpoint = Date.now() - lastCheckpoint.timestamp;\n if (timeSinceCheckpoint >= config.checkpointInterval * 1000) return true;\n\n // Check amount change\n const currentStreamed = BigInt(this.getCurrentStreamedAmount());\n const lastStreamed = BigInt(lastCheckpoint.amountStreamed);\n const amountChange = currentStreamed - lastStreamed;\n\n if (amountChange >= BigInt(config.minCheckpointAmount)) return true;\n\n return false;\n }\n\n /**\n * Subscribe to state changes\n */\n onStateChange(state: ChannelState | '*', callback: (channel: StreamingChannel) => void): () => void {\n const key = state;\n if (!this.listeners.has(key)) {\n this.listeners.set(key, new Set());\n }\n this.listeners.get(key)!.add(callback);\n\n return () => {\n this.listeners.get(key)?.delete(callback);\n };\n }\n\n private notifyListeners(newState: ChannelState): void {\n // Notify specific state listeners\n this.listeners.get(newState)?.forEach(cb => cb(this.channel));\n // Notify wildcard listeners\n this.listeners.get('*')?.forEach(cb => cb(this.channel));\n }\n}\n\n/**\n * Check if channel is active (can stream)\n */\nexport function isChannelActive(channel: StreamingChannel): boolean {\n return channel.state === 'open';\n}\n\n/**\n * Check if channel is terminal (cannot transition further)\n */\nexport function isChannelTerminal(channel: StreamingChannel): boolean {\n return channel.state === 'closed' || channel.state === 'expired';\n}\n\n/**\n * Calculate channel utilization\n */\nexport function getChannelUtilization(channel: StreamingChannel): number {\n const total = parseFloat(channel.balance.total);\n if (total === 0) return 0;\n\n const payee = parseFloat(channel.balance.payee);\n return (payee / total) * 100;\n}\n","import {\n StreamingChannel,\n ChannelCreateRequest,\n ChannelConfig,\n ChannelParticipant,\n ChannelBalance,\n FundingTransaction,\n} from './types.js';\nimport { ChannelStateMachine } from './state.js';\n\n/**\n * Channel opening configuration\n */\nexport interface ChannelOpeningConfig {\n fundingTimeout?: number; // Timeout for funding in ms (default 1 hour)\n confirmations?: number; // Required confirmations for funding tx\n contractAddress?: string; // Payment channel contract address\n}\n\n/**\n * Channel opening result\n */\nexport interface ChannelOpeningResult {\n channel: StreamingChannel;\n stateMachine: ChannelStateMachine;\n fundingRequired: {\n amount: string;\n to: string;\n data?: string;\n };\n}\n\n/**\n * Channel opener - handles channel creation and funding\n */\nexport class ChannelOpener {\n private config: Required<ChannelOpeningConfig>;\n\n constructor(config: ChannelOpeningConfig = {}) {\n this.config = {\n fundingTimeout: config.fundingTimeout ?? 3600000, // 1 hour\n confirmations: config.confirmations ?? 1,\n contractAddress: config.contractAddress ?? '',\n };\n }\n\n /**\n * Create a new channel\n */\n create(request: ChannelCreateRequest): ChannelOpeningResult {\n // Validate request\n this.validateCreateRequest(request);\n\n const channelConfig = request.config ?? ChannelConfig.parse({});\n const now = Date.now();\n const channelId = this.generateChannelId(request, now);\n\n const payer: ChannelParticipant = {\n address: request.payerAddress,\n role: 'payer',\n };\n\n const payee: ChannelParticipant = {\n address: request.payeeAddress,\n role: 'payee',\n };\n\n const balance: ChannelBalance = {\n payer: request.depositAmount,\n payee: '0',\n total: request.depositAmount,\n locked: '0',\n };\n\n const channel: StreamingChannel = {\n id: channelId,\n state: 'created',\n chain: request.chain,\n asset: request.asset,\n payer,\n payee,\n balance,\n ratePerSecond: request.ratePerSecond,\n config: channelConfig,\n contractAddress: this.config.contractAddress || undefined,\n checkpoints: [],\n createdAt: now,\n updatedAt: now,\n };\n\n const stateMachine = new ChannelStateMachine(channel);\n\n // Calculate funding requirements\n const fundingRequired = this.calculateFundingRequirements(channel);\n\n return {\n channel: stateMachine.getChannel(),\n stateMachine,\n fundingRequired,\n };\n }\n\n /**\n * Process funding transaction\n */\n processFunding(\n stateMachine: ChannelStateMachine,\n txHash: string,\n amount: string,\n ): { success: boolean; error?: string } {\n const channel = stateMachine.getChannel();\n\n // Validate funding amount\n if (BigInt(amount) < BigInt(channel.config.minDeposit)) {\n return { success: false, error: 'Funding amount below minimum deposit' };\n }\n\n if (channel.config.maxDeposit && BigInt(amount) > BigInt(channel.config.maxDeposit)) {\n return { success: false, error: 'Funding amount exceeds maximum deposit' };\n }\n\n // Process state transition\n const result = stateMachine.process({\n type: 'FUND',\n txHash,\n amount,\n });\n\n if (!result.success) {\n return result;\n }\n\n // Update balance with actual funded amount\n stateMachine.updateBalance(amount, '0');\n\n return { success: true };\n }\n\n /**\n * Confirm funding (after required confirmations)\n */\n confirmFunding(\n stateMachine: ChannelStateMachine,\n _confirmation: FundingTransaction,\n ): { success: boolean; error?: string } {\n return stateMachine.process({ type: 'CONFIRM_FUNDING' });\n }\n\n /**\n * Handle funding timeout\n */\n handleTimeout(\n stateMachine: ChannelStateMachine,\n ): { success: boolean; expired: boolean } {\n const channel = stateMachine.getChannel();\n\n if (channel.state !== 'funding') {\n return { success: false, expired: false };\n }\n\n const elapsed = Date.now() - channel.createdAt;\n if (elapsed < this.config.fundingTimeout) {\n return { success: false, expired: false };\n }\n\n const result = stateMachine.process({ type: 'TIMEOUT' });\n return { success: result.success, expired: result.success };\n }\n\n /**\n * Validate channel create request\n */\n private validateCreateRequest(request: ChannelCreateRequest): void {\n // Parse and validate with zod\n ChannelCreateRequest.parse(request);\n\n // Additional validations\n if (request.payerAddress === request.payeeAddress) {\n throw new Error('Payer and payee must be different addresses');\n }\n\n if (BigInt(request.depositAmount) <= 0n) {\n throw new Error('Deposit amount must be positive');\n }\n\n if (BigInt(request.ratePerSecond) <= 0n) {\n throw new Error('Rate per second must be positive');\n }\n\n // Check if rate is sustainable\n const depositBigInt = BigInt(request.depositAmount);\n const rateBigInt = BigInt(request.ratePerSecond);\n const minDuration = depositBigInt / rateBigInt;\n\n if (minDuration < 60n) {\n throw new Error('Channel would be exhausted in less than 60 seconds');\n }\n }\n\n /**\n * Generate unique channel ID\n */\n private generateChannelId(request: ChannelCreateRequest, timestamp: number): string {\n const data = `${request.chain}:${request.asset}:${request.payerAddress}:${request.payeeAddress}:${timestamp}`;\n // Simple hash for ID generation\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 `ch_${Math.abs(hash).toString(16).padStart(16, '0')}`;\n }\n\n /**\n * Calculate funding requirements for channel\n */\n private calculateFundingRequirements(channel: StreamingChannel): {\n amount: string;\n to: string;\n data?: string;\n } {\n const totalRequired = BigInt(channel.balance.total) + BigInt(channel.config.channelFee);\n\n return {\n amount: totalRequired.toString(),\n to: channel.contractAddress ?? channel.payee.address,\n data: this.encodeFundingData(channel),\n };\n }\n\n /**\n * Encode funding transaction data\n */\n private encodeFundingData(channel: StreamingChannel): string {\n // In production, this would encode the actual contract call\n // For now, return a placeholder representing the channel initialization\n const methodId = '0x' + 'initChannel'.split('').map(c => c.charCodeAt(0).toString(16)).join('').slice(0, 8);\n return `${methodId}${channel.id.replace('ch_', '').padStart(64, '0')}`;\n }\n}\n\n/**\n * Estimate channel duration based on rate\n */\nexport function estimateChannelDuration(\n depositAmount: string,\n ratePerSecond: string,\n): { seconds: number; formatted: string } {\n const deposit = BigInt(depositAmount);\n const rate = BigInt(ratePerSecond);\n\n if (rate === 0n) {\n return { seconds: Infinity, formatted: 'infinite' };\n }\n\n const seconds = Number(deposit / rate);\n\n // Format duration\n if (seconds < 60) {\n return { seconds, formatted: `${seconds} seconds` };\n } else if (seconds < 3600) {\n const minutes = Math.floor(seconds / 60);\n return { seconds, formatted: `${minutes} minutes` };\n } else if (seconds < 86400) {\n const hours = Math.floor(seconds / 3600);\n return { seconds, formatted: `${hours} hours` };\n } else {\n const days = Math.floor(seconds / 86400);\n return { seconds, formatted: `${days} days` };\n }\n}\n\n/**\n * Calculate required deposit for desired duration\n */\nexport function calculateRequiredDeposit(\n ratePerSecond: string,\n durationSeconds: number,\n): string {\n const rate = BigInt(ratePerSecond);\n const duration = BigInt(durationSeconds);\n return (rate * duration).toString();\n}\n","import {\n StreamingChannel,\n ChannelCheckpoint,\n ChannelCloseRequest,\n ChannelBalance,\n} from './types.js';\nimport { ChannelStateMachine } from './state.js';\n\n/**\n * Channel closing configuration\n */\nexport interface ChannelClosingConfig {\n challengePeriod?: number; // Default challenge period in seconds\n gracePeriod?: number; // Grace period for mutual close\n autoFinalize?: boolean; // Auto-finalize after challenge period\n}\n\n/**\n * Close initiation result\n */\nexport interface CloseInitiationResult {\n success: boolean;\n error?: string;\n challengeDeadline?: number;\n finalCheckpoint?: ChannelCheckpoint;\n settlementAmount?: {\n payer: string;\n payee: string;\n };\n}\n\n/**\n * Channel final settlement result\n */\nexport interface ChannelSettlementResult {\n success: boolean;\n error?: string;\n finalBalance: ChannelBalance;\n settlementTxHash?: string;\n gasCost?: string;\n}\n\n/**\n * Channel closer - handles channel closing and settlement\n */\nexport class ChannelCloser {\n private config: Required<ChannelClosingConfig>;\n\n constructor(config: ChannelClosingConfig = {}) {\n this.config = {\n challengePeriod: config.challengePeriod ?? 86400, // 24 hours\n gracePeriod: config.gracePeriod ?? 3600, // 1 hour\n autoFinalize: config.autoFinalize ?? true,\n };\n }\n\n /**\n * Initiate channel close\n */\n initiateClose(\n stateMachine: ChannelStateMachine,\n initiator: string,\n signature: string,\n ): CloseInitiationResult {\n const channel = stateMachine.getChannel();\n\n // Verify initiator is a participant\n if (initiator !== channel.payer.address && initiator !== channel.payee.address) {\n return { success: false, error: 'Initiator must be a channel participant' };\n }\n\n // Calculate final balances\n const currentStreamed = stateMachine.getCurrentStreamedAmount();\n const finalBalance = this.calculateFinalBalance(channel, currentStreamed);\n\n // Create final checkpoint\n const finalCheckpoint = this.createFinalCheckpoint(channel, finalBalance, signature);\n\n // Process state transition\n const result = stateMachine.process({\n type: 'INITIATE_CLOSE',\n initiator,\n });\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n // Add final checkpoint\n stateMachine.addCheckpoint(finalCheckpoint);\n\n const challengeDeadline = Date.now() + this.config.challengePeriod * 1000;\n\n return {\n success: true,\n challengeDeadline,\n finalCheckpoint,\n settlementAmount: {\n payer: finalBalance.payer,\n payee: finalBalance.payee,\n },\n };\n }\n\n /**\n * Complete mutual close (both parties agree)\n */\n mutualClose(\n stateMachine: ChannelStateMachine,\n payerSignature: string,\n payeeSignature: string,\n ): CloseInitiationResult {\n const channel = stateMachine.getChannel();\n\n // Calculate final balances\n const currentStreamed = stateMachine.getCurrentStreamedAmount();\n const finalBalance = this.calculateFinalBalance(channel, currentStreamed);\n\n // Create mutually signed checkpoint\n const finalCheckpoint: ChannelCheckpoint = {\n channelId: channel.id,\n sequence: channel.checkpoints.length,\n timestamp: Date.now(),\n balance: finalBalance,\n amountStreamed: currentStreamed,\n payerSignature,\n payeeSignature,\n };\n\n // For mutual close, skip challenge period\n let result = stateMachine.process({\n type: 'INITIATE_CLOSE',\n initiator: channel.payer.address,\n });\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n result = stateMachine.process({\n type: 'MUTUAL_CLOSE',\n signature: `${payerSignature}:${payeeSignature}`,\n });\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n stateMachine.addCheckpoint(finalCheckpoint);\n\n return {\n success: true,\n finalCheckpoint,\n settlementAmount: {\n payer: finalBalance.payer,\n payee: finalBalance.payee,\n },\n };\n }\n\n /**\n * Finalize channel after challenge period\n */\n finalize(\n stateMachine: ChannelStateMachine,\n ): ChannelSettlementResult {\n const channel = stateMachine.getChannel();\n\n if (channel.state !== 'closing') {\n return {\n success: false,\n error: 'Channel must be in closing state',\n finalBalance: channel.balance,\n };\n }\n\n // Check if challenge period has passed\n const latestCheckpoint = channel.latestCheckpoint;\n if (latestCheckpoint) {\n const elapsed = Date.now() - latestCheckpoint.timestamp;\n if (elapsed < this.config.challengePeriod * 1000) {\n return {\n success: false,\n error: 'Challenge period not yet elapsed',\n finalBalance: channel.balance,\n };\n }\n }\n\n // Process finalization\n const result = stateMachine.process({ type: 'FINALIZE' });\n\n if (!result.success) {\n return {\n success: false,\n error: result.error,\n finalBalance: channel.balance,\n };\n }\n\n const finalChannel = stateMachine.getChannel();\n\n return {\n success: true,\n finalBalance: finalChannel.balance,\n };\n }\n\n /**\n * Validate close request\n */\n validateCloseRequest(\n channel: StreamingChannel,\n request: ChannelCloseRequest,\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Validate channel ID\n if (request.channelId !== channel.id) {\n errors.push('Channel ID mismatch');\n }\n\n // Validate initiator\n if (request.initiator !== channel.payer.address &&\n request.initiator !== channel.payee.address) {\n errors.push('Initiator is not a channel participant');\n }\n\n // Validate channel state\n if (channel.state !== 'open' && channel.state !== 'paused') {\n errors.push(`Cannot close channel in ${channel.state} state`);\n }\n\n // Validate checkpoint if provided\n if (request.finalCheckpoint) {\n const cpErrors = this.validateCheckpoint(channel, request.finalCheckpoint);\n errors.push(...cpErrors);\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /**\n * Get settlement amounts for on-chain execution\n */\n getSettlementAmounts(\n channel: StreamingChannel,\n ): { payer: string; payee: string; fee: string } {\n const finalBalance = channel.latestCheckpoint?.balance ?? channel.balance;\n const fee = channel.config.settlementFee;\n\n // Deduct fee from payer's remaining balance\n const payerAmount = BigInt(finalBalance.payer) - BigInt(fee);\n\n return {\n payer: payerAmount > 0n ? payerAmount.toString() : '0',\n payee: finalBalance.payee,\n fee,\n };\n }\n\n /**\n * Calculate time until channel can be finalized\n */\n getTimeUntilFinalization(channel: StreamingChannel): number {\n if (channel.state !== 'closing') {\n return -1;\n }\n\n const latestCheckpoint = channel.latestCheckpoint;\n if (!latestCheckpoint) {\n return 0;\n }\n\n const elapsed = Date.now() - latestCheckpoint.timestamp;\n const remaining = this.config.challengePeriod * 1000 - elapsed;\n\n return Math.max(0, remaining);\n }\n\n /**\n * Check if channel close can be challenged\n */\n canChallenge(channel: StreamingChannel): boolean {\n if (channel.state !== 'closing') {\n return false;\n }\n\n return this.getTimeUntilFinalization(channel) > 0;\n }\n\n private calculateFinalBalance(\n channel: StreamingChannel,\n amountStreamed: string,\n ): ChannelBalance {\n const total = BigInt(channel.balance.total);\n const streamed = BigInt(amountStreamed);\n const remaining = total - streamed;\n\n return {\n payer: remaining.toString(),\n payee: streamed.toString(),\n total: total.toString(),\n locked: '0',\n };\n }\n\n private createFinalCheckpoint(\n channel: StreamingChannel,\n balance: ChannelBalance,\n signature: string,\n ): ChannelCheckpoint {\n return {\n channelId: channel.id,\n sequence: channel.checkpoints.length,\n timestamp: Date.now(),\n balance,\n amountStreamed: balance.payee,\n payerSignature: signature,\n };\n }\n\n private validateCheckpoint(\n channel: StreamingChannel,\n checkpoint: ChannelCheckpoint,\n ): string[] {\n const errors: string[] = [];\n\n // Validate sequence number\n const expectedSequence = channel.checkpoints.length;\n if (checkpoint.sequence !== expectedSequence) {\n errors.push(`Invalid sequence: expected ${expectedSequence}, got ${checkpoint.sequence}`);\n }\n\n // Validate balance consistency\n const totalBalance = BigInt(checkpoint.balance.payer) + BigInt(checkpoint.balance.payee);\n if (totalBalance !== BigInt(channel.balance.total)) {\n errors.push('Balance inconsistency: payer + payee does not equal total');\n }\n\n // Validate timestamp\n if (checkpoint.timestamp > Date.now()) {\n errors.push('Checkpoint timestamp is in the future');\n }\n\n return errors;\n }\n}\n\n/**\n * Build on-chain close transaction data\n */\nexport function buildCloseTransactionData(\n channel: StreamingChannel,\n checkpoint: ChannelCheckpoint,\n): { to: string; data: string; value: string } {\n // In production, this would encode the actual contract call\n const methodId = '0x' + 'closeChannel'.split('').map(c => c.charCodeAt(0).toString(16)).join('').slice(0, 8);\n\n const data = [\n methodId,\n channel.id.replace('ch_', '').padStart(64, '0'),\n checkpoint.sequence.toString(16).padStart(64, '0'),\n checkpoint.payerSignature.replace('0x', '').padStart(128, '0'),\n ].join('');\n\n return {\n to: channel.contractAddress ?? channel.payee.address,\n data,\n value: '0',\n };\n}\n","import {\n StreamingChannel,\n ChannelCheckpoint,\n RecoveryData,\n FundingTransaction,\n ChannelDispute,\n StateTransition,\n ChannelState,\n} from './types.js';\nimport { ChannelStateMachine } from './state.js';\n\n/**\n * Recovery configuration\n */\nexport interface RecoveryConfig {\n maxCheckpointsToKeep?: number;\n verifySignatures?: boolean;\n onChainFallback?: boolean;\n}\n\n/**\n * Recovery result\n */\nexport interface RecoveryResult {\n success: boolean;\n error?: string;\n channel?: StreamingChannel;\n stateMachine?: ChannelStateMachine;\n recoveredFromCheckpoint?: ChannelCheckpoint;\n dataLoss?: boolean;\n}\n\n/**\n * Channel storage interface for recovery\n */\nexport interface IChannelStorage {\n getChannel(channelId: string): Promise<StreamingChannel | null>;\n getCheckpoints(channelId: string): Promise<ChannelCheckpoint[]>;\n getTransactions(channelId: string): Promise<FundingTransaction[]>;\n getDisputes(channelId: string): Promise<ChannelDispute[]>;\n getStateHistory(channelId: string): Promise<StateTransition[]>;\n}\n\n/**\n * Channel recovery manager\n */\nexport class ChannelRecovery {\n private config: Required<RecoveryConfig>;\n private storage?: IChannelStorage;\n\n constructor(config: RecoveryConfig = {}, storage?: IChannelStorage) {\n this.config = {\n maxCheckpointsToKeep: config.maxCheckpointsToKeep ?? 100,\n verifySignatures: config.verifySignatures ?? true,\n onChainFallback: config.onChainFallback ?? true,\n };\n this.storage = storage;\n }\n\n /**\n * Recover channel from checkpoints\n */\n recoverFromCheckpoints(\n baseChannel: StreamingChannel,\n checkpoints: ChannelCheckpoint[],\n ): RecoveryResult {\n if (checkpoints.length === 0) {\n return {\n success: true,\n channel: baseChannel,\n stateMachine: new ChannelStateMachine(baseChannel),\n dataLoss: false,\n };\n }\n\n // Sort checkpoints by sequence\n const sortedCheckpoints = [...checkpoints].sort((a, b) => a.sequence - b.sequence);\n\n // Find the latest valid checkpoint\n let latestValid: ChannelCheckpoint | undefined;\n\n for (let i = sortedCheckpoints.length - 1; i >= 0; i--) {\n const checkpoint = sortedCheckpoints[i];\n\n if (this.isCheckpointValid(baseChannel, checkpoint)) {\n latestValid = checkpoint;\n break;\n }\n }\n\n if (!latestValid) {\n return {\n success: false,\n error: 'No valid checkpoints found',\n dataLoss: true,\n };\n }\n\n // Reconstruct channel state from checkpoint\n const recoveredChannel = this.reconstructFromCheckpoint(baseChannel, latestValid, sortedCheckpoints);\n\n return {\n success: true,\n channel: recoveredChannel,\n stateMachine: new ChannelStateMachine(recoveredChannel),\n recoveredFromCheckpoint: latestValid,\n dataLoss: sortedCheckpoints[sortedCheckpoints.length - 1].sequence > latestValid.sequence,\n };\n }\n\n /**\n * Full recovery from storage\n */\n async recoverFromStorage(channelId: string): Promise<RecoveryResult> {\n if (!this.storage) {\n return {\n success: false,\n error: 'No storage provider configured',\n };\n }\n\n try {\n // Fetch all recovery data\n const [channel, checkpoints, transactions, disputes] = await Promise.all([\n this.storage.getChannel(channelId),\n this.storage.getCheckpoints(channelId),\n this.storage.getTransactions(channelId),\n this.storage.getDisputes(channelId),\n ]);\n\n if (!channel) {\n return {\n success: false,\n error: 'Channel not found in storage',\n };\n }\n\n // Use checkpoint recovery\n const result = this.recoverFromCheckpoints(channel, checkpoints);\n\n if (!result.success) {\n // Try on-chain fallback if enabled\n if (this.config.onChainFallback) {\n return this.recoverFromOnChain(channel, transactions, disputes);\n }\n return result;\n }\n\n return result;\n } catch (error) {\n return {\n success: false,\n error: `Storage recovery failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n }\n\n /**\n * Export recovery data for backup\n */\n exportRecoveryData(\n channel: StreamingChannel,\n stateMachine: ChannelStateMachine,\n ): RecoveryData {\n return {\n channelId: channel.id,\n checkpoints: channel.checkpoints,\n transactions: [], // Would be populated from transaction history\n disputes: [], // Would be populated from dispute history\n stateHistory: stateMachine.getTransitions(),\n recoveredAt: Date.now(),\n };\n }\n\n /**\n * Import recovery data\n */\n importRecoveryData(data: RecoveryData): RecoveryResult {\n // Validate recovery data\n if (!data.channelId || !data.checkpoints) {\n return {\n success: false,\n error: 'Invalid recovery data format',\n };\n }\n\n // Find the base channel state from first checkpoint or reconstruct\n if (data.checkpoints.length === 0) {\n return {\n success: false,\n error: 'No checkpoints in recovery data',\n };\n }\n\n // Create minimal base channel\n const baseChannel = this.createBaseChannelFromRecoveryData(data);\n\n return this.recoverFromCheckpoints(baseChannel, data.checkpoints);\n }\n\n /**\n * Verify checkpoint integrity\n */\n verifyCheckpointChain(checkpoints: ChannelCheckpoint[]): {\n valid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (checkpoints.length === 0) {\n return { valid: true, errors: [] };\n }\n\n const sorted = [...checkpoints].sort((a, b) => a.sequence - b.sequence);\n\n for (let i = 0; i < sorted.length; i++) {\n const current = sorted[i];\n\n // Check sequence\n if (current.sequence !== i) {\n errors.push(`Sequence gap: expected ${i}, got ${current.sequence}`);\n }\n\n // Check timestamp ordering\n if (i > 0 && current.timestamp < sorted[i - 1].timestamp) {\n errors.push(`Timestamp ordering violation at sequence ${current.sequence}`);\n }\n\n // Check amount monotonicity (streamed amount should only increase)\n if (i > 0) {\n const prevStreamed = BigInt(sorted[i - 1].amountStreamed);\n const currStreamed = BigInt(current.amountStreamed);\n if (currStreamed < prevStreamed) {\n errors.push(`Amount decreased at sequence ${current.sequence}`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n /**\n * Prune old checkpoints keeping only recent ones\n */\n pruneCheckpoints(checkpoints: ChannelCheckpoint[]): ChannelCheckpoint[] {\n if (checkpoints.length <= this.config.maxCheckpointsToKeep) {\n return checkpoints;\n }\n\n // Keep first checkpoint (genesis), last N-1 checkpoints\n const sorted = [...checkpoints].sort((a, b) => a.sequence - b.sequence);\n const genesis = sorted[0];\n const recent = sorted.slice(-(this.config.maxCheckpointsToKeep - 1));\n\n return [genesis, ...recent];\n }\n\n private isCheckpointValid(\n channel: StreamingChannel,\n checkpoint: ChannelCheckpoint,\n ): boolean {\n // Validate channel ID\n if (checkpoint.channelId !== channel.id) {\n return false;\n }\n\n // Validate balance totals\n const total = BigInt(checkpoint.balance.payer) + BigInt(checkpoint.balance.payee);\n if (total !== BigInt(channel.balance.total)) {\n return false;\n }\n\n // Validate signature presence\n if (!checkpoint.payerSignature) {\n return false;\n }\n\n // In production, would verify cryptographic signatures\n if (this.config.verifySignatures) {\n // Signature verification would happen here\n }\n\n return true;\n }\n\n private reconstructFromCheckpoint(\n baseChannel: StreamingChannel,\n checkpoint: ChannelCheckpoint,\n allCheckpoints: ChannelCheckpoint[],\n ): StreamingChannel {\n // Filter checkpoints up to and including the recovery point\n const validCheckpoints = allCheckpoints.filter(cp => cp.sequence <= checkpoint.sequence);\n\n // Determine state based on checkpoint\n let state: ChannelState = 'open';\n if (checkpoint.payeeSignature) {\n // Mutual checkpoint might indicate closing\n state = 'open';\n }\n\n return {\n ...baseChannel,\n state,\n balance: checkpoint.balance,\n checkpoints: validCheckpoints,\n latestCheckpoint: checkpoint,\n updatedAt: checkpoint.timestamp,\n };\n }\n\n private recoverFromOnChain(\n channel: StreamingChannel,\n transactions: FundingTransaction[],\n disputes: ChannelDispute[],\n ): RecoveryResult {\n // Reconstruct state from on-chain data\n const confirmedTxs = transactions.filter(tx => tx.confirmed);\n\n if (confirmedTxs.length === 0) {\n return {\n success: false,\n error: 'No confirmed transactions found',\n dataLoss: true,\n };\n }\n\n // Calculate total funded amount\n const totalFunded = confirmedTxs.reduce(\n (sum, tx) => sum + BigInt(tx.amount),\n 0n,\n );\n\n // Check for active disputes\n const activeDispute = disputes.find(d => d.status === 'pending');\n\n let state: ChannelState = 'open';\n if (activeDispute) {\n state = 'disputing';\n }\n\n const recoveredChannel: StreamingChannel = {\n ...channel,\n state,\n balance: {\n ...channel.balance,\n total: totalFunded.toString(),\n payer: totalFunded.toString(),\n payee: '0',\n },\n fundingTxHash: confirmedTxs[0].txHash,\n checkpoints: [],\n updatedAt: Date.now(),\n };\n\n return {\n success: true,\n channel: recoveredChannel,\n stateMachine: new ChannelStateMachine(recoveredChannel),\n dataLoss: true,\n };\n }\n\n private createBaseChannelFromRecoveryData(data: RecoveryData): StreamingChannel {\n const firstCheckpoint = data.checkpoints[0];\n\n return {\n id: data.channelId,\n state: 'open',\n chain: '',\n asset: '',\n payer: { address: '', role: 'payer' },\n payee: { address: '', role: 'payee' },\n balance: firstCheckpoint.balance,\n ratePerSecond: '0',\n config: {\n minDeposit: '0',\n challengePeriod: 86400,\n checkpointInterval: 3600,\n minCheckpointAmount: '0',\n channelFee: '0',\n settlementFee: '0',\n },\n checkpoints: [],\n createdAt: firstCheckpoint.timestamp,\n updatedAt: firstCheckpoint.timestamp,\n };\n }\n}\n\n/**\n * Create a state snapshot for backup\n */\nexport function createStateSnapshot(\n _channel: StreamingChannel,\n stateMachine: ChannelStateMachine,\n): string {\n const snapshot = {\n version: 1,\n channel: stateMachine.getChannel(),\n transitions: stateMachine.getTransitions(),\n timestamp: Date.now(),\n };\n\n return JSON.stringify(snapshot);\n}\n\n/**\n * Restore from state snapshot\n */\nexport function restoreFromSnapshot(\n snapshotJson: string,\n): RecoveryResult {\n try {\n const snapshot = JSON.parse(snapshotJson);\n\n if (snapshot.version !== 1) {\n return {\n success: false,\n error: 'Unsupported snapshot version',\n };\n }\n\n const channel = snapshot.channel as StreamingChannel;\n const stateMachine = new ChannelStateMachine(channel);\n\n return {\n success: true,\n channel,\n stateMachine,\n dataLoss: false,\n };\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse snapshot: ${error instanceof Error ? error.message : 'Unknown error'}`,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { AssetId, ChainId, ChannelBalance, ChannelCheckpoint, ChannelCloseRequest, ChannelCloser, ChannelClosingConfig, ChannelConfig, ChannelCreateRequest, ChannelDispute, ChannelOpener, ChannelOpeningConfig, ChannelOpeningResult, ChannelParticipant, ChannelRecovery, ChannelSettlementResult, ChannelState, ChannelStateMachine, CloseInitiationResult, FundingTransaction, IChannelStorage, RecoveryConfig, RecoveryData, RecoveryResult, StateEvent, StateTransition, StreamingChannel, buildCloseTransactionData, calculateRequiredDeposit, createStateSnapshot, estimateChannelDuration, getChannelUtilization, isChannelActive, isChannelTerminal, restoreFromSnapshot } from './channels/index.js';
|
|
2
|
+
export { AggregatedUsage, BillingConfig, BillingManager, BillingManagerConfig, BillingPeriod, FlowConfig, FlowController, Invoice, InvoiceItem, MeteringConfig, MeteringManager, MeteringRecord, RateAdjustmentRequest, RateController, RateControllerConfig, RateHistoryEntry, RateLimiter, RateType, StreamEvent, StreamRate, StreamSession, StreamState, UsageMetrics, calculateOptimalRate, calculateProRatedUsage, compareUsage, convertRate, createFixedRateFlow, createTieredRateFlow, estimateFutureBill, estimateUsage, formatCurrencyAmount, parseCurrencyAmount } from './streaming/index.js';
|
|
3
|
+
export { CheckpointManager, CheckpointManagerConfig, CheckpointRequest, CheckpointType, Dispute, DisputeEvidence, DisputeManager, DisputeManagerConfig, DisputeReason, DisputeRequest, DisputeResponse, FinalSettlementConfig, FinalSettlementManager, OnChainSettlement, SettlementCheckpoint, SettlementConfig, SettlementRequest, SettlementResult, SettlementState, SettlementStatus, createCheckpointEvidence, createSignatureEvidence, createTransactionEvidence, estimateSettlementGas, signCheckpoint, verifyCheckpointSignature, verifySettlementOnChain } from './settlement/index.js';
|
|
4
|
+
import 'zod';
|