@@ -12,6 +12,7 @@ import (
12
12
13
13
"decred.org/dcrwallet/errors"
14
14
"decred.org/dcrwallet/internal/uniformprng"
15
+ "decred.org/dcrwallet/rpc/client/dcrd"
15
16
"decred.org/dcrwallet/wallet"
16
17
"decred.org/dcrwallet/wallet/txrules"
17
18
"decred.org/dcrwallet/wallet/txsizes"
@@ -189,15 +190,20 @@ func (c *Client) feePayment(ticketHash *chainhash.Hash, policy Policy) (fp *feeP
189
190
if fp == nil {
190
191
return
191
192
}
193
+ var schedule bool
192
194
c .mu .Lock ()
193
195
fp2 := c .jobs [* ticketHash ]
194
196
if fp2 != nil {
195
197
fp .stop ()
196
198
fp = fp2
197
199
} else {
198
200
c .jobs [* ticketHash ] = fp
201
+ schedule = true
199
202
}
200
203
c .mu .Unlock ()
204
+ if schedule {
205
+ fp .schedule ("reconcile payment" , fp .reconcilePayment )
206
+ }
201
207
}()
202
208
203
209
ctx := context .Background ()
@@ -250,9 +256,9 @@ func (c *Client) feePayment(ticketHash *chainhash.Hash, policy Policy) (fp *feeP
250
256
return nil
251
257
}
252
258
259
+ fp .state = unprocessed // XXX fee created, but perhaps not submitted with vsp.
253
260
feeHash , err := w .VSPFeeHashForTicket (ctx , ticketHash )
254
261
if err != nil {
255
- fp .state = unprocessed
256
262
// caller must schedule next method, as paying the fee may
257
263
// require using provided transaction inputs.
258
264
return fp
@@ -271,9 +277,7 @@ func (c *Client) feePayment(ticketHash *chainhash.Hash, policy Policy) (fp *feeP
271
277
}
272
278
273
279
fp .feeTx = fee
274
- fp .fee = - 1 // XXX fee amount (not needed anymore?)
275
- fp .state = unprocessed // XXX fee created, but perhaps not submitted with vsp.
276
- fp .schedule ("reconcile payment" , fp .reconcilePayment )
280
+ fp .fee = - 1 // XXX fee amount (not needed anymore?)
277
281
278
282
return fp
279
283
}
@@ -427,8 +431,6 @@ func (fp *feePayment) receiveFeeAddress() error {
427
431
fp .feeAddr = feeAddr
428
432
fp .mu .Unlock ()
429
433
430
- _ = fp .makeFeeTx (nil )
431
- fp .schedule ("reconcile payment" , fp .reconcilePayment )
432
434
return nil
433
435
}
434
436
@@ -471,8 +473,6 @@ func (fp *feePayment) makeFeeTx(tx *wire.MsgTx) error {
471
473
472
474
// XXX fp.fee == -1?
473
475
if fee == 0 {
474
- // XXX locking
475
- // this schedules paying the fee
476
476
err := fp .receiveFeeAddress ()
477
477
if err != nil {
478
478
return err
@@ -560,12 +560,17 @@ func (fp *feePayment) makeFeeTx(tx *wire.MsgTx) error {
560
560
561
561
// sign
562
562
sigErrs , err := w .SignTransaction (ctx , tx , txscript .SigHashAll , nil , nil , nil )
563
- if err != nil {
563
+ if err != nil || len ( sigErrs ) > 0 {
564
564
log .Errorf ("failed to sign transaction: %v" , err )
565
+ sigErrStr := ""
565
566
for _ , sigErr := range sigErrs {
566
567
log .Errorf ("\t %v" , sigErr )
568
+ sigErrStr = fmt .Sprintf ("\t %v" , sigErr ) + " "
567
569
}
568
- return err
570
+ if err != nil {
571
+ return err
572
+ }
573
+ return fmt .Errorf (sigErrStr )
569
574
}
570
575
571
576
err = w .SetPublished (ctx , & feeHash , false )
@@ -731,7 +736,23 @@ func (fp *feePayment) reconcilePayment() error {
731
736
if feeTx == nil || len (feeTx .TxOut ) == 0 {
732
737
err := fp .makeFeeTx (nil )
733
738
if err != nil {
734
- fp .schedule ("reconcile payment" , fp .reconcilePayment )
739
+ var apiErr * BadRequestError
740
+ if errors .As (err , & apiErr ) && apiErr .Code == codeTicketCannotVote {
741
+ fp .remove ("ticket cannot vote" )
742
+ // Attempt to Revoke Tickets, we're not returning any errors here
743
+ // and just logging.
744
+ n , err := w .NetworkBackend ()
745
+ if err != nil {
746
+ log .Errorf ("unable to get network backend for revoking tickets %v" , err )
747
+ } else {
748
+ if rpc , ok := n .(* dcrd.RPC ); ok {
749
+ err := w .RevokeTickets (ctx , rpc )
750
+ if err != nil {
751
+ log .Errorf ("cannot revoke vsp tickets %v" , err )
752
+ }
753
+ }
754
+ }
755
+ }
735
756
return err
736
757
}
737
758
}
@@ -865,6 +886,17 @@ func (fp *feePayment) submitPayment() (err error) {
865
886
err = fp .client .post (ctx , "/api/v3/payfee" , fp .commitmentAddr ,
866
887
& payfeeResponse , json .RawMessage (requestBody ))
867
888
if err != nil {
889
+ var apiErr * BadRequestError
890
+ if errors .As (err , & apiErr ) && apiErr .Code == codeFeeExpired {
891
+ // Fee has been expired, so abandon current feetx, set fp.feeTx
892
+ // to nil and retry submit payment to make a new fee tx.
893
+ feeHash := feeTx .TxHash ()
894
+ err := w .AbandonTransaction (ctx , & feeHash )
895
+ if err != nil {
896
+ log .Errorf ("error abandoning expired fee tx %v" , err )
897
+ }
898
+ fp .feeTx = nil
899
+ }
868
900
return fmt .Errorf ("payfee: %w" , err )
869
901
}
870
902
0 commit comments