Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Expose node-invariant features via NodeStatus by enigbe · Pull Request #810 · lightningdevkit/ldk-node · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
296 changes: 296 additions & 0 deletions src/ffi/types.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -44,6 +44,7 @@ pub use lightning_liquidity::lsps0::ser::LSPSDateTime;
pub use lightning_liquidity::lsps1::msgs::{
LSPS1ChannelInfo, LSPS1OrderId, LSPS1OrderParams, LSPS1PaymentState,
};
use lightning_types::features::NodeFeatures as LdkNodeFeatures;
pub use lightning_types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
pub use lightning_types::string::UntrustedString;
use vss_client::headers::{
Expand DownExpand Up@@ -1519,6 +1520,301 @@ pub enum ClosureReason {
},
}

#[derive(Debug, Clone, PartialEq, Eq, uniffi::Object)]
#[uniffi::export(Debug, Eq)]
pub struct NodeFeatures {
pub(crate) inner: LdkNodeFeatures,
}

impl NodeFeatures {
/// Constructs node features from big-endian BOLT 9 encoded bytes.
#[uniffi::constructor]
pub fn from_bytes(bytes: &[u8]) -> Self {
Self { inner: LdkNodeFeatures::from_be_bytes(bytes.to_vec()) }
}

/// Returns the BOLT 9 big-endian encoded representation of these features.
pub fn to_bytes(&self) -> Vec<u8> {
self.inner.encode()
}

/// Whether this node's `node_announcement` advertises support for `option_data_loss_protect`.
pub fn supports_data_loss_protect(&self) -> bool {
self.inner.supports_data_loss_protect()
}

/// Whether this node's `node_announcement` requires `option_data_loss_protect`.
pub fn requires_data_loss_protect(&self) -> bool {
self.inner.requires_data_loss_protect()
}

/// Whether this node's `node_announcement` advertises support for `option_upfront_shutdown_script`.
pub fn supports_upfront_shutdown_script(&self) -> bool {
self.inner.supports_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` requires `option_upfront_shutdown_script`.
pub fn requires_upfront_shutdown_script(&self) -> bool {
self.inner.requires_upfront_shutdown_script()
}

/// Whether this node's `node_announcement` advertises support for `gossip_queries`.
pub fn supports_gossip_queries(&self) -> bool {
self.inner.supports_gossip_queries()
}

/// Whether this node's `node_announcement` requires `gossip_queries`.
pub fn requires_gossip_queries(&self) -> bool {
self.inner.requires_gossip_queries()
}

/// Whether this node's `node_announcement` advertises support for `var_onion_optin`.
pub fn supports_variable_length_onion(&self) -> bool {
self.inner.supports_variable_length_onion()
}

/// Whether this node's `node_announcement` requires `var_onion_optin`.
pub fn requires_variable_length_onion(&self) -> bool {
self.inner.requires_variable_length_onion()
}

/// Whether this node's `node_announcement` advertises support for `option_static_remotekey`.
pub fn supports_static_remote_key(&self) -> bool {
self.inner.supports_static_remote_key()
}

/// Whether this node's `node_announcement` requires `option_static_remotekey`.
pub fn requires_static_remote_key(&self) -> bool {
self.inner.requires_static_remote_key()
}

/// Whether this node's `node_announcement` advertises support for `payment_secret`.
pub fn supports_payment_secret(&self) -> bool {
self.inner.supports_payment_secret()
}

/// Whether this node's `node_announcement` requires `payment_secret`.
pub fn requires_payment_secret(&self) -> bool {
self.inner.requires_payment_secret()
}

/// Whether this node's `node_announcement` advertises support for `basic_mpp`.
pub fn supports_basic_mpp(&self) -> bool {
self.inner.supports_basic_mpp()
}

/// Whether this node's `node_announcement` requires `basic_mpp`.
pub fn requires_basic_mpp(&self) -> bool {
self.inner.requires_basic_mpp()
}

/// Whether this node's `node_announcement` advertises support for `option_support_large_channel`.
pub fn supports_wumbo(&self) -> bool {
self.inner.supports_wumbo()
}

/// Whether this node's `node_announcement` requires `option_support_large_channel`.
pub fn requires_wumbo(&self) -> bool {
self.inner.requires_wumbo()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_nonzero_fee_htlc_tx`.
pub fn supports_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_nonzero_fee_htlc_tx`.
pub fn requires_anchors_nonzero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_nonzero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_anchors_zero_fee_htlc_tx`.
pub fn supports_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.supports_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` requires `option_anchors_zero_fee_htlc_tx`.
pub fn requires_anchors_zero_fee_htlc_tx(&self) -> bool {
self.inner.requires_anchors_zero_fee_htlc_tx()
}

/// Whether this node's `node_announcement` advertises support for `option_route_blinding`.
pub fn supports_route_blinding(&self) -> bool {
self.inner.supports_route_blinding()
}

/// Whether this node's `node_announcement` requires `option_route_blinding`.
pub fn requires_route_blinding(&self) -> bool {
self.inner.requires_route_blinding()
}

/// Whether this node's `node_announcement` advertises support for `opt_shutdown_anysegwit`.
pub fn supports_shutdown_anysegwit(&self) -> bool {
self.inner.supports_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` requires `opt_shutdown_anysegwit`.
pub fn requires_shutdown_anysegwit(&self) -> bool {
self.inner.requires_shutdown_anysegwit()
}

/// Whether this node's `node_announcement` advertises support for `option_dual_fund`.
pub fn supports_dual_fund(&self) -> bool {
self.inner.supports_dual_fund()
}

/// Whether this node's `node_announcement` requires `option_dual_fund`.
pub fn requires_dual_fund(&self) -> bool {
self.inner.requires_dual_fund()
}

/// Whether this node's `node_announcement` advertises support for `option_taproot`.
pub fn supports_taproot(&self) -> bool {
self.inner.supports_taproot()
}

/// Whether this node's `node_announcement` requires `option_taproot`.
pub fn requires_taproot(&self) -> bool {
self.inner.requires_taproot()
}

/// Whether this node's `node_announcement` advertises support for `option_quiesce`.
pub fn supports_quiescence(&self) -> bool {
self.inner.supports_quiescence()
}

/// Whether this node's `node_announcement` requires `option_quiesce`.
pub fn requires_quiescence(&self) -> bool {
self.inner.requires_quiescence()
}

/// Whether this node's `node_announcement` advertises support for `option_onion_messages`.
pub fn supports_onion_messages(&self) -> bool {
self.inner.supports_onion_messages()
}

/// Whether this node's `node_announcement` requires `option_onion_messages`.
pub fn requires_onion_messages(&self) -> bool {
self.inner.requires_onion_messages()
}

/// Whether this node's `node_announcement` advertises support for `option_provide_storage`.
pub fn supports_provide_storage(&self) -> bool {
self.inner.supports_provide_storage()
}

/// Whether this node's `node_announcement` requires `option_provide_storage`.
pub fn requires_provide_storage(&self) -> bool {
self.inner.requires_provide_storage()
}

/// Whether this node's `node_announcement` advertises support for `option_channel_type`.
pub fn supports_channel_type(&self) -> bool {
self.inner.supports_channel_type()
}

/// Whether this node's `node_announcement` requires `option_channel_type`.
pub fn requires_channel_type(&self) -> bool {
self.inner.requires_channel_type()
}

/// Whether this node's `node_announcement` advertises support for `option_scid_alias`.
pub fn supports_scid_privacy(&self) -> bool {
self.inner.supports_scid_privacy()
}

/// Whether this node's `node_announcement` requires `option_scid_alias`.
pub fn requires_scid_privacy(&self) -> bool {
self.inner.requires_scid_privacy()
}

/// Whether this node's `node_announcement` advertises support for `option_zeroconf`.
pub fn supports_zero_conf(&self) -> bool {
self.inner.supports_zero_conf()
}

/// Whether this node's `node_announcement` requires `option_zeroconf`.
pub fn requires_zero_conf(&self) -> bool {
self.inner.requires_zero_conf()
}

/// Whether this node's `node_announcement` advertises support for `keysend`.
pub fn supports_keysend(&self) -> bool {
self.inner.supports_keysend()
}

/// Whether this node's `node_announcement` requires `keysend`.
pub fn requires_keysend(&self) -> bool {
self.inner.requires_keysend()
}

/// Whether this node's `node_announcement` advertises support for `option_trampoline`.
pub fn supports_trampoline_routing(&self) -> bool {
self.inner.supports_trampoline_routing()
}

/// Whether this node's `node_announcement` requires `option_trampoline`.
pub fn requires_trampoline_routing(&self) -> bool {
self.inner.requires_trampoline_routing()
}

/// Whether this node's `node_announcement` advertises support for `option_simple_close`.
pub fn supports_simple_close(&self) -> bool {
self.inner.supports_simple_close()
}

/// Whether this node's `node_announcement` requires `option_simple_close`.
pub fn requires_simple_close(&self) -> bool {
self.inner.requires_simple_close()
}

/// Whether this node's `node_announcement` advertises support for `option_splice`.
pub fn supports_splicing(&self) -> bool {
self.inner.supports_splicing()
}

/// Whether this node's `node_announcement` requires `option_splice`.
pub fn requires_splicing(&self) -> bool {
self.inner.requires_splicing()
}

/// Whether this node's `node_announcement` advertises support for `option_zero_fee_commitments`.
pub fn supports_anchor_zero_fee_commitments(&self) -> bool {
self.inner.supports_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` requires `option_zero_fee_commitments`.
pub fn requires_anchor_zero_fee_commitments(&self) -> bool {
self.inner.requires_anchor_zero_fee_commitments()
}

/// Whether this node's `node_announcement` advertises support for HTLC hold.
pub fn supports_htlc_hold(&self) -> bool {
self.inner.supports_htlc_hold()
}

/// Whether this node's `node_announcement` requires HTLC hold.
pub fn requires_htlc_hold(&self) -> bool {
self.inner.requires_htlc_hold()
}

/// Whether this node's `node_announcement` advertises support for DNS resolution.
pub fn supports_dns_resolution(&self) -> bool {
self.inner.supports_dns_resolution()
}

/// Whether this node's `node_announcement` requires DNS resolution.
pub fn requires_dns_resolution(&self) -> bool {
self.inner.requires_dns_resolution()
}
}

impl From<LdkNodeFeatures> for NodeFeatures {
fn from(features: LdkNodeFeatures) -> Self {
Self { inner: features }
}
}

#[cfg(test)]
mod tests {
use std::num::NonZeroU64;
Expand Down
Loading
Loading