diff --git a/channeldb/invoice_test.go b/channeldb/invoice_test.go index d67ff2a4..0929147c 100644 --- a/channeldb/invoice_test.go +++ b/channeldb/invoice_test.go @@ -87,8 +87,9 @@ func TestInvoiceWorkflow(t *testing.T) { spew.Sdump(fakeInvoice), spew.Sdump(dbInvoice)) } - // Settle the invoice, the versin retreived from the database should - // now have the settled bit toggle to true. + // Settle the invoice, the version retrieved from the database should + // now have the settled bit toggle to true and a non-default + // SettledDate if err := db.SettleInvoice(paymentHash); err != nil { t.Fatalf("unable to settle invoice: %v", err) } @@ -100,6 +101,10 @@ func TestInvoiceWorkflow(t *testing.T) { t.Fatalf("invoice should now be settled but isn't") } + if dbInvoice2.SettleDate.IsZero() { + t.Fatalf("invoice should have non-zero SettledDate but isn't") + } + // Attempt to insert generated above again, this should fail as // duplicates are rejected by the processing logic. if err := db.AddInvoice(fakeInvoice); err != ErrDuplicateInvoice { diff --git a/channeldb/invoices.go b/channeldb/invoices.go index 99a9caec..c94d1e9c 100644 --- a/channeldb/invoices.go +++ b/channeldb/invoices.go @@ -100,6 +100,9 @@ type Invoice struct { // CreationDate is the exact time the invoice was created. CreationDate time.Time + // SettleDate is the exact time the invoice was settled. + SettleDate time.Time + // Terms are the contractual payment terms of the invoice. Once // all the terms have been satisfied by the payer, then the invoice can // be considered fully fulfilled. @@ -330,10 +333,20 @@ func serializeInvoice(w io.Writer, i *Invoice) error { if err != nil { return err } + if err := wire.WriteVarBytes(w, 0, birthBytes); err != nil { return err } + settleBytes, err := i.SettleDate.MarshalBinary() + if err != nil { + return err + } + + if err := wire.WriteVarBytes(w, 0, settleBytes); err != nil { + return err + } + if _, err := w.Write(i.Terms.PaymentPreimage[:]); err != nil { return err } @@ -389,6 +402,14 @@ func deserializeInvoice(r io.Reader) (*Invoice, error) { return nil, err } + settledBytes, err := wire.ReadVarBytes(r, 0, 300, "settled") + if err != nil { + return nil, err + } + if err := invoice.SettleDate.UnmarshalBinary(settledBytes); err != nil { + return nil, err + } + if _, err := io.ReadFull(r, invoice.Terms.PaymentPreimage[:]); err != nil { return nil, err } @@ -412,13 +433,12 @@ func settleInvoice(invoices *bolt.Bucket, invoiceNum []byte) error { } invoice.Terms.Settled = true + invoice.SettleDate = time.Now() var buf bytes.Buffer if err := serializeInvoice(&buf, invoice); err != nil { return nil } - // TODO(roasbeef): add timestamp - return invoices.Put(invoiceNum[:], buf.Bytes()) }