- memset(&node_seed, 1, 32);
- LDK::KeysManager keys2 = KeysManager_new(&node_seed, network, 0, 0);
- LDK::KeysInterface keys_source2 = KeysManager_as_KeysInterface(&keys2);
- LDKSecretKey node_secret2 = keys_source2->get_node_secret(keys_source2->this_arg);
-
- LDK::ChannelHandshakeConfig handshake_config2 = ChannelHandshakeConfig_default();
- ChannelHandshakeConfig_set_minimum_depth(&handshake_config2, 2);
- LDK::UserConfig config2 = UserConfig_default();
- UserConfig_set_own_channel_config(&config2, handshake_config2);
-
- LDK::ChannelManager cm2 = ChannelManager_new(network, fee_est, mon2, broadcast, logger2, KeysManager_as_KeysInterface(&keys2), config2, 0);
- BlockNotifier_register_listener(&blocks2, ChannelManager_as_ChainListener(&cm2));
-
- LDK::CVec_ChannelDetailsZ channels2 = ChannelManager_list_channels(&cm2);
- assert(channels2->datalen == 0);
-
- LDK::NetGraphMsgHandler net_graph2 = NetGraphMsgHandler_new(ChainWatchInterfaceUtil_as_ChainWatchInterface(&chain2), logger2);
- LDK::RoutingMessageHandler net_msgs2 = NetGraphMsgHandler_as_RoutingMessageHandler(&net_graph2);
- LDK::ChannelAnnouncement chan_ann = ChannelAnnouncement_read(LDKu8slice { .data = valid_node_announcement, .datalen = sizeof(valid_node_announcement) });
- LDK::CResult_boolLightningErrorZ ann_res = net_msgs2->handle_channel_announcement(net_msgs2->this_arg, &chan_ann);
- assert(ann_res->result_ok);
+ LDK::NetGraphMsgHandler net_graph2 = NetGraphMsgHandler_new(genesis_hash, NULL, logger2);
+ LDKSecretKey node_secret2;
+
+ LDK::CVec_u8Z cm1_ser = LDKCVec_u8Z {}; // ChannelManager 1 serialization at the end of the ser-des scope
+ LDK::CVec_u8Z cm2_ser = LDKCVec_u8Z {}; // ChannelManager 2 serialization at the end of the ser-des scope
+
+ { // Scope for the ser-des reload
+ // Instantiate classes for node 1:
+ uint8_t node_seed[32];
+ memset(&node_seed, 0, 32);
+ LDK::KeysManager keys1 = KeysManager_new(&node_seed, 0, 0);
+ LDK::KeysInterface keys_source1 = KeysManager_as_KeysInterface(&keys1);
+ node_secret1 = keys_source1->get_node_secret(keys_source1->this_arg);
+
+ LDK::ChannelManager cm1 = ChannelManager_new(network, fee_est, mon1, broadcast, logger1, KeysManager_as_KeysInterface(&keys1), UserConfig_default(), 0);
+
+ LDK::CVec_ChannelDetailsZ channels = ChannelManager_list_channels(&cm1);
+ assert(channels->datalen == 0);
+
+ LDK::MessageHandler msg_handler1 = MessageHandler_new(ChannelManager_as_ChannelMessageHandler(&cm1), NetGraphMsgHandler_as_RoutingMessageHandler(&net_graph1));
+
+ random_bytes = keys_source1->get_secure_random_bytes(keys_source1->this_arg);
+ LDK::PeerManager net1 = PeerManager_new(std::move(msg_handler1), node_secret1, &random_bytes.data, logger1);
+
+ // Demo getting a channel key and check that its returning real pubkeys:
+ LDK::Sign chan_signer1 = keys_source1->get_channel_signer(keys_source1->this_arg, false, 42);
+ chan_signer1->set_pubkeys(&chan_signer1); // Make sure pubkeys is defined
+ LDKPublicKey payment_point = ChannelPublicKeys_get_payment_point(&chan_signer1->pubkeys);
+ assert(memcmp(&payment_point, &null_pk, sizeof(null_pk)));
+
+ // Instantiate classes for node 2:
+ memset(&node_seed, 1, 32);
+ LDK::KeysManager keys2 = KeysManager_new(&node_seed, 0, 0);
+ LDK::KeysInterface keys_source2 = KeysManager_as_KeysInterface(&keys2);
+ node_secret2 = keys_source2->get_node_secret(keys_source2->this_arg);
+
+ LDK::ChannelHandshakeConfig handshake_config2 = ChannelHandshakeConfig_default();
+ ChannelHandshakeConfig_set_minimum_depth(&handshake_config2, 2);
+ LDK::UserConfig config2 = UserConfig_default();
+ UserConfig_set_own_channel_config(&config2, std::move(handshake_config2));
+
+ LDK::ChannelManager cm2 = ChannelManager_new(network, fee_est, mon2, broadcast, logger2, KeysManager_as_KeysInterface(&keys2), std::move(config2), 0);
+
+ LDK::CVec_ChannelDetailsZ channels2 = ChannelManager_list_channels(&cm2);
+ assert(channels2->datalen == 0);
+
+ LDK::RoutingMessageHandler net_msgs2 = NetGraphMsgHandler_as_RoutingMessageHandler(&net_graph2);
+ LDK::CResult_ChannelAnnouncementDecodeErrorZ chan_ann = ChannelAnnouncement_read(LDKu8slice { .data = valid_node_announcement, .datalen = sizeof(valid_node_announcement) });
+ assert(chan_ann->result_ok);
+ LDK::CResult_boolLightningErrorZ ann_res = net_msgs2->handle_channel_announcement(net_msgs2->this_arg, chan_ann->contents.result);
+ assert(ann_res->result_ok);
+
+ LDK::MessageHandler msg_handler2 = MessageHandler_new(ChannelManager_as_ChannelMessageHandler(&cm2), std::move(net_msgs2));
+
+ random_bytes = keys_source2->get_secure_random_bytes(keys_source2->this_arg);
+ LDK::PeerManager net2 = PeerManager_new(std::move(msg_handler2), node_secret2, &random_bytes.data, logger2);
+
+ // Open a connection!
+ PeersConnection conn(cm1, cm2, net1, net2);
+
+ // Note that we have to bind the result to a C++ class to make sure it gets free'd
+ LDK::CResult_NoneAPIErrorZ res = ChannelManager_create_channel(&cm1, ChannelManager_get_our_node_id(&cm2), 40000, 1000, 42, UserConfig_default());
+ assert(res->result_ok);
+ PeerManager_process_events(&net1);
+
+ LDK::CVec_ChannelDetailsZ new_channels = ChannelManager_list_channels(&cm1);
+ assert(new_channels->datalen == 1);
+ LDKPublicKey chan_open_pk = ChannelDetails_get_remote_network_id(&new_channels->data[0]);
+ assert(!memcmp(chan_open_pk.compressed_form, ChannelManager_get_our_node_id(&cm2).compressed_form, 33));
+
+ while (true) {
+ LDK::CVec_ChannelDetailsZ new_channels_2 = ChannelManager_list_channels(&cm2);
+ if (new_channels_2->datalen == 1) {
+ // Sample getting our counterparty's init features (which used to be hard to do without a memory leak):
+ const LDK::InitFeatures init_feats = ChannelDetails_get_counterparty_features(&new_channels_2->data[0]);
+ assert(init_feats->inner != NULL);
+ break;
+ }
+ std::this_thread::yield();
+ }