Skip to content

Commit fbe2dd8

Browse files
authored
Merge pull request #225 from starius/accounting-fmt-errorf
accounting: add error messages for errors
2 parents b12a858 + 3431cd8 commit fbe2dd8

File tree

7 files changed

+128
-49
lines changed

7 files changed

+128
-49
lines changed

accounting/categories.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package accounting
22

3-
import "regexp"
3+
import (
4+
"fmt"
5+
"regexp"
6+
)
47

58
// CustomCategory describes a custom category which can be used to identify
69
// special case groups of transactions.
@@ -24,7 +27,8 @@ func NewCustomCategory(name string, regexes []string) (*CustomCategory, error) {
2427
for _, regex := range regexes {
2528
exp, err := regexp.Compile(regex)
2629
if err != nil {
27-
return nil, err
30+
return nil, fmt.Errorf("category %v: compiling regex "+
31+
"%v failed: %w", name, regex, err)
2832
}
2933

3034
category.Regexes = append(category.Regexes, exp)

accounting/conversions.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package accounting
22

33
import (
44
"context"
5+
"fmt"
56
"time"
67

78
"github.com/btcsuite/btcd/btcutil"
@@ -44,25 +45,38 @@ func getConversion(ctx context.Context, startTime, endTime time.Time,
4445

4546
err := utils.ValidateTimeRange(startTime, endTime)
4647
if err != nil {
47-
return nil, err
48+
return nil, fmt.Errorf("conversion: invalid time range [%v,%v): %w",
49+
startTime, endTime, err)
4850
}
4951

5052
fiatClient, err := fiat.NewPriceSource(priceCfg)
5153
if err != nil {
52-
return nil, err
54+
backend := "<nil>"
55+
if priceCfg != nil {
56+
backend = priceCfg.Backend.String()
57+
}
58+
return nil, fmt.Errorf("conversion: initialising price "+
59+
"source backend %v failed: %w", backend, err)
5360
}
5461

5562
// Get price data for our relevant period. We get pricing for the whole
5663
// period rather than on a per-item level to limit the number of api
5764
// calls we need to make to our external data source.
5865
prices, err := fiatClient.GetPrices(ctx, startTime, endTime)
5966
if err != nil {
60-
return nil, err
67+
return nil, fmt.Errorf("conversion: fetching prices for "+
68+
"range [%v,%v) failed: %w", startTime, endTime, err)
6169
}
6270

6371
// Create a wrapper function which can be used to get individual price
6472
// points from our set of price data as we create our report.
6573
return func(ts time.Time) (*fiat.Price, error) {
66-
return fiat.GetPrice(prices, ts)
74+
price, err := fiat.GetPrice(prices, ts)
75+
if err != nil {
76+
return nil, fmt.Errorf("conversion: fetching price "+
77+
"at %v failed: %w", ts, err)
78+
}
79+
80+
return price, nil
6781
}, nil
6882
}

accounting/entries.go

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ func channelOpenEntries(channel channelInfo, tx lndclient.Transaction,
8080
true, u.getFiat,
8181
)
8282
if err != nil {
83-
return nil, err
83+
return nil, fmt.Errorf("tx %v channel %v: creating open entry "+
84+
"failed: %w", tx.TxHash, channel.channelID, err)
8485
}
8586

8687
// If we did not initiate opening the channel, we can just return the
@@ -101,7 +102,9 @@ func channelOpenEntries(channel channelInfo, tx lndclient.Transaction,
101102
FeeReference(tx.TxHash), note, category, true, u.getFiat,
102103
)
103104
if err != nil {
104-
return nil, err
105+
return nil, fmt.Errorf("tx %v channel %v: creating channel "+
106+
"open fee entry failed: %w", tx.TxHash,
107+
channel.channelID, err)
105108
}
106109

107110
return []*HarmonyEntry{openEntry, feeEntry}, nil
@@ -135,7 +138,9 @@ func closedChannelEntries(channel closedChannelInfo, tx lndclient.Transaction,
135138
tx.TxHash, note, category, true, u.getFiat,
136139
)
137140
if err != nil {
138-
return nil, err
141+
return nil, fmt.Errorf("tx %v channel %v: creating channel "+
142+
"close entry failed: %w", tx.TxHash, channel.channelID,
143+
err)
139144
}
140145

141146
switch channel.initiator {
@@ -172,7 +177,9 @@ func closedChannelEntries(channel closedChannelInfo, tx lndclient.Transaction,
172177

173178
fees, err := u.getFee(tx.Tx.TxHash())
174179
if err != nil {
175-
return nil, err
180+
return nil, fmt.Errorf("tx %v channel %v: fetching on-chain "+
181+
"close fees failed: %w", tx.TxHash, channel.channelID,
182+
err)
176183
}
177184

178185
// Our fees are provided as a positive amount in sats. Convert this to
@@ -185,7 +192,9 @@ func closedChannelEntries(channel closedChannelInfo, tx lndclient.Transaction,
185192
true, u.getFiat,
186193
)
187194
if err != nil {
188-
return nil, err
195+
return nil, fmt.Errorf("tx %v channel %v: creating channel "+
196+
"close fee entry failed: %w", tx.TxHash,
197+
channel.channelID, err)
189198
}
190199

191200
return []*HarmonyEntry{closeEntry, feeEntry}, nil
@@ -201,7 +210,8 @@ func sweepEntries(tx lndclient.Transaction, u entryUtils) ([]*HarmonyEntry, erro
201210
tx.TxHash, tx.Label, category, true, u.getFiat,
202211
)
203212
if err != nil {
204-
return nil, err
213+
return nil, fmt.Errorf("tx %v: creating sweep entry failed: %w",
214+
tx.TxHash, err)
205215
}
206216

207217
// If we do not have a fee lookup function set, we log a warning that
@@ -216,7 +226,8 @@ func sweepEntries(tx lndclient.Transaction, u entryUtils) ([]*HarmonyEntry, erro
216226

217227
fee, err := u.getFee(tx.Tx.TxHash())
218228
if err != nil {
219-
return nil, err
229+
return nil, fmt.Errorf("tx %v: fetching sweep fee failed: %w",
230+
tx.TxHash, err)
220231
}
221232

222233
feeEntry, err := newHarmonyEntry(
@@ -225,7 +236,8 @@ func sweepEntries(tx lndclient.Transaction, u entryUtils) ([]*HarmonyEntry, erro
225236
u.getFiat,
226237
)
227238
if err != nil {
228-
return nil, err
239+
return nil, fmt.Errorf("tx %v: creating sweep fee entry "+
240+
"failed: %w", tx.TxHash, err)
229241
}
230242

231243
return []*HarmonyEntry{txEntry, feeEntry}, nil
@@ -267,7 +279,8 @@ func createOnchainFeeEntry(tx lndclient.Transaction, category string,
267279
)
268280

269281
if err != nil {
270-
return nil, err
282+
return nil, fmt.Errorf("tx %v: creating on-chain fee entry "+
283+
"failed: %w", tx.TxHash, err)
271284
}
272285

273286
return feeEntry, nil
@@ -315,7 +328,9 @@ func onChainEntries(tx lndclient.Transaction,
315328
note := utxoManagementFeeNote(tx.TxHash)
316329
feeEntry, err := createOnchainFeeEntry(tx, category, note, u)
317330
if err != nil {
318-
return nil, err
331+
return nil, fmt.Errorf("tx %v: creating utxo "+
332+
"management fee entry failed: %w", tx.TxHash,
333+
err)
319334
}
320335

321336
return []*HarmonyEntry{feeEntry}, nil
@@ -326,7 +341,8 @@ func onChainEntries(tx lndclient.Transaction,
326341
tx.Label, category, true, u.getFiat,
327342
)
328343
if err != nil {
329-
return nil, err
344+
return nil, fmt.Errorf("tx %v: creating on-chain transaction "+
345+
"entry failed: %w", tx.TxHash, err)
330346
}
331347

332348
// If we did not pay any fees, we can just return a single entry.
@@ -336,7 +352,8 @@ func onChainEntries(tx lndclient.Transaction,
336352

337353
feeEntry, err := createOnchainFeeEntry(tx, category, "", u)
338354
if err != nil {
339-
return nil, err
355+
return nil, fmt.Errorf("tx %v: creating on-chain fee entry "+
356+
"failed: %w", tx.TxHash, err)
340357
}
341358

342359
return []*HarmonyEntry{txEntry, feeEntry}, nil
@@ -451,7 +468,8 @@ func paymentEntry(payment paymentInfo, paidToSelf bool,
451468
ref, note, "", false, u.getFiat,
452469
)
453470
if err != nil {
454-
return nil, err
471+
return nil, fmt.Errorf("payment %v: creating payment entry "+
472+
"failed: %w", payment.Hash, err)
455473
}
456474

457475
// If we paid no fees (possible for payments to our direct peer), then
@@ -468,7 +486,8 @@ func paymentEntry(payment paymentInfo, paidToSelf bool,
468486
feeRef, note, "", false, u.getFiat,
469487
)
470488
if err != nil {
471-
return nil, err
489+
return nil, fmt.Errorf("payment %v: creating payment fee "+
490+
"entry failed: %w", payment.Hash, err)
472491
}
473492
return []*HarmonyEntry{paymentEntry, feeEntry}, nil
474493
}
@@ -502,7 +521,8 @@ func forwardingEntry(forward lndclient.ForwardingEvent,
502521
false, u.getFiat,
503522
)
504523
if err != nil {
505-
return nil, err
524+
return nil, fmt.Errorf("forward %v: creating forwarding "+
525+
"entry failed: %w", txid, err)
506526
}
507527

508528
// If we did not earn any fees, return the forwarding entry.
@@ -515,7 +535,8 @@ func forwardingEntry(forward lndclient.ForwardingEvent,
515535
EntryTypeForwardFee, txid, "", "", "", false, u.getFiat,
516536
)
517537
if err != nil {
518-
return nil, err
538+
return nil, fmt.Errorf("forward %v: creating forwarding fee "+
539+
"entry failed: %w", txid, err)
519540
}
520541

521542
return []*HarmonyEntry{fwdEntry, feeEntry}, nil

accounting/filter.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,9 @@ func preProcessPayments(payments []lndclient.Payment,
149149
payment.PaymentRequest, decode,
150150
)
151151
if err != nil && err != errNoPaymentRequest {
152-
return nil, err
152+
return nil, fmt.Errorf("payment %v: retrieving "+
153+
"payment request details failed: %w",
154+
payment.Hash, err)
153155
}
154156

155157
destination, err := paymentHtlcDestination(payment)
@@ -214,7 +216,9 @@ func paymentHtlcDestination(payment lndclient.Payment) (*route.Vertex, error) {
214216
lastHop := hops[len(hops)-1]
215217
lastHopPubkey, err := route.NewVertexFromStr(lastHop.PubKey)
216218
if err != nil {
217-
return nil, err
219+
return nil, fmt.Errorf("payment %v: parsing last hop "+
220+
"pubkey %v failed: %w", payment.Hash, lastHop.PubKey,
221+
err)
218222
}
219223

220224
return &lastHopPubkey, nil

accounting/off_chain.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"context"
66
"errors"
7+
"fmt"
78

89
"github.com/lightninglabs/lndclient"
910
"github.com/lightningnetwork/lnd/lntypes"
@@ -48,7 +49,9 @@ func OffChainReport(ctx context.Context, cfg *OffChainConfig) (Report, error) {
4849
cfg.PriceSourceCfg,
4950
)
5051
if err != nil {
51-
return nil, err
52+
return nil, fmt.Errorf("off-chain report: init conversion "+
53+
"lookup for range [%v,%v) failed: %w", cfg.StartTime,
54+
cfg.EndTime, err)
5255
}
5356

5457
return offChainReportWithPrices(cfg, getPrice)
@@ -62,7 +65,8 @@ func offChainReportWithPrices(cfg *OffChainConfig, getPrice fiatPrice) (Report,
6265

6366
invoices, err := cfg.ListInvoices()
6467
if err != nil {
65-
return nil, err
68+
return nil, fmt.Errorf("off-chain report: listing invoices "+
69+
"failed: %w", err)
6670
}
6771
filteredInvoices := filterInvoices(cfg.StartTime, cfg.EndTime, invoices)
6872

@@ -71,25 +75,31 @@ func offChainReportWithPrices(cfg *OffChainConfig, getPrice fiatPrice) (Report,
7175

7276
payments, err := cfg.ListPayments()
7377
if err != nil {
74-
return nil, err
78+
return nil, fmt.Errorf("off-chain report: listing payments "+
79+
"failed: %w", err)
7580
}
7681

7782
preProcessed, err := preProcessPayments(payments, cfg.DecodePayReq)
7883
if err != nil {
79-
return nil, err
84+
return nil, fmt.Errorf("off-chain report: preprocessing %d "+
85+
"payments failed: %w", len(payments), err)
8086
}
8187

8288
// Get a list of all the payments we made to ourselves.
8389
paymentsToSelf, err := getCircularPayments(cfg.OwnPubKey, preProcessed)
8490
if err != nil {
85-
return nil, err
91+
return nil, fmt.Errorf("off-chain report: identifying "+
92+
"circular payments for node %v failed: %w",
93+
cfg.OwnPubKey, err)
8694
}
8795

8896
filteredPayments := filterPayments(
8997
cfg.StartTime, cfg.EndTime, preProcessed,
9098
)
9199
if err := sanityCheckDuplicates(filteredPayments); err != nil {
92-
return nil, err
100+
return nil, fmt.Errorf("off-chain report: duplicate payment "+
101+
"hashes detected in range [%v,%v): %w", cfg.StartTime,
102+
cfg.EndTime, err)
93103
}
94104

95105
log.Infof("Retrieved: %v payments, %v filtered, %v circular",
@@ -99,7 +109,8 @@ func offChainReportWithPrices(cfg *OffChainConfig, getPrice fiatPrice) (Report,
99109
// are already supplied over the relevant range for our query.
100110
forwards, err := cfg.ListForwards()
101111
if err != nil {
102-
return nil, err
112+
return nil, fmt.Errorf("off-chain report: listing forwards "+
113+
"failed: %w", err)
103114
}
104115

105116
log.Infof("Retrieved: %v forwards", len(forwards))
@@ -133,7 +144,8 @@ func offChainReport(invoices []lndclient.Invoice, payments []paymentInfo,
133144

134145
entry, err := invoiceEntry(invoice, toSelf, utils)
135146
if err != nil {
136-
return nil, err
147+
return nil, fmt.Errorf("invoice %v: creating entry "+
148+
"failed: %w", invoice.Hash, err)
137149
}
138150

139151
reports = append(reports, entry)
@@ -146,7 +158,8 @@ func offChainReport(invoices []lndclient.Invoice, payments []paymentInfo,
146158

147159
entries, err := paymentEntry(payment, toSelf, utils)
148160
if err != nil {
149-
return nil, err
161+
return nil, fmt.Errorf("payment %v: creating entries "+
162+
"failed: %w", payment.Hash, err)
150163
}
151164

152165
reports = append(reports, entries...)
@@ -155,7 +168,8 @@ func offChainReport(invoices []lndclient.Invoice, payments []paymentInfo,
155168
for _, forward := range forwards {
156169
entries, err := forwardingEntry(forward, utils)
157170
if err != nil {
158-
return nil, err
171+
return nil, fmt.Errorf("forward at %v: creating "+
172+
"entries failed: %w", forward.Timestamp, err)
159173
}
160174

161175
reports = append(reports, entries...)

0 commit comments

Comments
 (0)