@@ -282,6 +282,11 @@ type batch struct {
282
282
// verifySchnorrSig is a function that verifies a schnorr signature.
283
283
verifySchnorrSig VerifySchnorrSig
284
284
285
+ // publishErrorHandler is a function that handles transaction publishing
286
+ // error. By default, it logs all errors as warnings, but "insufficient
287
+ // fee" as Info.
288
+ publishErrorHandler PublishErrorHandler
289
+
285
290
// purger is a function that can take a sweep which is being purged and
286
291
// hand it over to the batcher for further processing.
287
292
purger Purger
@@ -308,23 +313,24 @@ type Purger func(sweepReq *SweepRequest) error
308
313
// struct is only used as a wrapper for the arguments that are required to
309
314
// create a new batch.
310
315
type batchKit struct {
311
- id int32
312
- batchTxid * chainhash.Hash
313
- batchPkScript []byte
314
- state batchState
315
- primaryID lntypes.Hash
316
- sweeps map [lntypes.Hash ]sweep
317
- rbfCache rbfCache
318
- returnChan chan SweepRequest
319
- wallet lndclient.WalletKitClient
320
- chainNotifier lndclient.ChainNotifierClient
321
- signerClient lndclient.SignerClient
322
- musig2SignSweep MuSig2SignSweep
323
- verifySchnorrSig VerifySchnorrSig
324
- purger Purger
325
- store BatcherStore
326
- log btclog.Logger
327
- quit chan struct {}
316
+ id int32
317
+ batchTxid * chainhash.Hash
318
+ batchPkScript []byte
319
+ state batchState
320
+ primaryID lntypes.Hash
321
+ sweeps map [lntypes.Hash ]sweep
322
+ rbfCache rbfCache
323
+ returnChan chan SweepRequest
324
+ wallet lndclient.WalletKitClient
325
+ chainNotifier lndclient.ChainNotifierClient
326
+ signerClient lndclient.SignerClient
327
+ musig2SignSweep MuSig2SignSweep
328
+ verifySchnorrSig VerifySchnorrSig
329
+ publishErrorHandler PublishErrorHandler
330
+ purger Purger
331
+ store BatcherStore
332
+ log btclog.Logger
333
+ quit chan struct {}
328
334
}
329
335
330
336
// scheduleNextCall schedules the next call to the batch handler's main event
@@ -353,28 +359,29 @@ func NewBatch(cfg batchConfig, bk batchKit) *batch {
353
359
return & batch {
354
360
// We set the ID to a negative value to flag that this batch has
355
361
// never been persisted, so it needs to be assigned a new ID.
356
- id : - 1 ,
357
- state : Open ,
358
- sweeps : make (map [lntypes.Hash ]sweep ),
359
- blockEpochChan : make (chan int32 ),
360
- spendChan : make (chan * chainntnfs.SpendDetail ),
361
- confChan : make (chan * chainntnfs.TxConfirmation , 1 ),
362
- reorgChan : make (chan struct {}, 1 ),
363
- errChan : make (chan error , 1 ),
364
- callEnter : make (chan struct {}),
365
- callLeave : make (chan struct {}),
366
- stopping : make (chan struct {}),
367
- finished : make (chan struct {}),
368
- quit : bk .quit ,
369
- batchTxid : bk .batchTxid ,
370
- wallet : bk .wallet ,
371
- chainNotifier : bk .chainNotifier ,
372
- signerClient : bk .signerClient ,
373
- muSig2SignSweep : bk .musig2SignSweep ,
374
- verifySchnorrSig : bk .verifySchnorrSig ,
375
- purger : bk .purger ,
376
- store : bk .store ,
377
- cfg : & cfg ,
362
+ id : - 1 ,
363
+ state : Open ,
364
+ sweeps : make (map [lntypes.Hash ]sweep ),
365
+ blockEpochChan : make (chan int32 ),
366
+ spendChan : make (chan * chainntnfs.SpendDetail ),
367
+ confChan : make (chan * chainntnfs.TxConfirmation , 1 ),
368
+ reorgChan : make (chan struct {}, 1 ),
369
+ errChan : make (chan error , 1 ),
370
+ callEnter : make (chan struct {}),
371
+ callLeave : make (chan struct {}),
372
+ stopping : make (chan struct {}),
373
+ finished : make (chan struct {}),
374
+ quit : bk .quit ,
375
+ batchTxid : bk .batchTxid ,
376
+ wallet : bk .wallet ,
377
+ chainNotifier : bk .chainNotifier ,
378
+ signerClient : bk .signerClient ,
379
+ muSig2SignSweep : bk .musig2SignSweep ,
380
+ verifySchnorrSig : bk .verifySchnorrSig ,
381
+ publishErrorHandler : bk .publishErrorHandler ,
382
+ purger : bk .purger ,
383
+ store : bk .store ,
384
+ cfg : & cfg ,
378
385
}
379
386
}
380
387
@@ -396,32 +403,33 @@ func NewBatchFromDB(cfg batchConfig, bk batchKit) (*batch, error) {
396
403
}
397
404
398
405
return & batch {
399
- id : bk .id ,
400
- state : bk .state ,
401
- primarySweepID : bk .primaryID ,
402
- sweeps : bk .sweeps ,
403
- blockEpochChan : make (chan int32 ),
404
- spendChan : make (chan * chainntnfs.SpendDetail ),
405
- confChan : make (chan * chainntnfs.TxConfirmation , 1 ),
406
- reorgChan : make (chan struct {}, 1 ),
407
- errChan : make (chan error , 1 ),
408
- callEnter : make (chan struct {}),
409
- callLeave : make (chan struct {}),
410
- stopping : make (chan struct {}),
411
- finished : make (chan struct {}),
412
- quit : bk .quit ,
413
- batchTxid : bk .batchTxid ,
414
- batchPkScript : bk .batchPkScript ,
415
- rbfCache : bk .rbfCache ,
416
- wallet : bk .wallet ,
417
- chainNotifier : bk .chainNotifier ,
418
- signerClient : bk .signerClient ,
419
- muSig2SignSweep : bk .musig2SignSweep ,
420
- verifySchnorrSig : bk .verifySchnorrSig ,
421
- purger : bk .purger ,
422
- store : bk .store ,
423
- log : bk .log ,
424
- cfg : & cfg ,
406
+ id : bk .id ,
407
+ state : bk .state ,
408
+ primarySweepID : bk .primaryID ,
409
+ sweeps : bk .sweeps ,
410
+ blockEpochChan : make (chan int32 ),
411
+ spendChan : make (chan * chainntnfs.SpendDetail ),
412
+ confChan : make (chan * chainntnfs.TxConfirmation , 1 ),
413
+ reorgChan : make (chan struct {}, 1 ),
414
+ errChan : make (chan error , 1 ),
415
+ callEnter : make (chan struct {}),
416
+ callLeave : make (chan struct {}),
417
+ stopping : make (chan struct {}),
418
+ finished : make (chan struct {}),
419
+ quit : bk .quit ,
420
+ batchTxid : bk .batchTxid ,
421
+ batchPkScript : bk .batchPkScript ,
422
+ rbfCache : bk .rbfCache ,
423
+ wallet : bk .wallet ,
424
+ chainNotifier : bk .chainNotifier ,
425
+ signerClient : bk .signerClient ,
426
+ muSig2SignSweep : bk .musig2SignSweep ,
427
+ verifySchnorrSig : bk .verifySchnorrSig ,
428
+ publishErrorHandler : bk .publishErrorHandler ,
429
+ purger : bk .purger ,
430
+ store : bk .store ,
431
+ log : bk .log ,
432
+ cfg : & cfg ,
425
433
}, nil
426
434
}
427
435
@@ -795,23 +803,31 @@ func (b *batch) publish(ctx context.Context) error {
795
803
return err
796
804
}
797
805
806
+ // logPublishError is a function which logs publish errors.
807
+ logPublishError := func (errMsg string , err error ) {
808
+ b .publishErrorHandler (err , errMsg , b .log )
809
+ }
810
+
798
811
if b .cfg .mixedBatch {
799
812
fee , err , signSuccess = b .publishMixedBatch (ctx )
800
813
if err != nil {
801
- b . log . Warnf ( "Mixed batch publish error: %v " , err )
814
+ logPublishError ( "mixed batch publish error" , err )
802
815
}
803
816
} else {
804
817
fee , err , signSuccess = b .publishBatchCoop (ctx )
805
818
if err != nil {
806
- b . log . Warnf ("co-op publish error: %v " , err )
819
+ logPublishError ("co-op publish error" , err )
807
820
}
808
821
}
809
822
810
823
if ! signSuccess {
811
824
fee , err = b .publishBatch (ctx )
825
+ if err != nil {
826
+ logPublishError ("non-coop publish error" , err )
827
+ }
812
828
}
829
+
813
830
if err != nil {
814
- b .log .Warnf ("publish error: %v" , err )
815
831
return nil
816
832
}
817
833
0 commit comments