7
7
8
8
use crate :: chain:: ChainSource ;
9
9
use 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 ,
13
13
} ;
14
14
15
15
use crate :: connection:: ConnectionManager ;
@@ -242,6 +242,7 @@ pub struct NodeBuilder {
242
242
liquidity_source_config : Option < LiquiditySourceConfig > ,
243
243
log_writer_config : Option < LogWriterConfig > ,
244
244
runtime_handle : Option < tokio:: runtime:: Handle > ,
245
+ async_payments_role : Option < AsyncPaymentsRole > ,
245
246
}
246
247
247
248
impl NodeBuilder {
@@ -267,6 +268,7 @@ impl NodeBuilder {
267
268
liquidity_source_config,
268
269
log_writer_config,
269
270
runtime_handle,
271
+ async_payments_role : None ,
270
272
}
271
273
}
272
274
@@ -545,6 +547,12 @@ impl NodeBuilder {
545
547
Ok ( self )
546
548
}
547
549
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
+
548
556
/// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
549
557
/// previously configured.
550
558
pub fn build ( & self ) -> Result < Node , BuildError > {
@@ -705,6 +713,7 @@ impl NodeBuilder {
705
713
runtime,
706
714
logger,
707
715
Arc :: new ( vss_store) ,
716
+ self . async_payments_role ,
708
717
)
709
718
}
710
719
@@ -737,6 +746,7 @@ impl NodeBuilder {
737
746
runtime,
738
747
logger,
739
748
kv_store,
749
+ self . async_payments_role ,
740
750
)
741
751
}
742
752
}
@@ -990,6 +1000,11 @@ impl ArcedNodeBuilder {
990
1000
self . inner . write ( ) . unwrap ( ) . set_node_alias ( node_alias) . map ( |_| ( ) )
991
1001
}
992
1002
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
+
993
1008
/// Builds a [`Node`] instance with a [`SqliteStore`] backend and according to the options
994
1009
/// previously configured.
995
1010
pub fn build ( & self ) -> Result < Arc < Node > , BuildError > {
@@ -1085,6 +1100,7 @@ fn build_with_store_internal(
1085
1100
gossip_source_config : Option < & GossipSourceConfig > ,
1086
1101
liquidity_source_config : Option < & LiquiditySourceConfig > , seed_bytes : [ u8 ; 64 ] ,
1087
1102
runtime : Arc < Runtime > , logger : Arc < Logger > , kv_store : Arc < DynStore > ,
1103
+ async_payments_role : Option < AsyncPaymentsRole > ,
1088
1104
) -> Result < Node , BuildError > {
1089
1105
optionally_install_rustls_cryptoprovider ( ) ;
1090
1106
@@ -1379,8 +1395,14 @@ fn build_with_store_internal(
1379
1395
100 ;
1380
1396
}
1381
1397
1382
- if config. async_payment_services_enabled {
1383
- 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
+ }
1384
1406
}
1385
1407
1386
1408
let message_router =
@@ -1453,31 +1475,32 @@ fn build_with_store_internal(
1453
1475
}
1454
1476
1455
1477
// Initialize the PeerManager
1456
- let onion_messenger: Arc < OnionMessenger > = if config. async_payment_services_enabled {
1457
- Arc :: new ( OnionMessenger :: new_with_offline_peer_interception (
1458
- Arc :: clone ( & keys_manager) ,
1459
- Arc :: clone ( & keys_manager) ,
1460
- Arc :: clone ( & logger) ,
1461
- Arc :: clone ( & channel_manager) ,
1462
- message_router,
1463
- Arc :: clone ( & channel_manager) ,
1464
- Arc :: clone ( & channel_manager) ,
1465
- IgnoringMessageHandler { } ,
1466
- IgnoringMessageHandler { } ,
1467
- ) )
1468
- } else {
1469
- Arc :: new ( OnionMessenger :: new (
1470
- Arc :: clone ( & keys_manager) ,
1471
- Arc :: clone ( & keys_manager) ,
1472
- Arc :: clone ( & logger) ,
1473
- Arc :: clone ( & channel_manager) ,
1474
- message_router,
1475
- Arc :: clone ( & channel_manager) ,
1476
- Arc :: clone ( & channel_manager) ,
1477
- IgnoringMessageHandler { } ,
1478
- IgnoringMessageHandler { } ,
1479
- ) )
1480
- } ;
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
+ } ;
1481
1504
let ephemeral_bytes: [ u8 ; 32 ] = keys_manager. get_secure_random_bytes ( ) ;
1482
1505
1483
1506
// Initialize the GossipSource
@@ -1664,7 +1687,7 @@ fn build_with_store_internal(
1664
1687
} ,
1665
1688
} ;
1666
1689
1667
- let om_mailbox = if config . async_payment_services_enabled {
1690
+ let om_mailbox = if let Some ( AsyncPaymentsRole :: Server ) = async_payments_role {
1668
1691
Some ( Arc :: new ( OnionMessageMailbox :: new ( ) ) )
1669
1692
} else {
1670
1693
None
@@ -1703,6 +1726,7 @@ fn build_with_store_internal(
1703
1726
is_listening,
1704
1727
node_metrics,
1705
1728
om_mailbox,
1729
+ async_payments_role,
1706
1730
} )
1707
1731
}
1708
1732
0 commit comments