diff --git a/plugins/pay.c b/plugins/pay.c index dc37ac143..1261f9d51 100644 --- a/plugins/pay.c +++ b/plugins/pay.c @@ -1520,7 +1520,10 @@ static bool attempt_ongoing(const char *b11) /* We consolidate multi-part payments into a single entry. */ struct pay_mpp { - /* This is the bolt11 string, and lookup key */ + /* payment_hash from the invoice and lookup key */ + const struct sha256 *payment_hash; + + /* This is the bolt11 string */ const char *b11; /* Status of combined payment */ const char *status; @@ -1534,22 +1537,22 @@ struct pay_mpp { struct amount_msat amount_sent; }; -static const char *pay_mpp_key(const struct pay_mpp *pm) +static const struct sha256 *pay_mpp_key(const struct pay_mpp *pm) { - return pm->b11; + return pm->payment_hash; } -static size_t b11str_hash(const char *b11) +static size_t pay_mpp_hash(const struct sha256 *payment_hash) { - return siphash24(siphash_seed(), b11, strlen(b11)); + return siphash24(siphash_seed(), payment_hash, sizeof(struct sha256)); } -static bool pay_mpp_eq(const struct pay_mpp *pm, const char *b11) +static bool pay_mpp_eq(const struct pay_mpp *pm, const struct sha256 *payment_hash) { - return streq(pm->b11, b11); + return memcmp(pm->payment_hash, payment_hash, sizeof(struct sha256)) == 0; } -HTABLE_DEFINE_TYPE(struct pay_mpp, pay_mpp_key, b11str_hash, pay_mpp_eq, +HTABLE_DEFINE_TYPE(struct pay_mpp, pay_mpp_key, pay_mpp_hash, pay_mpp_eq, pay_map); static void add_amount_sent(struct plugin *p, @@ -1610,19 +1613,22 @@ static struct command_result *listsendpays_done(struct command *cmd, ret = jsonrpc_stream_success(cmd); json_array_start(ret, "pays"); json_for_each_arr(i, t, arr) { - const jsmntok_t *status, *b11tok; - const char *b11; + const jsmntok_t *status, *b11tok, *hashtok; + const char *b11 = b11str; + struct sha256 payment_hash; b11tok = json_get_member(buf, t, "bolt11"); - /* Old (or manual) payments didn't have bolt11 field */ - if (!b11tok) - continue; + hashtok = json_get_member(buf, t, "payment_hash"); + assert(hashtok != NULL); - b11 = json_strdup(cmd, buf, b11tok); + json_to_sha256(buf, hashtok, &payment_hash); + if (b11tok) + b11 = json_strdup(cmd, buf, b11tok); - pm = pay_map_get(&pay_map, b11); + pm = pay_map_get(&pay_map, &payment_hash); if (!pm) { pm = tal(cmd, struct pay_mpp); + pm->payment_hash = tal_dup(pm, struct sha256, &payment_hash); pm->b11 = tal_steal(pm, b11); pm->label = json_get_member(buf, t, "label"); pm->preimage = NULL;