Skip to content

Commit

Permalink
lightningd/invoice.c: Improve programmatic error reporting for `delin…
Browse files Browse the repository at this point in the history
…voice`.

Changelog-Changed: JSON-RPC: `delinvoice` will now report specific error codes: 905 for failing to find the invoice, 906 for the invoice status not matching the parameter.
  • Loading branch information
ZmnSCPxj committed Jul 31, 2020
1 parent b646b96 commit e7d89cd
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 5 deletions.
4 changes: 3 additions & 1 deletion common/jsonrpc_errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,14 @@ static const errcode_t CONNECT_ALL_ADDRESSES_FAILED = 401;
/* bitcoin-cli plugin errors */
#define BCLI_ERROR 400

/* Errors from `invoice` command */
/* Errors from `invoice` or `delinvoice` commands */
static const errcode_t INVOICE_LABEL_ALREADY_EXISTS = 900;
static const errcode_t INVOICE_PREIMAGE_ALREADY_EXISTS = 901;
static const errcode_t INVOICE_HINTS_GAVE_NO_ROUTES = 902;
static const errcode_t INVOICE_EXPIRED_DURING_WAIT = 903;
static const errcode_t INVOICE_WAIT_TIMED_OUT = 904;
static const errcode_t INVOICE_NOT_FOUND = 905;
static const errcode_t INVOICE_STATUS_UNEXPECTED = 906;

/* Errors from HSM crypto operations. */
static const errcode_t HSM_ECDH_FAILED = 800;
Expand Down
15 changes: 15 additions & 0 deletions doc/lightning-delinvoice.7

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions doc/lightning-delinvoice.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ RETURN VALUE
On success, an invoice description will be returned as per
lightning-listinvoice(7).

ERRORS
------

The following errors may be reported:

- -1: Database error.
- 905: An invoice with that label does not exist.
- 906: The invoice *status* does not match the parameter.
An error object will be returned as error *data*, containing
*current_status* and *expected_status* fields.
This is most likely due to the *status* of the invoice
changing just before this command is invoked.

AUTHOR
------

Expand Down
15 changes: 11 additions & 4 deletions lightningd/invoice.c
Original file line number Diff line number Diff line change
Expand Up @@ -1145,7 +1145,7 @@ static struct command_result *json_delinvoice(struct command *cmd,
return command_param_failed();

if (!wallet_invoice_find_by_label(wallet, &i, label)) {
return command_fail(cmd, LIGHTNINGD, "Unknown invoice");
return command_fail(cmd, INVOICE_NOT_FOUND, "Unknown invoice");
}

details = wallet_invoice_details(cmd, cmd->ld->wallet, i);
Expand All @@ -1154,15 +1154,22 @@ static struct command_result *json_delinvoice(struct command *cmd,
* might not make sense if it changed! */
actual_status = invoice_status_str(details);
if (!streq(actual_status, status)) {
return command_fail(cmd, LIGHTNINGD,
"Invoice status is %s not %s",
actual_status, status);
struct json_stream *js;
js = json_stream_fail(cmd, INVOICE_STATUS_UNEXPECTED,
tal_fmt(tmpctx,
"Invoice status is %s not %s",
actual_status, status));
json_add_string(js, "current_status", actual_status);
json_add_string(js, "expected_status", status);
json_object_end(js);
return command_failed(cmd, js);
}

if (!wallet_invoice_delete(wallet, i)) {
log_broken(cmd->ld->log,
"Error attempting to remove invoice %"PRIu64,
i.id);
/* FIXME: allocate a generic DATABASE_ERROR code. */
return command_fail(cmd, LIGHTNINGD, "Database error");
}

Expand Down

0 comments on commit e7d89cd

Please sign in to comment.