77
88use crate :: chain:: ChainSource ;
99use crate :: config:: {
10- default_user_config, may_announce_channel, AnnounceError , BitcoindRestClientConfig , Config ,
11- ElectrumSyncConfig , EsploraSyncConfig , DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME ,
12- DEFAULT_LOG_LEVEL , WALLET_KEYS_SEED_LEN ,
10+ default_user_config, may_announce_channel, AnnounceError , AsyncPaymentsRole ,
11+ BitcoindRestClientConfig , Config , ElectrumSyncConfig , EsploraSyncConfig ,
12+ DEFAULT_ESPLORA_SERVER_URL , DEFAULT_LOG_FILENAME , DEFAULT_LOG_LEVEL , WALLET_KEYS_SEED_LEN ,
1313} ;
1414
1515use crate :: connection:: ConnectionManager ;
@@ -27,6 +27,7 @@ use crate::liquidity::{
2727} ;
2828use crate :: logger:: { log_error, LdkLogger , LogLevel , LogWriter , Logger } ;
2929use crate :: message_handler:: NodeCustomMessageHandler ;
30+ use crate :: payment:: asynchronous:: om_mailbox:: OnionMessageMailbox ;
3031use crate :: peer_store:: PeerStore ;
3132use crate :: runtime:: Runtime ;
3233use crate :: tx_broadcaster:: TransactionBroadcaster ;
@@ -241,6 +242,7 @@ pub struct NodeBuilder {
241242 liquidity_source_config : Option < LiquiditySourceConfig > ,
242243 log_writer_config : Option < LogWriterConfig > ,
243244 runtime_handle : Option < tokio:: runtime:: Handle > ,
245+ async_payments_role : Option < AsyncPaymentsRole > ,
244246}
245247
246248impl NodeBuilder {
@@ -266,6 +268,7 @@ impl NodeBuilder {
266268 liquidity_source_config,
267269 log_writer_config,
268270 runtime_handle,
271+ async_payments_role : None ,
269272 }
270273 }
271274
@@ -544,6 +547,12 @@ impl NodeBuilder {
544547 Ok ( self )
545548 }
546549
550+ /// Sets the role of the node in an asynchronous payments context.
551+ pub fn set_async_payments_role ( & mut self , role : Option < AsyncPaymentsRole > ) -> & mut Self {
552+ self . async_payments_role = role;
553+ self
554+ }
555+
547556 /// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
548557 /// previously configured.
549558 pub fn build ( & self ) -> Result < Node , BuildError > {
@@ -704,6 +713,7 @@ impl NodeBuilder {
704713 runtime,
705714 logger,
706715 Arc :: new ( vss_store) ,
716+ self . async_payments_role ,
707717 )
708718 }
709719
@@ -736,6 +746,7 @@ impl NodeBuilder {
736746 runtime,
737747 logger,
738748 kv_store,
749+ self . async_payments_role ,
739750 )
740751 }
741752}
@@ -989,6 +1000,11 @@ impl ArcedNodeBuilder {
9891000 self . inner . write ( ) . unwrap ( ) . set_node_alias ( node_alias) . map ( |_| ( ) )
9901001 }
9911002
1003+ /// Sets the role of the node in an asynchronous payments context.
1004+ pub fn set_async_payments_role ( & self , role : Option < AsyncPaymentsRole > ) {
1005+ _ = self . inner . write ( ) . unwrap ( ) . set_async_payments_role ( role)
1006+ }
1007+
9921008 /// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
9931009 /// previously configured.
9941010 pub fn build ( & self ) -> Result < Arc < Node > , BuildError > {
@@ -1084,6 +1100,7 @@ fn build_with_store_internal(
10841100 gossip_source_config : Option < & GossipSourceConfig > ,
10851101 liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
10861102 runtime : Arc < Runtime > , logger : Arc < Logger > , kv_store : Arc < DynStore > ,
1103+ async_payments_role : Option < AsyncPaymentsRole > ,
10871104) -> Result < Node , BuildError > {
10881105 optionally_install_rustls_cryptoprovider ( ) ;
10891106
@@ -1378,8 +1395,14 @@ fn build_with_store_internal(
13781395 100 ;
13791396 }
13801397
1381- if config. async_payment_services_enabled {
1382- user_config. accept_forwards_to_priv_channels = true ;
1398+ if let Some ( role) = async_payments_role {
1399+ match role {
1400+ AsyncPaymentsRole :: Server => {
1401+ user_config. accept_forwards_to_priv_channels = true ;
1402+ user_config. enable_htlc_hold = true ;
1403+ } ,
1404+ AsyncPaymentsRole :: Client => user_config. hold_outbound_htlcs_at_next_hop = true ,
1405+ }
13831406 }
13841407
13851408 let message_router =
@@ -1452,17 +1475,32 @@ fn build_with_store_internal(
14521475 }
14531476
14541477 // Initialize the PeerManager
1455- let onion_messenger: Arc < OnionMessenger > = Arc :: new ( OnionMessenger :: new (
1456- Arc :: clone ( & keys_manager) ,
1457- Arc :: clone ( & keys_manager) ,
1458- Arc :: clone ( & logger) ,
1459- Arc :: clone ( & channel_manager) ,
1460- message_router,
1461- Arc :: clone ( & channel_manager) ,
1462- Arc :: clone ( & channel_manager) ,
1463- IgnoringMessageHandler { } ,
1464- IgnoringMessageHandler { } ,
1465- ) ) ;
1478+ let onion_messenger: Arc < OnionMessenger > =
1479+ if let Some ( AsyncPaymentsRole :: Server ) = async_payments_role {
1480+ Arc :: new ( OnionMessenger :: new_with_offline_peer_interception (
1481+ Arc :: clone ( & keys_manager) ,
1482+ Arc :: clone ( & keys_manager) ,
1483+ Arc :: clone ( & logger) ,
1484+ Arc :: clone ( & channel_manager) ,
1485+ message_router,
1486+ Arc :: clone ( & channel_manager) ,
1487+ Arc :: clone ( & channel_manager) ,
1488+ IgnoringMessageHandler { } ,
1489+ IgnoringMessageHandler { } ,
1490+ ) )
1491+ } else {
1492+ Arc :: new ( OnionMessenger :: new (
1493+ Arc :: clone ( & keys_manager) ,
1494+ Arc :: clone ( & keys_manager) ,
1495+ Arc :: clone ( & logger) ,
1496+ Arc :: clone ( & channel_manager) ,
1497+ message_router,
1498+ Arc :: clone ( & channel_manager) ,
1499+ Arc :: clone ( & channel_manager) ,
1500+ IgnoringMessageHandler { } ,
1501+ IgnoringMessageHandler { } ,
1502+ ) )
1503+ } ;
14661504 let ephemeral_bytes: [ u8 ; 32 ] = keys_manager. get_secure_random_bytes ( ) ;
14671505
14681506 // Initialize the GossipSource
@@ -1649,6 +1687,12 @@ fn build_with_store_internal(
16491687 } ,
16501688 } ;
16511689
1690+ let om_mailbox = if let Some ( AsyncPaymentsRole :: Server ) = async_payments_role {
1691+ Some ( Arc :: new ( OnionMessageMailbox :: new ( ) ) )
1692+ } else {
1693+ None
1694+ } ;
1695+
16521696 let ( stop_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
16531697 let ( background_processor_stop_sender, _) = tokio:: sync:: watch:: channel ( ( ) ) ;
16541698 let is_running = Arc :: new ( RwLock :: new ( false ) ) ;
@@ -1681,6 +1725,8 @@ fn build_with_store_internal(
16811725 is_running,
16821726 is_listening,
16831727 node_metrics,
1728+ om_mailbox,
1729+ async_payments_role,
16841730 } )
16851731}
16861732
0 commit comments