diff --git a/internal/rpc/rpcserver/server.go b/internal/rpc/rpcserver/server.go index c2fb76e63..a8907f0c3 100644 --- a/internal/rpc/rpcserver/server.go +++ b/internal/rpc/rpcserver/server.go @@ -3764,6 +3764,7 @@ func (s *walletServer) GetVSPTicketsByFeeStatus(ctx context.Context, req *pb.Get func (s *walletServer) SyncVSPFailedTickets(ctx context.Context, req *pb.SyncVSPTicketsRequest) ( *pb.SyncVSPTicketsResponse, error) { + var err error failedTicketsFee, err := s.wallet.GetVSPTicketsByFeeStatus(ctx, int(udb.VSPFeeProcessErrored)) if err != nil { return nil, err @@ -3790,20 +3791,29 @@ func (s *walletServer) SyncVSPFailedTickets(ctx context.Context, req *pb.SyncVSP } vspClient, err := getVSP(cfg) if err != nil { - return nil, status.Errorf(codes.Unknown, "TicketBuyerV3 instance failed to start. Error: %v", err) + return nil, status.Errorf(codes.Unknown, "vsp client instance failed to start. Error: %v", err) } // process tickets fee if needed. + feeErrors := "" for _, ticketHash := range failedTicketsFee { feeTx := new(wire.MsgTx) err := vspClient.Process(ctx, &ticketHash, feeTx) if err != nil { + if feeErrors == "" { + feeErrors = err.Error() + } else { + feeErrors += ", " + err.Error() + } // if it fails to process again, we log it and continue with // the wallet start. // Not sure we need to log here since it's already warned elsewhere } } - return &pb.SyncVSPTicketsResponse{}, nil + if feeErrors != "" { + err = status.Errorf(codes.Unknown, feeErrors) + } + return &pb.SyncVSPTicketsResponse{}, err } func (s *walletServer) ProcessManagedTickets(ctx context.Context, req *pb.ProcessManagedTicketsRequest) ( diff --git a/wallet/createtx.go b/wallet/createtx.go index 52bed1ba8..4ff41e729 100644 --- a/wallet/createtx.go +++ b/wallet/createtx.go @@ -10,6 +10,7 @@ import ( "crypto/rand" "crypto/tls" "encoding/binary" + "fmt" "net" "sort" "time" @@ -1741,6 +1742,7 @@ func (w *Wallet) purchaseTickets(ctx context.Context, op errors.Op, if !req.DontSignTx && req.VSPFeePaymentProcess != nil { unlockCredits = false + feeErrors := "" for i, ticketHash := range purchaseTicketsResponse.TicketHashes { // set vsp fee as processing, so we can know it started to be // processed. @@ -1760,7 +1762,14 @@ func (w *Wallet) purchaseTickets(ctx context.Context, op errors.Op, err = req.VSPFeePaymentProcess(ctx, ticketHash, feeTx) if err != nil { - log.Errorf("vsp ticket %v fee proccessment failed: %v", ticketHash, err) + feeError := fmt.Sprintf("vsp ticket %v fee proccessment failed: %v", ticketHash, err) + if feeErrors == "" { + feeErrors = feeError + } else { + feeErrors += ", " + feeError + } + log.Error(feeError) + rec.FeeTxStatus = uint32(udb.VSPFeeProcessErrored) err = w.UpdateVSPTicket(ctx, ticketHash, rec) if err != nil { @@ -1778,8 +1787,10 @@ func (w *Wallet) purchaseTickets(ctx context.Context, op errors.Op, return nil, err } } + if feeErrors != "" { + err = errors.E(op, errors.Other, feeErrors) + } } - return purchaseTicketsResponse, err }