Skip to content

Commit ee6e268

Browse files
committed
Add HRN resolver to Node and UnifiedPayment
Introduce the hrn_resolver dependency into the main Node struct and plumb it through to the UnifiedPayment component. This is necessary to allow the node to resolve offers presented via a Human-Readable Name (HRN).
1 parent 5a3eb67 commit ee6e268

File tree

4 files changed

+45
-18
lines changed

4 files changed

+45
-18
lines changed

src/builder.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use bdk_wallet::{KeychainKind, Wallet as BdkWallet};
1818
use bitcoin::bip32::{ChildNumber, Xpriv};
1919
use bitcoin::secp256k1::PublicKey;
2020
use bitcoin::{BlockHash, Network};
21+
use bitcoin_payment_instructions::onion_message_resolver::LDKOnionMessageDNSSECHrnResolver;
2122
use lightning::chain::{chainmonitor, BestBlock, Watch};
2223
use lightning::io::Cursor;
2324
use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArgs};
@@ -1479,6 +1480,8 @@ fn build_with_store_internal(
14791480
})?;
14801481
}
14811482

1483+
let hrn_resolver = Arc::new(LDKOnionMessageDNSSECHrnResolver::new(Arc::clone(&network_graph)));
1484+
14821485
// Initialize the PeerManager
14831486
let onion_messenger: Arc<OnionMessenger> =
14841487
if let Some(AsyncPaymentsRole::Server) = async_payments_role {
@@ -1490,7 +1493,7 @@ fn build_with_store_internal(
14901493
message_router,
14911494
Arc::clone(&channel_manager),
14921495
Arc::clone(&channel_manager),
1493-
IgnoringMessageHandler {},
1496+
Arc::clone(&hrn_resolver),
14941497
IgnoringMessageHandler {},
14951498
))
14961499
} else {
@@ -1502,7 +1505,7 @@ fn build_with_store_internal(
15021505
message_router,
15031506
Arc::clone(&channel_manager),
15041507
Arc::clone(&channel_manager),
1505-
IgnoringMessageHandler {},
1508+
Arc::clone(&hrn_resolver),
15061509
IgnoringMessageHandler {},
15071510
))
15081511
};
@@ -1634,6 +1637,12 @@ fn build_with_store_internal(
16341637
Arc::clone(&keys_manager),
16351638
));
16361639

1640+
let peer_manager_clone = Arc::clone(&peer_manager);
1641+
1642+
hrn_resolver.register_post_queue_action(Box::new(move || {
1643+
peer_manager_clone.process_events();
1644+
}));
1645+
16371646
liquidity_source.as_ref().map(|l| l.set_peer_manager(Arc::clone(&peer_manager)));
16381647

16391648
gossip_source.set_gossip_verifier(
@@ -1741,6 +1750,7 @@ fn build_with_store_internal(
17411750
node_metrics,
17421751
om_mailbox,
17431752
async_payments_role,
1753+
hrn_resolver,
17441754
})
17451755
}
17461756

src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ use peer_store::{PeerInfo, PeerStore};
158158
use rand::Rng;
159159
use runtime::Runtime;
160160
use types::{
161-
Broadcaster, BumpTransactionEventHandler, ChainMonitor, ChannelManager, Graph, KeysManager,
162-
OnionMessenger, PaymentStore, PeerManager, Router, Scorer, Sweeper, Wallet,
161+
Broadcaster, BumpTransactionEventHandler, ChainMonitor, ChannelManager, Graph, HRNResolver,
162+
KeysManager, OnionMessenger, PaymentStore, PeerManager, Router, Scorer, Sweeper, Wallet,
163163
};
164164
pub use types::{
165165
ChannelDetails, CustomTlvRecord, DynStore, PeerDetails, SyncAndAsyncKVStore, UserChannelId,
@@ -208,6 +208,7 @@ pub struct Node {
208208
node_metrics: Arc<RwLock<NodeMetrics>>,
209209
om_mailbox: Option<Arc<OnionMessageMailbox>>,
210210
async_payments_role: Option<AsyncPaymentsRole>,
211+
hrn_resolver: Arc<HRNResolver>,
211212
}
212213

213214
impl Node {
@@ -961,6 +962,7 @@ impl Node {
961962
self.bolt12_payment().into(),
962963
Arc::clone(&self.config),
963964
Arc::clone(&self.logger),
965+
Arc::clone(&self.hrn_resolver),
964966
)
965967
}
966968

@@ -981,6 +983,7 @@ impl Node {
981983
self.bolt12_payment(),
982984
Arc::clone(&self.config),
983985
Arc::clone(&self.logger),
986+
Arc::clone(&self.hrn_resolver),
984987
))
985988
}
986989

src/payment/unified.rs

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,33 @@
55
// http://opensource.org/licenses/MIT>, at your option. You may not use this file except in
66
// accordance with one or both of these licenses.
77

8-
//! Holds a payment handler allowing to create [BIP 21] URIs with an on-chain, [BOLT 11], and [BOLT 12] payment
8+
//! Holds a payment handler allowing to create [BIP 21] URIs with on-chain, [BOLT 11], and [BOLT 12] payment
99
//! options.
1010
//!
11+
//! Also allows to send payments using these URIs as well as [BIP 353] HRNs.
12+
//!
1113
//! [BIP 21]: https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
14+
//! [BIP 353]: https://github.com/bitcoin/bips/blob/master/bip-0353.mediawiki
1215
//! [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
1316
//! [BOLT 12]: https://github.com/lightning/bolts/blob/master/12-offer-encoding.md
17+
use crate::error::Error;
18+
use crate::ffi::maybe_wrap;
19+
use crate::logger::{log_error, LdkLogger, Logger};
20+
use crate::payment::{Bolt11Payment, Bolt12Payment, OnchainPayment};
21+
use crate::types::HRNResolver;
22+
use crate::Config;
1423
use std::sync::Arc;
1524
use std::vec::IntoIter;
1625

17-
use bip21::de::ParamKind;
18-
use bip21::{DeserializationError, DeserializeParams, Param, SerializeParams};
19-
use bitcoin::address::{NetworkChecked, NetworkUnchecked};
20-
use bitcoin::{Amount, Txid};
2126
use lightning::ln::channelmanager::PaymentId;
2227
use lightning::offers::offer::Offer;
2328
use lightning::routing::router::RouteParametersConfig;
2429
use lightning_invoice::{Bolt11Invoice, Bolt11InvoiceDescription, Description};
2530

26-
use crate::error::Error;
27-
use crate::ffi::maybe_wrap;
28-
use crate::logger::{log_error, LdkLogger, Logger};
29-
use crate::payment::{Bolt11Payment, Bolt12Payment, OnchainPayment};
30-
use crate::Config;
31+
use bip21::de::ParamKind;
32+
use bip21::{DeserializationError, DeserializeParams, Param, SerializeParams};
33+
use bitcoin::address::{NetworkChecked, NetworkUnchecked};
34+
use bitcoin::{Amount, Txid};
3135

3236
type Uri<'a> = bip21::Uri<'a, NetworkChecked, Extras>;
3337

@@ -40,26 +44,31 @@ struct Extras {
4044
/// A payment handler allowing to create [BIP 21] URIs with an on-chain, [BOLT 11], and [BOLT 12] payment
4145
/// option.
4246
///
43-
/// Should be retrieved by calling [`Node::unified_qr_payment`]
47+
/// Should be retrieved by calling [`Node::unified_payment`]
48+
///
49+
/// This handler allows you to send payments to these URIs as well as [BIP 353] HRNs.
4450
///
4551
/// [BIP 21]: https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki
52+
/// [BIP 353]: https://github.com/bitcoin/bips/blob/master/bip-0353.mediawiki
4653
/// [BOLT 11]: https://github.com/lightning/bolts/blob/master/11-payment-encoding.md
4754
/// [BOLT 12]: https://github.com/lightning/bolts/blob/master/12-offer-encoding.md
48-
/// [`Node::unified_qr_payment`]: crate::Node::unified_qr_payment
55+
/// [`Node::unified_payment`]: crate::Node::unified_payment
4956
pub struct UnifiedPayment {
5057
onchain_payment: Arc<OnchainPayment>,
5158
bolt11_invoice: Arc<Bolt11Payment>,
5259
bolt12_payment: Arc<Bolt12Payment>,
5360
config: Arc<Config>,
5461
logger: Arc<Logger>,
62+
hrn_resolver: Arc<HRNResolver>,
5563
}
5664

5765
impl UnifiedPayment {
5866
pub(crate) fn new(
5967
onchain_payment: Arc<OnchainPayment>, bolt11_invoice: Arc<Bolt11Payment>,
6068
bolt12_payment: Arc<Bolt12Payment>, config: Arc<Config>, logger: Arc<Logger>,
69+
hrn_resolver: Arc<HRNResolver>,
6170
) -> Self {
62-
Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger }
71+
Self { onchain_payment, bolt11_invoice, bolt12_payment, config, logger, hrn_resolver }
6372
}
6473

6574
/// Generates a URI with an on-chain address, [BOLT 11] invoice and [BOLT 12] offer.
@@ -148,6 +157,8 @@ impl UnifiedPayment {
148157
let uri: bip21::Uri<NetworkUnchecked, Extras> =
149158
uri_str.parse().map_err(|_| Error::InvalidUri)?;
150159

160+
let _resolver = &self.hrn_resolver;
161+
151162
let uri_network_checked =
152163
uri.clone().require_network(self.config.network).map_err(|_| Error::InvalidNetwork)?;
153164

src/types.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::sync::{Arc, Mutex};
1010

1111
use bitcoin::secp256k1::PublicKey;
1212
use bitcoin::OutPoint;
13+
use bitcoin_payment_instructions::onion_message_resolver::LDKOnionMessageDNSSECHrnResolver;
1314
use lightning::chain::chainmonitor;
1415
use lightning::impl_writeable_tlv_based;
1516
use lightning::ln::channel_state::ChannelDetails as LdkChannelDetails;
@@ -142,10 +143,12 @@ pub(crate) type OnionMessenger = lightning::onion_message::messenger::OnionMesse
142143
Arc<MessageRouter>,
143144
Arc<ChannelManager>,
144145
Arc<ChannelManager>,
145-
IgnoringMessageHandler,
146+
Arc<HRNResolver>,
146147
IgnoringMessageHandler,
147148
>;
148149

150+
pub(crate) type HRNResolver = LDKOnionMessageDNSSECHrnResolver<Arc<Graph>, Arc<Logger>>;
151+
149152
pub(crate) type MessageRouter = lightning::onion_message::messenger::DefaultMessageRouter<
150153
Arc<Graph>,
151154
Arc<Logger>,

0 commit comments

Comments
 (0)