diff --git a/client.go b/client.go index a388604..3f2e887 100644 --- a/client.go +++ b/client.go @@ -152,8 +152,8 @@ func NewClient(dbDir string, loopDB loopdb.SwapStore, LndServices: cfg.Lnd, Server: swapServerClient, Conn: swapServerClient.conn, - Store: loopDB, L402Store: l402Store, + Store: loopDB, CreateExpiryTimer: func(d time.Duration) <-chan time.Time { return time.NewTimer(d).C }, diff --git a/loopd/daemon.go b/loopd/daemon.go index 9c0101e..e335e20 100644 --- a/loopd/daemon.go +++ b/loopd/daemon.go @@ -53,7 +53,7 @@ type ListenerCfg struct { // on the passed TLS configuration. restListener func(*tls.Config) (net.Listener, error) - // getLnd returns a grpc connection to an lnd instance. + // getLnd returns a grpc connection to a lnd instance. getLnd func(lndclient.Network, *lndConfig) (*lndclient.GrpcLndServices, error) } @@ -120,9 +120,9 @@ func New(config *Config, lisCfg *ListenerCfg) *Daemon { // Start starts loopd in daemon mode. It will listen for grpc connections, // execute commands and pass back swap status information. func (d *Daemon) Start() error { - // There should be no reason to start the daemon twice. Therefore return - // an error if that's tried. This is mostly to guard against Start and - // StartAsSubserver both being called. + // There should be no reason to start the daemon twice. Therefore, + // return an error if that's tried. This is mostly to guard against + // Start and StartAsSubserver both being called. if atomic.AddInt32(&d.started, 1) != 1 { return errOnlyStartOnce } @@ -137,7 +137,7 @@ func (d *Daemon) Start() error { // With lnd connected, initialize everything else, such as the swap // server client, the swap client RPC server instance and our main swap - // and error handlers. If this fails, then nothing has been started yet + // and error handlers. If this fails, then nothing has been started yet, // and we can just return the error. err = d.initialize(true) if errors.Is(err, bbolt.ErrTimeout) { @@ -324,7 +324,7 @@ func (d *Daemon) startWebServers() error { err := d.restServer.Serve(d.restListener) // ErrServerClosed is always returned when the proxy is // shut down, so don't log it. - if err != nil && err != http.ErrServerClosed { + if err != nil && !errors.Is(err, http.ErrServerClosed) { // Notify the main error handler goroutine that // we exited unexpectedly here. We don't have to // worry about blocking as the internal error @@ -343,7 +343,7 @@ func (d *Daemon) startWebServers() error { log.Infof("RPC server listening on %s", d.grpcListener.Addr()) err = d.grpcServer.Serve(d.grpcListener) - if err != nil && err != grpc.ErrServerStopped { + if err != nil && !errors.Is(err, grpc.ErrServerStopped) { // Notify the main error handler goroutine that // we exited unexpectedly here. We don't have to // worry about blocking as the internal error @@ -719,9 +719,9 @@ func (d *Daemon) initialize(withMacaroonService bool) error { var runtimeErr error // There are only two ways this goroutine can exit. Either there - // is an internal error or the caller requests shutdown. In both - // cases we wait for the stop to complete before we signal the - // caller that we're done. + // is an internal error or the caller requests a shutdown. + // In both cases we wait for the stop to complete before we + // signal the caller that we're done. select { case runtimeErr = <-d.internalErrChan: log.Errorf("Runtime error in daemon, shutting down: "+ @@ -730,7 +730,7 @@ func (d *Daemon) initialize(withMacaroonService bool) error { case <-d.quit: } - // We need to shutdown before sending the error on the channel, + // We need to shut down before sending the error on the channel, // otherwise a caller might exit the process too early. d.stop() cleanupMacaroonStore() @@ -761,7 +761,7 @@ func (d *Daemon) stop() { d.mainCtxCancel() } - // As there is no swap activity anymore, we can forcefully shutdown the + // As there is no swap activity anymore, we can forcefully shut down the // gRPC and HTTP servers now. log.Infof("Stopping gRPC server") if d.grpcServer != nil { diff --git a/sweepbatcher/sweep_batch.go b/sweepbatcher/sweep_batch.go index 0960f31..33814f3 100644 --- a/sweepbatcher/sweep_batch.go +++ b/sweepbatcher/sweep_batch.go @@ -3,6 +3,7 @@ package sweepbatcher import ( "bytes" "context" + "encoding/hex" "fmt" "math" "sync" @@ -700,9 +701,11 @@ func (b *batch) publishBatch(ctx context.Context) (btcutil.Amount, error) { batchTx.TxIn[i].Witness = witness } - b.log.Debugf("attempting to publish non-coop tx with feerate=%v, "+ - "totalfee=%v, sweeps=%v, destAddr=%s", b.rbfCache.FeeRate, fee, - len(batchTx.TxIn), address.String()) + b.log.Infof("attempting to publish non-coop tx=%v with feerate=%v, "+ + "totalfee=%v, sweeps=%d, destAddr=%s", batchTx.TxHash(), + b.rbfCache.FeeRate, fee, len(batchTx.TxIn), address) + + b.debugLogTx("serialized non-coop sweep", batchTx) err = b.wallet.PublishTransaction( ctx, batchTx, labels.LoopOutBatchSweepSuccess(b.id), @@ -846,9 +849,11 @@ func (b *batch) publishBatchCoop(ctx context.Context) (btcutil.Amount, return fee, err, false } - b.log.Debugf("attempting to publish coop tx with feerate=%v, "+ - "totalfee=%v, sweeps=%v, destAddr=%s", b.rbfCache.FeeRate, fee, - len(batchTx.TxIn), address.String()) + b.log.Infof("attempting to publish coop tx=%v with feerate=%v, "+ + "totalfee=%v, sweeps=%d, destAddr=%s", batchTx.TxHash(), + b.rbfCache.FeeRate, fee, len(batchTx.TxIn), address) + + b.debugLogTx("serialized coop sweep", batchTx) err = b.wallet.PublishTransaction( ctx, batchTx, labels.LoopOutBatchSweepSuccess(b.id), @@ -866,6 +871,17 @@ func (b *batch) publishBatchCoop(ctx context.Context) (btcutil.Amount, return fee, nil, true } +func (b *batch) debugLogTx(msg string, tx *wire.MsgTx) { + // Serialize the transaction and convert to hex string. + buf := bytes.NewBuffer(make([]byte, 0, tx.SerializeSize())) + if err := tx.Serialize(buf); err != nil { + b.log.Errorf("failed to serialize tx for debug log: %v", err) + return + } + + b.log.Debugf("%s: %s", msg, hex.EncodeToString(buf.Bytes())) +} + // coopSignBatchTx collects the necessary signatures from the server in order // to cooperatively sweep the funds. func (b *batch) coopSignBatchTx(ctx context.Context, packet *psbt.Packet,