@@ -307,8 +307,23 @@ export function sessionManager(parameters: sessionManager.Parameters): SessionMa
307307
308308 if ( msg . mpp === 'need-voucher' && channel && wsChallenge ) {
309309 const required = BigInt ( msg . data . requiredCumulative )
310+ const accepted = BigInt ( msg . data . acceptedCumulative ?? '0' )
311+ const deposit = BigInt ( msg . data . deposit ?? '0' )
312+
313+ // Pre-authorize a batch of chunks to reduce round-trips.
314+ // On first need-voucher (accepted=0), use `required` as the unit price
315+ // since the server tells us exactly what one unit costs.
316+ // On subsequent vouchers, derive unit price from the delta.
317+ const unitPrice = accepted === 0n
318+ ? ( required > 0n ? required : 1n )
319+ : ( required > accepted ? required - accepted : 1n )
320+ const batchTarget = required + unitPrice * 99n // ~100 chunks total
321+ // Cap at deposit to avoid exceeding on-chain balance
322+ const capped = deposit > 0n && batchTarget > deposit ? deposit : batchTarget
323+ const newCumulative = capped > required ? capped : required
324+
310325 channel . cumulativeAmount =
311- channel . cumulativeAmount > required ? channel . cumulativeAmount : required
326+ channel . cumulativeAmount > newCumulative ? channel . cumulativeAmount : newCumulative
312327
313328 try {
314329 const credential = await method . createCredential ( {
@@ -322,7 +337,8 @@ export function sessionManager(parameters: sessionManager.Parameters): SessionMa
322337 ws . send (
323338 JSON . stringify ( { mpp : 'voucher' , mppVersion : '1' , authorization : credential } ) ,
324339 )
325- } catch {
340+ } catch ( err ) {
341+ console . error ( '[mppx] ws voucher creation failed:' , err )
326342 ws . close ( 1011 , 'Failed to create payment credential' )
327343 }
328344 } else if ( msg . mpp === 'receipt' ) {
0 commit comments