wallet: catch remaining bitcoind errors, and generic RPC errors resendUnminedTxs

In this commit, ensure that upon restart, if any of the full-node based
backends we support reject the transaction, then we'll properly remove
the now invalid transaction from the tx store. Before this commit, we
could miss a few errors from bitcoind. To remedy this, we explicitly
catch those errors, but then also attempt to precisely catch the set of
generic json RPC errors that can be returned.
This commit is contained in:
Olaoluwa Osuntokun 2018-04-18 15:00:10 -07:00
parent 8b2aebe89e
commit 921dae5d5e

View file

@ -2195,13 +2195,22 @@ func (w *Wallet) resendUnminedTxs() {
// detect that the output has already been fully spent, // detect that the output has already been fully spent,
// is an orphan, or is conflicting with another // is an orphan, or is conflicting with another
// transaction. // transaction.
//
// TODO(roasbeef): SendRawTransaction needs to return
// concrete error types, no need for string matching
switch { switch {
// The following are errors returned from btcd's
// mempool.
case strings.Contains(err.Error(), "spent"): case strings.Contains(err.Error(), "spent"):
case strings.Contains(err.Error(), "orphan"): case strings.Contains(err.Error(), "orphan"):
case strings.Contains(err.Error(), "conflict"): case strings.Contains(err.Error(), "conflict"):
// The following errors are returned from bitcoind's
// mempool.
case strings.Contains(err.Error(), "Missing inputs"):
case strings.Contains(err.Error(), "already in block chain"):
case strings.Contains(err.Error(), "fee not met"):
default: default:
continue continue
} }
@ -2221,12 +2230,7 @@ func (w *Wallet) resendUnminedTxs() {
return err return err
} }
err = w.TxStore.RemoveUnminedTx(txmgrNs, txRec) return w.TxStore.RemoveUnminedTx(txmgrNs, txRec)
if err != nil {
return err
}
return err
}) })
if err != nil { if err != nil {
log.Warnf("unable to remove conflicting "+ log.Warnf("unable to remove conflicting "+