+ return new MonitorEvent[0];
+ }
+ };
+ Watch watch = Watch.new_impl(watch_impl);
+ must_free_objs.add(new WeakReference<>(watch_impl));
+ must_free_objs.add(new WeakReference<>(watch));
+ return watch;
+ }
+
+ NioPeerHandler nio_peer_handler;
+ short nio_port;
+ final byte seed;
+ final Logger logger;
+ final FeeEstimator fee_estimator;
+ final BroadcasterInterface tx_broadcaster;
+ final KeysInterface keys_interface;
+ final ChainMonitor chain_monitor;
+ final NetGraphMsgHandler router;
+ final Watch chain_watch;
+ ChannelManager chan_manager;
+ EventsProvider chan_manager_events;
+ PeerManager peer_manager;
+ final HashMap<String, ChannelMonitor> monitors; // Wow I forgot just how terrible Java is - we can't put a byte array here.
+ byte[] node_id;
+ final LinkedList<byte[]> broadcast_set = new LinkedList<>();
+
+ private TwoTuple<OutPoint, byte[]> test_mon_roundtrip(ChannelMonitor mon) {
+ // Because get_funding_txo() returns an OutPoint in a tuple that is a reference to an OutPoint inside the
+ // ChannelMonitor, its a good test to ensure that the OutPoint isn't freed (or is cloned) before the
+ // ChannelMonitor is. This used to be broken.
+ Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ roundtrip_monitor = UtilMethods.constructor_BlockHashChannelMonitorZ_read(mon.write(), keys_interface);
+ assert roundtrip_monitor instanceof Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK;
+ TwoTuple<OutPoint, byte[]> funding_txo = ((Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ.Result_C2Tuple_BlockHashChannelMonitorZDecodeErrorZ_OK) roundtrip_monitor).res.b.get_funding_txo();
+ System.gc(); System.runFinalization(); // Give the GC a chance to run.
+ return funding_txo;
+ }
+
+ private Peer(Object _dummy, byte seed) {
+ logger = Logger.new_impl((String arg) -> System.out.println(seed + ": " + arg));
+ fee_estimator = FeeEstimator.new_impl((confirmation_target -> 253));
+ tx_broadcaster = BroadcasterInterface.new_impl(tx -> {
+ broadcast_set.add(tx);
+ });
+ monitors = new HashMap<>();
+ this.seed = seed;
+ Persist persister = Persist.new_impl(new Persist.PersistInterface() {
+ @Override
+ public Result_NoneChannelMonitorUpdateErrZ persist_new_channel(OutPoint id, ChannelMonitor data) {
+ synchronized (monitors) {
+ String key = Arrays.toString(id.to_channel_id());
+ assert monitors.put(key, data) == null;
+ TwoTuple<OutPoint, byte[]> res = test_mon_roundtrip(data);
+ assert Arrays.equals(res.a.get_txid(), id.get_txid());
+ assert res.a.get_index() == id.get_index();
+ }
+ return new Result_NoneChannelMonitorUpdateErrZ.Result_NoneChannelMonitorUpdateErrZ_OK();
+ }
+
+ @Override
+ public Result_NoneChannelMonitorUpdateErrZ update_persisted_channel(OutPoint id, ChannelMonitorUpdate update, ChannelMonitor data) {
+ synchronized (monitors) {
+ String key = Arrays.toString(id.to_channel_id());
+ assert monitors.put(key, data) != null;
+ TwoTuple<OutPoint, byte[]> res = test_mon_roundtrip(data);
+ assert Arrays.equals(res.a.get_txid(), id.get_txid());
+ assert res.a.get_index() == id.get_index();
+ }
+ return new Result_NoneChannelMonitorUpdateErrZ.Result_NoneChannelMonitorUpdateErrZ_OK();