diff --git a/common/gossmap.c b/common/gossmap.c index bec5dea27eae..a61947bc5636 100644 --- a/common/gossmap.c +++ b/common/gossmap.c @@ -1249,6 +1249,8 @@ void gossmap_chan_get_update_details(const struct gossmap *map, const size_t htlc_maximum_off = fee_prop_off + 4; assert(gossmap_chan_set(chan, dir)); + /* Not allowed on local updates! */ + assert(chan->cann_off < map->map_size); if (timestamp) *timestamp = map_be32(map, timestamp_off); diff --git a/common/gossmap.h b/common/gossmap.h index b173c9bd5515..edaec7415f6d 100644 --- a/common/gossmap.h +++ b/common/gossmap.h @@ -155,7 +155,7 @@ u8 *gossmap_node_get_features(const tal_t *ctx, const struct gossmap_node *n); /* Returns details from channel_update (must be gossmap_chan_set, and - * does not work for local_updatechan! */ + * does not work for local_updatechan)! */ void gossmap_chan_get_update_details(const struct gossmap *map, const struct gossmap_chan *chan, int dir, diff --git a/plugins/topology.c b/plugins/topology.c index d4e29628c6b0..dd934c02f386 100644 --- a/plugins/topology.c +++ b/plugins/topology.c @@ -266,14 +266,27 @@ static void json_add_halfchan(struct json_stream *response, json_add_num(response, "direction", dir); json_add_bool(response, "public", !c->private); - gossmap_chan_get_update_details(gossmap, c, dir, - ×tamp, - &message_flags, - &channel_flags, - &fee_base_msat, - &fee_proportional_millionths, - &htlc_minimum_msat, - &htlc_maximum_msat); + if (c->private) { + /* Local additions don't have a channel_update + * in gossmap. This is deprecated anyway, but + * fill in values from entry we added. */ + timestamp = time_now().ts.tv_sec; + message_flags = (ROUTING_OPT_HTLC_MAX_MSAT|ROUTING_OPT_DONT_FORWARD); + channel_flags = node_id_idx(&node_id[dir], &node_id[!dir]); + fee_base_msat = c->half[dir].base_fee; + fee_proportional_millionths = c->half[dir].proportional_fee; + htlc_minimum_msat = amount_msat(fp16_to_u64(c->half[dir].htlc_min)); + htlc_maximum_msat = amount_msat(fp16_to_u64(c->half[dir].htlc_max)); + } else { + gossmap_chan_get_update_details(gossmap, c, dir, + ×tamp, + &message_flags, + &channel_flags, + &fee_base_msat, + &fee_proportional_millionths, + &htlc_minimum_msat, + &htlc_maximum_msat); + } json_add_amount_sat_msat(response, "amount_msat", capacity); json_add_num(response, "message_flags", message_flags); diff --git a/tests/test_connection.py b/tests/test_connection.py index 8410539ee7c4..87414c066171 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -3785,6 +3785,7 @@ def test_upgrade_statickey_onchaind(node_factory, executor, bitcoind): bitcoind.generate_block(100, wait_for_mempool=txid) # This works even if they disconnect and listpeerchannels() is empty: + wait_for(lambda: l1.rpc.listpeerchannels()['channels'] == []) wait_for(lambda: l2.rpc.listpeerchannels()['channels'] == []) # TEST 2: Cheat from post-upgrade. @@ -3817,6 +3818,7 @@ def test_upgrade_statickey_onchaind(node_factory, executor, bitcoind): bitcoind.generate_block(100, wait_for_mempool=txid) # This works even if they disconnect and listpeers() is empty: + wait_for(lambda: len(l1.rpc.listpeerchannels()['channels']) == 0) wait_for(lambda: len(l2.rpc.listpeerchannels()['channels']) == 0) # TEST 3: Unilateral close from pre-upgrade @@ -3852,6 +3854,7 @@ def test_upgrade_statickey_onchaind(node_factory, executor, bitcoind): bitcoind.generate_block(100, wait_for_mempool=txid) # This works even if they disconnect and listpeerchannels() is empty: + wait_for(lambda: len(l1.rpc.listpeerchannels()['channels']) == 0) wait_for(lambda: len(l2.rpc.listpeerchannels()['channels']) == 0) # TEST 4: Unilateral close from post-upgrade