diff --git a/contractcourt/contract_resolvers.go b/contractcourt/contract_resolvers.go index 223220d61..d0d7328eb 100644 --- a/contractcourt/contract_resolvers.go +++ b/contractcourt/contract_resolvers.go @@ -1258,18 +1258,33 @@ func (c *commitSweepResolver) Resolve() (ContractResolver, error) { log.Infof("%T(%v): sweeping commit output with tx=%v", c, c.chanPoint, spew.Sdump(c.sweepTx)) - // Finally, we'll broadcast the sweep transaction to the - // network. - if err := c.PublishTx(c.sweepTx); err != nil { + // With the sweep transaction constructed, we'll now Checkpoint + // our state. + if err := c.Checkpoint(c); err != nil { + log.Errorf("unable to Checkpoint: %v", err) + return nil, err + } + + // With the sweep transaction checkpointed, we'll now publish + // the transaction. Upon restart, the resolver will immediately + // take the case below since the sweep tx is checkpointed. + err := c.PublishTx(c.sweepTx) + if err != nil && err != lnwallet.ErrDoubleSpend { log.Errorf("%T(%v): unable to publish sweep tx: %v", c, c.chanPoint, err) return nil, err } - // With the sweep transaction confirmed, we'll now Checkpoint - // our state. - if err := c.Checkpoint(c); err != nil { - log.Errorf("unable to Checkpoint: %v", err) + // If the sweep transaction has been generated, and the remote party + // broadcast the commit transaction, we'll republish it for reliability + // to ensure it confirms. The resolver will enter this case after + // checkpointing in the case above, ensuring we reliably on restarts. + case c.sweepTx != nil && !isLocalCommitTx: + err := c.PublishTx(c.sweepTx) + if err != nil && err != lnwallet.ErrDoubleSpend { + log.Errorf("%T(%v): unable to publish sweep tx: %v", + c, c.chanPoint, err) + return nil, err } // Otherwise, this is our commitment transaction, So we'll obtain the