diff --git a/lightningd/invoice.c b/lightningd/invoice.c index 334b42388..2804dc229 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -104,6 +104,9 @@ void resolve_invoice(struct lightningd *ld, struct invoice *invoice) tell_waiter(w->cmd, invoice); wallet_invoice_save(ld->wallet, invoice); + + /* Also mark the payment in the history table as complete */ + wallet_payment_set_status(ld->wallet, &invoice->rhash, PAYMENT_COMPLETE); } static void json_invoice(struct command *cmd, @@ -115,6 +118,7 @@ static void json_invoice(struct command *cmd, struct invoices *invs = cmd->ld->invoices; struct bolt11 *b11; char *b11enc; + struct wallet_payment payment; if (!json_get_params(buffer, params, "amount", &msatoshi, @@ -193,6 +197,20 @@ static void json_invoice(struct command *cmd, tal_steal(invs, invoice); list_add_tail(&invs->invlist, &invoice->list); + /* Store the payment so we can later show it in the history */ + payment.id = 0; + payment.incoming = true; + payment.payment_hash = invoice->rhash; + payment.destination = NULL; + payment.status = PAYMENT_PENDING; + payment.msatoshi = invoice->msatoshi; + payment.timestamp = b11->timestamp; + + if (!wallet_payment_add(cmd->ld->wallet, &payment)) { + command_fail(cmd, "Unable to record payment in the database."); + return; + } + json_object_start(response, NULL); json_add_hex(response, "rhash", &invoice->rhash, sizeof(invoice->rhash)); diff --git a/lightningd/pay.c b/lightningd/pay.c index 66e63e4bb..a964f7c67 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -162,6 +162,7 @@ static void send_payment(struct command *cmd, size_t i, n_hops = tal_count(route); struct hop_data *hop_data = tal_arr(cmd, struct hop_data, n_hops); struct pubkey *ids = tal_arr(cmd, struct pubkey, n_hops); + struct wallet_payment payment; /* Expiry for HTLCs is absolute. And add one to give some margin. */ base_expiry = get_block_height(cmd->ld->topology) + 1; @@ -219,6 +220,23 @@ static void send_payment(struct command *cmd, log_add(cmd->ld->log, "... retrying"); } + /* If this is a new payment, then store the payment so we can + * later show it in the history */ + if (!pc) { + payment.id = 0; + payment.incoming = false; + payment.payment_hash = *rhash; + payment.destination = &ids[n_hops - 1]; + payment.status = PAYMENT_PENDING; + payment.msatoshi = route[n_hops-1].amount; + payment.timestamp = time_now().ts.tv_sec; + + if (!wallet_payment_add(cmd->ld->wallet, &payment)) { + command_fail(cmd, "Unable to record payment in the database."); + return; + } + } + peer = peer_by_id(cmd->ld, &ids[0]); if (!peer) { command_fail(cmd, "no connection to first peer found");