+
+ MessageSendEvent[] funding_msg = node_a.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(funding_msg.Length == 1, 13);
+ Assert(funding_msg[0] is MessageSendEvent.MessageSendEvent_SendFundingCreated, 14);
+ node_b.manager.as_ChannelMessageHandler().handle_funding_created(node_a.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendFundingCreated) funding_msg[0]).msg);
+
+ Event bs_chan_pending = get_event(node_b.manager);
+ Assert(bs_chan_pending is Event.Event_ChannelPending, 15);
+
+ MessageSendEvent[] signed_ready_msgs = node_b.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(signed_ready_msgs.Length == 2, 16);
+ Assert(signed_ready_msgs[0] is MessageSendEvent.MessageSendEvent_SendFundingSigned, 17);
+ node_a.manager.as_ChannelMessageHandler().handle_funding_signed(node_b.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendFundingSigned) signed_ready_msgs[0]).msg);
+ Assert(node_a.broadcaster.broadcasted_len == 99, 18);
+
+ Event as_chan_pending = get_event(node_a.manager);
+ Assert(as_chan_pending is Event.Event_ChannelPending, 19);
+
+ MessageSendEvent[] as_ready = node_a.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(as_ready.Length == 1, 20);
+ Assert(as_ready[0] is MessageSendEvent.MessageSendEvent_SendChannelReady, 21);
+
+ Assert(signed_ready_msgs[1] is MessageSendEvent.MessageSendEvent_SendChannelReady, 22);
+ node_a.manager.as_ChannelMessageHandler().handle_channel_ready(node_b.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendChannelReady) signed_ready_msgs[1]).msg);
+
+ MessageSendEvent[] as_chan_update = node_a.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(as_chan_update.Length == 1, 23);
+ Assert(as_chan_update[0] is MessageSendEvent.MessageSendEvent_SendChannelUpdate, 24);
+
+ node_b.manager.as_ChannelMessageHandler().handle_channel_ready(node_a.manager.get_our_node_id(), ((MessageSendEvent.MessageSendEvent_SendChannelReady) as_ready[0]).msg);
+
+ Event as_chan_ready = get_event(node_a.manager);
+ Assert(as_chan_ready is Event.Event_ChannelReady, 25);
+
+ Event bs_chan_ready = get_event(node_b.manager);
+ Assert(bs_chan_ready is Event.Event_ChannelReady, 26);
+
+ MessageSendEvent[] bs_chan_update = node_b.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(bs_chan_update.Length == 1, 27);
+ Assert(bs_chan_update[0] is MessageSendEvent.MessageSendEvent_SendChannelUpdate, 28);
+
+ // Now that we have a channel, pay using a BOLT12 offer!
+
+ Result_OfferWithDerivedMetadataBuilderBolt12SemanticErrorZ builder_res = node_b.manager.create_offer_builder();
+ Assert(builder_res.is_ok(), 29);
+ Result_OfferBolt12SemanticErrorZ offer_res = ((Result_OfferWithDerivedMetadataBuilderBolt12SemanticErrorZ.Result_OfferWithDerivedMetadataBuilderBolt12SemanticErrorZ_OK)builder_res).res.build();
+ Assert(offer_res.is_ok(), 30);
+ Offer offer = ((Result_OfferBolt12SemanticErrorZ.Result_OfferBolt12SemanticErrorZ_OK)offer_res).res;
+
+ Result_NoneBolt12SemanticErrorZ pay_res = node_a.manager.pay_for_offer(offer, Option_u64Z.none(), Option_u64Z.some(42000), Option_StrZ.none(), new byte[32], Retry.attempts(0), Option_u64Z.none());
+ Assert(pay_res.is_ok(), 31);
+
+ OnionMessage as_invreq = node_a.messenger.as_OnionMessageHandler().next_onion_message_for_peer(node_b.manager.get_our_node_id());
+ node_b.messenger.as_OnionMessageHandler().handle_onion_message(node_a.manager.get_our_node_id(), as_invreq);
+
+ OnionMessage bs_inv = node_b.messenger.as_OnionMessageHandler().next_onion_message_for_peer(node_a.manager.get_our_node_id());
+ node_a.messenger.as_OnionMessageHandler().handle_onion_message(node_b.manager.get_our_node_id(), bs_inv);
+
+ // At this point node_a will generate a commitment update for node_b, which we check exists but don't bother to handle:
+ MessageSendEvent[] as_commit = node_a.manager.as_MessageSendEventsProvider().get_and_clear_pending_msg_events();
+ Assert(as_commit.Length == 1, 32);
+ Assert(as_commit[0] is MessageSendEvent.MessageSendEvent_UpdateHTLCs, 33);