diff --git a/.msggen.json b/.msggen.json index 15381b47e..e91e8fbc1 100644 --- a/.msggen.json +++ b/.msggen.json @@ -736,9 +736,14 @@ "FetchInvoice.invoice": 1, "FetchInvoice.next_period": 3 }, + "FundchannelChannel_type": { + "FundChannel.channel_type.bits[]": 1, + "FundChannel.channel_type.names[]": 2 + }, "FundchannelRequest": { "FundChannel.amount": 1, "FundChannel.announce": 3, + "FundChannel.channel_type[]": 14, "FundChannel.close_to": 6, "FundChannel.compact_lease": 8, "FundChannel.feerate": 2, @@ -753,6 +758,7 @@ }, "FundchannelResponse": { "FundChannel.channel_id": 4, + "FundChannel.channel_type": 7, "FundChannel.close_to": 5, "FundChannel.mindepth": 6, "FundChannel.outnum": 3, @@ -3026,6 +3032,22 @@ "added": "pre-v0.10.1", "deprecated": false }, + "FundChannel.channel_type": { + "added": "v24.02", + "deprecated": false + }, + "FundChannel.channel_type.bits[]": { + "added": "v24.02", + "deprecated": false + }, + "FundChannel.channel_type.names[]": { + "added": "v24.02", + "deprecated": false + }, + "FundChannel.channel_type[]": { + "added": "v24.02", + "deprecated": false + }, "FundChannel.close_to": { "added": "pre-v0.10.1", "deprecated": false diff --git a/cln-grpc/proto/primitives.proto b/cln-grpc/proto/primitives.proto index 64a6cc9a3..fa913dec1 100644 --- a/cln-grpc/proto/primitives.proto +++ b/cln-grpc/proto/primitives.proto @@ -103,6 +103,15 @@ message TlvEntry { uint64 type = 1; bytes value = 2; } + message TlvStream { repeated TlvEntry entries = 1; } + +enum ChannelTypeName { + static_remotekey_even = 0; + anchor_outputs_even = 1; + anchors_zero_fee_htlc_tx_even = 2; + scid_alias_even = 3; + zeroconf_even = 4; +} diff --git a/cln-rpc/src/primitives.rs b/cln-rpc/src/primitives.rs index 659f623f5..52b34af31 100644 --- a/cln-rpc/src/primitives.rs +++ b/cln-rpc/src/primitives.rs @@ -54,6 +54,21 @@ pub enum HtlcState { SENT_REMOVE_ACK_REVOCATION = 19, } +#[derive(Copy, Clone, Serialize, Deserialize, Debug)] +#[allow(non_camel_case_types)] +pub enum ChannelTypeName { + #[serde(rename = "static_remotekey/even")] + STATIC_REMOTEKEY_EVEN = 0, + #[serde(rename = "anchor_outputs/even")] + ANCHOR_OUTPUTS_EVEN = 1, + #[serde(rename = "anchors_zero_fee_htlc_tx/even")] + ANCHORS_ZERO_FEE_HTLC_TX_EVEN = 2, + #[serde(rename = "scid_alias/even")] + SCID_ALIAS_EVEN = 3, + #[serde(rename = "zeroconf/even")] + ZEROCONF_EVEN = 4, +} + #[derive(Copy, Clone, Serialize, Deserialize, Debug)] #[allow(non_camel_case_types)] #[serde(rename_all = "lowercase")] @@ -318,6 +333,31 @@ impl TryFrom for ChannelState { } } +impl From for ChannelTypeName { + fn from(value: i32) -> Self { + match value { + 0 => ChannelTypeName::STATIC_REMOTEKEY_EVEN, + 1 => ChannelTypeName::ANCHOR_OUTPUTS_EVEN, + 2 => ChannelTypeName::ANCHORS_ZERO_FEE_HTLC_TX_EVEN, + 3 => ChannelTypeName::SCID_ALIAS_EVEN, + 4 => ChannelTypeName::ZEROCONF_EVEN, + o => panic!("Unmapped ChannelTypeName {}", o), + } + } +} + +impl From for i32 { + fn from(value: ChannelTypeName) -> Self { + match value { + ChannelTypeName::STATIC_REMOTEKEY_EVEN => 0, + ChannelTypeName::ANCHOR_OUTPUTS_EVEN => 1, + ChannelTypeName::ANCHORS_ZERO_FEE_HTLC_TX_EVEN => 2, + ChannelTypeName::SCID_ALIAS_EVEN => 3, + ChannelTypeName::ZEROCONF_EVEN => 4, + } + } +} + impl From for HtlcState { fn from(value: i32) -> Self { match value { @@ -470,13 +510,13 @@ impl TryFrom<&str> for Amount { impl From for String { fn from(a: Amount) -> String { - // Best effort msat to sat conversion, for methods that accept - // sats but not msats - if a.msat % 1000 == 0 { - format!("{}sat", a.msat / 1000) - } else { + // Best effort msat to sat conversion, for methods that accept + // sats but not msats + if a.msat % 1000 == 0 { + format!("{}sat", a.msat / 1000) + } else { format!("{}msat", a.msat) - } + } } } @@ -553,6 +593,8 @@ impl Serialize for Feerate { #[cfg(test)] mod test { + use crate::model::responses::FundchannelResponse; + use super::*; #[test] @@ -564,11 +606,7 @@ mod test { let tests = vec![ ("{\"amount\": \"10msat\"}", Amount { msat: 10 }, "10msat"), - ( - "{\"amount\": \"42sat\"}", - Amount { msat: 42_000 }, - "42sat", - ), + ("{\"amount\": \"42sat\"}", Amount { msat: 42_000 }, "42sat"), ( "{\"amount\": \"31337btc\"}", Amount { @@ -669,6 +707,31 @@ mod test { let res = serde_json::to_string(&stream).unwrap(); assert_eq!(res, "{\"31337\":\"0102030405\",\"42\":\"\"}"); } + + #[test] + fn test_fundchannel() { + let r = serde_json::json!({ + "tx": "0000000000000000000000000000000000000000000000000000000000000000", + "txid": "0000000000000000000000000000000000000000000000000000000000000000", + "outnum": 0, + "channel_id": "0000000000000000000000000000000000000000000000000000000000000000", + "channel_type": { + "bits": [1, 3, 5], + "names": [ + "static_remotekey/even", + "anchor_outputs/even", + "anchors_zero_fee_htlc_tx/even", + "scid_alias/even", + "zeroconf/even" + ] + }, + "close_to": "bc1qd23gerv2mn0qdecrmulsjsmkv8lz6t6m0770tg", + "mindepth": 1, + }); + + let p: FundchannelResponse = serde_json::from_value(r).unwrap(); + assert_eq!(p.channel_type.unwrap().bits, Some(vec![1,3,5])); + } } #[derive(Clone, Debug, PartialEq)] diff --git a/contrib/msggen/msggen/patch.py b/contrib/msggen/msggen/patch.py index e1c66c17a..823e290e6 100644 --- a/contrib/msggen/msggen/patch.py +++ b/contrib/msggen/msggen/patch.py @@ -182,6 +182,7 @@ class OverridePatch(Patch): 'ListPeers.peers[].channels[].htlcs[].state': "HtlcState", 'ListPeerChannels.channels[].htlcs[].state': "HtlcState", 'ListHtlcs.htlcs[].state': "HtlcState", + 'FundChannel.channel_type.names[]': 'ChannelTypeName', } def visit(self, f: model.Field) -> None: diff --git a/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py b/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py index c1f8caeaa..c0ce0d478 100644 --- a/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py +++ b/contrib/pyln-grpc-proto/pyln/grpc/primitives_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10primitives.proto\x12\x03\x63ln\"\x16\n\x06\x41mount\x12\x0c\n\x04msat\x18\x01 \x01(\x04\"D\n\x0b\x41mountOrAll\x12\x1d\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x12\r\n\x03\x61ll\x18\x02 \x01(\x08H\x00\x42\x07\n\x05value\"D\n\x0b\x41mountOrAny\x12\x1d\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x12\r\n\x03\x61ny\x18\x02 \x01(\x08H\x00\x42\x07\n\x05value\"\x19\n\x17\x43hannelStateChangeCause\"(\n\x08Outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"h\n\x07\x46\x65\x65rate\x12\x0e\n\x04slow\x18\x01 \x01(\x08H\x00\x12\x10\n\x06normal\x18\x02 \x01(\x08H\x00\x12\x10\n\x06urgent\x18\x03 \x01(\x08H\x00\x12\x0f\n\x05perkb\x18\x04 \x01(\rH\x00\x12\x0f\n\x05perkw\x18\x05 \x01(\rH\x00\x42\x07\n\x05style\":\n\nOutputDesc\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\"t\n\x08RouteHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x1c\n\x07\x66\x65\x65\x62\x61se\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0f\n\x07\x66\x65\x65prop\x18\x04 \x01(\r\x12\x13\n\x0b\x65xpirydelta\x18\x05 \x01(\r\"(\n\tRoutehint\x12\x1b\n\x04hops\x18\x01 \x03(\x0b\x32\r.cln.RouteHop\".\n\rRoutehintList\x12\x1d\n\x05hints\x18\x02 \x03(\x0b\x32\x0e.cln.Routehint\"\'\n\x08TlvEntry\x12\x0c\n\x04type\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\"+\n\tTlvStream\x12\x1e\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\r.cln.TlvEntry*$\n\x0b\x43hannelSide\x12\t\n\x05LOCAL\x10\x00\x12\n\n\x06REMOTE\x10\x01*\xa0\x02\n\x0c\x43hannelState\x12\x0c\n\x08Openingd\x10\x00\x12\x1a\n\x16\x43hanneldAwaitingLockin\x10\x01\x12\x12\n\x0e\x43hanneldNormal\x10\x02\x12\x18\n\x14\x43hanneldShuttingDown\x10\x03\x12\x17\n\x13\x43losingdSigexchange\x10\x04\x12\x14\n\x10\x43losingdComplete\x10\x05\x12\x16\n\x12\x41waitingUnilateral\x10\x06\x12\x14\n\x10\x46undingSpendSeen\x10\x07\x12\x0b\n\x07Onchain\x10\x08\x12\x15\n\x11\x44ualopendOpenInit\x10\t\x12\x1b\n\x17\x44ualopendAwaitingLockin\x10\n\x12\x1a\n\x16\x43hanneldAwaitingSplice\x10\x0b*\xd5\x03\n\tHtlcState\x12\x0f\n\x0bSentAddHtlc\x10\x00\x12\x11\n\rSentAddCommit\x10\x01\x12\x15\n\x11RcvdAddRevocation\x10\x02\x12\x14\n\x10RcvdAddAckCommit\x10\x03\x12\x18\n\x14SentAddAckRevocation\x10\x04\x12\x18\n\x14RcvdAddAckRevocation\x10\x05\x12\x12\n\x0eRcvdRemoveHtlc\x10\x06\x12\x14\n\x10RcvdRemoveCommit\x10\x07\x12\x18\n\x14SentRemoveRevocation\x10\x08\x12\x17\n\x13SentRemoveAckCommit\x10\t\x12\x1b\n\x17RcvdRemoveAckRevocation\x10\n\x12\x0f\n\x0bRcvdAddHtlc\x10\x0b\x12\x11\n\rRcvdAddCommit\x10\x0c\x12\x15\n\x11SentAddRevocation\x10\r\x12\x14\n\x10SentAddAckCommit\x10\x0e\x12\x12\n\x0eSentRemoveHtlc\x10\x0f\x12\x14\n\x10SentRemoveCommit\x10\x10\x12\x18\n\x14RcvdRemoveRevocation\x10\x11\x12\x17\n\x13RcvdRemoveAckCommit\x10\x12\x12\x1b\n\x17SentRemoveAckRevocation\x10\x13\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10primitives.proto\x12\x03\x63ln\"\x16\n\x06\x41mount\x12\x0c\n\x04msat\x18\x01 \x01(\x04\"D\n\x0b\x41mountOrAll\x12\x1d\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x12\r\n\x03\x61ll\x18\x02 \x01(\x08H\x00\x42\x07\n\x05value\"D\n\x0b\x41mountOrAny\x12\x1d\n\x06\x61mount\x18\x01 \x01(\x0b\x32\x0b.cln.AmountH\x00\x12\r\n\x03\x61ny\x18\x02 \x01(\x08H\x00\x42\x07\n\x05value\"\x19\n\x17\x43hannelStateChangeCause\"(\n\x08Outpoint\x12\x0c\n\x04txid\x18\x01 \x01(\x0c\x12\x0e\n\x06outnum\x18\x02 \x01(\r\"h\n\x07\x46\x65\x65rate\x12\x0e\n\x04slow\x18\x01 \x01(\x08H\x00\x12\x10\n\x06normal\x18\x02 \x01(\x08H\x00\x12\x10\n\x06urgent\x18\x03 \x01(\x08H\x00\x12\x0f\n\x05perkb\x18\x04 \x01(\rH\x00\x12\x0f\n\x05perkw\x18\x05 \x01(\rH\x00\x42\x07\n\x05style\":\n\nOutputDesc\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x1b\n\x06\x61mount\x18\x02 \x01(\x0b\x32\x0b.cln.Amount\"t\n\x08RouteHop\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\x18\n\x10short_channel_id\x18\x02 \x01(\t\x12\x1c\n\x07\x66\x65\x65\x62\x61se\x18\x03 \x01(\x0b\x32\x0b.cln.Amount\x12\x0f\n\x07\x66\x65\x65prop\x18\x04 \x01(\r\x12\x13\n\x0b\x65xpirydelta\x18\x05 \x01(\r\"(\n\tRoutehint\x12\x1b\n\x04hops\x18\x01 \x03(\x0b\x32\r.cln.RouteHop\".\n\rRoutehintList\x12\x1d\n\x05hints\x18\x02 \x03(\x0b\x32\x0e.cln.Routehint\"\'\n\x08TlvEntry\x12\x0c\n\x04type\x18\x01 \x01(\x04\x12\r\n\x05value\x18\x02 \x01(\x0c\"+\n\tTlvStream\x12\x1e\n\x07\x65ntries\x18\x01 \x03(\x0b\x32\r.cln.TlvEntry*$\n\x0b\x43hannelSide\x12\t\n\x05LOCAL\x10\x00\x12\n\n\x06REMOTE\x10\x01*\xa0\x02\n\x0c\x43hannelState\x12\x0c\n\x08Openingd\x10\x00\x12\x1a\n\x16\x43hanneldAwaitingLockin\x10\x01\x12\x12\n\x0e\x43hanneldNormal\x10\x02\x12\x18\n\x14\x43hanneldShuttingDown\x10\x03\x12\x17\n\x13\x43losingdSigexchange\x10\x04\x12\x14\n\x10\x43losingdComplete\x10\x05\x12\x16\n\x12\x41waitingUnilateral\x10\x06\x12\x14\n\x10\x46undingSpendSeen\x10\x07\x12\x0b\n\x07Onchain\x10\x08\x12\x15\n\x11\x44ualopendOpenInit\x10\t\x12\x1b\n\x17\x44ualopendAwaitingLockin\x10\n\x12\x1a\n\x16\x43hanneldAwaitingSplice\x10\x0b*\xd5\x03\n\tHtlcState\x12\x0f\n\x0bSentAddHtlc\x10\x00\x12\x11\n\rSentAddCommit\x10\x01\x12\x15\n\x11RcvdAddRevocation\x10\x02\x12\x14\n\x10RcvdAddAckCommit\x10\x03\x12\x18\n\x14SentAddAckRevocation\x10\x04\x12\x18\n\x14RcvdAddAckRevocation\x10\x05\x12\x12\n\x0eRcvdRemoveHtlc\x10\x06\x12\x14\n\x10RcvdRemoveCommit\x10\x07\x12\x18\n\x14SentRemoveRevocation\x10\x08\x12\x17\n\x13SentRemoveAckCommit\x10\t\x12\x1b\n\x17RcvdRemoveAckRevocation\x10\n\x12\x0f\n\x0bRcvdAddHtlc\x10\x0b\x12\x11\n\rRcvdAddCommit\x10\x0c\x12\x15\n\x11SentAddRevocation\x10\r\x12\x14\n\x10SentAddAckCommit\x10\x0e\x12\x12\n\x0eSentRemoveHtlc\x10\x0f\x12\x14\n\x10SentRemoveCommit\x10\x10\x12\x18\n\x14RcvdRemoveRevocation\x10\x11\x12\x17\n\x13RcvdRemoveAckCommit\x10\x12\x12\x1b\n\x17SentRemoveAckRevocation\x10\x13*\x90\x01\n\x0f\x43hannelTypeName\x12\x19\n\x15static_remotekey_even\x10\x00\x12\x17\n\x13\x61nchor_outputs_even\x10\x01\x12!\n\x1d\x61nchors_zero_fee_htlc_tx_even\x10\x02\x12\x13\n\x0fscid_alias_even\x10\x03\x12\x11\n\rzeroconf_even\x10\x04\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -26,6 +26,8 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_CHANNELSTATE']._serialized_end=1045 _globals['_HTLCSTATE']._serialized_start=1048 _globals['_HTLCSTATE']._serialized_end=1517 + _globals['_CHANNELTYPENAME']._serialized_start=1520 + _globals['_CHANNELTYPENAME']._serialized_end=1664 _globals['_AMOUNT']._serialized_start=25 _globals['_AMOUNT']._serialized_end=47 _globals['_AMOUNTORALL']._serialized_start=49