diff --git a/lightningd/pay.c b/lightningd/pay.c index 38a6035cf..fd0b6c48f 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -142,10 +142,14 @@ json_add_routefail_info(struct json_stream *js, } void json_sendpay_fail_fields(struct json_stream *js, + const struct wallet_payment *payment, int pay_errcode, const u8 *onionreply, const struct routing_failure *fail) { + /* "immediate_routing_failure" is before payment creation. */ + if (payment) + json_add_payment_fields(js, payment); if (pay_errcode == PAY_UNPARSEABLE_ONION) json_add_hex_talarr(js, "onionreply", onionreply); else @@ -161,6 +165,7 @@ void json_sendpay_fail_fields(struct json_stream *js, /* onionreply used if pay_errcode == PAY_UNPARSEABLE_ONION */ static struct command_result * sendpay_fail(struct command *cmd, + const struct wallet_payment *payment, int pay_errcode, const u8 *onionreply, const struct routing_failure *fail, @@ -181,6 +186,7 @@ sendpay_fail(struct command *cmd, data = json_stream_fail(cmd, pay_errcode, errmsg); json_sendpay_fail_fields(data, + payment, pay_errcode, onionreply, fail); @@ -202,6 +208,7 @@ json_sendpay_in_progress(struct command *cmd, static void tell_waiters_failed(struct lightningd *ld, const struct sha256 *payment_hash, + const struct wallet_payment *payment, int pay_errcode, const u8 *onionreply, const struct routing_failure *fail, @@ -215,7 +222,8 @@ static void tell_waiters_failed(struct lightningd *ld, if (!sha256_eq(payment_hash, &pc->payment_hash)) continue; - sendpay_fail(pc->cmd, pay_errcode, onionreply, fail, details); + sendpay_fail(pc->cmd, payment, + pay_errcode, onionreply, fail, details); } } @@ -510,8 +518,8 @@ void payment_failed(struct lightningd *ld, const struct htlc_out *hout, failmsg, fail ? fail->channel_dir : 0); - tell_waiters_failed(ld, &hout->payment_hash, pay_errcode, - hout->failuremsg, fail, failmsg); + tell_waiters_failed(ld, &hout->payment_hash, payment, + pay_errcode, hout->failuremsg, fail, failmsg); } /* Wait for a payment. If cmd is deleted, then json_waitsendpay_on_resolve @@ -567,7 +575,9 @@ static struct command_result *wait_payment(struct lightningd *ld, "Payment failure reason unknown"); } else if (failonionreply) { /* failed to parse returned onion error */ - return sendpay_fail(cmd, PAY_UNPARSEABLE_ONION, + return sendpay_fail(cmd, + payment, + PAY_UNPARSEABLE_ONION, failonionreply, NULL, faildetail); } else { @@ -583,6 +593,7 @@ static struct command_result *wait_payment(struct lightningd *ld, /* FIXME: We don't store this! */ fail->msg = NULL; return sendpay_fail(cmd, + payment, faildestperm ? PAY_DESTINATION_PERM_FAIL : PAY_TRY_OTHER_ROUTE, @@ -721,8 +732,8 @@ send_payment(struct lightningd *ld, &route[0].channel_id, &channel->peer->id); - return sendpay_fail(cmd, PAY_TRY_OTHER_ROUTE, NULL, - fail, "First peer not ready"); + return sendpay_fail(cmd, payment, PAY_TRY_OTHER_ROUTE, + NULL, fail, "First peer not ready"); } /* Copy channels used along the route. */ diff --git a/lightningd/pay.h b/lightningd/pay.h index f5ca389fb..53f0e0cdd 100644 --- a/lightningd/pay.h +++ b/lightningd/pay.h @@ -26,6 +26,7 @@ void json_add_payment_fields(struct json_stream *response, /* This json will be also used in 'sendpay_failure' notifictaion. */ void json_sendpay_fail_fields(struct json_stream *js, + const struct wallet_payment *t, int pay_errcode, const u8 *onionreply, const struct routing_failure *fail);