diff --git a/plugins/libplugin-pay.c b/plugins/libplugin-pay.c index 3a56382ba..6bffd3b1f 100644 --- a/plugins/libplugin-pay.c +++ b/plugins/libplugin-pay.c @@ -39,6 +39,8 @@ struct payment *payment_new(tal_t *ctx, struct command *cmd, /* Re-establish the unmodified constraints for our sub-payment. */ p->constraints = *parent->start_constraints; p->deadline = parent->deadline; + + p->invoice = parent->invoice; } else { assert(cmd != NULL); p->partid = 0; @@ -715,6 +717,7 @@ payment_waitsendpay_finished(struct command *cmd, const char *buffer, case WIRE_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS: p->result->code = PAY_DESTINATION_PERM_FAIL; + root->abort = true; case WIRE_MPP_TIMEOUT: /* These are permanent failures that should abort all of our * attempts right away. We'll still track pending partial @@ -2094,6 +2097,14 @@ static struct presplit_mod_data *presplit_mod_data_init(struct payment *p) } } +static bool payment_supports_mpp(struct payment *p) +{ + if (p->invoice == NULL || p->invoice->features == NULL) + return false; + + return feature_offered(p->invoice->features, OPT_BASIC_MPP); +} + static void presplit_cb(struct presplit_mod_data *d, struct payment *p) { struct payment *root = payment_root(p); @@ -2102,6 +2113,9 @@ static void presplit_cb(struct presplit_mod_data *d, struct payment *p) if (d->disable) return payment_continue(p); + if (!payment_supports_mpp(p)) + return payment_continue(p); + if (p->step == PAYMENT_STEP_ONION_PAYLOAD) { /* We need to tell the last hop the total we're going to * send. Presplit disables amount fuzzing, so we should always @@ -2214,6 +2228,9 @@ static void adaptive_splitter_cb(struct presplit_mod_data *d, struct payment *p) if (d->disable) return payment_continue(p); + if (!payment_supports_mpp(p) || root->abort) + return payment_continue(p); + if (p->step == PAYMENT_STEP_ONION_PAYLOAD) { /* We need to tell the last hop the total we're going to * send. Presplit disables amount fuzzing, so we should always