From ce46245d4245568b5e3f1b162c2aa54f409a2fe8 Mon Sep 17 00:00:00 2001 From: Jeremy Mawson Date: Sat, 1 Aug 2026 19:12:45 +1000 Subject: [PATCH 1/3] batteries: Allow wrapping the MessageRouter in ChannelManagerConstructor ChannelManagerConstructor hardcodes DefaultMessageRouter for onion message path finding, with no way to customize it. Nodes that restrict outbound connections cannot act on Event::ConnectionNeeded, so onion messages (e.g. BOLT 12 invoice requests) to unconnected destinations buffer forever. Such deployments route onion messages through a trusted forwarding peer by prefixing the path with a connected node, which requires substituting the MessageRouter handed to the OnionMessenger and ChannelManager. Add a MessageRouterWrapper hook mirroring the existing RouterWrapper pattern: a nullable constructor parameter whose find_path and create_blinded_paths receive the DefaultMessageRouter the constructor would otherwise have used, so implementations can delegate any case they don't want to customize. To avoid changing the public API, the new parameter is added on new constructor overloads rather than on the existing constructors, which are retained verbatim and simply delegate with a null wrapper, preserving existing behavior exactly. Amp-Thread-ID: https://ampcode.com/threads/T-019fac05-3d6f-75ca-9581-2c17d12954db Co-authored-by: Amp Further Tweaks By: Claude Opus 5 --- .../batteries/ChannelManagerConstructor.java | 103 +++++++++++++++++- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java b/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java index c1ec6bee..2698fa21 100644 --- a/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java +++ b/src/main/java/org/ldk/batteries/ChannelManagerConstructor.java @@ -81,7 +81,7 @@ public static class InvalidSerializedDataException extends Exception { private final EntropySource entropy_source; private final NodeSigner node_signer; private final Router router; - private final DefaultMessageRouter msg_router; + private final MessageRouter msg_router; /** * Exposes the `ProbabilisticScorer` wrapped inside a lock. Don't forget to `close` this lock when you're done with @@ -126,6 +126,50 @@ Result_RouteStrZ find_route(byte[] payer_node_id, RouteParameters route_params, InFlightHtlcs inflight_htlcs, @Nullable byte[] payment_hash, @Nullable byte[] payment_id, DefaultRouter default_router); } + /** + * A simple interface to provide onion message paths to LDK. + */ + public interface MessageRouterWrapper { + /** + * Finds a path for an onion message to the given destination. + * + * @param default_message_router Provides a message router which uses the LDK path-finder backed by the + * network graph. You may use this to fetch a "default" path, modifying or + * storing it as you wish before returning it to LDK. + */ + Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, Destination destination, + DefaultMessageRouter default_message_router); + + /** + * Creates blinded message paths to the recipient. Implementations which only wish to customize + * [`find_path`] should delegate to `default_message_router`. + */ + Result_CVec_BlindedMessagePathZNoneZ create_blinded_paths(byte[] recipient, + ReceiveAuthKey local_node_receive_key, MessageContext context, + MessageForwardNode[] peers, DefaultMessageRouter default_message_router); + } + + /** + * Deserializes a channel manager and a set of channel monitors from the given serialized copies and interface implementations + * + * @param filter If provided, the outputs which were previously registered to be monitored for will be loaded into the filter. + * Note that if the provided Watch is a ChainWatch and has an associated filter, the previously registered + * outputs will be loaded when chain_sync_completed is called. + * @param router_wrapper If provided, routes will be fetched by calling the given router rather than an LDK `DefaultRouter`. + */ + public ChannelManagerConstructor(byte[] channel_manager_serialized, byte[][] channel_monitors_serialized, UserConfig config, + EntropySource entropy_source, NodeSigner node_signer, SignerProvider signer_provider, + FeeEstimator fee_estimator, ChainMonitor chain_monitor, + @Nullable Filter filter, byte[] net_graph_serialized, + ProbabilisticScoringDecayParameters scoring_decay_params, + ProbabilisticScoringFeeParameters scoring_fee_params, + byte[] probabilistic_scorer_bytes, @Nullable RouterWrapper router_wrapper, + BroadcasterInterface tx_broadcaster, Logger logger) throws InvalidSerializedDataException { + this(channel_manager_serialized, channel_monitors_serialized, config, entropy_source, node_signer, + signer_provider, fee_estimator, chain_monitor, filter, net_graph_serialized, scoring_decay_params, + scoring_fee_params, probabilistic_scorer_bytes, router_wrapper, null, tx_broadcaster, logger); + } + /** * Deserializes a channel manager and a set of channel monitors from the given serialized copies and interface implementations * @@ -133,6 +177,7 @@ Result_RouteStrZ find_route(byte[] payer_node_id, RouteParameters route_params, * Note that if the provided Watch is a ChainWatch and has an associated filter, the previously registered * outputs will be loaded when chain_sync_completed is called. * @param router_wrapper If provided, routes will be fetched by calling the given router rather than an LDK `DefaultRouter`. + * @param message_router_wrapper If provided, onion message paths will be fetched by calling the given router rather than an LDK `DefaultMessageRouter`. */ public ChannelManagerConstructor(byte[] channel_manager_serialized, byte[][] channel_monitors_serialized, UserConfig config, EntropySource entropy_source, NodeSigner node_signer, SignerProvider signer_provider, @@ -141,6 +186,7 @@ public ChannelManagerConstructor(byte[] channel_manager_serialized, byte[][] cha ProbabilisticScoringDecayParameters scoring_decay_params, ProbabilisticScoringFeeParameters scoring_fee_params, byte[] probabilistic_scorer_bytes, @Nullable RouterWrapper router_wrapper, + @Nullable MessageRouterWrapper message_router_wrapper, BroadcasterInterface tx_broadcaster, Logger logger) throws InvalidSerializedDataException { this.entropy_source = entropy_source; this.node_signer = node_signer; @@ -181,7 +227,20 @@ public Result_CVec_BlindedPaymentPathZNoneZ create_blinded_payment_paths(byte[] } else { router = default_router.as_Router(); } - msg_router = DefaultMessageRouter.of(this.net_graph, entropy_source); + DefaultMessageRouter default_msg_router = DefaultMessageRouter.of(this.net_graph, entropy_source); + if (message_router_wrapper != null) { + msg_router = MessageRouter.new_impl(new MessageRouter.MessageRouterInterface() { + @Override public Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, Destination destination) { + return message_router_wrapper.find_path(sender, peers, destination, default_msg_router); + } + + @Override public Result_CVec_BlindedMessagePathZNoneZ create_blinded_paths(byte[] recipient, ReceiveAuthKey local_node_receive_key, MessageContext context, MessageForwardNode[] peers) { + return message_router_wrapper.create_blinded_paths(recipient, local_node_receive_key, context, peers, default_msg_router); + } + }); + } else { + msg_router = default_msg_router.as_MessageRouter(); + } final ChannelMonitor[] monitors = new ChannelMonitor[channel_monitors_serialized.length]; this.channel_monitors = new TwoTuple_ThirtyTwoBytesChannelMonitorZ[monitors.length]; @@ -200,7 +259,7 @@ public Result_CVec_BlindedPaymentPathZNoneZ create_blinded_payment_paths(byte[] Result_C2Tuple_ThirtyTwoBytesChannelManagerZDecodeErrorZ res = UtilMethods.C2Tuple_ThirtyTwoBytesChannelManagerZ_read(channel_manager_serialized, entropy_source, node_signer, signer_provider, fee_estimator, chain_monitor.as_Watch(), - tx_broadcaster, router, this.msg_router.as_MessageRouter(), logger, config, monitors); + tx_broadcaster, router, this.msg_router, logger, config, monitors); if (!res.is_ok()) { throw new InvalidSerializedDataException("Serialized ChannelManager was corrupt"); } @@ -227,6 +286,25 @@ public ChannelManagerConstructor(Network network, UserConfig config, byte[] curr ProbabilisticScoringFeeParameters scoring_fee_params, @Nullable RouterWrapper router_wrapper, BroadcasterInterface tx_broadcaster, Logger logger) { + this(network, config, current_blockchain_tip_hash, current_blockchain_tip_height, entropy_source, node_signer, + signer_provider, fee_estimator, chain_monitor, net_graph, scoring_decay_params, scoring_fee_params, + router_wrapper, null, tx_broadcaster, logger); + } + + /** + * Constructs a channel manager from the given interface implementations + * + * @param router_wrapper If provided, routes will be fetched by calling the given router rather than an LDK `DefaultRouter`. + * @param message_router_wrapper If provided, onion message paths will be fetched by calling the given router rather than an LDK `DefaultMessageRouter`. + */ + public ChannelManagerConstructor(Network network, UserConfig config, byte[] current_blockchain_tip_hash, int current_blockchain_tip_height, + EntropySource entropy_source, NodeSigner node_signer, SignerProvider signer_provider, + FeeEstimator fee_estimator, ChainMonitor chain_monitor, + NetworkGraph net_graph, ProbabilisticScoringDecayParameters scoring_decay_params, + ProbabilisticScoringFeeParameters scoring_fee_params, + @Nullable RouterWrapper router_wrapper, + @Nullable MessageRouterWrapper message_router_wrapper, + BroadcasterInterface tx_broadcaster, Logger logger) { this.entropy_source = entropy_source; this.node_signer = node_signer; this.net_graph = net_graph; @@ -253,14 +331,27 @@ public Result_CVec_BlindedPaymentPathZNoneZ create_blinded_payment_paths(byte[] } else { router = default_router.as_Router(); } - msg_router = DefaultMessageRouter.of(this.net_graph, entropy_source); + DefaultMessageRouter default_msg_router = DefaultMessageRouter.of(this.net_graph, entropy_source); + if (message_router_wrapper != null) { + msg_router = MessageRouter.new_impl(new MessageRouter.MessageRouterInterface() { + @Override public Result_OnionMessagePathNoneZ find_path(byte[] sender, byte[][] peers, Destination destination) { + return message_router_wrapper.find_path(sender, peers, destination, default_msg_router); + } + + @Override public Result_CVec_BlindedMessagePathZNoneZ create_blinded_paths(byte[] recipient, ReceiveAuthKey local_node_receive_key, MessageContext context, MessageForwardNode[] peers) { + return message_router_wrapper.create_blinded_paths(recipient, local_node_receive_key, context, peers, default_msg_router); + } + }); + } else { + msg_router = default_msg_router.as_MessageRouter(); + } channel_monitors = new TwoTuple_ThirtyTwoBytesChannelMonitorZ[0]; channel_manager_latest_block_hash = null; this.chain_monitor = chain_monitor; BestBlock block = BestBlock.of(current_blockchain_tip_hash, current_blockchain_tip_height); ChainParameters params = ChainParameters.of(network, block); channel_manager = ChannelManager.of(fee_estimator, chain_monitor.as_Watch(), tx_broadcaster, router, - this.msg_router.as_MessageRouter(), logger, entropy_source, node_signer, signer_provider, config, params, + this.msg_router, logger, entropy_source, node_signer, signer_provider, config, params, (int) (System.currentTimeMillis() / 1000)); this.logger = logger; } @@ -312,7 +403,7 @@ public void chain_sync_completed(KVStoreSync kv_store, EventHandler event_handle else routing_msg_handler = ignoring_handler.as_RoutingMessageHandler(); OnionMessenger messenger = OnionMessenger.of(this.entropy_source, this.node_signer, this.logger, - this.channel_manager.as_NodeIdLookUp(), this.msg_router.as_MessageRouter(), + this.channel_manager.as_NodeIdLookUp(), this.msg_router, channel_manager.as_OffersMessageHandler(), IgnoringMessageHandler.of().as_AsyncPaymentsMessageHandler(), channel_manager.as_DNSResolverMessageHandler(), IgnoringMessageHandler.of().as_CustomOnionMessageHandler()); From 1c02c828b2fe5eca75e22a95b820b01eb59f0685 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Tue, 1 Sep 2026 01:25:35 +0000 Subject: [PATCH 2/3] Update pom.xml to inform maven that we occasionally use UTF-8 --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 69b802da..1782a404 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,8 @@ 9 9 + UTF-8 + UTF-8 true From b7c1c83de1c71fd0c0044e8014cf6a66985a06a0 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Tue, 1 Sep 2026 15:15:16 +0000 Subject: [PATCH 3/3] Update pins to match the upstream 0.2 branch --- .github/workflows/build.yml | 138 +++++++++++++++++++++++------------- 1 file changed, 90 insertions(+), 48 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 81bd3174..09b16c59 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,27 +41,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen @@ -160,27 +167,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen @@ -411,27 +425,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen @@ -490,27 +511,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen @@ -635,27 +663,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen @@ -790,27 +825,34 @@ jobs: git clone https://github.com/lightningdevkit/rust-lightning cd rust-lightning git checkout origin/0.2-bindings + cargo update -p tokio --precise "1.38.1" --verbose + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose cd .. git clone https://github.com/lightningdevkit/ldk-c-bindings cd ldk-c-bindings git checkout 0.2 cd lightning-c-bindings + cargo update -p serde --precise "1.0.228" --verbose cargo update -p syn --precise "2.0.106" --verbose cargo update -p quote --precise "1.0.41" --verbose - cargo update -p libc --precise 0.2.183 --verbose - cargo update -p serde_json --precise "1.0.145" --verbose cargo update -p proc-macro2 --precise "1.0.103" --verbose - cargo update -p itoa --precise 1.0.15 + cargo update -p serde_json --precise "1.0.145" --verbose + cargo update -p itoa --precise "1.0.15" --verbose + cargo update -p ryu --precise "1.0.20" --verbose cargo update -p unicode-ident --precise 1.0.22 - cargo update -p ryu --precise "1.0.20" + cargo update -p libc --precise 0.2.183 --verbose + cargo update -p cc --precise "1.4.0" --verbose + cargo update -p find-msvc-tools --precise "0.1.9" --verbose - name: Pin proc-macro and quote to meet MSRV run: | cd ldk-c-bindings/c-bindings-gen