@@ -67,16 +67,16 @@ const uint8_t channel_open_block[] = {
6767 0x02 , 0x00 , 0x00 , 0x00 , 0x00 , 0x01 , 0x01 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
6868 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
6969 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
70- 0x01 , 0x40 , 0x9c , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x22 , 0x00 , 0x20 , 0xc5 , 0x1c , 0xad , 0x5e ,
71- 0x51 , 0x11 , 0xb0 , 0x11 , 0xa1 , 0x14 , 0xf4 , 0xda , 0x02 , 0x3d , 0xbc , 0xc1 , 0x44 , 0x3c , 0x67 , 0x31 ,
72- 0xec , 0x6f , 0x10 , 0x2f , 0x89 , 0xc1 , 0x05 , 0x80 , 0xfe , 0xfc , 0xd6 , 0xc7 , 0x01 , 0x00 , 0x00 , 0x00 ,
70+ 0x01 , 0x40 , 0x9c , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x22 , 0x00 , 0x20 , 0x6e , 0x78 , 0xd3 , 0x6c ,
71+ 0x07 , 0x22 , 0x76 , 0x2d , 0x7c , 0x24 , 0xa0 , 0x43 , 0xbb , 0xbb , 0x96 , 0xfe , 0x5b , 0x15 , 0x1b , 0x30 ,
72+ 0x9c , 0x3f , 0xfe , 0xc9 , 0x09 , 0x61 , 0xee , 0xa0 , 0x52 , 0x4f , 0x9d , 0xc3 , 0x01 , 0x00 , 0x00 , 0x00 ,
7373 0x00 , 0x00
7474};
7575
7676// The first transaction in the block is header (80 bytes) + transaction count (1 byte) into the block data.
7777const uint8_t channel_open_txid[] = {
78- 0x7a , 0x14 , 0x8f , 0xb4 , 0x08 , 0x49 , 0x9b , 0x51 , 0x2e , 0xff , 0xf9 , 0x46 , 0x73 , 0xca , 0xc6 , 0x48 ,
79- 0xfd , 0x95 , 0x0e , 0x72 , 0xd4 , 0xd3 , 0xdb , 0x79 , 0xc9 , 0x20 , 0xed , 0x83 , 0xb2 , 0xde , 0xed , 0x41 ,
78+ 0x1d , 0x5d , 0x36 , 0x00 , 0x47 , 0xa7 , 0x11 , 0x5d , 0x40 , 0xf9 , 0x57 , 0x7a , 0xd0 , 0x8d , 0x9d , 0x9c ,
79+ 0x06 , 0xb7 , 0x36 , 0xdf , 0x87 , 0x37 , 0xc6 , 0x57 , 0x9d , 0xfa , 0xc1 , 0xad , 0xbe , 0x38 , 0x29 , 0x35 ,
8080};
8181
8282// Two blocks built on top of channel_open_block:
@@ -119,6 +119,19 @@ const LDKFeeEstimator fee_est {
119119 .free = NULL ,
120120};
121121
122+ uint64_t get_zero_penalty (const void *this_arg, const struct LDKCandidateRouteHop *candidate, struct LDKChannelUsage usage, const struct LDKProbabilisticScoringFeeParameters *score_params) {
123+ LDK::ChannelUsage cpp_usage (std::move (usage)); // Make sure we free usage
124+ return 0 ;
125+ }
126+ const LDKScoreLookUp zero_score_lookup {
127+ .this_arg = NULL ,
128+ .channel_penalty_msat = get_zero_penalty,
129+ .free = NULL ,
130+ };
131+ struct LDKScoreLookUp fetch_zero_scorer (const void *this_arg) {
132+ return zero_score_lookup;
133+ }
134+
122135static std::atomic_int num_txs_broadcasted (0 );
123136void broadcast_txn (const void *this_arg, LDKCVec_TransactionZ txn) {
124137 num_txs_broadcasted += 1 ;
@@ -603,6 +616,13 @@ int main() {
603616 .free = NULL ,
604617 };
605618
619+ LDKMessageRouter panic_msg_router = {
620+ .this_arg = NULL ,
621+ .create_blinded_paths = NULL , // Segfault if we ever try to find a route
622+ .create_compact_blinded_paths = NULL , // Segfault if we ever try to find a route
623+ .free = NULL ,
624+ };
625+
606626 LDK::NetworkGraph net_graph2 = NetworkGraph_new (network, logger2);
607627 LDK::P2PGossipSync graph_msg_handler2 = P2PGossipSync_new (&net_graph2, COption_UtxoLookupZ_none (), logger2);
608628
@@ -618,14 +638,22 @@ int main() {
618638 LDK::EntropySource entropy_source1 = KeysManager_as_EntropySource (&keys1);
619639 LDK::SignerProvider signer_provider1 = KeysManager_as_SignerProvider (&keys1);
620640
621- LDK::ChannelManager cm1 = ChannelManager_new (fee_est, mon1, broadcast, panic_router, logger1, KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), KeysManager_as_SignerProvider (&keys1), UserConfig_default (), ChainParameters_new (network, BestBlock_new (chain_tip, 0 )), 1689638400 );
641+ LDKLockableScore zero_scorer = {
642+ .this_arg = NULL ,
643+ .read_lock = fetch_zero_scorer,
644+ .write_lock = NULL , // This scorer should never be updated
645+ .free = NULL ,
646+ };
647+ LDK::DefaultRouter default_router_1 = DefaultRouter_new (&net_graph1, logger1, KeysManager_as_EntropySource (&keys1), zero_scorer, ProbabilisticScoringFeeParameters_default ());
648+
649+ LDK::ChannelManager cm1 = ChannelManager_new (fee_est, mon1, broadcast, DefaultRouter_as_Router (&default_router_1), panic_msg_router, logger1, KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), KeysManager_as_SignerProvider (&keys1), UserConfig_default (), ChainParameters_new (network, BestBlock_new (chain_tip, 0 )), 1689638400 );
622650
623651 LDK::IgnoringMessageHandler ignoring_handler1 = IgnoringMessageHandler_new ();
624652 LDK::CustomMessageHandler custom_msg_handler1 = IgnoringMessageHandler_as_CustomMessageHandler (&ignoring_handler1);
625653 LDK::CustomOnionMessageHandler custom_onion_msg_handler1 = IgnoringMessageHandler_as_CustomOnionMessageHandler (&ignoring_handler1);
626654 LDK::AsyncPaymentsMessageHandler async_msg_handler1 = IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignoring_handler1);
627655 LDK::DefaultMessageRouter mr1 = DefaultMessageRouter_new (&net_graph1, KeysManager_as_EntropySource (&keys1));
628- LDK::OnionMessenger om1 = OnionMessenger_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), logger1, ChannelManager_as_NodeIdLookUp (&cm1), DefaultMessageRouter_as_MessageRouter (&mr1), IgnoringMessageHandler_as_OffersMessageHandler (&ignoring_handler1), std::move (async_msg_handler1), std::move (custom_onion_msg_handler1));
656+ LDK::OnionMessenger om1 = OnionMessenger_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), logger1, ChannelManager_as_NodeIdLookUp (&cm1), DefaultMessageRouter_as_MessageRouter (&mr1), IgnoringMessageHandler_as_OffersMessageHandler (&ignoring_handler1), std::move (async_msg_handler1), ChannelManager_as_DNSResolverMessageHandler (&cm1), std::move (custom_onion_msg_handler1));
629657
630658 LDK::CVec_ChannelDetailsZ channels = ChannelManager_list_channels (&cm1);
631659 assert (channels->datalen == 0 );
@@ -655,21 +683,21 @@ int main() {
655683 LDK::UserConfig config2 = UserConfig_default ();
656684 UserConfig_set_channel_handshake_config (&config2, std::move (handshake_config2));
657685
658- LDK::ChannelManager cm2 = ChannelManager_new (fee_est, mon2, broadcast, panic_router, logger2, KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), KeysManager_as_SignerProvider (&keys2), std::move (config2), ChainParameters_new (network, BestBlock_new (chain_tip, 0 )), 1689638400 );
686+ LDK::ChannelManager cm2 = ChannelManager_new (fee_est, mon2, broadcast, panic_router, panic_msg_router, logger2, KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), KeysManager_as_SignerProvider (&keys2), std::move (config2), ChainParameters_new (network, BestBlock_new (chain_tip, 0 )), 1689638400 );
659687
660688 LDK::IgnoringMessageHandler ignoring_handler2 = IgnoringMessageHandler_new ();
661689 LDK::CustomMessageHandler custom_msg_handler2 = IgnoringMessageHandler_as_CustomMessageHandler (&ignoring_handler2);
662690 LDK::CustomOnionMessageHandler custom_onion_msg_handler2 = IgnoringMessageHandler_as_CustomOnionMessageHandler (&ignoring_handler2);
663691 LDK::DefaultMessageRouter mr2 = DefaultMessageRouter_new (&net_graph2, KeysManager_as_EntropySource (&keys2));
664- LDK::OnionMessenger om2 = OnionMessenger_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), logger2, ChannelManager_as_NodeIdLookUp (&cm2), DefaultMessageRouter_as_MessageRouter (&mr2), IgnoringMessageHandler_as_OffersMessageHandler (&ignoring_handler2), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignoring_handler2), std::move (custom_onion_msg_handler2));
692+ LDK::OnionMessenger om2 = OnionMessenger_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), logger2, ChannelManager_as_NodeIdLookUp (&cm2), DefaultMessageRouter_as_MessageRouter (&mr2), IgnoringMessageHandler_as_OffersMessageHandler (&ignoring_handler2), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignoring_handler2), ChannelManager_as_DNSResolverMessageHandler (&cm2), std::move (custom_onion_msg_handler2));
665693
666694 LDK::CVec_ChannelDetailsZ channels2 = ChannelManager_list_channels (&cm2);
667695 assert (channels2->datalen == 0 );
668696
669697 LDK::RoutingMessageHandler net_msgs2 = P2PGossipSync_as_RoutingMessageHandler (&graph_msg_handler2);
670698 LDK::CResult_ChannelAnnouncementDecodeErrorZ chan_ann = ChannelAnnouncement_read (LDKu8slice { .data = valid_node_announcement, .datalen = sizeof (valid_node_announcement) });
671699 assert (chan_ann->result_ok );
672- LDK::CResult_boolLightningErrorZ ann_res = net_msgs2->handle_channel_announcement (net_msgs2->this_arg , chan_ann->contents .result );
700+ LDK::CResult_boolLightningErrorZ ann_res = net_msgs2->handle_channel_announcement (net_msgs2->this_arg , ChannelManager_get_our_node_id (&cm1), chan_ann->contents .result );
673701 assert (ann_res->result_ok );
674702
675703 LDK::MessageHandler msg_handler2 = MessageHandler_new (ChannelManager_as_ChannelMessageHandler (&cm2), std::move (net_msgs2), OnionMessenger_as_OnionMessageHandler (&om1), std::move (custom_msg_handler2));
@@ -863,8 +891,7 @@ int main() {
863891 .some = 5000 ,
864892 };
865893 LDK::CResult_Bolt11InvoiceSignOrCreationErrorZ invoice = create_invoice_from_channelmanager (&cm2,
866- KeysManager_as_NodeSigner (&keys2), logger2,
867- LDKCurrency_Bitcoin, min_value,
894+ min_value,
868895 LDKStr {
869896 .chars = (const uint8_t *)" Invoice Description" ,
870897 .len = strlen (" Invoice Description" ),
@@ -887,24 +914,12 @@ int main() {
887914 PaymentParameters_new (std::move (payee), COption_u64Z_none (), 0xffffffff , 1 , 20 , 2 ,
888915 LDKCVec_u64Z { .data = NULL , .datalen = 0 }, LDKCVec_u64Z { .data = NULL , .datalen = 0 }),
889916 5000 );
890- random_bytes = entropy_source1.get_secure_random_bytes ();
891- LDK::ProbabilisticScoringFeeParameters params = ProbabilisticScoringFeeParameters_default ();
892-
893- LDK::CResult_RouteLightningErrorZ route_res = find_route (ChannelManager_get_our_node_id (&cm1), &route_params, &net_graph2, &outbound_channels, logger1, &chan_scorer, ¶ms, &random_bytes.data );
894-
895- assert (route_res->result_ok );
896- LDK::CVec_PathZ paths = Route_get_paths (route_res->contents .result );
897- assert (paths->datalen == 1 );
898- LDK::CVec_RouteHopZ hops = Path_get_hops (&paths->data [0 ]);
899- assert (hops->datalen == 1 );
900- assert (!memcmp (RouteHop_get_pubkey (&hops->data [0 ]).compressed_form ,
901- ChannelManager_get_our_node_id (&cm2).compressed_form , 33 ));
902- assert (RouteHop_get_short_channel_id (&hops->data [0 ]) == channel_scid);
917+
903918 LDKThirtyTwoBytes payment_secret;
904919 memcpy (payment_secret.data , Bolt11Invoice_payment_secret (invoice->contents .result ), 32 );
905- LDK::Route route ( Route_clone (route_res-> contents . result ));
906- LDK::CResult_NonePaymentSendFailureZ send_res = ChannelManager_send_payment_with_route (&cm1 ,
907- std::move (route ), payment_hash, RecipientOnionFields_secret_only (payment_secret), payment_hash );
920+ LDK::CResult_NoneRetryableSendFailureZ send_res = ChannelManager_send_payment (&cm1,
921+ payment_hash, RecipientOnionFields_secret_only (payment_secret), payment_hash ,
922+ std::move (route_params ), Retry_attempts ( 0 ) );
908923 assert (send_res->result_ok );
909924 }
910925
@@ -1009,8 +1024,9 @@ int main() {
10091024 .find_route_with_id = custom_find_route,
10101025 .free = NULL ,
10111026 };
1027+ LDK::DefaultMessageRouter mr1 = DefaultMessageRouter_new (&net_graph1, KeysManager_as_EntropySource (&keys1));
10121028
1013- LDK::ChannelManagerReadArgs cm1_args = ChannelManagerReadArgs_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), KeysManager_as_SignerProvider (&keys1), fee_est, mon1, broadcast, router1, logger1, UserConfig_default (), std::move (mons_list1));
1029+ LDK::ChannelManagerReadArgs cm1_args = ChannelManagerReadArgs_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), KeysManager_as_SignerProvider (&keys1), fee_est, mon1, broadcast, router1, DefaultMessageRouter_as_MessageRouter (&mr1), logger1, UserConfig_default (), std::move (mons_list1));
10141030 LDK::CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ cm1_read =
10151031 C2Tuple_ThirtyTwoBytesChannelManagerZ_read (LDKu8slice { .data = cm1_ser->data , .datalen = cm1_ser -> datalen}, std::move (cm1_args));
10161032 assert (cm1_read->result_ok );
@@ -1023,9 +1039,8 @@ int main() {
10231039 .release_pending_custom_messages = release_no_messages,
10241040 .free = NULL ,
10251041 };
1026- LDK::DefaultMessageRouter mr1 = DefaultMessageRouter_new (&net_graph1, KeysManager_as_EntropySource (&keys1));
10271042 LDK::IgnoringMessageHandler ignorer_1 = IgnoringMessageHandler_new ();
1028- LDK::OnionMessenger om1 = OnionMessenger_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), logger1, ChannelManager_as_NodeIdLookUp (&cm1), DefaultMessageRouter_as_MessageRouter (&mr1), IgnoringMessageHandler_as_OffersMessageHandler (&ignorer_1), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignorer_1), std::move (custom_onion_msg_handler1));
1043+ LDK::OnionMessenger om1 = OnionMessenger_new (KeysManager_as_EntropySource (&keys1), KeysManager_as_NodeSigner (&keys1), logger1, ChannelManager_as_NodeIdLookUp (&cm1), DefaultMessageRouter_as_MessageRouter (&mr1), IgnoringMessageHandler_as_OffersMessageHandler (&ignorer_1), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignorer_1), ChannelManager_as_DNSResolverMessageHandler (&cm1), std::move (custom_onion_msg_handler1));
10291044
10301045 LDK::CVec_ChannelMonitorZ mons_list2 = LDKCVec_ChannelMonitorZ { .data = (LDKChannelMonitor*)malloc (sizeof (LDKChannelMonitor)), .datalen = 1 };
10311046 assert (mons2.mons .size () == 1 );
@@ -1036,13 +1051,24 @@ int main() {
10361051 LDK::NodeSigner node_signer2 = KeysManager_as_NodeSigner (&keys2);
10371052 LDK::EntropySource entropy_source2 = KeysManager_as_EntropySource (&keys2);
10381053 LDK::SignerProvider signer_provider2 = KeysManager_as_SignerProvider (&keys2);
1054+ LDK::DefaultMessageRouter mr2 = DefaultMessageRouter_new (&net_graph2, KeysManager_as_EntropySource (&keys2));
10391055
1040- LDK::ChannelManagerReadArgs cm2_args = ChannelManagerReadArgs_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), KeysManager_as_SignerProvider (&keys2), fee_est, mon2, broadcast, panic_router, logger2, UserConfig_default (), std::move (mons_list2));
1056+ LDK::ChannelManagerReadArgs cm2_args = ChannelManagerReadArgs_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), KeysManager_as_SignerProvider (&keys2), fee_est, mon2, broadcast, panic_router, DefaultMessageRouter_as_MessageRouter (&mr2), logger2, UserConfig_default (), std::move (mons_list2));
10411057 LDK::CResult_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ cm2_read =
10421058 C2Tuple_ThirtyTwoBytesChannelManagerZ_read (LDKu8slice { .data = cm2_ser->data , .datalen = cm2_ser -> datalen}, std::move (cm2_args));
10431059 assert (cm2_read->result_ok );
10441060 LDK::ChannelManager cm2 (std::move (cm2_read->contents .result ->b ));
10451061
1062+ // On startup, we'll get a PaymentClaimed replay
1063+ {
1064+ EventQueue queue2;
1065+ LDKEventHandler handler2 = { .this_arg = &queue2, .handle_event = handle_event, .free = NULL };
1066+ LDK::EventsProvider ev2 = ChannelManager_as_EventsProvider (&cm2);
1067+ ev2.process_pending_events (handler2);
1068+ assert (queue2.events .size () == 1 );
1069+ assert (queue2.events [0 ]->tag == LDKEvent_PaymentClaimed);
1070+ }
1071+
10461072 CustomOnionMsgQueue peer_2_custom_onion_messages;
10471073 LDKCustomOnionMessageHandler custom_onion_msg_handler2 = {
10481074 .this_arg = &peer_2_custom_onion_messages,
@@ -1051,9 +1077,8 @@ int main() {
10511077 .release_pending_custom_messages = release_no_messages,
10521078 .free = NULL ,
10531079 };
1054- LDK::DefaultMessageRouter mr2 = DefaultMessageRouter_new (&net_graph2, KeysManager_as_EntropySource (&keys2));
10551080 LDK::IgnoringMessageHandler ignorer_2 = IgnoringMessageHandler_new ();
1056- LDK::OnionMessenger om2 = OnionMessenger_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), logger2, ChannelManager_as_NodeIdLookUp (&cm2), DefaultMessageRouter_as_MessageRouter (&mr2), IgnoringMessageHandler_as_OffersMessageHandler (&ignorer_2), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignorer_2), custom_onion_msg_handler2);
1081+ LDK::OnionMessenger om2 = OnionMessenger_new (KeysManager_as_EntropySource (&keys2), KeysManager_as_NodeSigner (&keys2), logger2, ChannelManager_as_NodeIdLookUp (&cm2), DefaultMessageRouter_as_MessageRouter (&mr2), IgnoringMessageHandler_as_OffersMessageHandler (&ignorer_2), IgnoringMessageHandler_as_AsyncPaymentsMessageHandler (&ignorer_2), ChannelManager_as_DNSResolverMessageHandler (&cm2), custom_onion_msg_handler2);
10571082
10581083 // Attempt to close the channel...
10591084 LDKThirtyTwoBytes chan_id_bytes;
@@ -1118,8 +1143,7 @@ int main() {
11181143
11191144 // Send another payment, this time via the retires path
11201145 LDK::CResult_Bolt11InvoiceSignOrCreationErrorZ invoice_res2 = create_invoice_from_channelmanager (&cm2,
1121- KeysManager_as_NodeSigner (&keys2), logger1,
1122- LDKCurrency_Bitcoin, COption_u64Z_some (10000 ),
1146+ COption_u64Z_some (10000 ),
11231147 LDKStr {
11241148 .chars = (const uint8_t *)" Invoice 2 Description" ,
11251149 .len = strlen (" Invoice 2 Description" ),
0 commit comments