+ });
+ this.chain_monitor = bindings.LDKWatch_new(new bindings.LDKWatch() {
+ @Override
+ public long watch_channel(long funding_txo, long monitor) {
+ return 0;
+ }
+
+ @Override
+ public long update_channel(long funding_txo, long update) {
+ return 0;
+ }
+
+ @Override
+ public long release_pending_monitor_events() {
+ return 0;
+ }
+ });
+
+ byte[] key_seed = new byte[32];
+ for (byte i = 0; i < 32; i++) { key_seed[i] = (byte) (i ^ seed); }
+ this.keys = bindings.KeysManager_new(key_seed, bindings.LDKNetwork.LDKNetwork_Bitcoin, System.currentTimeMillis() / 1000, (int)(System.currentTimeMillis() * 1000) & 0xffffffff);
+ this.keys_interface = bindings.KeysManager_as_KeysInterface(keys);
+ this.config = bindings.UserConfig_default();
+ this.chan_manager = bindings.ChannelManager_new(bindings.LDKNetwork.LDKNetwork_Bitcoin, fee_estimator, chain_monitor, tx_broadcaster, logger, keys_interface, config, 1);
+
+ this.chan_handler = bindings.ChannelManager_as_ChannelMessageHandler(chan_manager);
+ this.router = bindings.NetGraphMsgHandler_new(0, logger);
+ this.route_handler = bindings.NetGraphMsgHandler_as_RoutingMessageHandler(router);
+ this.message_handler = bindings.MessageHandler_new(chan_handler, route_handler);
+
+ byte[] random_data = new byte[32];
+ for (byte i = 0; i < 32; i++) { random_data[i] = (byte) ((i ^ seed) ^ 0xf0); }
+ this.peer_manager = bindings.PeerManager_new(message_handler, bindings.LDKKeysInterface_call_get_node_secret(keys_interface), random_data, logger);
+ }
+
+ void free() {
+ // Note that we can't rely on finalizer order, so don't bother trying to rely on it here
+ bindings.Logger_free(logger);
+ bindings.FeeEstimator_free(fee_estimator);
+ bindings.BroadcasterInterface_free(tx_broadcaster);
+ bindings.Watch_free(chain_monitor);
+ bindings.KeysManager_free(keys);
+ bindings.KeysInterface_free(keys_interface);
+ bindings.ChannelManager_free(chan_manager);
+ bindings.ChannelMessageHandler_free(chan_handler);
+ bindings.NetGraphMsgHandler_free(router);
+ bindings.RoutingMessageHandler_free(route_handler);
+ //MessageHandler was actually moved into the route_handler!: bindings.MessageHandler_free(message_handler);
+ bindings.PeerManager_free(peer_manager);
+ }
+ }
+
+ class LongHolder { long val; }
+
+ byte[] do_read_event(ConcurrentLinkedQueue<Thread> list, long pm, long descriptor, long data) {
+ byte[] arr = bindings.get_u8_slice_bytes(data);
+ Thread thread = new Thread(() -> {
+ long arr_vec = bindings.bytes_to_u8_vec(arr);
+ long res = bindings.PeerManager_read_event(pm, descriptor, arr_vec);
+ assert bindings.LDKCResult_boolPeerHandleErrorZ_result_ok(res);
+ //assert bindings.deref_bool(bindings.LDKCResult_boolPeerHandleErrorZ_get_inner(res));
+ bindings.CResult_boolPeerHandleErrorZ_free(res);
+ bindings.free_heap_ptr(arr_vec);