mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-22 08:34:20 +01:00
pay: Key the MPP payments based on the payment_hash not the bolt11
This allows us to drive the payment from outside, and still get the aggregation that we want.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user