core-lightning/doc/schemas/listpeers.schema.json
niftynei 376e6f8bd1 dual-funding: update fee_step to be a feerate
Using a 'feestep' is more restrictive than you'd want, instead we
enforce that the next feerate must be at least 1/64th more than the
last, but put no upper limit on it

Includes update to lnprototest changes

Contributed-By: Vincenzo Palazzo <vincenzopalazzodev@gmail.com>
Changelog-EXPERIMENTAL: Protocol: Replaces init_rbf's `fee_step` for RBF of v2 opens with `funding_feerate_perkw`, breaking change
2021-07-19 16:13:24 -04:00

952 lines
28 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"additionalProperties": false,
"required": [ "peers" ],
"properties": {
"peers": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"required": [ "id", "connected", "channels" ],
"properties": {
"id": {
"type": "pubkey",
"description": "the public key of the peer"
},
"connected": {
"type": "boolean",
"description": "True if the peer is currently connected"
},
"log": {
"type": "array",
"description": "if *level* is specified, logs for this peer",
"items": {
"type": "object",
"additionalProperties": true,
"required": [ "type" ],
"properties": {
"type": {
"type": "string",
"enum": [ "SKIPPED", "BROKEN", "UNUSUAL", "INFO", "DEBUG", "IO_IN", "IO_OUT" ]
}
},
"allOf": [
{
"if": {
"properties": {
"type": {
"enum": [ "SKIPPED" ]
}
}
},
"then": {
"type": "object",
"additionalProperties": false,
"required": [ "num_skipped" ],
"properties": {
"type": { },
"num_skipped": {
"type": "u32",
"description": "number of deleted/omitted entries"
}
}
}
},
{
"if": {
"properties": {
"type": {
"enum": [ "BROKEN", "UNUSUAL", "INFO", "DEBUG" ]
}
}
},
"then": {
"type": "object",
"additionalProperties": false,
"required": [ "time", "source", "log", "node_id" ],
"properties": {
"type": { },
"time": {
"type": "string",
"description": "UNIX timestamp with 9 decimal places"
},
"source": {
"type": "string",
"description": "The particular logbook this was found in"
},
"log": {
"type": "string",
"description": "The actual log message"
},
"node_id": {
"type": "pubkey",
"description": "The peer this is associated with"
}
}
}
},
{
"if": {
"properties": {
"type": {
"enum": [ "IO_IN", "IO_OUT" ]
}
}
},
"then": {
"type": "object",
"additionalProperties": false,
"required": [ "time", "source", "log", "node_id", "data" ],
"properties": {
"type": { },
"time": {
"type": "string",
"description": "UNIX timestamp with 9 decimal places"
},
"source": {
"type": "string",
"description": "The particular logbook this was found in"
},
"log": {
"type": "string",
"description": "The actual log message"
},
"node_id": {
"type": "pubkey",
"description": "The peer this is associated with"
},
"data": {
"type": "hex",
"description": "The IO which occurred"
}
}
}
}
]
}
},
"channels": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true,
"required": [ "state", "opener", "features" ],
"properties": {
"state": {
"type": "string",
"enum": [ "OPENINGD", "CHANNELD_AWAITING_LOCKIN", "CHANNELD_NORMAL", "CHANNELD_SHUTTING_DOWN", "CLOSINGD_SIGEXCHANGE", "CLOSINGD_COMPLETE", "AWAITING_UNILATERAL", "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN" ],
"description": "the channel state, in particular \"CHANNELD_NORMAL\" means the channel can be used normally"
},
"scratch_txid": {
"type": "txid",
"description": "The txid we would use if we went onchain now"
},
"feerate": {
"type": "object",
"description": "Feerates for the current tx",
"additionalProperties": false,
"required": [ "perkw", "perkb" ],
"properties": {
"perkw": {
"type": "u32",
"description": "Feerate per 1000 weight (i.e kSipa)"
},
"perkb": {
"type": "u32",
"description": "Feerate per 1000 virtual bytes"
}
}
},
"owner": {
"type": "string",
"description": "The current subdaemon controlling this connection"
},
"short_channel_id": {
"type": "short_channel_id",
"description": "The short_channel_id (once locked in)"
},
"channel_id": {
"type": "hex",
"description": "The full channel_id",
"minLength": 64,
"maxLength": 64
},
"funding_txid": {
"type": "txid",
"description": "ID of the funding transaction"
},
"initial_feerate": {
"type": "string",
"description": "For inflight opens, the first feerate used to initiate the channel open"
},
"last_feerate": {
"type": "string",
"description": "For inflight opens, the most recent feerate used on the channel open"
},
"next_feerate": {
"type": "string",
"description": "For inflight opens, the next feerate we'll use for the channel open"
},
"next_fee_step": {
"type": "u32",
"description": "For inflight opens, the next feerate step we'll use for the channel open"
},
"inflight": {
"type": "array",
"description": "Current candidate funding transactions (only for dual-funding)",
"items": {
"type": "object",
"additionalProperties": false,
"required": [ "funding_txid", "funding_outnum", "feerate", "total_funding_msat", "our_funding_msat", "scratch_txid" ],
"properties": {
"funding_txid": {
"type": "txid",
"description": "ID of the funding transaction"
},
"funding_outnum": {
"type": "u32",
"description": "The 0-based output number of the funding transaction which opens the channel"
},
"feerate": {
"type": "string",
"description": "The feerate for this funding transaction in per-1000-weight, with \"kpw\" appended"
},
"total_funding_msat": {
"type": "msat",
"description": "total amount in the channel"
},
"our_funding_msat": {
"type": "msat",
"description": "amount we have in the channel"
},
"scratch_txid": {
"type": "txid",
"description": "The commitment transaction txid we would use if we went onchain now"
}
}
}
},
"close_to": {
"type": "hex",
"description": "scriptPubkey which we have to close to if we mutual close"
},
"private": {
"type": "boolean",
"description": "if False, we will not announce this channel"
},
"opener": {
"type": "string",
"enum": [ "local", "remote" ],
"description": "Who initiated the channel"
},
"closer": {
"FIXME": "deprecated_apis turns off null!",
"type": [ "string", "null" ],
"enum": [ "local", "remote", null ],
"description": "Who initiated the channel close (`null` is deprecated!)"
},
"features": {
"type": "array",
"items": {
"type": "string",
"enum": [ "option_static_remotekey", "option_anchor_outputs" ],
"description": "BOLT #9 features which apply to this channel"
}
},
"funding": {
"type": "object",
"additionalProperties": false,
"required": [ "local_msat", "remote_msat" ],
"properties": {
"local_msat": {
"type": "msat",
"description": "Amount of channel we funded"
},
"remote_msat": {
"type": "msat",
"description": "Amount of channel they funded"
}
}
},
"funding_allocation_msat": {
"deprecated": true
},
"funding_msat": {
"deprecated": true
},
"to_us_msat": {
"type": "msat",
"description": "how much of channel is owed to us"
},
"min_to_us_msat": {
"type": "msat",
"description": "least amount owed to us ever"
},
"max_to_us_msat": {
"type": "msat",
"description": "most amount owed to us ever"
},
"total_msat": {
"type": "msat",
"description": "total amount in the channel"
},
"fee_base_msat": {
"type": "msat",
"description": "amount we charge to use the channel"
},
"fee_proportional_millionths": {
"type": "u32",
"description": "amount we charge to use the channel in parts-per-million"
},
"dust_limit_msat": {
"type": "msat",
"description": "minimum amount for an output on the channel transactions"
},
"max_total_htlc_in_msat": {
"type": "msat",
"description": "max amount accept in a single payment"
},
"their_reserve_msat": {
"type": "msat",
"description": "minimum we insist they keep in channel"
},
"our_reserve_msat": {
"type": "msat",
"description": "minimum they insist we keep in channel"
},
"spendable_msat": {
"type": "msat",
"description": "total we could send through channel"
},
"receivable_msat": {
"type": "msat",
"description": "total peer could send through channel"
},
"minimum_htlc_in_msat": {
"type": "msat",
"description": "the minimum amount HTLC we accept"
},
"their_to_self_delay": {
"type": "u32",
"description": "the number of blocks before they can take their funds if they unilateral close"
},
"our_to_self_delay": {
"type": "u32",
"description": "the number of blocks before we can take our funds if we unilateral close"
},
"max_accepted_htlcs": {
"type": "u32",
"description": "Maximum number of incoming HTLC we will accept at once"
},
"msatoshi_to_us": {
"deprecated": true
},
"msatoshi_to_us_min": {
"deprecated": true
},
"msatoshi_to_us_max": {
"deprecated": true
},
"msatoshi_total": {
"deprecated": true
},
"dust_limit_satoshis": {
"deprecated": true
},
"max_htlc_value_in_flight_msat": {
"deprecated": true
},
"our_channel_reserve_satoshis": {
"deprecated": true
},
"their_channel_reserve_satoshis": {
"deprecated": true
},
"spendable_msatoshi": {
"deprecated": true
},
"receivable_msatoshi": {
"deprecated": true
},
"htlc_minimum_msat": {
"deprecated": true
},
"state_changes": {
"type": "array",
"description": "Prior state changes",
"items": {
"type": "object",
"additionalProperties": false,
"required": [ "timestamp", "old_state", "new_state", "cause", "message" ],
"properties": {
"timestamp": {
"type": "string",
"description": "UTC timestamp of form YYYY-mm-ddTHH:MM:SS.%03dZ"
},
"old_state": {
"type": "string",
"enum": [ "OPENINGD", "CHANNELD_AWAITING_LOCKIN", "CHANNELD_NORMAL", "CHANNELD_SHUTTING_DOWN", "CLOSINGD_SIGEXCHANGE", "CLOSINGD_COMPLETE", "AWAITING_UNILATERAL", "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN" ],
"description": "Previous state"
},
"new_state": {
"type": "string",
"enum": [ "OPENINGD", "CHANNELD_AWAITING_LOCKIN", "CHANNELD_NORMAL", "CHANNELD_SHUTTING_DOWN", "CLOSINGD_SIGEXCHANGE", "CLOSINGD_COMPLETE", "AWAITING_UNILATERAL", "FUNDING_SPEND_SEEN", "ONCHAIN", "DUALOPEND_OPEN_INIT", "DUALOPEND_AWAITING_LOCKIN" ],
"description": "New state"
},
"cause": {
"type": "string",
"enum": [ "unknown", "local", "user", "remote", "protocol", "onchain" ],
"description": "What caused the change"
},
"message": {
"type": "string",
"description": "Human-readable explanation"
}
}
}
},
"status": {
"type": "array",
"items": {
"type": "string",
"description": "Billboard log of significant changes"
}
},
"in_payments_offered": {
"type": "u64",
"description": "Number of incoming payment attempts"
},
"in_offered_msat": {
"type": "msat",
"description": "Total amount of incoming payment attempts"
},
"in_msatoshi_offered": {
"deprecated": true
},
"in_payments_fulfilled": {
"type": "u64",
"description": "Number of successful incoming payment attempts"
},
"in_fulfilled_msat": {
"type": "msat",
"description": "Total amount of successful incoming payment attempts"
},
"in_msatoshi_fulfilled": {
"deprecated": true
},
"out_payments_offered": {
"type": "u64",
"description": "Number of outgoing payment attempts"
},
"out_offered_msat": {
"type": "msat",
"description": "Total amount of outgoing payment attempts"
},
"out_msatoshi_offered": {
"deprecated": true
},
"out_payments_fulfilled": {
"type": "u64",
"description": "Number of successful outgoing payment attempts"
},
"out_fulfilled_msat": {
"type": "msat",
"description": "Total amount of successful outgoing payment attempts"
},
"out_msatoshi_fulfilled": {
"deprecated": true
},
"htlcs": {
"type": "array",
"description": "current HTLCs in this channel",
"items": {
"type": "object",
"additionalProperties": true,
"required": [ "direction", "id", "amount_msat", "expiry", "payment_hash", "state" ],
"properties": {
"direction": {
"type": "string",
"enum": [ "in", "out" ],
"description": "Whether it came from peer, or is going to peer"
},
"id": {
"type": "u64",
"description": "Unique ID for this htlc on this channel in this direction"
},
"amount_msat": {
"type": "msat",
"description": "Amount send/received for this HTLC"
},
"msatoshi": {
"deprecated": true
},
"expiry": {
"type": "u32",
"description": "Block this HTLC expires at"
},
"payment_hash": {
"type": "hex",
"description": "the hash of the payment_preimage which will prove payment",
"maxLength": 64,
"minLength": 64
},
"local_trimmed": {
"type": "boolean",
"enum": [ true ],
"description": "if this is too small to enforce onchain"
},
"status": {
"type": "string",
"description": "set if this HTLC is currently waiting on a hook (and shows what plugin)"
}
},
"allOf": [
{
"if": {
"properties": {
"direction": {
"enum": [ "out" ]
}
}
},
"then": {
"additionalProperties": false,
"required": [ "state" ],
"properties": {
"direction": { },
"id": { },
"amount_msat": { },
"msatoshi": { },
"expiry": { },
"payment_hash": { },
"local_trimmed": { },
"status": { },
"state": {
"type": "string",
"enum": [ "SENT_ADD_HTLC", "SENT_ADD_COMMIT", "RCVD_ADD_REVOCATION", "RCVD_ADD_ACK_COMMIT", "SENT_ADD_ACK_REVOCATION", "RCVD_REMOVE_HTLC", "RCVD_REMOVE_COMMIT", "SENT_REMOVE_REVOCATION", "SENT_REMOVE_ACK_COMMIT", "RCVD_REMOVE_ACK_REVOCATION" ],
"description": "Status of the HTLC"
}
}
}
},
{
"if": {
"properties": {
"direction": {
"enum": [ "in" ]
}
}
},
"then": {
"additionalProperties": false,
"required": [ "state" ],
"properties": {
"direction": { },
"id": { },
"amount_msat": { },
"msatoshi": { },
"expiry": { },
"payment_hash": { },
"local_trimmed": { },
"status": { },
"state": {
"type": "string",
"enum": [ "RCVD_ADD_HTLC", "RCVD_ADD_COMMIT", "SENT_ADD_REVOCATION", "SENT_ADD_ACK_COMMIT", "RCVD_ADD_ACK_REVOCATION", "SENT_REMOVE_HTLC", "SENT_REMOVE_COMMIT", "RCVD_REMOVE_REVOCATION", "RCVD_REMOVE_ACK_COMMIT", "SENT_REMOVE_ACK_REVOCATION" ],
"description": "Status of the HTLC"
}
}
}
}
]
}
}
},
"allOf": [
{
"if": {
"required": [ "close_to" ]
},
"then": {
"additionalProperties": false,
"required": [ ],
"properties": {
"state": { },
"scratch_txid": { },
"feerate": { },
"owner": { },
"short_channel_id": { },
"channel_id": { },
"funding_txid": { },
"close_to": { },
"private": { },
"opener": { },
"closer": { },
"features": { },
"funding": { },
"funding_allocation_msat": { },
"funding_msat": { },
"to_us_msat": { },
"min_to_us_msat": { },
"max_to_us_msat": { },
"total_msat": { },
"fee_base_msat": { },
"fee_proportional_millionths": { },
"dust_limit_msat": { },
"max_total_htlc_in_msat": { },
"their_reserve_msat": { },
"our_reserve_msat": { },
"spendable_msat": { },
"receivable_msat": { },
"minimum_htlc_in_msat": { },
"spendable_msatoshi": { },
"receivable_msatoshi": { },
"their_to_self_delay": { },
"our_to_self_delay": { },
"max_accepted_htlcs": { },
"msatoshi_to_us": { },
"msatoshi_to_us_min": { },
"msatoshi_to_us_max": { },
"msatoshi_total": { },
"dust_limit_satoshis": { },
"max_htlc_value_in_flight_msat": { },
"our_channel_reserve_satoshis": { },
"their_channel_reserve_satoshis": { },
"spendable_satoshis": { },
"receivable_satoshis": { },
"htlc_minimum_msat": { },
"state_changes": { },
"status": { },
"in_payments_offered": { },
"in_offered_msat": { },
"in_msatoshi_offered": { },
"in_payments_fulfilled": { },
"in_fulfilled_msat": { },
"in_msatoshi_fulfilled": { },
"out_payments_offered": { },
"out_offered_msat": { },
"out_msatoshi_offered": { },
"out_payments_fulfilled": { },
"out_fulfilled_msat": { },
"out_msatoshi_fulfilled": { },
"htlcs": { },
"initial_feerate": { },
"last_feerate": { },
"next_feerate": { },
"inflight": { },
"last_tx_fee": { },
"last_tx_fee_msat": { },
"direction": { },
"close_to_addr": {
"type": "string",
"description": "The bitcoin address we will close to"
}
}
}
},
{
"if": {
"required": [ "scratch_txid" ]
},
"then": {
"additionalProperties": false,
"required": [ "last_tx_fee_msat" ],
"properties": {
"state": { },
"scratch_txid": { },
"feerate": { },
"owner": { },
"short_channel_id": { },
"channel_id": { },
"funding_txid": { },
"inflight": { },
"close_to": { },
"private": { },
"opener": { },
"closer": { },
"features": { },
"funding": { },
"funding_allocation_msat": { },
"funding_msat": { },
"to_us_msat": { },
"min_to_us_msat": { },
"max_to_us_msat": { },
"total_msat": { },
"fee_base_msat": { },
"fee_proportional_millionths": { },
"dust_limit_msat": { },
"max_total_htlc_in_msat": { },
"their_reserve_msat": { },
"our_reserve_msat": { },
"spendable_msat": { },
"receivable_msat": { },
"minimum_htlc_in_msat": { },
"spendable_msatoshi": { },
"receivable_msatoshi": { },
"their_to_self_delay": { },
"our_to_self_delay": { },
"max_accepted_htlcs": { },
"msatoshi_to_us": { },
"msatoshi_to_us_min": { },
"msatoshi_to_us_max": { },
"msatoshi_total": { },
"dust_limit_satoshis": { },
"max_htlc_value_in_flight_msat": { },
"our_channel_reserve_satoshis": { },
"their_channel_reserve_satoshis": { },
"spendable_satoshis": { },
"receivable_satoshis": { },
"htlc_minimum_msat": { },
"state_changes": { },
"status": { },
"in_payments_offered": { },
"in_offered_msat": { },
"in_msatoshi_offered": { },
"in_payments_fulfilled": { },
"in_fulfilled_msat": { },
"in_msatoshi_fulfilled": { },
"out_payments_offered": { },
"out_offered_msat": { },
"out_msatoshi_offered": { },
"out_payments_fulfilled": { },
"out_fulfilled_msat": { },
"out_msatoshi_fulfilled": { },
"htlcs": { },
"initial_feerate": { },
"last_feerate": { },
"next_feerate": { },
"close_to_addr": { },
"initial_feerate": { },
"last_feerate": { },
"next_feerate": { },
"direction": { },
"last_tx_fee": {
"deprecated": true
},
"last_tx_fee_msat": {
"type": "msat",
"description": "fee attached to this the current tx"
}
}
}
},
{
"if": {
"required": [ "short_channel_id" ]
},
"then": {
"additionalProperties": false,
"required": [ "direction" ],
"properties": {
"state": { },
"scratch_txid": { },
"feerate": { },
"owner": { },
"short_channel_id": { },
"channel_id": { },
"funding_txid": { },
"inflight": { },
"close_to": { },
"private": { },
"opener": { },
"closer": { },
"features": { },
"funding": { },
"funding_allocation_msat": { },
"funding_msat": { },
"to_us_msat": { },
"min_to_us_msat": { },
"max_to_us_msat": { },
"total_msat": { },
"fee_base_msat": { },
"fee_proportional_millionths": { },
"dust_limit_msat": { },
"max_total_htlc_in_msat": { },
"their_reserve_msat": { },
"our_reserve_msat": { },
"spendable_msat": { },
"receivable_msat": { },
"minimum_htlc_in_msat": { },
"spendable_msatoshi": { },
"receivable_msatoshi": { },
"their_to_self_delay": { },
"our_to_self_delay": { },
"max_accepted_htlcs": { },
"msatoshi_to_us": { },
"msatoshi_to_us_min": { },
"msatoshi_to_us_max": { },
"msatoshi_total": { },
"dust_limit_satoshis": { },
"max_htlc_value_in_flight_msat": { },
"our_channel_reserve_satoshis": { },
"their_channel_reserve_satoshis": { },
"spendable_satoshis": { },
"receivable_satoshis": { },
"htlc_minimum_msat": { },
"state_changes": { },
"status": { },
"in_payments_offered": { },
"in_offered_msat": { },
"in_msatoshi_offered": { },
"in_payments_fulfilled": { },
"in_fulfilled_msat": { },
"in_msatoshi_fulfilled": { },
"out_payments_offered": { },
"out_offered_msat": { },
"out_msatoshi_offered": { },
"out_payments_fulfilled": { },
"out_fulfilled_msat": { },
"out_msatoshi_fulfilled": { },
"htlcs": { },
"initial_feerate": { },
"last_feerate": { },
"next_feerate": { },
"last_tx_fee": { },
"close_to_addr": { },
"initial_feerate": { },
"last_feerate": { },
"next_feerate": { },
"last_tx_fee": { },
"last_tx_fee_msat": { },
"direction": {
"type": "u32",
"description": "0 if we're the lesser node_id, 1 if we're the greater"
}
}
}
},
{
"if": {
"required": [ "inflight" ]
},
"then": {
"additionalProperties": false,
"required": [ "initial_feerate", "last_feerate", "next_feerate" ],
"properties": {
"state": { },
"scratch_txid": { },
"feerate": { },
"owner": { },
"short_channel_id": { },
"channel_id": { },
"funding_txid": { },
"close_to": { },
"private": { },
"opener": { },
"closer": { },
"features": { },
"funding": { },
"funding_allocation_msat": { },
"funding_msat": { },
"to_us_msat": { },
"min_to_us_msat": { },
"max_to_us_msat": { },
"total_msat": { },
"fee_base_msat": { },
"fee_proportional_millionths": { },
"dust_limit_msat": { },
"max_total_htlc_in_msat": { },
"their_reserve_msat": { },
"our_reserve_msat": { },
"spendable_msat": { },
"receivable_msat": { },
"minimum_htlc_in_msat": { },
"spendable_msatoshi": { },
"receivable_msatoshi": { },
"their_to_self_delay": { },
"our_to_self_delay": { },
"max_accepted_htlcs": { },
"msatoshi_to_us": { },
"msatoshi_to_us_min": { },
"msatoshi_to_us_max": { },
"msatoshi_total": { },
"dust_limit_satoshis": { },
"max_htlc_value_in_flight_msat": { },
"our_channel_reserve_satoshis": { },
"their_channel_reserve_satoshis": { },
"spendable_satoshis": { },
"receivable_satoshis": { },
"htlc_minimum_msat": { },
"state_changes": { },
"status": { },
"in_payments_offered": { },
"in_offered_msat": { },
"in_msatoshi_offered": { },
"in_payments_fulfilled": { },
"in_fulfilled_msat": { },
"in_msatoshi_fulfilled": { },
"out_payments_offered": { },
"out_offered_msat": { },
"out_msatoshi_offered": { },
"out_payments_fulfilled": { },
"out_fulfilled_msat": { },
"out_msatoshi_fulfilled": { },
"htlcs": { },
"inflight": { },
"last_tx_fee": { },
"close_to_addr": { },
"direction": { },
"last_tx_fee": { },
"last_tx_fee_msat": { },
"initial_feerate": {
"type": "string",
"description": "The feerate for the initial funding transaction in per-1000-weight, with \"kpw\" appended"
},
"last_feerate": {
"type": "string",
"description": "The feerate for the latest funding transaction in per-1000-weight, with \"kpw\" appended"
},
"next_feerate": {
"type": "string",
"description": "The minimum feerate for the next funding transaction in per-1000-weight, with \"kpw\" appended"
}
}
}
}
]
}
}
},
"allOf": [
{
"if": {
"additionalProperties": true,
"properties": {
"connected": {
"enum": [ true ]
}
}
},
"then": {
"additionalProperties": false,
"required": [ "netaddr", "features" ],
"properties": {
"id": { },
"channels": { },
"connected": { },
"htlcs": { },
"log": { },
"last_tx_fee": { },
"netaddr": {
"type": "array",
"minItems": 1,
"maxItems": 1,
"description": "A single entry array",
"items": {
"type": "string",
"description": "address, e.g. 1.2.3.4:1234"
}
},
"features": {
"type": "hex",
"description": "bitmap of BOLT #9 features from peer's INIT message" }
}
}
}
]
}
}
}
}