+#endif // !REAL_NET
+
+struct CustomOnionMsgQueue {
+ std::mutex mtx;
+ std::vector<LDK::OnionMessageContents> msgs;
+};
+
+uint64_t custom_onion_msg_type_id(const void *this_arg) {
+ return 8888;
+}
+LDKCVec_u8Z custom_onion_msg_bytes(const void *this_arg) {
+ uint8_t *bytes = (uint8_t *) malloc(1024);
+ memset(bytes, 43, 1024);
+ return LDKCVec_u8Z {
+ .data = bytes, .datalen = 1024
+ };
+}
+
+LDKCOption_OnionMessageContentsZ handle_custom_onion_message(const void* this_arg, struct LDKOnionMessageContents msg) {
+ CustomOnionMsgQueue* arg = (CustomOnionMsgQueue*) this_arg;
+ std::unique_lock<std::mutex> lck(arg->mtx);
+ arg->msgs.push_back(std::move(msg));
+ return COption_OnionMessageContentsZ_none();
+}
+
+LDKOnionMessageContents build_custom_onion_message() {
+ return LDKOnionMessageContents {
+ .this_arg = NULL,
+ .tlv_type = custom_onion_msg_type_id,
+ .write = custom_onion_msg_bytes,
+ .free = NULL,
+ };
+}
+
+LDKCResult_COption_OnionMessageContentsZDecodeErrorZ read_custom_onion_message(const void* this_arg, uint64_t type, LDKu8slice buf) {
+ assert(type == 8888);
+ assert(buf.datalen == 1024);
+ uint8_t cmp[1024];
+ memset(cmp, 43, 1024);
+ assert(!memcmp(cmp, buf.data, 1024));
+ return CResult_COption_OnionMessageContentsZDecodeErrorZ_ok(COption_OnionMessageContentsZ_some(build_custom_onion_message()));
+}
+
+LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ release_no_messages(const void* this_arg) {
+ return LDKCVec_C3Tuple_OnionMessageContentsDestinationBlindedPathZZ {
+ .data = NULL, .datalen = 0 };
+}
+
+struct CustomMsgQueue {
+ std::vector<LDK::Type> msgs;
+};
+
+uint16_t custom_msg_type_id(const void *this_arg) {
+ return 8888;
+}
+LDKCVec_u8Z custom_msg_bytes(const void *this_arg) {
+ uint8_t *bytes = (uint8_t *) malloc(1024);
+ memset(bytes, 42, 1024);
+ return LDKCVec_u8Z {
+ .data = bytes, .datalen = 1024
+ };
+}
+LDKStr custom_msg_debug(const void *this_arg) {
+ return LDKStr {
+ .chars = (const unsigned char*) "Custom Message", .len = 14, .chars_is_owned = false
+ };
+}
+
+LDKCResult_COption_TypeZDecodeErrorZ read_custom_message(const void* this_arg, uint16_t type_id, LDKu8slice buf) {
+ assert(type_id == 8888);
+ assert(buf.datalen == 1024);
+ uint8_t cmp[1024];
+ memset(cmp, 42, 1024);
+ assert(!memcmp(cmp, buf.data, 1024));
+ return CResult_COption_TypeZDecodeErrorZ_ok(COption_TypeZ_some(LDKType {
+ .this_arg = NULL,
+ .type_id = custom_msg_type_id,
+ .debug_str = custom_msg_debug,
+ .write = NULL, // This message should never be written
+ .free = NULL,
+ }));
+}
+
+LDKCResult_NoneLightningErrorZ handle_custom_message(const void* this_arg, struct LDKType msg, struct LDKPublicKey _sender_node_id) {
+ CustomMsgQueue* arg = (CustomMsgQueue*) this_arg;
+ arg->msgs.push_back(std::move(msg));
+ return CResult_NoneLightningErrorZ_ok();
+}
+LDKCVec_C2Tuple_PublicKeyTypeZZ never_send_custom_msgs(const void* this_arg) {
+ return LDKCVec_C2Tuple_PublicKeyTypeZZ {
+ .data = NULL, .datalen = 0
+ };
+}
+
+LDKCVec_C2Tuple_PublicKeyTypeZZ create_custom_msg(const void* this_arg) {
+ const LDKPublicKey *counterparty_node_id = (const LDKPublicKey *)this_arg;
+ LDKCVec_C2Tuple_PublicKeyTypeZZ ret = {
+ .data = ((LDKC2Tuple_PublicKeyTypeZ*)malloc(sizeof(LDKC2Tuple_PublicKeyTypeZ))),
+ .datalen = 1
+ };
+ ret.data[0].a = *counterparty_node_id;
+ ret.data[0].b = LDKType {
+ .this_arg = NULL,
+ .type_id = custom_msg_type_id,
+ .debug_str = custom_msg_debug,
+ .write = custom_msg_bytes,
+ .free = NULL,
+ };
+ return ret;
+}
+
+LDKNodeFeatures custom_node_features(const void *this_arg) {
+ return NodeFeatures_empty();
+}
+
+LDKInitFeatures custom_init_features(const void *this_arg, struct LDKPublicKey their_node_id) {
+ return InitFeatures_empty();
+}
+
+uint64_t get_chan_score(const void *this_arg, uint64_t scid, const LDKNodeId *src, const LDKNodeId *dst, LDKChannelUsage usage_in, const LDKProbabilisticScoringFeeParameters *params) {
+ LDK::ChannelUsage usage(std::move(usage_in));
+ return 42;
+}
+
+struct LDKCResult_RouteLightningErrorZ custom_find_route(const void *this_arg, struct LDKPublicKey payer, const struct LDKRouteParameters *NONNULL_PTR route_params, struct LDKCVec_ChannelDetailsZ *first_hops, const struct LDKInFlightHtlcs in_flights, LDKThirtyTwoBytes payment_id, LDKThirtyTwoBytes payment_hash) {
+ const LDK::DefaultRouter *router = (LDK::DefaultRouter *)this_arg;
+ assert(first_hops->datalen == 1);
+ assert(ChannelDetails_get_is_usable(&first_hops->data[0]));
+ const LDK::Router router_impl = DefaultRouter_as_Router(&*router);
+ return router_impl->find_route(router_impl->this_arg, payer, route_params, first_hops, in_flights);
+}