From e4a5188206a468fa5900fd7f77fbec77041687bd Mon Sep 17 00:00:00 2001 From: Armin Sabouri Date: Sat, 10 May 2025 15:24:48 -0300 Subject: [PATCH 1/5] WIP - Payjoin POC - DO NOT MERGE This commit acts as the initial approach set out by Artur to add payjoin tnio liana. Any changes from this PR will be split up into their individual issues / PRs for more exact review. --- Cargo.lock | 2522 +++++++++++------ liana-gui/Cargo.toml | 2 + liana-gui/src/app/message.rs | 5 +- liana-gui/src/app/state/psbt.rs | 46 +- liana-gui/src/app/state/psbts.rs | 7 +- liana-gui/src/app/state/receive.rs | 66 +- liana-gui/src/app/state/spend/step.rs | 69 +- liana-gui/src/app/view/message.rs | 5 + liana-gui/src/app/view/psbt.rs | 60 +- liana-gui/src/app/view/receive.rs | 69 +- liana-gui/src/app/view/spend/mod.rs | 20 + liana-gui/src/daemon/client/mod.rs | 15 + liana-gui/src/daemon/embedded.rs | 29 +- liana-gui/src/daemon/mod.rs | 9 + liana-gui/src/daemon/model.rs | 21 +- .../services/connect/client/backend/mod.rs | 16 + liana-ui/src/color.rs | 6 + liana-ui/src/theme/palette.rs | 2 + liana-ui/src/theme/text.rs | 6 + liana/src/descriptors/mod.rs | 5 +- liana/src/spend.rs | 3 + lianad/Cargo.toml | 4 + lianad/src/bitcoin/d/mod.rs | 15 + lianad/src/bitcoin/mod.rs | 17 + lianad/src/bitcoin/poller/looper.rs | 31 +- lianad/src/bitcoin/poller/mod.rs | 13 +- lianad/src/commands/mod.rs | 151 +- lianad/src/database/mod.rs | 160 ++ lianad/src/database/sqlite/mod.rs | 435 ++- lianad/src/database/sqlite/schema.rs | 76 + lianad/src/jsonrpc/api.rs | 47 + lianad/src/jsonrpc/rpc.rs | 6 +- lianad/src/lib.rs | 1 + lianad/src/payjoin/db.rs | 141 + lianad/src/payjoin/helpers.rs | 130 + lianad/src/payjoin/mod.rs | 5 + lianad/src/payjoin/receiver.rs | 375 +++ lianad/src/payjoin/sender.rs | 141 + lianad/src/payjoin/types.rs | 49 + lianad/src/testutils.rs | 182 ++ 40 files changed, 4049 insertions(+), 913 deletions(-) create mode 100644 lianad/src/payjoin/db.rs create mode 100644 lianad/src/payjoin/helpers.rs create mode 100644 lianad/src/payjoin/mod.rs create mode 100644 lianad/src/payjoin/receiver.rs create mode 100644 lianad/src/payjoin/sender.rs create mode 100644 lianad/src/payjoin/types.rs diff --git a/Cargo.lock b/Cargo.lock index 3e0a58d4e..276152b8d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.29" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,24 +14,34 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aead" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", + "rand_core 0.6.4", +] [[package]] name = "aead" @@ -43,6 +53,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures 0.2.17", + "opaque-debug", +] + [[package]] name = "aes" version = "0.8.4" @@ -50,8 +72,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", - "cipher", - "cpufeatures", + "cipher 0.4.4", + "cpufeatures 0.2.17", +] + +[[package]] +name = "aes-gcm" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc3be92e19a7ef47457b8e6f90707e12b6ac5d20c6f3866584fa3be0787d839f" +dependencies = [ + "aead 0.4.3", + "aes 0.7.5", + "cipher 0.3.0", + "ctr 0.7.0", + "ghash 0.4.4", + "subtle", ] [[package]] @@ -60,22 +96,22 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", + "aead 0.5.2", + "aes 0.8.4", + "cipher 0.4.4", + "ctr 0.9.2", + "ghash 0.5.1", "subtle", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -109,7 +145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.8.0", + "bitflags 2.9.4", "cc", "cesu8", "jni", @@ -129,12 +165,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -146,9 +176,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.95" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -161,9 +191,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -197,16 +227,16 @@ dependencies = [ [[package]] name = "ashpd" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" dependencies = [ "async-fs", "async-net", "enumflags2", "futures-channel", "futures-util", - "rand 0.8.5", + "rand 0.9.2", "raw-window-handle", "serde", "serde_repr", @@ -231,9 +261,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -243,14 +273,15 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] @@ -263,7 +294,7 @@ dependencies = [ "async-trait", "cfg-if", "pin-project", - "rustix", + "rustix 0.38.44", "thiserror 1.0.69", "tokio", "windows-sys 0.52.0", @@ -271,9 +302,9 @@ dependencies = [ [[package]] name = "async-fs" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ "async-lock", "blocking", @@ -296,7 +327,7 @@ dependencies = [ "ledger-transport-hidapi", "ledger_bitcoin_client", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_bytes", "serde_cbor", @@ -307,28 +338,27 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix", + "rustix 1.1.2", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ "event-listener", "event-listener-strategy", @@ -348,9 +378,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -361,8 +391,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix", - "tracing", + "rustix 1.1.2", ] [[package]] @@ -373,14 +402,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -388,10 +417,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -402,13 +431,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.86" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -419,15 +448,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -435,7 +464,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -495,9 +524,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bdk_chain" @@ -510,9 +539,9 @@ dependencies = [ [[package]] name = "bdk_coin_select" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e57e4db8b917d554a0eb142be5267bbc88d787c3346c8dc0590fbe76be68bd" +checksum = "43064fa3dd1d3a8b24079cfcb5ede6b785857edc782277f17a1736511ccc1916" [[package]] name = "bdk_electrum" @@ -529,6 +558,15 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bhttp" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16fc24bc615b9fd63148f59b218ea58a444b55762f8845da910e23aca686398b" +dependencies = [ + "thiserror 1.0.69", +] + [[package]] name = "bip329" version = "0.3.0" @@ -538,14 +576,14 @@ dependencies = [ "bitcoin", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "bip39" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" +checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" dependencies = [ "bitcoin_hashes 0.13.0", "serde", @@ -569,9 +607,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bit_field" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitbox-api" @@ -584,13 +622,13 @@ dependencies = [ "bitcoin", "byteorder", "chrono", - "getrandom 0.2.15", + "getrandom 0.2.16", "hex", "hidapi", "noise-protocol", "noise-rust-crypto", "num-bigint", - "prost 0.13.4", + "prost 0.13.5", "prost-build", "semver", "serde", @@ -602,9 +640,9 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.32.5" +version = "0.32.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6bc65742dea50536e35ad42492b234c27904a27f0abdcbce605015cb4ea026" +checksum = "0fda569d741b895131a88ee5589a467e73e9c4718e958ac9308e4f7dc44b6945" dependencies = [ "base58ck", "base64 0.21.7", @@ -625,12 +663,31 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b89ad3b53c1425530260f9080fe1a968816d762f9467c82d8e57a5d638b90aa" dependencies = [ - "aes-gcm", + "aes-gcm 0.10.3", "miniscript", "num_enum", "rand 0.9.2", ] +[[package]] +name = "bitcoin-hpke" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37a54c486727c1d1ae9cc28dcf78b6e6ba20dcb88e8c892f1437d9ce215dc8c" +dependencies = [ + "aead 0.5.2", + "chacha20poly1305 0.10.1", + "digest 0.10.7", + "generic-array", + "hkdf 0.12.4", + "hmac 0.12.1", + "rand_core 0.6.4", + "secp256k1", + "sha2 0.10.9", + "subtle", + "zeroize", +] + [[package]] name = "bitcoin-internals" version = "0.2.0" @@ -652,6 +709,29 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" +[[package]] +name = "bitcoin-ohttp" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87a803a4b54e44635206b53329c78c0029d0c70926288ac2f07f4bb1267546cb" +dependencies = [ + "aead 0.4.3", + "aes-gcm 0.9.2", + "bitcoin-hpke", + "byteorder", + "chacha20poly1305 0.8.0", + "hex", + "hkdf 0.11.0", + "lazy_static", + "log", + "rand 0.8.5", + "serde", + "serde_derive", + "sha2 0.9.9", + "thiserror 1.0.69", + "toml 0.5.11", +] + [[package]] name = "bitcoin-private" version = "0.1.0" @@ -698,6 +778,16 @@ dependencies = [ "serde", ] +[[package]] +name = "bitcoin_uri" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0a228e083d1702f83389b0ac71eb70078dc8d7fcbb6cde864d1cbca145f5cc" +dependencies = [ + "bitcoin", + "percent-encoding-rfc3986", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -706,9 +796,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "blake2" @@ -716,7 +806,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -725,6 +815,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -740,14 +839,23 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.3", ] [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -758,9 +866,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "by_address" @@ -770,22 +878,22 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -796,9 +904,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bzip2" @@ -812,12 +920,11 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -827,10 +934,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "log", "polling", - "rustix", + "rustix 0.38.44", "slab", "thiserror 1.0.69", ] @@ -842,17 +949,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", - "rustix", + "rustix 0.38.44", "wayland-backend", "wayland-client", ] [[package]] name = "cc" -version = "1.2.12" +version = "1.2.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" +checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -866,9 +974,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -882,6 +990,18 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee7ad89dc1128635074c268ee661f90c3f7e83d9fd12910608c36b47d6c3412" +dependencies = [ + "cfg-if", + "cipher 0.3.0", + "cpufeatures 0.1.5", + "zeroize", +] + [[package]] name = "chacha20" version = "0.9.1" @@ -889,8 +1009,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", - "cipher", - "cpufeatures", + "cipher 0.4.4", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1580317203210c517b6d44794abfbe600698276db18127e37ad3e69bf5e848e5" +dependencies = [ + "aead 0.4.3", + "chacha20 0.7.1", + "cipher 0.3.0", + "poly1305 0.7.2", + "zeroize", ] [[package]] @@ -899,25 +1032,33 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", + "aead 0.5.2", + "chacha20 0.9.1", + "cipher 0.4.4", + "poly1305 0.8.0", "zeroize", ] [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", ] [[package]] @@ -933,9 +1074,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -946,9 +1087,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" dependencies = [ - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -986,10 +1127,10 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aaaf3f7409edc40001c30a4c1337f21558a8ceba2a4afe807da841a38ce83d6" dependencies = [ - "aes", + "aes 0.8.4", "base58", "bitcoin_hashes 0.13.0", - "ctr", + "ctr 0.9.2", "hidapi", "k256", "rand 0.8.5", @@ -1072,7 +1213,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "tiny-keccak", ] @@ -1089,9 +1230,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -1122,8 +1263,8 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.10.0", + "bitflags 2.9.4", + "core-foundation 0.10.1", "core-graphics-types 0.2.0", "foreign-types", "libc", @@ -1146,8 +1287,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.8.0", - "core-foundation 0.10.0", + "bitflags 2.9.4", + "core-foundation 0.10.1", "libc", ] @@ -1157,7 +1298,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "fontdb 0.16.2", "log", "rangemap", @@ -1174,6 +1315,15 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cpufeatures" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" +dependencies = [ + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1185,9 +1335,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1219,9 +1369,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -1246,26 +1396,45 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-mac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "ctor-lite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f791803201ab277ace03903de1594460708d2d54df6053f2d9e82f592b19e3b" +[[package]] +name = "ctr" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a232f92a03f37dd7d7dd2adc67166c77e9cd88de5b019b9a9eecfaeaf7bfd481" +dependencies = [ + "cipher 0.3.0", +] + [[package]] name = "ctr" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher", + "cipher 0.4.4", ] [[package]] name = "cursor-icon" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "curve25519-dalek" @@ -1274,7 +1443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "fiat-crypto", "rustc_version", @@ -1290,7 +1459,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -1299,22 +1468,22 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ - "bitflags 2.8.0", - "libloading 0.8.6", + "bitflags 2.9.4", + "libloading 0.8.9", "winapi", ] [[package]] name = "data-url" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -1322,13 +1491,22 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", ] [[package]] @@ -1337,7 +1515,7 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", "crypto-common", "subtle", @@ -1390,6 +1568,18 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "libc", + "objc2 0.6.3", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1398,7 +1588,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -1407,7 +1597,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.6", + "libloading 0.8.9", ] [[package]] @@ -1433,9 +1623,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" [[package]] name = "drm" @@ -1443,11 +1633,11 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "bytemuck", "drm-ffi", "drm-fourcc", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -1457,7 +1647,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" dependencies = [ "drm-sys", - "rustix", + "rustix 0.38.44", ] [[package]] @@ -1483,7 +1673,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -1492,9 +1682,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "electrum-client" @@ -1506,10 +1696,10 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.27", + "rustls 0.23.32", "serde", "serde_json", - "webpki-roots", + "webpki-roots 0.25.4", "winapi", ] @@ -1521,7 +1711,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -1558,9 +1748,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1568,36 +1758,36 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "etagere" @@ -1620,9 +1810,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1631,9 +1821,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", @@ -1646,7 +1836,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "half 2.4.1", + "half 2.6.0", "lebe", "miniz_oxide", "rayon-core", @@ -1698,9 +1888,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "rand_core 0.6.4", "subtle", @@ -1714,16 +1904,22 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1732,9 +1928,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -1769,9 +1965,9 @@ dependencies = [ [[package]] name = "fontconfig-parser" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ "roxmltree", ] @@ -1822,7 +2018,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -1833,9 +2029,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1901,9 +2097,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -1920,7 +2116,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -1966,35 +2162,49 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.4.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" dependencies = [ - "libc", - "windows-targets 0.48.5", + "rustix 1.1.2", + "windows-targets 0.52.6", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "ghash" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1583cc1656d7839fd3732b80cf4f38850336cdb9b8ded1cd399ca62958de3c99" +dependencies = [ + "opaque-debug", + "polyval 0.5.3", ] [[package]] @@ -2004,14 +2214,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" dependencies = [ "opaque-debug", - "polyval", + "polyval 0.6.2", ] [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -2019,9 +2229,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gl_generator" @@ -2067,7 +2277,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "gpu-alloc-types", ] @@ -2077,7 +2287,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", ] [[package]] @@ -2099,7 +2309,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "gpu-descriptor-types", "hashbrown 0.14.5", ] @@ -2110,7 +2320,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", ] [[package]] @@ -2136,16 +2346,16 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap", "slab", "tokio", @@ -2161,9 +2371,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -2187,9 +2397,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "hashlink" @@ -2206,10 +2416,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "com", "libc", - "libloading 0.8.6", + "libloading 0.8.9", "thiserror 1.0.69", "widestring", "winapi", @@ -2223,15 +2433,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -2280,27 +2484,56 @@ dependencies = [ ] [[package]] -name = "hmac" -version = "0.12.1" +name = "hkdf" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" dependencies = [ - "digest", + "digest 0.9.0", + "hmac 0.11.0", ] [[package]] -name = "home" -version = "0.5.11" +name = "hkdf" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ - "windows-sys 0.59.0", + "hmac 0.12.1", ] [[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" +name = "hmac" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", @@ -2308,6 +2541,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -2315,15 +2559,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2342,19 +2609,40 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", "want", ] +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -2362,25 +2650,67 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", + "http 0.2.12", + "hyper 0.14.32", "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.7.0", + "hyper-util", + "rustls 0.23.32", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", + "webpki-roots 1.0.3", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "tokio", + "tower-service", + "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -2415,7 +2745,7 @@ checksum = "582c517a94ce3205da98e9c10b26bb71aa36b7d7d084441d826dc912711d1bac" dependencies = [ "cfg-if", "chrono", - "getrandom 0.3.1", + "getrandom 0.3.3", "iced", "iced_fonts", "itertools 0.14.0", @@ -2430,7 +2760,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "bytes", "glam", "log", @@ -2486,10 +2816,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "bytemuck", "cosmic-text", - "half 2.4.1", + "half 2.6.0", "iced_core", "iced_futures", "image", @@ -2552,7 +2882,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "bytemuck", "futures", "glam", @@ -2607,21 +2937,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -2630,31 +2961,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -2662,72 +2973,59 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.98", -] - [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2736,9 +3034,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -2770,19 +3068,19 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "indexmap" -version = "2.7.1" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.0", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] @@ -2806,12 +3104,33 @@ dependencies = [ "mach2", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-docker" version = "0.2.0" @@ -2840,15 +3159,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -2860,9 +3170,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jni" @@ -2888,27 +3198,28 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -2948,7 +3259,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.9", "signature", ] @@ -2968,7 +3279,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.6", + "libloading 0.8.9", "pkg-config", ] @@ -2990,11 +3301,12 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ "arrayvec", + "euclid", "smallvec", ] @@ -3006,9 +3318,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "ledger-apdu" @@ -3064,7 +3376,7 @@ version = "13.0.0" dependencies = [ "bdk_coin_select", "bip39", - "getrandom 0.3.1", + "getrandom 0.3.3", "log", "miniscript", "rdrand", @@ -3108,7 +3420,8 @@ dependencies = [ "libc", "log", "open", - "reqwest", + "payjoin", + "reqwest 0.11.27", "rfd", "rust-ini", "serde", @@ -3148,6 +3461,8 @@ dependencies = [ "liana", "log", "miniscript", + "payjoin", + "reqwest 0.11.27", "rusqlite", "serde", "serde_json", @@ -3156,15 +3471,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" dependencies = [ "arbitrary", "cc", @@ -3182,29 +3497,29 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.18", ] [[package]] @@ -3250,27 +3565,32 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.25" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru" @@ -3278,11 +3598,17 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "lyon" -version = "1.0.1" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7f9cda98b5430809e63ca5197b06c7d191bf7e26dfc467d5a3f0290e2a74f" +checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" dependencies = [ "lyon_algorithms", "lyon_tessellation", @@ -3290,9 +3616,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.5" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f13c9be19d257c7d37e70608ed858e8eab4b2afcea2e3c9a622e892acbf43c08" +checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" dependencies = [ "lyon_path", "num-traits", @@ -3300,9 +3626,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.6" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8af69edc087272df438b3ee436c4bb6d7c04aa8af665cfd398feae627dbd8570" +checksum = "4e16770d760c7848b0c1c2d209101e408207a65168109509f8483837a36cf2e7" dependencies = [ "arrayvec", "euclid", @@ -3311,9 +3637,9 @@ dependencies = [ [[package]] name = "lyon_path" -version = "1.0.6" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e0b8aec2f58586f6eef237985b9a9b7cb3a3aff4417c575075cf95bf925252e" +checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" dependencies = [ "lyon_geom", "num-traits", @@ -3321,9 +3647,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "579d42360a4b09846eff2feef28f538696c7d6c7439bfa65874ff3cbe0951b2c" +checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" dependencies = [ "float_next_after", "lyon_path", @@ -3332,9 +3658,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" dependencies = [ "libc", ] @@ -3350,15 +3676,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -3378,7 +3704,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "block", "core-graphics-types 0.1.3", "foreign-types", @@ -3395,9 +3721,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniscript" -version = "12.3.1" +version = "12.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82911d2fb527bb9aacd2446d2f517aff3f8e3846ace1b3c24258b61ea3cce2bc" +checksum = "487906208f38448e186e3deb02f2b8ef046a9078b0de00bdb28bf4fb9b76951c" dependencies = [ "bech32", "bitcoin", @@ -3406,9 +3732,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -3416,25 +3742,24 @@ dependencies = [ [[package]] name = "minreq" -version = "2.13.2" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" +checksum = "05015102dad0f7d61691ca347e9d9d9006685a64aefb3d79eecf62665de2153d" dependencies = [ - "log", "serde", "serde_json", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -3458,9 +3783,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "mutate_once" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" +checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" [[package]] name = "naga" @@ -3469,7 +3794,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" dependencies = [ "bit-set", - "bitflags 2.8.0", + "bitflags 2.9.4", "codespan-reporting", "hexf-parse", "indexmap", @@ -3488,7 +3813,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -3538,7 +3863,19 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.9.4", "cfg-if", "cfg_aliases 0.2.1", "libc", @@ -3566,23 +3903,22 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c6159f60beb3bbbcdc266bc789bfc6c37fdad7d7ca7152d3e049ef5af633f0" dependencies = [ - "aes-gcm", + "aes-gcm 0.10.3", "blake2", - "chacha20poly1305", + "chacha20poly1305 0.10.1", "noise-protocol", - "sha2", + "sha2 0.10.9", "x25519-dalek", "zeroize", ] [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -3626,33 +3962,34 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -3681,33 +4018,54 @@ dependencies = [ "objc2-encode", ] +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + [[package]] name = "objc2-app-kit" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.8.0", - "block2", + "bitflags 2.9.4", + "block2 0.5.1", "libc", - "objc2", + "objc2 0.5.2", "objc2-core-data", "objc2-core-image", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-quartz-core", ] +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-cloud-kit" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -3716,9 +4074,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -3727,10 +4085,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.3", ] [[package]] @@ -3739,9 +4108,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -3751,10 +4120,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "block2", - "objc2", + "block2 0.5.1", + "objc2 0.5.2", "objc2-contacts", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -3769,11 +4138,22 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.8.0", - "block2", + "bitflags 2.9.4", + "block2 0.5.1", "dispatch", "libc", - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", ] [[package]] @@ -3782,10 +4162,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -3794,10 +4174,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -3806,10 +4186,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", - "objc2-foundation", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] @@ -3819,8 +4199,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -3829,14 +4209,14 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", "objc2-link-presentation", "objc2-quartz-core", "objc2-symbols", @@ -3850,9 +4230,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "block2", - "objc2", - "objc2-foundation", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -3861,11 +4241,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.8.0", - "block2", - "objc2", + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", "objc2-core-location", - "objc2-foundation", + "objc2-foundation 0.2.2", ] [[package]] @@ -3879,18 +4259,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -3965,20 +4345,14 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.98", + "syn 2.0.106", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser 0.25.1", ] @@ -4004,7 +4378,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -4026,12 +4400,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.12", ] [[package]] @@ -4050,15 +4424,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.8", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -4073,11 +4447,35 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +[[package]] +name = "payjoin" +version = "1.0.0-rc.0" +source = "git+https://github.com/payjoin/rust-payjoin.git?branch=master#b97ffb7129aceea4bb56ec7789681d56423572b6" +dependencies = [ + "bhttp", + "bitcoin", + "bitcoin-hpke", + "bitcoin-ohttp", + "bitcoin_uri", + "http 1.3.1", + "reqwest 0.12.23", + "serde", + "serde_json", + "tracing", + "url", +] + [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percent-encoding-rfc3986" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "3637c05577168127568a64e9dc5a6887da720efef07b3d9472d45f63ab191166" [[package]] name = "petgraph" @@ -4119,7 +4517,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -4139,22 +4537,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -4192,9 +4590,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" @@ -4211,17 +4609,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -4230,15 +4627,38 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +[[package]] +name = "poly1305" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048aeb476be11a4b6ca432ca569e375810de9294ae78f4774e78ea98a9246ede" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash 0.4.0", +] + [[package]] name = "poly1305" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", - "universal-hash", + "universal-hash 0.5.1", +] + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash 0.4.0", ] [[package]] @@ -4248,16 +4668,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", - "universal-hash", + "universal-hash 0.5.1", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", ] [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -4280,18 +4709,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.6", ] [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -4304,16 +4733,16 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "prost" @@ -4327,12 +4756,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive 0.13.4", + "prost-derive 0.13.5", ] [[package]] @@ -4372,15 +4801,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -4409,22 +4838,83 @@ checksum = "166f136dfdb199f98186f3649cf7a0536534a61417a1a30221b492b4fb60ce3f" [[package]] name = "quick-xml" -version = "0.37.2" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases 0.2.1", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.1", + "rustls 0.23.32", + "socket2 0.6.0", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash 2.1.1", + "rustls 0.23.32", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases 0.2.1", + "libc", + "once_cell", + "socket2 0.6.0", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" -version = "1.0.38" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -4472,7 +4962,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -4481,7 +4971,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.3", ] [[package]] @@ -4492,9 +4982,9 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rangemap" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" +checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" [[package]] name = "raw-window-handle" @@ -4504,9 +4994,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -4514,9 +5004,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -4561,11 +5051,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.8" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", ] [[package]] @@ -4574,16 +5064,16 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -4593,9 +5083,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -4604,9 +5094,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "renderdoc-sys" @@ -4626,10 +5116,10 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -4642,10 +5132,10 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tokio-util", "tower-service", "url", @@ -4653,10 +5143,48 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-rustls 0.27.7", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.32", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-rustls 0.26.4", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 1.0.3", +] + [[package]] name = "resvg" version = "0.42.0" @@ -4679,25 +5207,25 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac", + "hmac 0.12.1", "subtle", ] [[package]] name = "rfd" -version = "0.15.2" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a24763657bff09769a8ccf12c8b8a50416fb035fe199263b4c5071e4e3f006f" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", - "block2", - "core-foundation 0.10.0", - "core-foundation-sys", + "block2 0.6.2", + "dispatch2", "js-sys", "log", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", "pollster", "raw-window-handle", "urlencoding", @@ -4709,24 +5237,23 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -4743,7 +5270,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4763,9 +5290,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -4794,13 +5321,26 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", "windows-sys 0.59.0", ] +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", +] + [[package]] name = "rustls" version = "0.21.12" @@ -4815,15 +5355,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -4843,6 +5383,7 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ + "web-time", "zeroize", ] @@ -4858,9 +5399,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -4869,9 +5410,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustybuzz" @@ -4879,7 +5420,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "bytemuck", "libm", "smallvec", @@ -4892,9 +5433,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -4961,6 +5502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "bitcoin_hashes 0.14.0", + "rand 0.8.5", "secp256k1-sys", "serde", ] @@ -4976,32 +5518,34 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" [[package]] name = "semver" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -5014,38 +5558,48 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.138" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -5071,13 +5625,13 @@ dependencies = [ [[package]] name = "serialport" -version = "4.7.0" +version = "4.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecfc4858c2266c7695d8b8460bbd612fa81bd2e250f5f0dd16195e4b4f8b3d8" +checksum = "2acaf3f973e8616d7ceac415f53fc60e190b2a686fbcf8d27d0256c741c5007b" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "cfg-if", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-foundation-sys", "io-kit-sys", "libudev", @@ -5090,13 +5644,26 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -5116,9 +5683,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -5129,7 +5696,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] @@ -5166,12 +5733,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" @@ -5184,9 +5748,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smithay-client-toolkit" @@ -5194,14 +5758,14 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "calloop", "calloop-wayland-source", "cursor-icon", "libc", "log", "memmap2", - "rustix", + "rustix 0.38.44", "thiserror 1.0.69", "wayland-backend", "wayland-client", @@ -5257,14 +5821,24 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "softbuffer" version = "0.4.6" @@ -5281,12 +5855,12 @@ dependencies = [ "js-sys", "log", "memmap2", - "objc2", - "objc2-foundation", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-quartz-core", "raw-window-handle", - "redox_syscall 0.5.8", - "rustix", + "redox_syscall 0.5.18", + "rustix 0.38.44", "tiny-xlib", "wasm-bindgen", "wayland-backend", @@ -5297,19 +5871,13 @@ dependencies = [ "x11rb", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", ] [[package]] @@ -5351,9 +5919,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svg_fmt" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" [[package]] name = "svgtypes" @@ -5361,7 +5929,7 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.1", + "kurbo 0.11.3", "siphasher", ] @@ -5389,9 +5957,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.98" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -5400,19 +5968,28 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -5447,9 +6024,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" dependencies = [ "filetime", "libc", @@ -5457,16 +6034,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.16.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.3", "once_cell", - "rustix", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -5489,11 +6065,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -5504,28 +6080,27 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -5582,16 +6157,16 @@ checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" dependencies = [ "as-raw-xcb-connection", "ctor-lite", - "libloading 0.8.6", + "libloading 0.8.9", "pkg-config", "tracing", ] [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -5599,9 +6174,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -5614,19 +6189,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5637,7 +6214,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -5650,6 +6227,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.32", + "tokio", +] + [[package]] name = "tokio-serial" version = "5.4.5" @@ -5666,9 +6253,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -5688,38 +6275,114 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" -version = "0.22.23" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.6.11", + "toml_write", "winnow", ] +[[package]] +name = "toml_edit" +version = "0.23.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +dependencies = [ + "indexmap", + "toml_datetime 0.7.2", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -5739,20 +6402,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -5771,9 +6434,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -5809,9 +6472,9 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "uds_windows" @@ -5826,11 +6489,11 @@ dependencies = [ [[package]] name = "unescaper" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" +checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" dependencies = [ - "thiserror 1.0.69", + "thiserror 2.0.17", ] [[package]] @@ -5853,9 +6516,9 @@ checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" [[package]] name = "unicode-ident" -version = "1.0.16" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-linebreak" @@ -5865,9 +6528,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] @@ -5908,6 +6571,16 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402" +dependencies = [ + "generic-array", + "subtle", +] + [[package]] name = "universal-hash" version = "0.5.1" @@ -5926,9 +6599,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -5953,7 +6626,7 @@ dependencies = [ "flate2", "fontdb 0.18.0", "imagesize", - "kurbo 0.11.1", + "kurbo 0.11.3", "log", "pico-args", "roxmltree", @@ -5969,12 +6642,6 @@ dependencies = [ "xmlwriter", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -6020,50 +6687,60 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -6074,9 +6751,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6084,22 +6761,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -6134,13 +6811,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs", - "rustix", + "rustix 1.1.2", "scoped-tls", "smallvec", "wayland-sys", @@ -6148,12 +6825,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.8" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.8.0", - "rustix", + "bitflags 2.9.4", + "rustix 1.1.2", "wayland-backend", "wayland-scanner", ] @@ -6164,29 +6841,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.8" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" dependencies = [ - "rustix", + "rustix 1.1.2", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.6" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6194,11 +6871,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6207,11 +6884,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6220,9 +6897,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", "quick-xml", @@ -6231,9 +6908,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "dlib", "log", @@ -6243,9 +6920,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -6267,11 +6944,20 @@ version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "wgpu" @@ -6285,7 +6971,7 @@ dependencies = [ "js-sys", "log", "naga", - "parking_lot 0.12.3", + "parking_lot 0.12.5", "profiling", "raw-window-handle", "smallvec", @@ -6306,14 +6992,14 @@ checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.8.0", + "bitflags 2.9.4", "cfg_aliases 0.1.1", "codespan-reporting", "indexmap", "log", "naga", "once_cell", - "parking_lot 0.12.3", + "parking_lot 0.12.5", "profiling", "raw-window-handle", "rustc-hash 1.1.0", @@ -6334,7 +7020,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.8.0", + "bitflags 2.9.4", "block", "cfg_aliases 0.1.1", "core-graphics-types 0.1.3", @@ -6348,14 +7034,14 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading 0.8.6", + "libloading 0.8.9", "log", "metal", "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", - "parking_lot 0.12.3", + "parking_lot 0.12.5", "profiling", "range-alloc", "raw-window-handle", @@ -6375,7 +7061,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "js-sys", "web-sys", ] @@ -6389,14 +7075,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.44", ] [[package]] name = "widestring" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" [[package]] name = "winapi" @@ -6416,11 +7102,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -6449,7 +7135,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", "windows-targets 0.52.6", ] @@ -6462,6 +7148,65 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -6498,6 +7243,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -6537,13 +7300,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6562,6 +7342,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -6580,6 +7366,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -6598,12 +7390,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -6622,6 +7426,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -6640,6 +7450,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -6658,6 +7474,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -6676,17 +7498,23 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winit" -version = "0.30.8" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.8.0", - "block2", + "bitflags 2.9.4", + "block2 0.5.1", "bytemuck", "calloop", "cfg_aliases 0.2.1", @@ -6699,16 +7527,16 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", "objc2-ui-kit", "orbclient", "percent-encoding", "pin-project", "raw-window-handle", "redox_syscall 0.4.1", - "rustix", + "rustix 0.38.44", "sctk-adwaita", "smithay-client-toolkit", "smol_str", @@ -6730,9 +7558,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.1" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -6753,30 +7581,21 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcacf11b6f48dd21b9ba002f991bdd5de29b2da8cc2800412f4b80f677e4957" dependencies = [ - "toml 0.8.20", + "toml 0.8.23", "version_check", ] [[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.8.0", -] - -[[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "x11-dl" @@ -6791,24 +7610,24 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.6", + "libloading 0.8.9", "once_cell", - "rustix", + "rustix 1.1.2", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "x25519-dalek" @@ -6823,19 +7642,9 @@ dependencies = [ [[package]] name = "xcursor" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" - -[[package]] -name = "xdg-home" -version = "1.3.0" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] name = "xkbcommon-dl" @@ -6843,7 +7652,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.4", "dlib", "log", "once_cell", @@ -6858,9 +7667,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmlwriter" @@ -6882,9 +7691,9 @@ checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -6894,25 +7703,24 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "synstructure", ] [[package]] name = "zbus" -version = "5.4.0" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" +checksum = "2d07e46d035fb8e375b2ce63ba4e4ff90a7f73cf2ffb0138b29e1158d2eaadf7" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -6923,18 +7731,16 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-util", + "futures-lite", "hex", - "nix 0.29.0", + "nix 0.30.1", "ordered-stream", "serde", "serde_repr", - "static_assertions", "tracing", "uds_windows", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "winnow", - "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -6942,14 +7748,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.4.0" +version = "5.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" +checksum = "57e797a9c847ed3ccc5b6254e8bcce056494b375b511b3d6edcec0aeb4defaca" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "zbus_names", "zvariant", "zvariant_utils", @@ -6975,51 +7781,50 @@ checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -7032,14 +7837,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -7048,13 +7864,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", ] [[package]] @@ -7081,14 +7897,13 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.3.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c951c21879c6e1d46ac5adfc34f698fefb465d498cf4ac87545849bd71bb5a" +checksum = "999dd3be73c52b1fccd109a4a81e4fcd20fab1d3599c8121b38d04e1419498db" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", "url", "winnow", "zvariant_derive", @@ -7097,27 +7912,26 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.3.0" +version = "5.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eeb539471af098d9e63faf428c71ac4cd4efe0b5baa3c8a6b991c5f2543b70e" +checksum = "6643fd0b26a46d226bd90d3f07c1b5321fe9bb7f04673cb37ac6d6883885b68e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.98", + "syn 2.0.106", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ "proc-macro2", "quote", "serde", - "static_assertions", - "syn 2.0.98", + "syn 2.0.106", "winnow", ] diff --git a/liana-gui/Cargo.toml b/liana-gui/Cargo.toml index db3fee141..b630b46f8 100644 --- a/liana-gui/Cargo.toml +++ b/liana-gui/Cargo.toml @@ -63,6 +63,8 @@ fs2 = "0.4.3" open = "5.3" encrypted_backup = { version = "0.0.1", default-features=false, features = ["miniscript_12_0"], package = "bitcoin-encrypted-backup" } +# Payjoin +payjoin = { git = "https://github.com/payjoin/rust-payjoin.git", branch = "master", features = ["v2", "io"] } [target.'cfg(windows)'.dependencies] zip = { version = "0.6", default-features=false, features = ["bzip2", "deflate"] } diff --git a/liana-gui/src/app/message.rs b/liana-gui/src/app/message.rs index 21ff8379a..fed0edb91 100644 --- a/liana-gui/src/app/message.rs +++ b/liana-gui/src/app/message.rs @@ -7,6 +7,7 @@ use liana::miniscript::bitcoin::{ Address, Txid, }; use lianad::config::Config as DaemonConfig; +use payjoin::Url; use crate::{ app::{ @@ -36,7 +37,7 @@ pub enum Message { DaemonConfigLoaded(Result<(), Error>), LoadWallet(Wallet), Info(Result), - ReceiveAddress(Result<(Address, ChildNumber), Error>), + ReceiveAddress(Result<(Address, ChildNumber, Option), Error>), /// Revealed addresses. The second element contains the start index used for the request. RevealedAddresses( Result, @@ -66,6 +67,8 @@ pub enum Message { BroadcastModal(Result, Error>), RbfModal(Box, bool, Result, Error>), Export(ImportExportMessage), + SendPayjoin(Result<(), Error>), + PayjoinInitiated(Result), } impl From for Message { diff --git a/liana-gui/src/app/state/psbt.rs b/liana-gui/src/app/state/psbt.rs index 7efca2d11..5af24f845 100644 --- a/liana-gui/src/app/state/psbt.rs +++ b/liana-gui/src/app/state/psbt.rs @@ -58,6 +58,7 @@ pub enum PsbtModal { Broadcast(BroadcastModal), Delete(DeleteModal), Export(ExportModal), + SendPayjoin(SendPayjoinModal), } impl<'a> AsRef for PsbtModal { @@ -68,6 +69,7 @@ impl<'a> AsRef for PsbtModal { Self::Broadcast(a) => a, Self::Delete(a) => a, Self::Export(a) => a, + Self::SendPayjoin(a) => a, } } } @@ -80,6 +82,7 @@ impl<'a> AsMut for PsbtModal { Self::Broadcast(a) => a, Self::Delete(a) => a, Self::Export(a) => a, + Self::SendPayjoin(a) => a, } } } @@ -88,6 +91,7 @@ pub struct PsbtState { pub wallet: Arc, pub desc_policy: LianaPolicy, pub tx: SpendTx, + pub bip21: Option, pub saved: bool, pub warning: Option, pub labels_edited: LabelsEdited, @@ -95,7 +99,7 @@ pub struct PsbtState { } impl PsbtState { - pub fn new(wallet: Arc, tx: SpendTx, saved: bool) -> Self { + pub fn new(wallet: Arc, tx: SpendTx, saved: bool, bip21: Option) -> Self { Self { desc_policy: wallet.main_descriptor.policy(), wallet, @@ -103,6 +107,7 @@ impl PsbtState { warning: None, modal: None, tx, + bip21, saved, } } @@ -182,6 +187,30 @@ impl PsbtState { Message::View(view::Message::Spend(view::SpendTxMessage::Delete)) => { self.modal = Some(PsbtModal::Delete(DeleteModal::default())); } + Message::View(view::Message::Spend(view::SpendTxMessage::SendPayjoin)) => { + let modal = SendPayjoinModal; + let cmd = modal.load(daemon); + self.modal = Some(PsbtModal::SendPayjoin(modal)); + return cmd; + } + Message::View(view::Message::Spend(view::SpendTxMessage::PayjoinInitiated)) => { + self.tx.status = SpendStatus::PayjoinInitiated; + self.modal = None; + if let Some(_payjoin_info) = self.tx.payjoin_status { + let psbt = self.tx.psbt.clone(); + // TODO: should this be an error? + let bip21 = self.bip21.clone().expect("bip21 should be set"); + return Task::perform( + async move { + daemon + .send_payjoin(bip21, &psbt) + .await + .map_err(|e| e.into()) + }, + Message::SendPayjoin, + ); + } + } Message::View(view::Message::Spend(view::SpendTxMessage::Sign)) => { if let Some(PsbtModal::Sign(SignModal { display_modal, .. })) = &mut self.modal { *display_modal = true; @@ -301,6 +330,20 @@ impl PsbtState { } } +#[derive(Default)] +pub struct SendPayjoinModal; + +impl Modal for SendPayjoinModal { + fn view<'a>(&'a self, content: Element<'a, view::Message>) -> Element<'a, view::Message> { + modal::Modal::new(content, view::psbt::payjoin_send_success_view()) + // On blur, show the psbts view + .on_blur(Some(view::Message::Spend( + view::SpendTxMessage::PayjoinInitiated, + ))) + .into() + } +} + #[derive(Default)] pub struct SaveModal { saved: bool, @@ -537,6 +580,7 @@ impl Modal for SignModal { self.signed.insert(fingerprint); let daemon = daemon.clone(); merge_signatures(&mut tx.psbt, &psbt); + if self.is_saved { return Task::perform( async move { daemon.update_spend_tx(&psbt).await.map_err(|e| e.into()) }, diff --git a/liana-gui/src/app/state/psbts.rs b/liana-gui/src/app/state/psbts.rs index e6781e54e..0437d1378 100644 --- a/liana-gui/src/app/state/psbts.rs +++ b/liana-gui/src/app/state/psbts.rs @@ -31,7 +31,7 @@ impl PsbtsPanel { } pub fn preselect(&mut self, spend_tx: SpendTx) { - let psbt_state = psbt::PsbtState::new(self.wallet.clone(), spend_tx, true); + let psbt_state = psbt::PsbtState::new(self.wallet.clone(), spend_tx, true, None); self.selected_tx = Some(psbt_state); self.warning = None; self.modal = None; @@ -81,7 +81,8 @@ impl State for PsbtsPanel { spend_tx.psbt.unsigned_tx.compute_txid() == tx.tx.psbt.unsigned_tx.compute_txid() }) { - let tx = psbt::PsbtState::new(self.wallet.clone(), tx.clone(), true); + let tx = + psbt::PsbtState::new(self.wallet.clone(), tx.clone(), true, None); let cmd = tx.load(daemon); self.selected_tx = Some(tx); return cmd; @@ -119,7 +120,7 @@ impl State for PsbtsPanel { } Message::View(view::Message::Select(i)) => { if let Some(tx) = self.spend_txs.get(i) { - let tx = psbt::PsbtState::new(self.wallet.clone(), tx.clone(), true); + let tx = psbt::PsbtState::new(self.wallet.clone(), tx.clone(), true, None); let cmd = tx.load(daemon); self.selected_tx = Some(tx); return cmd; diff --git a/liana-gui/src/app/state/receive.rs b/liana-gui/src/app/state/receive.rs index 4df5012f7..8e7a680a0 100644 --- a/liana-gui/src/app/state/receive.rs +++ b/liana-gui/src/app/state/receive.rs @@ -7,6 +7,7 @@ use liana::miniscript::bitcoin::{ Address, Network, }; use liana_ui::{widget::modal, widget::*}; +use payjoin::Url; use crate::daemon::model::LabelsLoader; use crate::dir::LianaDirectory; @@ -33,12 +34,14 @@ const PREV_ADDRESSES_PAGE_SIZE: usize = 20; pub enum Modal { VerifyAddress(VerifyAddressModal), ShowQrCode(ShowQrCodeModal), + ShowBip21QrCode(ShowBip21QrCodeModal), None, } #[derive(Debug, Default)] pub struct Addresses { list: Vec
, + bip21s: HashMap, derivation_indexes: Vec, labels: HashMap, } @@ -121,6 +124,7 @@ impl State for ReceivePanel { self.warning.as_ref(), view::receive::receive( &self.addresses.list, + &self.addresses.bip21s, &self.addresses.labels, &self.prev_addresses.list, &self.prev_addresses.labels, @@ -139,6 +143,9 @@ impl State for ReceivePanel { Modal::ShowQrCode(m) => modal::Modal::new(content, m.view()) .on_blur(Some(view::Message::Close)) .into(), + Modal::ShowBip21QrCode(m) => modal::Modal::new(content, m.view()) + .on_blur(Some(view::Message::Close)) + .into(), Modal::None => content, } } @@ -175,10 +182,13 @@ impl State for ReceivePanel { } Message::ReceiveAddress(res) => { match res { - Ok((address, derivation_index)) => { + Ok((address, derivation_index, bip21)) => { self.warning = None; - self.addresses.list.push(address); + self.addresses.list.push(address.clone()); self.addresses.derivation_indexes.push(derivation_index); + if let Some(bip21) = bip21 { + self.addresses.bip21s.insert(address, bip21); + } } Err(e) => self.warning = Some(e), } @@ -209,7 +219,7 @@ impl State for ReceivePanel { daemon .get_new_address() .await - .map(|res| (res.address, res.derivation_index)) + .map(|res| (res.address, res.derivation_index, res.bip21)) .map_err(|e| e.into()) }, Message::ReceiveAddress, @@ -294,6 +304,33 @@ impl State for ReceivePanel { } Task::none() } + Message::View(view::Message::ShowBip21QrCode(i)) => { + if let (Some(bip21), Some(index)) = ( + &self + .addresses + .bip21s + .get(self.address(i).expect("Address should be in bip21")), + self.derivation_index(i), + ) { + if let Some(modal) = ShowBip21QrCodeModal::new(bip21, *index) { + self.modal = Modal::ShowBip21QrCode(modal); + } + } + Task::none() + } + Message::View(view::Message::PayjoinInitiate) => { + let daemon = daemon.clone(); + Task::perform( + async move { + daemon + .receive_payjoin() + .await + .map(|res| (res.address, res.derivation_index, res.bip21)) + .map_err(|e| e.into()) + }, + Message::ReceiveAddress, + ) + } _ => { if let Modal::VerifyAddress(ref mut m) = self.modal { m.update(daemon, cache, message) @@ -434,6 +471,26 @@ impl ShowQrCodeModal { } } +pub struct ShowBip21QrCodeModal { + qr_code: qr_code::Data, + bip21: String, +} + +impl ShowBip21QrCodeModal { + pub fn new(bip21: &payjoin::Url, _index: ChildNumber) -> Option { + qr_code::Data::new(format!("{}", bip21)) + .ok() + .map(|qr_code| Self { + qr_code, + bip21: bip21.to_string(), + }) + } + + fn view(&self) -> Element { + view::receive::qr_modal(&self.qr_code, &self.bip21) + } +} + async fn verify_address( hw: std::sync::Arc, index: ChildNumber, @@ -484,7 +541,8 @@ mod tests { Some(json!({"method": "getnewaddress", "params": Option::::None})), Ok(json!(GetAddressResult::new( addr.clone(), - ChildNumber::from_normal_idx(0).unwrap() + ChildNumber::from_normal_idx(0).unwrap(), + None, ))), ), ]); diff --git a/liana-gui/src/app/state/spend/step.rs b/liana-gui/src/app/state/spend/step.rs index fbbb985bf..7c326ea31 100644 --- a/liana-gui/src/app/state/spend/step.rs +++ b/liana-gui/src/app/state/spend/step.rs @@ -1,7 +1,7 @@ use std::{ cmp::Ordering, collections::{HashMap, HashSet}, - convert::TryInto, + convert::{TryFrom, TryInto}, iter::FromIterator, str::FromStr, sync::Arc, @@ -17,9 +17,10 @@ use liana::{ }, spend::{SpendCreationError, MAX_FEERATE}, }; -use lianad::commands::ListCoinsEntry; +use lianad::{commands::ListCoinsEntry, payjoin::types::PayjoinStatus}; use liana_ui::{component::form, widget::Element}; +use payjoin::Uri; use crate::{ app::{ @@ -609,6 +610,38 @@ impl Step for DefineSpend { .unwrap() .update(cache.network, msg); } + view::CreateSpendMessage::Bip21Edited(i, bip21) => { + if let Some(recipient) = self.recipients.get_mut(i) { + recipient.bip21.value = bip21.clone(); + if let Ok(uri) = Uri::try_from(bip21.as_str()) { + if let Ok(address) = uri.address.require_network(cache.network) { + recipient.address.value = address.to_string(); + recipient.update( + cache.network, + view::CreateSpendMessage::RecipientEdited( + i, + "address", + address.to_string(), + ), + ); + } + if let Some(amount) = uri.amount { + recipient.amount.value = + amount.to_string_in(Denomination::Bitcoin); + recipient.update( + cache.network, + view::CreateSpendMessage::RecipientEdited( + i, + "amount", + amount.to_string_in(Denomination::Bitcoin), + ), + ); + } + } else { + self.warning = Some(SpendCreationError::InvalidBip21.into()); + } + } + } view::CreateSpendMessage::FeerateEdited(s) => { if let Ok(value) = s.parse::() { self.feerate.value = s; @@ -848,6 +881,7 @@ struct Recipient { // This is only `Some` if the user has entered a fiat amount directly. fiat_amount: Option>, fiat_converter: Option, // the converter at the time of entering the fiat amount + bip21: form::Value, is_recovery: bool, } @@ -973,6 +1007,9 @@ impl Recipient { self.label.valid = label.len() <= 100; self.label.value = label; } + view::CreateSpendMessage::Bip21Edited(_, bip21) => { + self.bip21.value = bip21; + } _ => {} }; } @@ -1011,6 +1048,7 @@ impl Recipient { &self.label, is_max_selected, self.is_recovery, + &self.bip21, ) } } @@ -1034,6 +1072,25 @@ impl SaveSpend { impl Step for SaveSpend { fn load(&mut self, _coins: &[Coin], _tip_height: i32, draft: &TransactionDraft) { let (psbt, warnings) = draft.generated.clone().unwrap(); + + let bip21 = draft + .recipients + .first() + .expect("one recipient") + .bip21 + .value + .clone(); + + let payjoin_status = if let Ok(uri) = Uri::try_from(bip21.as_str()) { + if uri.assume_checked().extras.pj_is_supported() { + Some(PayjoinStatus::Pending) + } else { + None + } + } else { + None + }; + let mut tx = SpendTx::new( None, psbt, @@ -1041,6 +1098,7 @@ impl Step for SaveSpend { &self.wallet.main_descriptor, &self.curve, draft.network, + payjoin_status, ); tx.labels.clone_from(&draft.labels); @@ -1060,7 +1118,12 @@ impl Step for SaveSpend { } self.spend = Some(( - psbt::PsbtState::new(self.wallet.clone(), tx, false), + psbt::PsbtState::new( + self.wallet.clone(), + tx, + false, + if bip21.is_empty() { None } else { Some(bip21) }, + ), warnings, )); } diff --git a/liana-gui/src/app/view/message.rs b/liana-gui/src/app/view/message.rs index dd874bacf..998354cfa 100644 --- a/liana-gui/src/app/view/message.rs +++ b/liana-gui/src/app/view/message.rs @@ -33,11 +33,13 @@ pub enum Message { SelectHardwareWallet(usize), CreateRbf(CreateRbfMessage), ShowQrCode(usize), + ShowBip21QrCode(usize), ImportExport(ImportExportMessage), HideRescanWarning, ExportPsbt, ImportPsbt, OpenUrl(String), + PayjoinInitiate, } impl Close for Message { @@ -66,6 +68,7 @@ pub enum CreateSpendMessage { Generate, SendMaxToRecipient(usize), Clear, + Bip21Edited(usize, String), } #[derive(Debug, Clone)] @@ -87,6 +90,8 @@ pub enum SpendTxMessage { EditPsbt, PsbtEdited(String), Next, + SendPayjoin, + PayjoinInitiated, } #[derive(Debug, Clone)] diff --git a/liana-gui/src/app/view/psbt.rs b/liana-gui/src/app/view/psbt.rs index d30913955..99f13787d 100644 --- a/liana-gui/src/app/view/psbt.rs +++ b/liana-gui/src/app/view/psbt.rs @@ -25,6 +25,7 @@ use liana_ui::{ icon, theme, widget::*, }; +use lianad::payjoin::types::PayjoinStatus; use crate::{ app::{ @@ -331,6 +332,10 @@ pub fn spend_header<'a>( .into() } +pub fn payjoin_send_success_view<'a>() -> Element<'a, Message> { + card::simple(text("Payjoin sent successfully")).into() +} + pub fn spend_overview_view<'a>( tx: &'a SpendTx, desc_info: &'a LianaPolicy, @@ -418,6 +423,23 @@ pub fn spend_overview_view<'a>( .width(Length::Fixed(150.0)), ) }) + .push_maybe(if tx.path_ready().is_some() { + if let Some(payjoin_status) = &tx.payjoin_status { + if *payjoin_status == PayjoinStatus::Pending { + Some( + button::secondary(None, "Send Payjoin") + .on_press(Message::Spend(SpendTxMessage::SendPayjoin)) + .width(Length::Fixed(150.0)), + ) + } else { + None + } + } else { + None + } + } else { + None + }) .align_y(Alignment::Center) .spacing(20), ) @@ -433,7 +455,43 @@ pub fn signatures<'a>( keys_aliases: &'a HashMap, ) -> Element<'a, Message> { Column::new() - .push(if let Some(sigs) = tx.path_ready() { + .push(if tx.status == SpendStatus::PayjoinInitiated { + Container::new( + scrollable( + Row::new() + .spacing(5) + .align_y(Alignment::Center) + .spacing(10) + .push(p1_bold("Status")) + .push(icon::circle_check_icon().style(theme::text::payjoin)) + .push(text("Payjoin Initiated").bold().style(theme::text::payjoin)), + ) + .direction(scrollable::Direction::Horizontal( + scrollable::Scrollbar::new().width(2).scroller_width(2), + )), + ) + .padding(15) + } else if tx.status == SpendStatus::PayjoinProposalReady { + Container::new( + scrollable( + Row::new() + .spacing(5) + .align_y(Alignment::Center) + .spacing(10) + .push(p1_bold("Status")) + .push(icon::circle_check_icon().style(theme::text::payjoin)) + .push( + text("Payjoin Proposal Ready For Signing") + .bold() + .style(theme::text::payjoin), + ), + ) + .direction(scrollable::Direction::Horizontal( + scrollable::Scrollbar::new().width(2).scroller_width(2), + )), + ) + .padding(15) + } else if let Some(sigs) = tx.path_ready() { Container::new( scrollable( Row::new() diff --git a/liana-gui/src/app/view/receive.rs b/liana-gui/src/app/view/receive.rs index fd015901a..11984922f 100644 --- a/liana-gui/src/app/view/receive.rs +++ b/liana-gui/src/app/view/receive.rs @@ -23,6 +23,7 @@ use liana_ui::{ icon, theme, widget::*, }; +use payjoin::Url; use crate::{ app::{ @@ -37,6 +38,7 @@ use super::message::Message; fn address_card<'a>( row_index: usize, address: &'a bitcoin::Address, + maybe_bip21: Option<&Url>, labels: &'a HashMap, labels_editing: &'a HashMap>, ) -> Container<'a, Message> { @@ -55,7 +57,11 @@ fn address_card<'a>( scrollable( Column::new() .push(Space::with_height(Length::Fixed(10.0))) - .push(p2_regular(address).small().style(theme::text::secondary)) + .push( + p2_regular(addr.clone()) + .small() + .style(theme::text::secondary), + ) // Space between the address and the scrollbar .push(Space::with_height(Length::Fixed(10.0))), ) @@ -74,6 +80,36 @@ fn address_card<'a>( ) .align_y(Alignment::Center), ) + .push_maybe(maybe_bip21.map(|bip21| { + Row::new() + .push( + Container::new( + scrollable( + Column::new() + .push(Space::with_height(Length::Fixed(10.0))) + .push( + p2_regular(bip21.to_string()) + .small() + .style(theme::text::secondary), + ) + // Space between the URI and the scrollbar + .push(Space::with_height(Length::Fixed(10.0))), + ) + .direction( + scrollable::Direction::Horizontal( + scrollable::Scrollbar::new().width(2).scroller_width(2), + ), + ), + ) + .width(Length::Fill), + ) + .push( + Button::new(icon::clipboard_icon().style(theme::text::secondary)) + .on_press(Message::Clipboard(bip21.to_string())) + .style(theme::button::transparent_border), + ) + .align_y(Alignment::Center) + })) .push( Row::new() .push( @@ -81,10 +117,13 @@ fn address_card<'a>( .on_press(Message::Select(row_index)), ) .push(Space::with_width(Length::Fill)) - .push( + .push(if maybe_bip21.is_some() { + button::secondary(None, "Show Bip21 QR Code") + .on_press(Message::ShowBip21QrCode(row_index)) + } else { button::secondary(None, "Show QR Code") - .on_press(Message::ShowQrCode(row_index)), - ), + .on_press(Message::ShowQrCode(row_index)) + }), ) .spacing(10), ) @@ -93,6 +132,7 @@ fn address_card<'a>( #[allow(clippy::too_many_arguments)] pub fn receive<'a>( addresses: &'a [bitcoin::Address], + bip21s: &'a HashMap, labels: &'a HashMap, prev_addresses: &'a [bitcoin::Address], prev_labels: &'a HashMap, @@ -110,6 +150,11 @@ pub fn receive<'a>( Row::new() .align_y(Alignment::Center) .push(Container::new(h3("Receive")).width(Length::Fill)) + .push( + button::secondary(Some(icon::plus_icon()), "Payjoin") + .on_press(Message::PayjoinInitiate), + ) + .spacing(10) .push({ let (icon, label) = (Some(icon::plus_icon()), "Generate address"); if addresses.is_empty() { @@ -128,8 +173,15 @@ pub fn receive<'a>( // iterate starting from most recently generated Column::new().spacing(10).width(Length::Fill), |col, (i, address)| { + let maybe_bip21 = bip21s.get(address); addresses_count += 1; - col.push(address_card(i, address, labels, labels_editing)) + col.push(address_card( + i, + address, + maybe_bip21, + labels, + labels_editing, + )) }, )), ) @@ -162,13 +214,14 @@ pub fn receive<'a>( // prev addresses are already ordered in descending order Column::new().spacing(10).width(Length::Fill), |col, (i, address)| { + let addr = address.to_string(); + let maybe_bip21 = bip21s.get(address); col.push(if !selected.contains(address) { Button::new( Row::new() .spacing(10) .push( { - let addr = address.to_string(); let addr_len = addr.chars().count(); Container::new( p2_regular(if addr_len > 2 * NUM_ADDR_CHARS { @@ -229,6 +282,7 @@ pub fn receive<'a>( Button::new(address_card( addresses_count + i, address, + maybe_bip21, prev_labels, labels_editing, )) @@ -348,6 +402,7 @@ pub fn verify_address_modal<'a>( } pub fn qr_modal<'a>(qr: &'a qr_code::Data, address: &'a String) -> Element<'a, Message> { + let max_width = if address.len() > 64 { 600 } else { 400 }; Column::new() .push( Row::new() @@ -361,6 +416,6 @@ pub fn qr_modal<'a>(qr: &'a qr_code::Data, address: &'a String) -> Element<'a, M .push(Space::with_height(Length::Fixed(15.0))) .push(Container::new(text(address).size(15)).center_x(Length::Fill)) .width(Length::Fill) - .max_width(400) + .max_width(max_width) .into() } diff --git a/liana-gui/src/app/view/spend/mod.rs b/liana-gui/src/app/view/spend/mod.rs index 6212d47db..d052b3e51 100644 --- a/liana-gui/src/app/view/spend/mod.rs +++ b/liana-gui/src/app/view/spend/mod.rs @@ -386,6 +386,7 @@ pub fn recipient_view<'a>( label: &'a form::Value, is_max_selected: bool, is_recovery: bool, + bip21: &'a form::Value, ) -> Element<'a, CreateSpendMessage> { let btc_amt = Amount::from_str_in(&amount.value, Denomination::Bitcoin).ok(); @@ -403,6 +404,25 @@ pub fn recipient_view<'a>( ), ), ) + .push( + Row::new() + .align_y(Alignment::Start) + .spacing(10) + .push( + Container::new(p1_bold("BIP21")) + .align_x(alignment::Horizontal::Right) + .padding(10) + .width(Length::Fixed(110.0)), + ) + .push( + form::Form::new_trimmed("BIP21", bip21, move |msg| { + CreateSpendMessage::Bip21Edited(index, msg) + }) + .warning("Invalid BIP21") + .size(P1_SIZE) + .padding(10), + ), + ) .push( Row::new() .align_y(Alignment::Start) diff --git a/liana-gui/src/daemon/client/mod.rs b/liana-gui/src/daemon/client/mod.rs index 6341477d9..86ab65cd4 100644 --- a/liana-gui/src/daemon/client/mod.rs +++ b/liana-gui/src/daemon/client/mod.rs @@ -5,6 +5,7 @@ use std::iter::FromIterator; use async_trait::async_trait; use lianad::bip329::Labels; use lianad::commands::{GetLabelsBip329Result, UpdateDerivIndexesResult}; +use lianad::payjoin::types::PayjoinStatus; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use serde_json::json; @@ -107,6 +108,20 @@ impl Daemon for Lianad { ) } + async fn receive_payjoin(&self) -> Result { + self.call("receivepayjoin", Option::::None) + } + + async fn send_payjoin(&self, bip21: String, psbt: &Psbt) -> Result<(), DaemonError> { + let _res: serde_json::value::Value = + self.call("sendpayjoin", Some(vec![bip21, psbt.to_string()]))?; + Ok(()) + } + + async fn get_payjoin_info(&self, txid: &Txid) -> Result { + self.call("getpayjoininfo", Some(vec![txid.to_string()])) + } + async fn update_deriv_indexes( &self, receive: Option, diff --git a/liana-gui/src/daemon/embedded.rs b/liana-gui/src/daemon/embedded.rs index 59213b2ea..611f32191 100644 --- a/liana-gui/src/daemon/embedded.rs +++ b/liana-gui/src/daemon/embedded.rs @@ -1,5 +1,5 @@ -use lianad::bip329::Labels; use lianad::commands::UpdateDerivIndexesResult; +use lianad::{bip329::Labels, payjoin::types::PayjoinStatus}; use std::collections::{HashMap, HashSet}; use tokio::sync::Mutex; @@ -120,6 +120,33 @@ impl Daemon for EmbeddedDaemon { .await } + async fn receive_payjoin(&self) -> Result { + self.command(|daemon| { + daemon + .receive_payjoin() + .map_err(|e| DaemonError::Unexpected(e.to_string())) + }) + .await + } + + async fn send_payjoin(&self, bip21: String, psbt: &Psbt) -> Result<(), DaemonError> { + self.command(|daemon| { + daemon + .init_payjoin_sender(bip21, psbt) + .map_err(|e| DaemonError::Unexpected(e.to_string())) + }) + .await + } + + async fn get_payjoin_info(&self, txid: &Txid) -> Result { + self.command(|daemon| { + daemon + .get_payjoin_info(txid) + .map_err(|e| DaemonError::Unexpected(e.to_string())) + }) + .await + } + async fn update_deriv_indexes( &self, receive: Option, diff --git a/liana-gui/src/daemon/mod.rs b/liana-gui/src/daemon/mod.rs index 3e5b148cd..97d0e83e9 100644 --- a/liana-gui/src/daemon/mod.rs +++ b/liana-gui/src/daemon/mod.rs @@ -18,6 +18,7 @@ use liana::miniscript::bitcoin::{ }; use lianad::bip329::Labels; use lianad::commands::UpdateDerivIndexesResult; +use lianad::payjoin::types::PayjoinStatus; use lianad::{ commands::{CoinStatus, LabelItem, TransactionInfo}, config::Config, @@ -118,6 +119,9 @@ pub trait Daemon: Debug { limit: usize, start_index: Option, ) -> Result; + async fn receive_payjoin(&self) -> Result; + async fn send_payjoin(&self, bip21: String, psbt: &Psbt) -> Result<(), DaemonError>; + async fn get_payjoin_info(&self, txid: &Txid) -> Result; async fn update_deriv_indexes( &self, receive: Option, @@ -212,6 +216,10 @@ pub trait Daemon: Debug { .cloned() .collect(); + let payjoin_status = self + .get_payjoin_info(&tx.psbt.unsigned_tx.compute_txid()) + .await?; + spend_txs.push(model::SpendTx::new( tx.updated_at, tx.psbt, @@ -219,6 +227,7 @@ pub trait Daemon: Debug { &info.descriptors.main, &curve, info.network, + Some(payjoin_status), )); } load_labels(self, &mut spend_txs).await?; diff --git a/liana-gui/src/daemon/model.rs b/liana-gui/src/daemon/model.rs index f9dc00f14..b70fd6bbd 100644 --- a/liana-gui/src/daemon/model.rs +++ b/liana-gui/src/daemon/model.rs @@ -15,6 +15,7 @@ pub use lianad::commands::{ ListCoinsResult, ListRevealedAddressesEntry, ListRevealedAddressesResult, ListSpendEntry, ListSpendResult, ListTransactionsResult, TransactionInfo, }; +use lianad::payjoin::types::PayjoinStatus; pub type Coin = ListCoinsEntry; @@ -53,6 +54,9 @@ pub struct SpendTx { pub sigs: PartialSpendInfo, pub updated_at: Option, pub kind: TransactionKind, + pub payjoin_status: Option, + // // TODO: use a stronger type like bitcoin_uri + // pub bip21: String, } #[derive(PartialOrd, Ord, Debug, Clone, PartialEq, Eq)] @@ -61,6 +65,8 @@ pub enum SpendStatus { Broadcast, Spent, Deprecated, + PayjoinInitiated, + PayjoinProposalReady, } impl SpendTx { @@ -71,6 +77,7 @@ impl SpendTx { desc: &LianaDescriptor, secp: &secp256k1::Secp256k1, network: Network, + payjoin_status: Option, ) -> Self { // Use primary path if no inputs are using a relative locktime. let use_primary_path = !psbt @@ -145,7 +152,7 @@ impl SpendTx { }; // One input coin is missing, the psbt is deprecated for now. - if coins_map.len() != psbt.inputs.len() { + if coins_map.len() != psbt.inputs.len() && payjoin_status.is_none() { status = SpendStatus::Deprecated } @@ -190,15 +197,27 @@ impl SpendTx { status, sigs, network, + payjoin_status, } } /// Returns the path ready if it exists. pub fn path_ready(&self) -> Option<&PathSpendInfo> { let path = self.sigs.primary_path(); + + // Check if we have signatures for all of our inputs + let has_sigs = + self.psbt.inputs.iter().any(|psbtin| { + !psbtin.partial_sigs.is_empty() && !psbtin.bip32_derivation.is_empty() + }); + if has_sigs { + return Some(path); + } + if path.sigs_count >= path.threshold { return Some(path); } + self.sigs .recovery_paths() .values() diff --git a/liana-gui/src/services/connect/client/backend/mod.rs b/liana-gui/src/services/connect/client/backend/mod.rs index c0c22ade2..6676510c7 100644 --- a/liana-gui/src/services/connect/client/backend/mod.rs +++ b/liana-gui/src/services/connect/client/backend/mod.rs @@ -17,6 +17,7 @@ use lianad::{ bip329::Labels, commands::{CoinStatus, GetInfoDescriptors, LCSpendInfo, LabelItem, UpdateDerivIndexesResult}, config::Config, + payjoin::types::PayjoinStatus, }; use reqwest::{Error, IntoUrl, Method, RequestBuilder, Response}; use tokio::sync::RwLock; @@ -610,6 +611,7 @@ impl Daemon for BackendWalletClient { Ok(GetAddressResult { address: res.address, derivation_index: res.derivation_index, + bip21: None, }) } @@ -660,6 +662,18 @@ impl Daemon for BackendWalletClient { }) } + async fn receive_payjoin(&self) -> Result { + unimplemented!() + } + + async fn send_payjoin(&self, _bip21: String, _psbt: &Psbt) -> Result<(), DaemonError> { + unimplemented!() + } + + async fn get_payjoin_info(&self, _txid: &Txid) -> Result { + unimplemented!() + } + async fn update_deriv_indexes( &self, _receive: Option, @@ -1256,6 +1270,8 @@ fn spend_tx_from_api( desc, secp, network, + // TODO: Payjoin status is getting set to None and so is bip21 + None, ); tx.load_labels(&labels); tx diff --git a/liana-ui/src/color.rs b/liana-ui/src/color.rs index 31af9f64b..489374298 100644 --- a/liana-ui/src/color.rs +++ b/liana-ui/src/color.rs @@ -67,3 +67,9 @@ pub const BLUE: Color = Color::from_rgb( 0xD3 as f32 / 255.0, 0xFC as f32 / 255.0, ); + +pub const PAYJOIN_PINK: Color = Color::from_rgb( + 0xC7 as f32 / 255.0, + 0x15 as f32 / 255.0, + 0x85 as f32 / 255.0, +); diff --git a/liana-ui/src/theme/palette.rs b/liana-ui/src/theme/palette.rs index 3a70114e2..7bdb5cefc 100644 --- a/liana-ui/src/theme/palette.rs +++ b/liana-ui/src/theme/palette.rs @@ -27,6 +27,7 @@ pub struct Text { pub warning: iced::Color, pub success: iced::Color, pub error: iced::Color, + pub payjoin: iced::Color, } #[derive(Debug, Copy, Clone, PartialEq)] @@ -202,6 +203,7 @@ impl std::default::Default for Palette { warning: color::ORANGE, success: color::GREEN, error: color::RED, + payjoin: color::PAYJOIN_PINK, }, buttons: Buttons { primary: Button { diff --git a/liana-ui/src/theme/text.rs b/liana-ui/src/theme/text.rs index 23b2977ef..2df121acb 100644 --- a/liana-ui/src/theme/text.rs +++ b/liana-ui/src/theme/text.rs @@ -57,3 +57,9 @@ pub fn error(theme: &Theme) -> Style { pub fn custom(color: iced::Color) -> Style { Style { color: Some(color) } } + +pub fn payjoin(theme: &Theme) -> Style { + Style { + color: Some(theme.colors.text.payjoin), + } +} diff --git a/liana/src/descriptors/mod.rs b/liana/src/descriptors/mod.rs index 7d75ef398..8ffb565d7 100644 --- a/liana/src/descriptors/mod.rs +++ b/liana/src/descriptors/mod.rs @@ -1,3 +1,4 @@ +use log::warn; use miniscript::{ bitcoin::{ self, @@ -519,7 +520,9 @@ impl LianaDescriptor { if txin.sequence != first_txin.sequence || spend_info != self.partial_spend_info_txin(psbt_in, txin) { - return Err(LianaDescError::InconsistentPsbt); + // TODO(arturgontijo): Skip for now + warn!("LianaDescError::InconsistentPsbt: Not throwing..."); + // return Err(LianaDescError::InconsistentPsbt); } } diff --git a/liana/src/spend.rs b/liana/src/spend.rs index c4f350cfc..a55e2e601 100644 --- a/liana/src/spend.rs +++ b/liana/src/spend.rs @@ -55,6 +55,8 @@ pub enum SpendCreationError { SanityCheckFailure(Psbt), FetchingTransaction(bitcoin::OutPoint), CoinSelection(InsufficientFunds), + // TODO: wrap more specific error + InvalidBip21, } impl fmt::Display for SpendCreationError { @@ -84,6 +86,7 @@ impl fmt::Display for SpendCreationError { "BUG! Please report this. Failed sanity checks for PSBT '{}'.", psbt ), + Self::InvalidBip21 => write!(f, "Invalid BIP21"), } } } diff --git a/lianad/Cargo.toml b/lianad/Cargo.toml index 61237fc8f..942f70812 100644 --- a/lianad/Cargo.toml +++ b/lianad/Cargo.toml @@ -59,3 +59,7 @@ jsonrpc = { version = "0.17", features = ["minreq_http"], default-features = fal # import/export labels bip329 = { version = "0.3.0", default-features = false } + +# Payjoin +payjoin = { git = "https://github.com/payjoin/rust-payjoin.git", branch = "master", features = ["v2", "io"] } +reqwest = { version = "0.11", default-features=false, features = ["json", "rustls-tls", "stream", "blocking"] } diff --git a/lianad/src/bitcoin/d/mod.rs b/lianad/src/bitcoin/d/mod.rs index 427a16248..235166d7d 100644 --- a/lianad/src/bitcoin/d/mod.rs +++ b/lianad/src/bitcoin/d/mod.rs @@ -1231,6 +1231,21 @@ impl BitcoinD { .collect() } + /// Test whether raw transactions would be accepted by the mempool. + pub fn test_mempool_accept(&self, rawtxs: Vec) -> Vec { + let hex_txs: Json = rawtxs.into_iter().map(|tx| serde_json::json!(tx)).collect(); + self.make_node_request("testmempoolaccept", params!(hex_txs)) + .as_array() + .expect("Always returns an array") + .iter() + .map(|e| { + e.get("allowed") + .and_then(|v| v.as_bool()) + .expect("Each result must have an 'allowed' boolean") + }) + .collect() + } + /// Stop bitcoind. pub fn stop(&self) { self.make_node_request("stop", None); diff --git a/lianad/src/bitcoin/mod.rs b/lianad/src/bitcoin/mod.rs index 26e755df8..742ff51f6 100644 --- a/lianad/src/bitcoin/mod.rs +++ b/lianad/src/bitcoin/mod.rs @@ -133,6 +133,11 @@ pub trait BitcoinInterface: Send { /// /// Returns `None` if the transaction is not in the mempool. fn mempool_entry(&self, txid: &bitcoin::Txid) -> Option; + + /// Test if given raw txs will be accepted by mempool. + /// + /// Returns `None` if the transaction is not in the mempool. + fn test_mempool_accept(&self, rawtxs: Vec) -> Vec; } impl BitcoinInterface for d::BitcoinD { @@ -402,6 +407,10 @@ impl BitcoinInterface for d::BitcoinD { fn mempool_entry(&self, txid: &bitcoin::Txid) -> Option { self.mempool_entry(txid) } + + fn test_mempool_accept(&self, rawtxs: Vec) -> Vec { + self.test_mempool_accept(rawtxs) + } } impl BitcoinInterface for electrum::Electrum { @@ -589,6 +598,10 @@ impl BitcoinInterface for electrum::Electrum { fn tip_time(&self) -> Option { self.client().tip_time().ok() } + + fn test_mempool_accept(&self, _rawtxs: Vec) -> Vec { + todo!() + } } // FIXME: do we need to repeat the entire trait implementation? Isn't there a nicer way? @@ -694,6 +707,10 @@ impl BitcoinInterface for sync::Arc> fn mempool_entry(&self, txid: &bitcoin::Txid) -> Option { self.lock().unwrap().mempool_entry(txid) } + + fn test_mempool_accept(&self, rawtxs: Vec) -> Vec { + self.lock().unwrap().test_mempool_accept(rawtxs) + } } // FIXME: We could avoid this type (and all the conversions entailing allocations) if bitcoind diff --git a/lianad/src/bitcoin/poller/looper.rs b/lianad/src/bitcoin/poller/looper.rs index 8654a6b49..caca969dd 100644 --- a/lianad/src/bitcoin/poller/looper.rs +++ b/lianad/src/bitcoin/poller/looper.rs @@ -1,6 +1,7 @@ use crate::{ bitcoin::{BitcoinInterface, BlockChainTip, UTxO, UTxOAddress}, database::{Coin, DatabaseConnection, DatabaseInterface}, + payjoin::{receiver::payjoin_receiver_check, sender::payjoin_sender_check}, }; use std::{collections::HashSet, convert::TryInto, sync, thread, time}; @@ -28,7 +29,7 @@ fn update_coins( bit: &impl BitcoinInterface, db_conn: &mut Box, previous_tip: &BlockChainTip, - descs: &[descriptors::SinglePathLianaDesc], + desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, ) -> UpdatedCoins { let network = db_conn.network(); @@ -36,6 +37,10 @@ fn update_coins( log::debug!("Current coins: {:?}", curr_coins); // Start by fetching newly received coins. + let descs = &[ + desc.receive_descriptor().clone(), + desc.change_descriptor().clone(), + ]; let mut received = Vec::new(); for utxo in bit.received_coins(previous_tip, descs) { let UTxO { @@ -241,7 +246,7 @@ fn new_tip(bit: &impl BitcoinInterface, current_tip: &BlockChainTip) -> TipUpdat fn updates( db_conn: &mut Box, bit: &mut impl BitcoinInterface, - descs: &[descriptors::SinglePathLianaDesc], + desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, ) { // Check if there was a new block before we update our state. @@ -264,7 +269,7 @@ fn updates( // between our former chain and the new one, then restart fresh. db_conn.rollback_tip(&new_tip); log::info!("Tip was rolled back to '{}'.", new_tip); - return updates(db_conn, bit, descs, secp); + return updates(db_conn, bit, desc, secp); } } } @@ -285,23 +290,23 @@ fn updates( &reorg_common_ancestor ); } - return updates(db_conn, bit, descs, secp); + return updates(db_conn, bit, desc, secp); } Err(e) => { log::error!("Error syncing wallet: '{}'.", e); thread::sleep(time::Duration::from_secs(2)); - return updates(db_conn, bit, descs, secp); + return updates(db_conn, bit, desc, secp); } }; // Then check the state of our coins. Do it even if the tip did not change since last poll, as // we may have unconfirmed transactions. - let updated_coins = update_coins(bit, db_conn, ¤t_tip, descs, secp); + let updated_coins = update_coins(bit, db_conn, ¤t_tip, desc, secp); // If the tip changed while we were polling our Bitcoin interface, start over. if bit.chain_tip() != latest_tip { log::info!("Chain tip changed while we were updating our state. Starting over."); - return updates(db_conn, bit, descs, secp); + return updates(db_conn, bit, desc, secp); } // Transactions must be added to the DB before coins due to foreign key constraints. @@ -330,7 +335,7 @@ fn updates( fn rescan_check( db_conn: &mut Box, bit: &mut impl BitcoinInterface, - descs: &[descriptors::SinglePathLianaDesc], + desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, ) { log::debug!("Checking the state of an ongoing rescan if there is any"); @@ -368,7 +373,7 @@ fn rescan_check( "Rolling back our internal tip to '{}' to update our internal state with past transactions.", rescan_tip ); - updates(db_conn, bit, descs, secp) + updates(db_conn, bit, desc, secp) } else { log::debug!("No ongoing rescan."); } @@ -399,11 +404,13 @@ pub fn poll( bit: &mut sync::Arc>, db: &sync::Arc>, secp: &secp256k1::Secp256k1, - descs: &[descriptors::SinglePathLianaDesc], + desc: &descriptors::LianaDescriptor, ) { let mut db_conn = db.connection(); - updates(&mut db_conn, bit, descs, secp); - rescan_check(&mut db_conn, bit, descs, secp); + updates(&mut db_conn, bit, desc, secp); + rescan_check(&mut db_conn, bit, desc, secp); + payjoin_sender_check(db); + payjoin_receiver_check(db, bit, desc, secp); let now: u32 = time::SystemTime::now() .duration_since(time::UNIX_EPOCH) .expect("current system time must be later than epoch") diff --git a/lianad/src/bitcoin/poller/mod.rs b/lianad/src/bitcoin/poller/mod.rs index bbc11933e..f606e7758 100644 --- a/lianad/src/bitcoin/poller/mod.rs +++ b/lianad/src/bitcoin/poller/mod.rs @@ -23,8 +23,7 @@ pub struct Poller { bit: sync::Arc>, db: sync::Arc>, secp: secp256k1::Secp256k1, - // The receive and change descriptors (in this order). - descs: [descriptors::SinglePathLianaDesc; 2], + desc: descriptors::LianaDescriptor, } impl Poller { @@ -34,10 +33,6 @@ impl Poller { desc: descriptors::LianaDescriptor, ) -> Poller { let secp = secp256k1::Secp256k1::verification_only(); - let descs = [ - desc.receive_descriptor().clone(), - desc.change_descriptor().clone(), - ]; // On first startup the tip may be NULL. Make sure it's set as the poller relies on it. looper::maybe_initialize_tip(&bit, &db); @@ -46,7 +41,7 @@ impl Poller { bit, db, secp, - descs, + desc, } } @@ -108,7 +103,7 @@ impl Poller { // poll too soon. last_poll = Some(time::Instant::now()); if synced { - looper::poll(&mut self.bit, &self.db, &self.secp, &self.descs); + looper::poll(&mut self.bit, &self.db, &self.secp, &self.desc); } else { log::warn!("Skipped poll as block chain is still synchronizing."); } @@ -142,7 +137,7 @@ impl Poller { } } - looper::poll(&mut self.bit, &self.db, &self.secp, &self.descs); + looper::poll(&mut self.bit, &self.db, &self.secp, &self.desc); } } } diff --git a/lianad/src/commands/mod.rs b/lianad/src/commands/mod.rs index 1ff60886d..30be76553 100644 --- a/lianad/src/commands/mod.rs +++ b/lianad/src/commands/mod.rs @@ -8,6 +8,11 @@ use crate::{ bitcoin::BitcoinInterface, database::{Coin, DatabaseConnection, DatabaseInterface}, miniscript::bitcoin::absolute::LockTime, + payjoin::{ + db::{ReceiverPersister, SenderPersister}, + helpers::{fetch_ohttp_keys, FetchOhttpKeysError, OHTTP_RELAY, PAYJOIN_DIRECTORY}, + types::PayjoinStatus, + }, poller::PollerMessage, DaemonControl, VERSION, }; @@ -22,6 +27,7 @@ use liana::{ }, }; +use log::info; use utils::{ deser_addr_assume_checked, deser_amount_from_sats, deser_fromstr, deser_hex, ser_amount, ser_hex, ser_to_string, @@ -29,9 +35,10 @@ use utils::{ use std::{ collections::{hash_map, HashMap, HashSet}, - convert::TryInto, + convert::{TryFrom, TryInto}, fmt, - sync::{self, mpsc}, + str::FromStr, + sync::{self, mpsc, Arc}, time::SystemTime, }; @@ -43,6 +50,12 @@ use miniscript::{ }, psbt::PsbtExt, }; +use payjoin::{ + bitcoin::{key::Secp256k1, FeeRate}, + receive::v2::{replay_event_log as replay_receiver_event_log, Receiver, UninitializedReceiver}, + send::v2::{replay_event_log as replay_sender_event_log, SenderBuilder}, + Uri, UriExt, Url, +}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, PartialEq, Eq)] @@ -74,6 +87,9 @@ pub enum CommandError { InvalidDerivationIndex, RbfError(RbfErrorInfo), EmptyFilterList, + FailedToFetchOhttpKeys(FetchOhttpKeysError), + // Same FIXME as `SpendFinalization` + FailedToPostOriginalPayjoinProposal(String), } impl fmt::Display for CommandError { @@ -132,6 +148,10 @@ impl fmt::Display for CommandError { } Self::RbfError(e) => write!(f, "RBF error: '{}'.", e), Self::EmptyFilterList => write!(f, "Filter list is empty, should supply None instead."), + Self::FailedToFetchOhttpKeys(e) => write!(f, "Failed to fetch OHTTP keys: '{}'.", e), + Self::FailedToPostOriginalPayjoinProposal(e) => { + write!(f, "Failed to post original payjoin proposal: '{}'.", e) + } } } } @@ -359,7 +379,109 @@ impl DaemonControl { .receive_descriptor() .derive(new_index, &self.secp) .address(self.config.bitcoin_config.network); - GetAddressResult::new(address, new_index) + GetAddressResult::new(address, new_index, None) + } + + pub fn receive_payjoin(&self) -> Result { + let mut db_conn = self.db.connection(); + + let ohttp_keys = if let Some(entry) = db_conn.payjoin_get_ohttp_keys(OHTTP_RELAY) { + entry.1 + } else { + let ohttp_keys = + std::thread::spawn(move || fetch_ohttp_keys(OHTTP_RELAY, PAYJOIN_DIRECTORY)) + .join() + .unwrap() + .map_err(CommandError::FailedToFetchOhttpKeys)?; + db_conn.payjoin_save_ohttp_keys(OHTTP_RELAY, ohttp_keys.clone()); + ohttp_keys + }; + + let index = db_conn.receive_index(); + let new_index = index + .increment() + .expect("Can't get into hardened territory"); + db_conn.set_receive_index(new_index, &self.secp); + let address = self + .config + .main_descriptor + .receive_descriptor() + .derive(new_index, &self.secp) + .address(self.config.bitcoin_config.network); + + let persister = ReceiverPersister::new(Arc::new(self.db.clone())); + let session = Receiver::::create_session( + address.clone(), + PAYJOIN_DIRECTORY, + ohttp_keys.clone(), + None, + ) + .save(&persister) + .unwrap(); + + Ok(GetAddressResult::new( + address, + new_index, + Some(Url::from_str(session.pj_uri().to_string().as_str()).expect("Should be valid")), + )) + } + + /// Initiate a payjoin sender + // TODO bip21 should be a uri not a string + // TODO: min fee rate should be a param + pub fn init_payjoin_sender(&self, bip21: String, psbt: &Psbt) -> Result<(), CommandError> { + // TODO: validate bip21 in uri + let uri = Uri::try_from(bip21.clone()) + .map_err(|e| format!("Failed to create URI from BIP21: {}", e)) + .unwrap(); + let uri = uri.assume_checked(); + let uri = uri + .check_pj_supported() + .map_err(|_| "URI does not support Payjoin".to_string()) + .unwrap(); + + let mut signed_psbt = psbt.clone(); + signed_psbt + .finalize_mut(&Secp256k1::verification_only()) + // Just display the first error + .map_err(|e| CommandError::FailedToPostOriginalPayjoinProposal(e[0].to_string()))?; + + let mut original_psbt = psbt.clone(); + for (index, input) in original_psbt.inputs.iter_mut().enumerate() { + input.partial_sigs = Default::default(); + input.final_script_witness = signed_psbt.inputs[index].final_script_witness.clone(); + } + + let original_txid = original_psbt.unsigned_tx.compute_txid(); + let persister = SenderPersister::new(Arc::new(self.db.clone()), &original_txid); + let _sender = SenderBuilder::new(original_psbt.clone(), uri) + .build_recommended(FeeRate::BROADCAST_MIN) + .save(&persister) + .unwrap(); + + Ok(()) + } + + /// Get Payjoin URI (BIP21) and its sender/receiver status by txid + pub fn get_payjoin_info(&self, txid: &bitcoin::Txid) -> Result { + let mut db_conn = self.db.connection(); + info!("Getting payjoin info for txid: {:?}", txid); + if let Some(session_id) = db_conn.get_payjoin_receiver_session_id_from_txid(txid) { + let persister = + ReceiverPersister::from_id(Arc::new(self.db.clone()), session_id.clone()); + let (state, _) = replay_receiver_event_log(&persister).unwrap(); + return Ok(state.into()); + } + + if let Some(session_id) = db_conn.get_payjoin_sender_session_id_from_txid(txid) { + log::info!("Checking sender session: {:?}", session_id); + let persister = SenderPersister::from_id(Arc::new(self.db.clone()), session_id.clone()); + let (state, _) = replay_sender_event_log(&persister).unwrap(); + log::info!("Sender state: {:?}", state); + return Ok(state.into()); + } + + Ok(PayjoinStatus::Unknown) } /// Update derivation indexes @@ -901,14 +1023,13 @@ impl DaemonControl { let mut spend_psbt = db_conn .spend_tx(txid) .ok_or(CommandError::UnknownSpend(*txid))?; - spend_psbt.finalize_mut(&self.secp).map_err(|e| { - CommandError::SpendFinalization( - e.into_iter() - .next() - .map(|e| e.to_string()) - .unwrap_or_default(), - ) - })?; + + for index in 0..spend_psbt.inputs.len() { + match spend_psbt.finalize_inp_mut(&self.secp, index) { + Ok(_) => log::info!("Finalizing input at: {}", index), + Err(e) => log::warn!("Not finalizing input at: {} | {}", index, e), + } + } // Then, broadcast it (or try to, we never know if we are not going to hit an // error at broadcast time). @@ -1372,13 +1493,19 @@ pub struct GetAddressResult { #[serde(deserialize_with = "deser_addr_assume_checked")] pub address: bitcoin::Address, pub derivation_index: bip32::ChildNumber, + pub bip21: Option, } impl GetAddressResult { - pub fn new(address: bitcoin::Address, derivation_index: bip32::ChildNumber) -> Self { + pub fn new( + address: bitcoin::Address, + derivation_index: bip32::ChildNumber, + bip21: Option, + ) -> Self { Self { address, derivation_index, + bip21, } } } diff --git a/lianad/src/database/mod.rs b/lianad/src/database/mod.rs index 57c4a835a..108f24cae 100644 --- a/lianad/src/database/mod.rs +++ b/lianad/src/database/mod.rs @@ -10,6 +10,7 @@ use crate::{ schema::{DbBlockInfo, DbCoin, DbTip}, SqliteConn, SqliteDb, }, + payjoin::db::SessionId, }; use std::{ @@ -22,6 +23,7 @@ use std::{ use bip329::Labels; use miniscript::bitcoin::{self, bip32, psbt::Psbt, secp256k1, Address, Network, OutPoint, Txid}; +use payjoin::OhttpKeys; /// Information about the wallet. /// @@ -194,6 +196,74 @@ pub trait DatabaseConnection { /// Dump all labels fn get_labels_bip329(&mut self, offset: u32, limit: u32) -> Labels; + + /// Get the next Session Id + fn payjoin_get_ohttp_keys(&mut self, ohttp_relay: &str) -> Option<(u32, OhttpKeys)>; + + /// Save OHttpKeys + fn payjoin_save_ohttp_keys(&mut self, ohttp_relay: &str, ohttp_keys: OhttpKeys); + + /// Save Receiver Session + fn save_new_payjoin_receiver_session(&mut self) -> i64; + + /// Save original txid for a receiver session + fn save_receiver_session_original_txid( + &mut self, + session_id: &SessionId, + original_txid: &bitcoin::Txid, + ); + + /// Save proposed txid for a receiver session + fn save_receiver_session_proposed_txid( + &mut self, + session_id: &SessionId, + proposed_txid: &bitcoin::Txid, + ); + + /// Get receiver session id from txid -- this will return the session id if the txid is a proposed payjoin txid or the original txid + fn get_payjoin_receiver_session_id_from_txid( + &mut self, + txid: &bitcoin::Txid, + ) -> Option; + + /// Get all Receiver Sessions + fn get_all_active_receiver_session_ids(&mut self) -> Vec; + + /// Save a Receiver Session Event + fn save_receiver_session_event(&mut self, session_id: &SessionId, event: Vec); + + /// Update completed at timestamp for a Receiver Session + /// Sets completed_at to current timestamp + fn update_receiver_session_completed_at(&mut self, session_id: &SessionId); + + /// Load all receiver session events for a particular session id + fn load_receiver_session_events(&mut self, session_id: &SessionId) -> Vec>; + + /// Check if input has been seen before and then add it to the input_seen table + fn insert_input_seen_before(&mut self, outpoints: &[bitcoin::OutPoint]) -> bool; + + /// Create a payjoin sender + fn save_new_payjoin_sender_session(&mut self, original_txid: &bitcoin::Txid) -> i64; + /// Get a all active payjoin senders + fn get_all_active_sender_session_ids(&mut self) -> Vec; + + /// Save a sender session event + fn save_sender_session_event(&mut self, session_id: &SessionId, event: Vec); + + /// Get all sender session events for a particular session id + fn get_all_sender_session_events(&mut self, session_id: &SessionId) -> Vec>; + + /// Update the completed at timestamp for a sender session + fn update_sender_session_completed_at(&mut self, session_id: &SessionId); + + /// Save the proposed txid for a sender session + fn save_proposed_payjoin_txid(&mut self, session_id: &SessionId, proposed_txid: &bitcoin::Txid); + + /// Get payjoin session id from txid -- this will return the session id if the txid is a proposed payjoin txid or the original txid + fn get_payjoin_sender_session_id_from_txid( + &mut self, + txid: &bitcoin::Txid, + ) -> Option; } impl DatabaseConnection for SqliteConn { @@ -416,6 +486,96 @@ impl DatabaseConnection for SqliteConn { }) .collect() } + + fn insert_input_seen_before(&mut self, outpoints: &[bitcoin::OutPoint]) -> bool { + self.insert_outpoint_seen_before(outpoints) + } + + fn payjoin_get_ohttp_keys(&mut self, ohttp_relay: &str) -> Option<(u32, OhttpKeys)> { + self.payjoin_get_ohttp_keys(ohttp_relay) + } + + fn payjoin_save_ohttp_keys(&mut self, ohttp_relay: &str, ohttp_keys: OhttpKeys) { + self.payjoin_save_ohttp_keys(ohttp_relay, ohttp_keys) + } + + fn save_new_payjoin_receiver_session(&mut self) -> i64 { + self.save_new_payjoin_receiver_session() + } + + fn get_all_active_receiver_session_ids(&mut self) -> Vec { + self.get_all_active_receiver_session_ids() + } + + fn save_receiver_session_original_txid( + &mut self, + session_id: &SessionId, + original_txid: &bitcoin::Txid, + ) { + self.update_receiver_session_original_txid(session_id, original_txid) + } + + fn save_receiver_session_proposed_txid( + &mut self, + session_id: &SessionId, + proposed_txid: &bitcoin::Txid, + ) { + self.update_receiver_session_proposed_txid(session_id, proposed_txid) + } + + fn get_payjoin_receiver_session_id_from_txid( + &mut self, + txid: &bitcoin::Txid, + ) -> Option { + self.get_payjoin_receiver_session_id(txid) + } + + fn save_receiver_session_event(&mut self, session_id: &SessionId, event: Vec) { + self.save_receiver_session_event(session_id, event) + } + + fn update_receiver_session_completed_at(&mut self, session_id: &SessionId) { + self.update_receiver_session_completed_at(session_id) + } + + fn load_receiver_session_events(&mut self, session_id: &SessionId) -> Vec> { + self.load_receiver_session_events(session_id) + } + + fn save_new_payjoin_sender_session(&mut self, original_txid: &bitcoin::Txid) -> i64 { + self.save_new_payjoin_sender_session(original_txid) + } + + fn get_all_active_sender_session_ids(&mut self) -> Vec { + self.get_all_active_sender_session_ids() + } + + fn save_sender_session_event(&mut self, session_id: &SessionId, event: Vec) { + self.save_sender_session_event(session_id, event) + } + + fn get_all_sender_session_events(&mut self, session_id: &SessionId) -> Vec> { + self.load_sender_session_events(session_id) + } + + fn update_sender_session_completed_at(&mut self, session_id: &SessionId) { + self.update_sender_session_completed_at(session_id) + } + + fn save_proposed_payjoin_txid( + &mut self, + session_id: &SessionId, + proposed_txid: &bitcoin::Txid, + ) { + self.save_proposed_payjoin_txid(session_id, proposed_txid) + } + + fn get_payjoin_sender_session_id_from_txid( + &mut self, + txid: &bitcoin::Txid, + ) -> Option { + self.get_payjoin_sender_session_id(txid) + } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/lianad/src/database/sqlite/mod.rs b/lianad/src/database/sqlite/mod.rs index 5f6876ee0..891620dc5 100644 --- a/lianad/src/database/sqlite/mod.rs +++ b/lianad/src/database/sqlite/mod.rs @@ -25,8 +25,10 @@ use crate::{ }, Coin, CoinStatus, LabelItem, }, + payjoin::db::SessionId, }; use liana::descriptors::LianaDescriptor; +use payjoin::{bitcoin::consensus::Encodable, OhttpKeys}; use std::{ cmp, @@ -479,6 +481,34 @@ impl SqliteConn { .expect("Database must be available") } + pub fn insert_outpoint_seen_before<'a>( + &mut self, + outpoints: impl IntoIterator, + ) -> bool { + let mut is_duplicate = false; + db_exec(&mut self.conn, |db_tx| { + for outpoint in outpoints { + let mut buf = Vec::new(); + outpoint + .consensus_encode(&mut buf) + .expect("Outpoint must encode"); + let affected = db_tx.execute( + "INSERT OR IGNORE INTO payjoin_outpoints (outpoint, added_at) \ + VALUES (?1, ?2)", + rusqlite::params![buf, curr_timestamp()], + )?; + + if affected == 0 { + is_duplicate = true + } + } + Ok(()) + }) + .expect("database must be available"); + + is_duplicate + } + /// Remove a set of coins from the database. pub fn remove_coins(&mut self, outpoints: &[bitcoin::OutPoint]) { db_exec(&mut self.conn, |db_tx| { @@ -963,6 +993,270 @@ impl SqliteConn { }) .expect("Db must not fail"); } + + /// Fetch Payjoin OHttpKeys and their timestamp + pub fn payjoin_get_ohttp_keys(&mut self, relay_url: &str) -> Option<(u32, OhttpKeys)> { + let entries = db_query( + &mut self.conn, + "SELECT timestamp, key FROM payjoin_ohttp_keys WHERE relay_url = ?1 ORDER BY timestamp DESC LIMIT 1", + rusqlite::params![relay_url], + |row| { + let timestamp: u32 = row.get(0)?; + let ohttp_keys_ser: Vec = row.get(1)?; + let ohttp_keys = OhttpKeys::decode(&ohttp_keys_ser).unwrap(); + Ok((timestamp, ohttp_keys)) + }, + ) + .expect("Db must not fail"); + + // Check timestamp (7-days) + if let Some(entry) = entries.first().cloned() { + let now = curr_timestamp(); + let seven_days_ago = now.saturating_sub(7 * 24 * 60 * 60); + if entry.0 < seven_days_ago { + // Delete entry + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "DELETE FROM payjoin_ohttp_keys WHERE relay_url = ?1", + rusqlite::params![relay_url], + )?; + Ok(()) + }) + .expect("Db must not fail"); + return None; + } else { + return Some(entry); + } + } + None + } + + /// Store new OHttpKeys with timestamp + pub fn payjoin_save_ohttp_keys(&mut self, relay_url: &str, ohttp_keys: OhttpKeys) { + let ohttp_keys_ser = ohttp_keys.encode().unwrap(); + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "INSERT INTO payjoin_ohttp_keys (relay_url, timestamp, key) VALUES (?1, ?2, ?3)", + rusqlite::params![relay_url, curr_timestamp(), ohttp_keys_ser], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Create new Receiver Session + pub fn save_new_payjoin_receiver_session(&mut self) -> i64 { + // TODO: is there a more elegant way to get the last insert row id atomically? + let mut id = 0i64; + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "INSERT INTO payjoin_receivers (created_at) VALUES (?1)", + rusqlite::params![curr_timestamp()], + )?; + + id = db_tx.last_insert_rowid(); + Ok(()) + }) + .expect("Db must not fail"); + id + } + + /// Get all active receiver session ids + pub fn get_all_active_receiver_session_ids(&mut self) -> Vec { + db_query( + &mut self.conn, + "SELECT id FROM payjoin_receivers WHERE completed_at IS NULL", + rusqlite::params![], + |row| { + let id: i64 = row.get(0)?; + Ok(SessionId::new(id)) + }, + ) + .expect("Db must not fail") + } + + /// Save a Receiver Session Event + pub fn save_receiver_session_event(&mut self, session_id: &SessionId, event: Vec) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "INSERT INTO payjoin_receiver_events (session_id, created_at, event) VALUES (?1, ?2, ?3)", + rusqlite::params![session_id.0, curr_timestamp(), event], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Update completed at timestamp for a Receiver Session + pub fn update_receiver_session_completed_at(&mut self, session_id: &SessionId) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "UPDATE payjoin_receivers SET completed_at = ?1 WHERE id = ?2", + rusqlite::params![curr_timestamp(), session_id.0], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Load all receiver session events for a particular session id + pub fn load_receiver_session_events(&mut self, session_id: &SessionId) -> Vec> { + db_query( + &mut self.conn, + "SELECT event FROM payjoin_receiver_events WHERE session_id = ?1 ORDER BY created_at ASC", + rusqlite::params![session_id.0], + |row| { + let event: Vec = row.get(0)?; + Ok(event) + }, + ) + .expect("Db must not fail") + } + + /// Save original txid for a sender session + pub fn update_receiver_session_original_txid( + &mut self, + session_id: &SessionId, + original_txid: &bitcoin::Txid, + ) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "UPDATE payjoin_receivers SET original_txid = ?1 WHERE id = ?2", + rusqlite::params![original_txid[..].to_vec(), session_id.0], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Save proposed txid for a sender session + pub fn update_receiver_session_proposed_txid( + &mut self, + session_id: &SessionId, + proposed_txid: &bitcoin::Txid, + ) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "UPDATE payjoin_receivers SET proposed_txid = ?1 WHERE id = ?2", + rusqlite::params![proposed_txid[..].to_vec(), session_id.0], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Get receiver session id from txid -- this will return the session id if the txid is a proposed payjoin txid or the original txid + pub fn get_payjoin_receiver_session_id(&mut self, txid: &bitcoin::Txid) -> Option { + // TODO: This should always be one row. + let session_id = db_query( + &mut self.conn, + "SELECT id FROM payjoin_receivers WHERE proposed_txid = ?1 or original_txid = ?1", + rusqlite::params![txid[..].to_vec()], + |row| { + let id: i64 = row.get(0)?; + Ok(SessionId::new(id)) + }, + ) + .expect("Db must not fail"); + session_id.first().cloned() + } + + pub fn save_new_payjoin_sender_session(&mut self, original_txid: &bitcoin::Txid) -> i64 { + let mut id = 0i64; + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "INSERT INTO payjoin_senders (created_at, original_txid) VALUES (?1, ?2)", + rusqlite::params![curr_timestamp(), original_txid[..].to_vec()], + )?; + id = db_tx.last_insert_rowid(); + Ok(()) + }) + .expect("Db must not fail"); + id + } + + /// Get all active sender session ids + pub fn get_all_active_sender_session_ids(&mut self) -> Vec { + db_query( + &mut self.conn, + "SELECT id FROM payjoin_senders WHERE completed_at IS NULL", + rusqlite::params![], + |row| { + let id: i64 = row.get(0)?; + Ok(SessionId::new(id)) + }, + ) + .expect("Db must not fail") + } + + pub fn save_sender_session_event(&mut self, session_id: &SessionId, event: Vec) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "INSERT INTO payjoin_sender_events (session_id, created_at, event) VALUES (?1, ?2, ?3)", + rusqlite::params![session_id.0, curr_timestamp(), event], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + pub fn update_sender_session_completed_at(&mut self, session_id: &SessionId) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "UPDATE payjoin_senders SET completed_at = ?1 WHERE id = ?2", + rusqlite::params![curr_timestamp(), session_id.0], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + pub fn load_sender_session_events(&mut self, session_id: &SessionId) -> Vec> { + db_query( + &mut self.conn, + "SELECT event FROM payjoin_sender_events WHERE session_id = ?1 ORDER BY created_at ASC", + rusqlite::params![session_id.0], + |row| { + let event: Vec = row.get(0)?; + Ok(event) + }, + ) + .expect("Db must not fail") + } + + /// Save the proposed txid for a sender session + pub fn save_proposed_payjoin_txid( + &mut self, + session_id: &SessionId, + proposed_txid: &bitcoin::Txid, + ) { + db_exec(&mut self.conn, |db_tx| { + db_tx.execute( + "UPDATE payjoin_senders SET proposed_txid = ?1 WHERE id = ?2", + rusqlite::params![proposed_txid[..].to_vec(), session_id.0], + )?; + Ok(()) + }) + .expect("Db must not fail"); + } + + /// Get the payjoin session id from a txid + /// + /// This will return the session id if the txid is a proposed payjoin txid or the original txid + pub fn get_payjoin_sender_session_id(&mut self, txid: &bitcoin::Txid) -> Option { + // TODO: This should always be one row. + let session_id = db_query( + &mut self.conn, + "SELECT id FROM payjoin_senders WHERE proposed_txid = ?1 or original_txid = ?1", + rusqlite::params![txid[..].to_vec()], + |row| { + let id: i64 = row.get(0)?; + Ok(SessionId::new(id)) + }, + ) + .expect("Db must not fail"); + session_id.first().cloned() + } } #[cfg(test)] @@ -3095,8 +3389,8 @@ CREATE TABLE labels ( // Two PSBTs we'll insert in the DB before and after the migration. Note they are random // PSBTs taken from the descriptor unit tests, it doesn't matter. - let first_psbt = psbt_from_str("cHNidP8BAIkCAAAAAWi3OFgkj1CqCDT3Swm8kbxZS9lxz4L3i4W2v9KGC7nqAQAAAAD9////AkANAwAAAAAAIgAg27lNc1rog+dOq80ohRuds4Hgg/RcpxVun2XwgpuLSrFYMwwAAAAAACIAIDyWveqaElWmFGkTbFojg1zXWHODtiipSNjfgi2DqBy9AAAAAAABAOoCAAAAAAEBsRWl70USoAFFozxc86pC7Dovttdg4kvja//3WMEJskEBAAAAAP7///8CWKmCIk4GAAAWABRKBWYWkCNS46jgF0r69Ehdnq+7T0BCDwAAAAAAIgAgTt5fs+CiB+FRzNC8lHcgWLH205sNjz1pT59ghXlG5tQCRzBEAiBXK9MF8z3bX/VnY2aefgBBmiAHPL4tyDbUOe7+KpYA4AIgL5kU0DFG8szKd+szRzz/OTUWJ0tZqij41h2eU9rSe1IBIQNBB1hy+jKsg1TihMT0dXw7etpu9TkO3NuvhBDFJlBj1cP2AQABAStAQg8AAAAAACIAIE7eX7PgogfhUczQvJR3IFix9tObDY89aU+fYIV5RubUIgICSKJsNs0zFJN58yd2aYQ+C3vhMbi0x7k0FV3wBhR4THlIMEUCIQCPWWWOhs2lThxOq/G8X2fYBRvM9MXSm7qPH+dRVYQZEwIgfut2vx3RvwZWcgEj4ohQJD5lNJlwOkA4PAiN1fjx6dABIgID3mvj1zerZKohOVhKCiskYk+3qrCum6PIwDhQ16ePACpHMEQCICZNR+0/1hPkrDQwPFmg5VjUHkh6aK9cXUu3kPbM8hirAiAyE/5NUXKfmFKij30isuyysJbq8HrURjivd+S9vdRGKQEBBZNSIQJIomw2zTMUk3nzJ3ZphD4Le+ExuLTHuTQVXfAGFHhMeSEC9OfCXl+sJOrxUFLBuMV4ZUlJYjuzNGZSld5ioY14y8FSrnNkUSED3mvj1zerZKohOVhKCiskYk+3qrCum6PIwDhQ16ePACohA+ECH+HlR+8Sf3pumaXH3IwSsoqSLCH7H1THiBP93z3ZUq9SsmgiBgJIomw2zTMUk3nzJ3ZphD4Le+ExuLTHuTQVXfAGFHhMeRxjat8/MAAAgAEAAIAAAACAAgAAgAAAAAABAAAAIgYC9OfCXl+sJOrxUFLBuMV4ZUlJYjuzNGZSld5ioY14y8Ec/9Y8jTAAAIABAACAAAAAgAIAAIAAAAAAAQAAACIGA95r49c3q2SqITlYSgorJGJPt6qwrpujyMA4UNenjwAqHGNq3z8wAACAAQAAgAEAAIACAACAAAAAAAEAAAAiBgPhAh/h5UfvEn96bpmlx9yMErKKkiwh+x9Ux4gT/d892Rz/1jyNMAAAgAEAAIABAACAAgAAgAAAAAABAAAAACICAlBQ7gGocg7eF3sXrCio+zusAC9+xfoyIV95AeR69DWvHGNq3z8wAACAAQAAgAEAAIACAACAAAAAAAMAAAAiAgMvVy984eg8Kgvj058PBHetFayWbRGb7L0DMnS9KHSJzBxjat8/MAAAgAEAAIAAAACAAgAAgAAAAAADAAAAIgIDSRIG1dn6njdjsDXenHa2lUvQHWGPLKBVrSzbQOhiIxgc/9Y8jTAAAIABAACAAAAAgAIAAIAAAAAAAwAAACICA0/epE59sVEj7Et0I4R9qJQNuX23RNvDZKCRL7eUps9FHP/WPI0wAACAAQAAgAEAAIACAACAAAAAAAMAAAAAIgICgldCOK6iHscv//2NipgaMABLV5TICU/zlP7HlQmlg08cY2rfPzAAAIABAACAAQAAgAIAAIABAAAAAQAAACICApb0p9rfpJshB3J186PGWrvzQdixcwQZWmebOUMdkquZHP/WPI0wAACAAQAAgAAAAIACAACAAQAAAAEAAAAiAgLY5q+unoDxC/HI5BaNiPq12ei1REZIcUAN304JfKXUwxz/1jyNMAAAgAEAAIABAACAAgAAgAEAAAABAAAAIgIDg6cUVCJB79cMcofiURHojxFARWyS4YEhJNRixuOZZRgcY2rfPzAAAIABAACAAAAAgAIAAIABAAAAAQAAAAA="); - let second_psbt = psbt_from_str("cHNidP8BAP0fAQIAAAAGAGo6V8K5MtKcQ8vRFedf5oJiOREiH4JJcEniyRv2800BAAAAAP3///9e3dVLjWKPAGwDeuUOmKFzOYEP5Ipu4LWdOPA+lITrRgAAAAAA/f///7cl9oeu9ssBXKnkWMCUnlgZPXhb+qQO2+OPeLEsbdGkAQAAAAD9////idkxRErbs34vsHUZ7QCYaiVaAFDV9gxNvvtwQLozwHsAAAAAAP3///9EakyJhd2PjwYh1I7zT2cmcTFI5g1nBd3srLeL7wKEewIAAAAA/f///7BcaP77nMaA2NjT/hyI6zueB/2jU/jK4oxmSqMaFkAzAQAAAAD9////AUAfAAAAAAAAFgAUqo7zdMr638p2kC3bXPYcYLv9nYUAAAAAAAEA/X4BAgAAAAABApEoe5xCmSi8hNTtIFwsy46aj3hlcLrtFrug39v5wy+EAQAAAGpHMEQCIDeI8JTWCTyX6opCCJBhWc4FytH8g6fxDaH+Wa/QqUoMAiAgbITpz8TBhwxhv/W4xEXzehZpOjOTjKnPw36GIy6SHAEhA6QnYCHUbU045FVh6ZwRwYTVineqRrB9tbqagxjaaBKh/v///+v1seDE9gGsZiWwewQs3TKuh0KSBIHiEtG8ABbz2DpAAQAAAAD+////Aqhaex4AAAAAFgAUkcVOEjVMct0jyCzhZN6zBT+lvTQvIAAAAAAAACIAIKKDUd/GWjAnwU99llS9TAK2dK80/nSRNLjmrhj0odUEAAJHMEQCICSn+boh4ItAa3/b4gRUpdfblKdcWtMLKZrgSEFFrC+zAiBtXCx/Dq0NutLSu1qmzFF1lpwSCB3w3MAxp5W90z7b/QEhA51S2ERUi0bg+l+bnJMJeAfDknaetMTagfQR9+AOrVKlxdMkAAEBKy8gAAAAAAAAIgAgooNR38ZaMCfBT32WVL1MArZ0rzT+dJE0uOauGPSh1QQiAgN+zbSfdr8oJBtlKomnQTHynF2b/UhovAwf0eS8awRSqUgwRQIhAJhm6xQvxt2LY+eNZqjhsgMOAxD0OPYty6nf9WaQZtgkAiBf/AXkeyq6ALknO9TZwY6ZRa0evY+DQ3j3XaqiBiAMfgEBBUEhA37NtJ92vygkG2UqiadBMfKcXZv9SGi8DB/R5LxrBFKprHNkdqkUxttmGj2sqzzaxSaacJTnJPDCbY6IrVqyaCIGAv9qeBDEB+5kvM/sZ8jQ7QApfZcDrqtq5OAe2gQ1V+pmDIpk8qkAAAAA0AAAACIGA37NtJ92vygkG2UqiadBMfKcXZv9SGi8DB/R5LxrBFKpDPWswv0AAAAA0AAAAAABAOoCAAAAAAEB0OPoVJs9ihvnAwjO16k/wGJuEus1IEE1Yo2KBjC2NSEAAAAAAP7///8C6AMAAAAAAAAiACBfeUS9jQv6O1a96Aw/mPV6gHxHl3mfj+f0frfAs2sMpP1QGgAAAAAAFgAUDS4UAIpdm1RlFYmg0OoCxW0yBT4CRzBEAiAPvbNlnhiUxLNshxN83AuK/lGWwlpXOvmcqoxsMLzIKwIgWwATJuYPf9buLe9z5SnXVnPVL0q6UZaWE5mjCvEl1RUBIQI54LFZmq9Lw0pxKpEGeqI74NnIfQmLMDcv5ySplUS1/wDMJAABASvoAwAAAAAAACIAIF95RL2NC/o7Vr3oDD+Y9XqAfEeXeZ+P5/R+t8CzawykIgICYn4eZbb6KGoxB1PEv/XPiujZFDhfoi/rJPtfHPVML2lHMEQCIDOHEqKdBozXIPLVgtBj3eWC1MeIxcKYDADe4zw0DbcMAiAq4+dbkTNCAjyCxJi0TKz5DWrPulxrqOdjMRHWngXHsQEBBUEhAmJ+HmW2+ihqMQdTxL/1z4ro2RQ4X6Iv6yT7Xxz1TC9prHNkdqkUzc/gCLoe6rQw63CGXhIR3YRz1qCIrVqyaCIGAmJ+HmW2+ihqMQdTxL/1z4ro2RQ4X6Iv6yT7Xxz1TC9pDPWswv0AAAAAqgAAACIGA8JCTIzdSoTJhiKN1pn+NnlkyuKOndiTgH2NIX+yNsYqDIpk8qkAAAAAqgAAAAABAOoCAAAAAAEBRGpMiYXdj48GIdSO809nJnExSOYNZwXd7Ky3i+8ChHsAAAAAAP7///8COMMQAAAAAAAWABQ5rnyuG5T8iuhqfaGAmpzlybo3t+gDAAAAAAAAIgAg7Kz3CX1RBjIvbK9LBYztmi7F1XIxQpX6mtCUkflvvl8CRzBEAiBaYx4sOHckEZwDnSrbb1ivc6seX4Puasm1PBGnBWgSTQIgCeUiXvd90ajI3F4/BHifLUI4fVIgVQFCqLTbbeXQD5oBIQOmGm+gTRx1slzF+wn8NhZoR1xfSYgoKX6bpRSVRjLcEXrOJAABASvoAwAAAAAAACIAIOys9wl9UQYyL2yvSwWM7ZouxdVyMUKV+prQlJH5b75fIgID0X2UJhC5+2jgJqUrihxZxDZHK7jgPFlrUYzoSHQTmP9HMEQCIEM4K8lVACvE2oSMZHDJiOeD81qsYgAvgpRgcSYgKc3AAiAQjdDr2COBea69W+2iVbnODuH3QwacgShW3dS4yeggJAEBBUEhA9F9lCYQufto4CalK4ocWcQ2Ryu44DxZa1GM6Eh0E5j/rHNkdqkU0DTexcgOQQ+BFjgS031OTxcWiH2IrVqyaCIGA9F9lCYQufto4CalK4ocWcQ2Ryu44DxZa1GM6Eh0E5j/DPWswv0AAAAAvwAAACIGA/xg4Uvem3JHVPpyTLP5JWiUH/yk3Y/uUI6JkZasCmHhDIpk8qkAAAAAvwAAAAABAOoCAAAAAAEBmG+mPq0O6QSWEMctsMjvv5LzWHGoT8wsA9Oa05kxIxsBAAAAAP7///8C6AMAAAAAAAAiACDUvIILFr0OxybADV3fB7ms7+ufnFZgicHR0nbI+LFCw1UoGwAAAAAAFgAUC+1ZjCC1lmMcvJ/4JkevqoZF4igCRzBEAiA3d8o96CNgNWHUkaINWHTvAUinjUINvXq0KBeWcsSWuwIgKfzRNWFR2LDbnB/fMBsBY/ylVXcSYwLs8YC+kmko1zIBIQOpEfsLv0htuertA1sgzCwGvHB0vE4zFO69wWEoHClKmAfMJAABASvoAwAAAAAAACIAINS8ggsWvQ7HJsANXd8Huazv65+cVmCJwdHSdsj4sULDIgID96jZc0sCi0IIXf2CpfE7tY+9LRmMsOdSTTHelFxfCwJHMEQCIHlaiMMznx8Cag8Y3X2gXi9Qtg0ZuyHEC6DsOzipSGOKAiAV2eC+S3Mbq6ig5QtRvTBsq5M3hCBdEJQlOrLVhWWt6AEBBUEhA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCrHNkdqkUyJ+Cbx7vYVY665yjJnMNODyYrAuIrVqyaCIGAt8UyDXk+mW3Y6IZNIBuDJHkdOaZi/UEShkN5L3GiHR5DIpk8qkAAAAAuAAAACIGA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCDPWswv0AAAAAuAAAAAABAP0JAQIAAAAAAQG7Zoy4I3J9x+OybAlIhxVKcYRuPFrkDFJfxMiC3kIqIAEAAAAA/v///wO5xxAAAAAAABYAFHgBzs9wJNVk6YwR81IMKmckTmC56AMAAAAAAAAWABTQ/LmJix5JoHBOr8LcgEChXHdLROgDAAAAAAAAIgAg7Kz3CX1RBjIvbK9LBYztmi7F1XIxQpX6mtCUkflvvl8CRzBEAiA+sIKnWVE3SmngjUgJdu1K2teW6eqeolfGe0d11b+irAIgL20zSabXaFRNM8dqVlcFsfNJ0exukzvxEOKl/OcF8VsBIQJrUspHq45AMSwbm24//2a9JM8XHFWbOKpyV+gNCtW71nrOJAABASvoAwAAAAAAACIAIOys9wl9UQYyL2yvSwWM7ZouxdVyMUKV+prQlJH5b75fIgID0X2UJhC5+2jgJqUrihxZxDZHK7jgPFlrUYzoSHQTmP9IMEUCIQCmDhJ9fyhlQwPruoOUemDuldtRu3ZkiTM3DA0OhkguSQIgYerNaYdP43DcqI5tnnL3n4jEeMHFCs+TBkOd6hDnqAkBAQVBIQPRfZQmELn7aOAmpSuKHFnENkcruOA8WWtRjOhIdBOY/6xzZHapFNA03sXIDkEPgRY4EtN9Tk8XFoh9iK1asmgiBgPRfZQmELn7aOAmpSuKHFnENkcruOA8WWtRjOhIdBOY/wz1rML9AAAAAL8AAAAiBgP8YOFL3ptyR1T6ckyz+SVolB/8pN2P7lCOiZGWrAph4QyKZPKpAAAAAL8AAAAAAQDqAgAAAAABAT6/vc6qBRzhQyjVtkC25NS2BvGyl2XjjEsw3e8vAesjAAAAAAD+////AgPBAO4HAAAAFgAUEwiWd/qI1ergMUw0F1+qLys5G/foAwAAAAAAACIAIOOPEiwmp2ZXR7ciyrveITXw0tn6zbQUA1Eikd9QlHRhAkcwRAIgJMZdO5A5u2UIMrAOgrR4NcxfNgZI6OfY7GKlZP0O8yUCIDFujbBRnamLEbf0887qidnXo6UgQA9IwTx6Zomd4RvJASEDoNmR2/XcqSyCWrE1tjGJ1oLWlKt4zsFekK9oyB4Hl0HF0yQAAQEr6AMAAAAAAAAiACDjjxIsJqdmV0e3Isq73iE18NLZ+s20FANRIpHfUJR0YSICAo3uyJxKHR9Z8fwvU7cywQCnZyPvtMl3nv54wPW1GSGqSDBFAiEAlLY98zqEL/xTUvm9ZKy5kBa4UWfr4Ryu6BmSZjseXPQCIGy7efKbZLQSDq8RhgNNjl1384gWFTN7nPwWV//SGriyAQEFQSECje7InEodH1nx/C9TtzLBAKdnI++0yXee/njA9bUZIaqsc2R2qRQhPRlaLsh/M/K/9fvbjxF/M20cNoitWrJoIgYCF7Rj5jFhe5L6VDzP5m2BeaG0mA9e7+6fMeWkWxLwpbAMimTyqQAAAADNAAAAIgYCje7InEodH1nx/C9TtzLBAKdnI++0yXee/njA9bUZIaoM9azC/QAAAADNAAAAAAA="); + let first_psbt = psbt_from_str("cHNidP8BAIkCAAAAAWi3OFgkj1CqCDT3Swm8kbxZS9lxz4L3i4W2v9KGC7nqAQAAAAD9////AkANAwAAAAAAIgAg27lNc1rog+dOq80ohRuds4Hgg/RcpxVun2XwgpuLSrFYMwwAAAAAACIAIDyWveqaElWmFGkTbFojg1zXWHODtiipSNjfgi2DqBy9AAAAAAABAOoCAAAAAAEBsRWl70USoAFFozxc86pC7Dovttdg4kvja//3WMEJskEBAAAAAP7///8CWKmCIk4GAAAWABRKBWYWkCNS46jgF0r69Ehdnq+7T0BCDwAAAAAAIgAgTt5fs+CiB+FRzNC8lHcgWLH205sNjz1pT59ghXlG5tQCRzBEAiBXK9MF8z3bX/VnY2aefgBBmiAHPL4tyDbUOe7+KpYA4AIgL5kU0DFG8szKd+szRzz/OTUWJ0tZqij41h2eU9rSe1IBIQNBB1hy+jKsg1TihMT0dXw7etpu9TkO3NuvhBDFJlBj1cP2AQABAStAQg8AAAAAACIAIE7eX7PgogfhUczQvJR3IFix9tObDY89aU+fYIV5RubUIgICSKJsNs0zFJN58yd2aYQ+C3vhMbi0x7k0FV3wBhR4THlIMEUCIQCPWWWOhs2lThxOq/G8X2fYBRvM9MXSm7qPH+dRVYQZEwIgfut2vx3RvwZWcgEj4ohQJD5lNJlwOkA4PAiN1fjx6dABIgID3mvj1zerZKohOVhKCiskYk+3qrCum6PIwDhQ16ePACpHMEQCICZNR+0/1hPkrDQwPFmg5VjUHkh6aK9cXUu3kPbM8hirAiAyE/5NUXKfmFKij30isuyysJbq8HrURjivd+S9vdRGKQEBBZNSIQJIomw2zTMUk3nzJ3ZphD4Le+ExuLTHuTQVXfAGFHhMeSEC9OfCXl+sJOrxUFLBuMV4ZUlJYjuzNGZSld5ioY14y8FSrnNkUSED3mvj1zerZKohOVhKCiskYk+3qrCum6PIwDhQ16ePACohA+ECH+HlR+8Sf3pumaXH3IwSsoqSLCH7H1THiBP93z3ZUq9SsmgiBgJIomw2zTMUk3nzJ3ZphD4Le+ExuLTHuTQVXfAGFHhMeRxjat8/MAAAgAEAAIAAAACAAgAAgAAAAAABAAAAIgYC9OfCXl+sJOrxUFLBuMV4ZUlJYjuzNGZSld5ioY14y8Ec/9Y8jTAAAIABAACAAAAAgAIAAIAAAAAAAQAAACIGA95r49c3q2SqITlYSgorJGJPt6qwrpujyMA4UNenjwAqHGNq3z8wAACAAQAAgAEAAIACAACAAAAAAAEAAAAiBgPhAh/h5UfvEn96bpmlx9yMErKKkiwh+x9Ux4gT/d892Rz/1jyNMAAAgAEAAIABAACAAgAAgAAAAAABAAAAACICAlBQ7gGocg7eF3sXrCio+zusAC9+xfoyIV95AeR69DWvHGNq3z8wAACAAQAAgAEAAIACAACAAAAAAAMAAAAiAgMvVy984eg8Kgvj058PBHetFayWbRGb7L0DMnS9KHSJzBxjat8/MAAAgAEAAIAAAACAAgAAgAAAAAADAAAAIgIDSRIG1dn6njdjsDXenHa2lUvQHWGPLKBVrSzbQOhiIxgc/9Y8jTAAAIABAACAAAAAgAIAAIABAAAAAQAAACICApb0p9rfpJshB3J186PGWrvzQdixcwQZWmebOUMdkquZHP/WPI0wAACAAQAAgAAAAIACAACAAQAAAAEAAAAiAgLY5q+unoDxC/HI5BaNiPq12ei1REZIcUAN304JfKXUwxz/1jyNMAAAgAEAAIABAACAAgAAgAEAAAABAAAAIgIDg6cUVCJB79cMcofiURHojxFARWyS4YEhJNRixuOZZRgcY2rfPzAAAIABAACAAAAAgAIAAIABAAAAAQAAAAA="); + let second_psbt = psbt_from_str("cHNidP8BAP0fAQIAAAAGAGo6V8K5MtKcQ8vRFedf5oJiOREiH4JJcEniyRv2800BAAAAAP3///9e3dVLjWKPAGwDeuUOmKFzOYEP5Ipu4LWdOPA+lITrRgAAAAAA/f///7cl9oeu9ssBXKnkWMCUnlgZPXhb+qQO2+OPeLEsbdGkAQAAAAD9////idkxRErbs34vsHUZ7QCYaiVaAFDV9gxNvvtwQLozwHsAAAAAAP3///9EakyJhd2PjwYh1I7zT2cmcTFI5g1nBd3srLeL7wKEewIAAAAA/f///7BcaP77nMaA2NjT/hyI6zueB/2jU/jK4oxmSqMaFkAzAQAAAAD9////AUAfAAAAAAAAFgAUqo7zdMr638p2kC3bXPYcYLv9nYUAAAAAAAEA/X4BAgAAAAABApEoe5xCmSi8hNTtIFwsy46aj3hlcLrtFrug39v5wy+EAQAAAGpHMEQCIDeI8JTWCTyX6opCCJBhWc4FytH8g6fxDaH+Wa/QqUoMAiAgbITpz8TBhwxhv/W4xEXzehZpOjOTjKnPw36GIy6SHAEhA6QnYCHUbU045FVh6ZwRwYTVineqRrB9tbqagxjaaBKh/v///+v1seDE9gGsZiWwewQs3TKuh0KSBIHiEtG8ABbz2DpAAQAAAAD+////Aqhaex4AAAAAFgAUkcVOEjVMct0jyCzhZN6zBT+lvTQvIAAAAAAAACIAIKKDUd/GWjAnwU99llS9TAK2dK80/nSRNLjmrhj0odUEAAJHMEQCICSn+boh4ItAa3/b4gRUpdfblKdcWtMLKZrgSEFFrC+zAiBtXCx/Dq0NutLSu1qmzFF1lpwSCB3w3MAxp5W90z7b/QEhA51S2ERUi0bg+l+bnJMJeAfDknaetMTagfQR9+AOrVKlxdMkAAEBKy8gAAAAAAAAIgAgooNR38ZaMCfBT32WVL1MArZ0rzT+dJE0uOauGPSh1QQiAgN+zbSfdr8oJBtlKomnQTHynF2b/UhovAwf0eS8awRSqUgwRQIhAJhm6xQvxt2LY+eNZqjhsgMOAxD0OPYty6nf9WaQZtgkAiBf/AXkeyq6ALknO9TZwY6ZRa0evY+DQ3j3XaqiBiAMfgEBBUEhA37NtJ92vygkG2UqiadBMfKcXZv9SGi8DB/R5LxrBFKprHNkdqkUxttmGj2sqzzaxSaacJTnJPDCbY6IrVqyaCIGAv9qeBDEB+5kvM/sZ8jQ7QApfZcDrqtq5OAe2gQ1V+pmDIpk8qkAAAAA0AAAACIGA37NtJ92vygkG2UqiadBMfKcXZv9SGi8DB/R5LxrBFKpDPWswv0AAAAA0AAAAAABAOoCAAAAAAEB0OPoVJs9ihvnAwjO16k/wGJuEus1IEE1Yo2KBjC2NSEAAAAAAP7///8C6AMAAAAAAAAiACBfeUS9jQv6O1a96Aw/mPV6gHxHl3mfj+f0frfAs2sMpP1QGgAAAAAAFgAUDS4UAIpdm1RlFYmg0OoCxW0yBT4CRzBEAiAPvbNlnhiUxLNshxN83AuK/lGWwlpXOvmcqoxsMLzIKwIgWwATJuYPf9buLe9z5SnXVnPVL0q6UZaWE5mjCvEl1RUBIQI54LFZmq9Lw0pxKpEGeqI74NnIfQmLMDcv5ySplUS1/wDMJAABASvoAwAAAAAAACIAIF95RL2NC/o7Vr3oDD+Y9XqAfEeXeZ+P5/R+t8CzawykIgICYn4eZbb6KGoxB1PEv/XPiujZFDhfoi/rJPtfHPVML2lHMEQCIDOHEqKdBozXIPLVgtBj3eWC1MeIxcKYDADe4zw0DbcMAiAq4+dbkTNCAjyCxJi0TKz5DWrPulxrqOdjMRHWngXHsQEBBUEhAmJ+HmW2+ihqMQdTxL/1z4ro2RQ4X6Iv6yT7Xxz1TC9prHNkdqkUzc/gCLoe6rQw63CGXhIR3YRz1qCIrVqyaCIGAmJ+HmW2+ihqMQdTxL/1z4ro2RQ4X6Iv6yT7Xxz1TC9pDPWswv0AAAAAuAAAACIGA/xg4Uvem3JHVPpyTLP5JWiUH/yk3Y/uUI6JkZasCmHhDIpk8qkAAAAAvwAAAAABAOoCAAAAAAEBmG+mPq0O6QSWEMctsMjvv5LzWHGoT8wsA9Oa05kxIxsBAAAAAP7///8C6AMAAAAAAAAiACDUvIILFr0OxybADV3fB7ms7+ufnFZgicHR0nbI+LFCw1UoGwAAAAAAFgAUC+1ZjCC1lmMcvJ/4JkevqoZF4igCRzBEAiA3d8o96CNgNWHUkaINWHTvAUinjUINvXq0KBeWcsSWuwIgKfzRNWFR2LDbnB/fMBsBY/ylVXcSYwLs8YC+kmko1zIBIQOpEfsLv0htuertA1sgzCwGvHB0vE4zFO69wWEoHClKmAfMJAABASvoAwAAAAAAACIAINS8ggsWvQ7HJsANXd8Huazv65+cVmCJwdHSdsj4sULDIgID96jZc0sCi0IIXf2CpfE7tY+9LRmMsOdSTTHelFxfCwJHMEQCIHlaiMMznx8Cag8Y3X2gXi9Qtg0ZuyHEC6DsOzipSGOKAiAV2eC+S3Mbq6ig5QtRvTBsq5M3hCBdEJQlOrLVhWWt6AEBBUEhA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCrHNkdqkUyJ+Cbx7vYVY665yjJnMNODyYrAuIrVqyaCIGAt8UyDXk+mW3Y6IZNIBuDJHkdOaZi/UEShkN5L3GiHR5DIpk8qkAAAAAuAAAACIGA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCDPWswv0AAAAAuAAAAAABAP0JAQIAAAAAAQG7Zoy4I3J9x+OybAlIhxVKcYRuPFrkDFJfxMiC3kIqIAEAAAAA/v///wO5xxAAAAAAABYAFHgBzs9wJNVk6YwR81IMKmckTmC56AMAAAAAAAAWABTQ/LmJix5JoHBOr8LcgEChXHdLROgDAAAAAAAAIgAg7Kz3CX1RBjIvbK9LBYztmi7F1XIxQpX6mtCUkflvvl8CRzBEAiA+sIKnWVE3SmngjUgJdu1K2teW6eqeolfGe0d11b+irAIgL20zSabXaFRNM8dqVlcFsfNJ0exukzvxEOKl/OcF8VsBIQJrUspHq45AMSwbm24//2a9JM8XHFWbOKpyV+gNCtW71nrOJAABASvoAwAAAAAAACIAIOys9wl9UQYyL2yvSwWM7ZouxdVyMUKV+prQlJH5b75fIgID0X2UJhC5+2jgJqUrihxZxDZHK7jgPFlrUYzoSHQTmP9HMEQCIEM4K8lVACvE2oSMZHDJiOeD81qsYgAvgpRgcSYgKc3AAiAQjdDr2COBea69W+2iVbnODuH3QwacgShW3dS4yeggJAEBBUEhA9F9lCYQufto4CalK4ocWcQ2Ryu44DxZa1GM6Eh0E5j/rHNkdqkU0DTexcgOQQ+BFjgS031OTxcWiH2IrVqyaCIGA9F9lCYQufto4CalK4ocWcQ2Ryu44DxZa1GM6Eh0E5j/DPWswv0AAAAAvwAAACIGA/xg4Uvem3JHVPpyTLP5JWiUH/yk3Y/uUI6JkZasCmHhDIpk8qkAAAAAvwAAAAABAOoCAAAAAAEBmG+mPq0O6QSWEMctsMjvv5LzWHGoT8wsA9Oa05kxIxsBAAAAAP7///8C6AMAAAAAAAAiACDUvIILFr0OxybADV3fB7ms7+ufnFZgicHR0nbI+LFCw1UoGwAAAAAAFgAUC+1ZjCC1lmMcvJ/4JkevqoZF4igCRzBEAiA3d8o96CNgNWHUkaINWHTvAUinjUINvXq0KBeWcsSWuwIgKfzRNWFR2LDbnB/fMBsBY/ylVXcSYwLs8YC+kmko1zIBIQOpEfsLv0htuertA1sgzCwGvHB0vE4zFO69wWEoHClKmAfMJAABASvoAwAAAAAAACIAINS8ggsWvQ7HJsANXd8Huazv65+cVmCJwdHSdsj4sULDIgID96jZc0sCi0IIXf2CpfE7tY+9LRmMsOdSTTHelFxfCwJHMEQCIHlaiMMznx8Cag8Y3X2gXi9Qtg0ZuyHEC6DsOzipSGOKAiAV2eC+S3Mbq6ig5QtRvTBsq5M3hCBdEJQlOrLVhWWt6AEBBUEhA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCrHNkdqkUyJ+Cbx7vYVY665yjJnMNODyYrAuIrVqyaCIGAt8UyDXk+mW3Y6IZNIBuDJHkdOaZi/UEShkN5L3GiHR5DIpk8qkAAAAAuAAAACIGA/eo2XNLAotCCF39gqXxO7WPvS0ZjLDnUk0x3pRcXwsCDPWswv0AAAAAuAAAAAABAP0JAQIAAAAAAQG7Zoy4I3J9x+OybAlIhxVKcYRuPFrkDFJfxMiC3kIqIAEAAAAA/v///wO5xxAAAAAAABYAFHgBzs9wJNVk6YwR81IMKmckTmC56AMAAAAAAAAWABTQ/LmJix5JoHBOr8LcgEChXHdLROgDAAAAAAAAIgAg7Kz3CX1RBjIvbK9LBYztmi7F1XIxQpX6mtCUkflvvl8CRzBEAiA+sIKnWVE3SmngjUgJdu1K2teW6eqeolfGe0d11b+irAIgL20zSabXaFRNM8dqVlcFsfNJ0exukzvxEOKl/OcF8VsBIQJrUspHq45AMSwbm24//2a9JM8XHFWbOKpyV+gNCtW71nrOJAABASvoAwAAAAAAACIAIOys9wl9UQYyL2yvSwWM7ZouxdVyMUKV+prQlJH5b75fIgID0X2UJhC5+2jgJqUrihxZxDZHK7jgPFlrUYzoSHQTmP9IMEUCIQCmDhJ9fyhlQwPruoOUemDuldtRu3ZkiTM3DA0OhkguSQIgYerNaYdP43DcqI5tnnL3n4jEeMHFCs+TBkOd6hDnqAkBAQVBIQPRfZQmELn7aOAmpSuKHFnENkcruOA8WWtRjOhIdBOY/6xzZHapFNA03sXIDkEPgRY4EtN9Tk8XFoh9iK1asmgiBgPRfZQmELn7aOAmpSuKHFnENkcruOA8WWtRjOhIdBOY/wz1rML9AAAAAL8AAAAiBgP8YOFL3ptyR1T6ckyz+SVolB/8pN2P7lCOiZGWrAph4QyKZPKpAAAAAL8AAAAAAQDqAgAAAAABAT6/vc6qBRzhQyjVtkC25NS2BvGyl2XjjEsw3e8vAesjAAAAAAD+////AgPBAO4HAAAAFgAUEwiWd/qI1ergMUw0F1+qLys5G/foAwAAAAAAACIAIOOPEiwmp2ZXR7ciyrveITXw0tn6zbQUA1Eikd9QlHRhAkcwRAIgJMZdO5A5u2UIMrAOgrR4NcxfNgZI6OfY7GKlZP0O8yUCIDFujbBRnamLEbf0887qidnXo6UgQA9IwTx6Zomd4RvJASEDoNmR2/XcqSyCWrE1tjGJ1oLWlKt4zsFekK9oyB4Hl0HF0yQAAQEr6AMAAAAAAAAiACDjjxIsJqdmV0e3Isq73iE18NLZ+s20FANRIpHfUJR0YSICAo3uyJxKHR9Z8fwvU7cywQCnZyPvtMl3nv54wPW1GSGqSDBFAiEAlLY98zqEL/xTUvm9ZKy5kBa4UWfr4Ryu6BmSZjseXPQCIGy7efKbZLQSDq8RhgNNjl1384gWFTN7nPwWV//SGriyAQEFQSECje7InEodH1nx/C9TtzLBAKdnI++0yXee/njA9bUZIaqsc2R2qRQhPRlaLsh/M/K/9fvbjxF/M20cNoitWrJoIgYCF7Rj5jFhe5L6VDzP5m2BeaG0mA9e7+6fMeWkWxLwpbAMimTyqQAAAADNAAAAIgYCje7InEodH1nx/C9TtzLBAKdnI++0yXee/njA9bUZIaoM9azC/QAAAADNAAAAAAA="); let bitcoin_txs: Vec<_> = (0..2) .map(|i| bitcoin::Transaction { @@ -3570,4 +3864,141 @@ CREATE TABLE labels ( fs::remove_dir_all(tmp_dir).unwrap(); } + + #[test] + fn test_payjoin_receiver_sessions() { + let (temp_dir, _, _, db) = dummy_db(); + let mut conn = db.connection().unwrap(); + + let session_id_1 = conn.save_new_payjoin_receiver_session(); + assert!(session_id_1 > 0); + let session_id_2 = conn.save_new_payjoin_receiver_session(); + assert!(session_id_2 > session_id_1); + + let active_sessions = conn.get_all_active_receiver_session_ids(); + assert_eq!(active_sessions.len(), 2); + assert!(active_sessions.iter().any(|s| s.0 == session_id_1)); + assert!(active_sessions.iter().any(|s| s.0 == session_id_2)); + + let event_data = b"test event data".to_vec(); + let session_id = SessionId::new(session_id_1); + conn.save_receiver_session_event(&session_id, event_data.clone()); + + let events = conn.load_receiver_session_events(&session_id); + assert_eq!(events.len(), 1); + assert_eq!(events[0], event_data); + + conn.update_receiver_session_completed_at(&session_id); + // This should not change how events are loaded + let events = conn.load_receiver_session_events(&session_id); + assert_eq!(events.len(), 1); + assert_eq!(events[0], event_data); + + // Verify session is no longer active + let active_sessions_after = conn.get_all_active_receiver_session_ids(); + assert_eq!(active_sessions_after.len(), 1); + assert!(!active_sessions_after.iter().any(|s| s.0 == session_id_1)); + + let event_data_2 = b"second event data".to_vec(); + // Data is same as the second event + let event_data_3 = b"second event data".to_vec(); + conn.save_receiver_session_event(&session_id, event_data_2.clone()); + conn.save_receiver_session_event(&session_id, event_data_3.clone()); + + let all_events = conn.load_receiver_session_events(&session_id); + assert_eq!(all_events.len(), 3); + assert_eq!(all_events[0], event_data); + assert_eq!(all_events[1], event_data_2); + assert_eq!(all_events[2], event_data_3); + + // Test empty events list for non-existent session + let non_existent_session = SessionId::new(99999); + let empty_events = conn.load_receiver_session_events(&non_existent_session); + assert_eq!(empty_events.len(), 0); + + // Test session with no events + let session_id_3 = conn.save_new_payjoin_receiver_session(); + let session_3 = SessionId::new(session_id_3); + let no_events = conn.load_receiver_session_events(&session_3); + assert_eq!(no_events.len(), 0); + + // Test completing multiple sessions + conn.update_receiver_session_completed_at(&session_3); + let final_active_sessions = conn.get_all_active_receiver_session_ids(); + assert_eq!(final_active_sessions.len(), 1); + assert!(final_active_sessions.iter().any(|s| s.0 == session_id_2)); + + fs::remove_dir_all(temp_dir).unwrap(); + } + + #[test] + fn test_payjoin_sender_sessions() { + let (temp_dir, _, _, db) = dummy_db(); + let mut conn = db.connection().unwrap(); + let original_txid = bitcoin::Txid::from_str( + "0000000000000000000000000000000000000000000000000000000000000001", + ) + .unwrap(); + + let session_id_1 = conn.save_new_payjoin_sender_session(&original_txid); + assert!(session_id_1 > 0); + let session_id_2 = conn.save_new_payjoin_sender_session(&original_txid); + assert!(session_id_2 > session_id_1); + + let active_sessions = conn.get_all_active_sender_session_ids(); + assert_eq!(active_sessions.len(), 2); + assert!(active_sessions.iter().any(|s| s.0 == session_id_1)); + assert!(active_sessions.iter().any(|s| s.0 == session_id_2)); + + let event_data = b"test event data".to_vec(); + let session_id = SessionId::new(session_id_1); + conn.save_sender_session_event(&session_id, event_data.clone()); + + // Test load_sender_session_events + let events = conn.load_sender_session_events(&session_id); + assert_eq!(events.len(), 1); + assert_eq!(events[0], event_data); + + conn.update_sender_session_completed_at(&session_id); + // This should not change how events are loaded + let events = conn.load_sender_session_events(&session_id); + assert_eq!(events.len(), 1); + assert_eq!(events[0], event_data); + + // Verify session is no longer active + let active_sessions_after = conn.get_all_active_sender_session_ids(); + assert_eq!(active_sessions_after.len(), 1); + assert!(!active_sessions_after.iter().any(|s| s.0 == session_id_1)); + + let event_data_2 = b"second event data".to_vec(); + // Data is same as the second event + let event_data_3 = b"second event data".to_vec(); + conn.save_sender_session_event(&session_id, event_data_2.clone()); + conn.save_sender_session_event(&session_id, event_data_3.clone()); + + let all_events = conn.load_sender_session_events(&session_id); + assert_eq!(all_events.len(), 3); + assert_eq!(all_events[0], event_data); + assert_eq!(all_events[1], event_data_2); + assert_eq!(all_events[2], event_data_3); + + // Test empty events list for non-existent session + let non_existent_session = SessionId::new(99999); + let empty_events = conn.load_sender_session_events(&non_existent_session); + assert_eq!(empty_events.len(), 0); + + // Test session with no events + let session_id_3 = conn.save_new_payjoin_sender_session(&original_txid); + let session_3 = SessionId::new(session_id_3); + let no_events = conn.load_sender_session_events(&session_3); + assert_eq!(no_events.len(), 0); + + // Test completing multiple sessions + conn.update_sender_session_completed_at(&session_3); + let final_active_sessions = conn.get_all_active_sender_session_ids(); + assert_eq!(final_active_sessions.len(), 1); + assert!(final_active_sessions.iter().any(|s| s.0 == session_id_2)); + + fs::remove_dir_all(temp_dir).unwrap(); + } } diff --git a/lianad/src/database/sqlite/schema.rs b/lianad/src/database/sqlite/schema.rs index 34eb5fd29..d5f399164 100644 --- a/lianad/src/database/sqlite/schema.rs +++ b/lianad/src/database/sqlite/schema.rs @@ -1,5 +1,6 @@ use bip329::Label; use liana::descriptors::LianaDescriptor; +use payjoin::bitcoin::{consensus::Decodable, io::Cursor}; use std::{convert::TryFrom, str::FromStr}; @@ -87,6 +88,16 @@ CREATE TABLE coins ( ON DELETE RESTRICT ); +/* Seen Payjoin outpoints + * + * The 'added_at' field is simply the time that this outpoint is added to the table for + * tracking. + */ +CREATE TABLE payjoin_outpoints ( + outpoint BLOB NOT NULL PRIMARY KEY, + added_at INTEGER NOT NULL +); + /* A mapping from descriptor address to derivation index. Necessary until * we can get the derivation index from the parent descriptor from bitcoind. */ @@ -122,6 +133,50 @@ CREATE TABLE labels ( item TEXT UNIQUE NOT NULL, value TEXT NOT NULL ); + +/* Payjoin OHttpKeys */ +CREATE TABLE payjoin_ohttp_keys ( + id INTEGER PRIMARY KEY NOT NULL, + relay_url TEXT UNIQUE NOT NULL, + timestamp INTEGER NOT NULL, + key BLOB NOT NULL +); + +/* Payjoin senders */ +CREATE TABLE payjoin_senders ( + id INTEGER PRIMARY KEY NOT NULL, + created_at INTEGER NOT NULL, + original_txid BLOB NOT NULL, + proposed_txid BLOB, + completed_at INTEGER +); + +/* Payjoin Sender session events */ +CREATE TABLE payjoin_sender_events ( + id INTEGER PRIMARY KEY NOT NULL, + session_id INTEGER NOT NULL, + created_at INTEGER NOT NULL, + event BLOB NOT NULL, + FOREIGN KEY (session_id) REFERENCES payjoin_senders (id) +); + +/* Payjoin receivers */ +CREATE TABLE payjoin_receivers ( + id INTEGER PRIMARY KEY NOT NULL, + original_txid BLOB, + proposed_txid BLOB, + created_at INTEGER NOT NULL, + completed_at INTEGER +); + +/* Payjoin Receiver session events */ +CREATE TABLE payjoin_receiver_events ( + id INTEGER PRIMARY KEY NOT NULL, + session_id INTEGER NOT NULL, + created_at INTEGER NOT NULL, + event BLOB NOT NULL, + FOREIGN KEY (session_id) REFERENCES payjoin_receivers (id) +); "; /// A row in the "tip" table. @@ -456,3 +511,24 @@ impl TryFrom<&rusqlite::Row<'_>> for DbWalletTransaction { }) } } + +/// An outpoint we have seen before in payjoin transactions +#[derive(Clone, Debug, PartialEq)] +pub struct DbPayjoinOutpoint { + pub outpoint: bitcoin::OutPoint, + pub added_at: Option, +} + +impl TryFrom<&rusqlite::Row<'_>> for DbPayjoinOutpoint { + type Error = rusqlite::Error; + + fn try_from(row: &rusqlite::Row) -> Result { + let outpoint: Vec = row.get(0)?; + let outpoint = bitcoin::OutPoint::consensus_decode(&mut Cursor::new(outpoint)) + .expect("Outpoint should be decodable"); + + let added_at = row.get(1)?; + + Ok(DbPayjoinOutpoint { outpoint, added_at }) + } +} diff --git a/lianad/src/jsonrpc/api.rs b/lianad/src/jsonrpc/api.rs index 7f6082e6d..a4196f974 100644 --- a/lianad/src/jsonrpc/api.rs +++ b/lianad/src/jsonrpc/api.rs @@ -486,6 +486,40 @@ fn get_labels_bip329(control: &DaemonControl, params: Params) -> Result Result { + let res = control.receive_payjoin()?; + Ok(serde_json::json!(&res)) +} + +fn send_payjoin(control: &DaemonControl, params: Params) -> Result { + let bip21 = params + .get(0, "bip21") + .ok_or_else(|| Error::invalid_params("Missing 'bip21' parameter."))? + .as_str() + .ok_or_else(|| Error::invalid_params("Invalid 'bip21' parameter."))?; + let psbt = params + .get(1, "psbt") + .ok_or_else(|| Error::invalid_params("Missing 'psbt' parameter."))? + .as_str() + .ok_or_else(|| Error::invalid_params("Invalid 'psbt' parameter."))?; + let psbt = + Psbt::from_str(psbt).map_err(|_| Error::invalid_params("Invalid 'psbt' parameter."))?; + control.init_payjoin_sender(bip21.to_string(), &psbt)?; + Ok(serde_json::json!({})) +} + +fn get_payjoin_info(control: &DaemonControl, params: Params) -> Result { + let txid = params + .get(0, "txid") + .ok_or_else(|| Error::invalid_params("Missing 'txid' parameter."))? + .as_str() + .ok_or_else(|| Error::invalid_params("Invalid 'txid' parameter."))?; + let txid = bitcoin::Txid::from_str(txid) + .map_err(|_| Error::invalid_params("Invalid 'txid' parameter."))?; + let res = control.get_payjoin_info(&txid)?; + Ok(serde_json::json!(&res)) +} + /// Handle an incoming JSONRPC2 request. pub fn handle_request(control: &mut DaemonControl, req: Request) -> Result { let result = match req.method.as_str() { @@ -593,6 +627,19 @@ pub fn handle_request(control: &mut DaemonControl, req: Request) -> Result receive_payjoin(control)?, + "sendpayjoin" => { + let params = req + .params + .ok_or_else(|| Error::invalid_params("Missing 'payjoin_url' parameter."))?; + send_payjoin(control, params)? + } + "getpayjoininfo" => { + let params = req + .params + .ok_or_else(|| Error::invalid_params("Missing 'txid' parameter."))?; + get_payjoin_info(control, params)? + } _ => { return Err(Error::method_not_found()); } diff --git a/lianad/src/jsonrpc/rpc.rs b/lianad/src/jsonrpc/rpc.rs index 90d307db6..de56ed6ec 100644 --- a/lianad/src/jsonrpc/rpc.rs +++ b/lianad/src/jsonrpc/rpc.rs @@ -164,7 +164,8 @@ impl From for Error { | commands::CommandError::RbfError(..) | commands::CommandError::EmptyFilterList | commands::CommandError::RecoveryNotAvailable - | commands::CommandError::OutpointNotRecoverable(..) => { + | commands::CommandError::OutpointNotRecoverable(..) + | commands::CommandError::FailedToFetchOhttpKeys(..) => { Error::new(ErrorCode::InvalidParams, e.to_string()) } commands::CommandError::RescanTrigger(..) => { @@ -173,6 +174,9 @@ impl From for Error { commands::CommandError::TxBroadcast(_) => { Error::new(ErrorCode::ServerError(BROADCAST_ERROR), e.to_string()) } + commands::CommandError::FailedToPostOriginalPayjoinProposal(_) => { + Error::new(ErrorCode::ServerError(BROADCAST_ERROR), e.to_string()) + } } } } diff --git a/lianad/src/lib.rs b/lianad/src/lib.rs index 86e339c72..bb20cbe83 100644 --- a/lianad/src/lib.rs +++ b/lianad/src/lib.rs @@ -4,6 +4,7 @@ pub mod config; mod database; pub mod datadir; mod jsonrpc; +pub mod payjoin; #[cfg(test)] mod testutils; diff --git a/lianad/src/payjoin/db.rs b/lianad/src/payjoin/db.rs new file mode 100644 index 000000000..bf4883042 --- /dev/null +++ b/lianad/src/payjoin/db.rs @@ -0,0 +1,141 @@ +use payjoin::bitcoin; +use payjoin::persist::SessionPersister; +use payjoin::receive::v2::SessionEvent as ReceiverSessionEvent; +use payjoin::send::v2::SessionEvent as SenderSessionEvent; +use serde::{Deserialize, Serialize}; +use std::fmt::{self, Display, Formatter}; +use std::sync::Arc; + +use crate::database::DatabaseInterface; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SessionId(pub i64); + +impl SessionId { + pub fn new(id: i64) -> Self { + Self(id) + } +} + +#[derive(Debug)] +pub(crate) enum PersisterError { + Serialize(serde_json::Error), +} + +impl Display for PersisterError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + PersisterError::Serialize(e) => write!(f, "Serialization failed: {e}"), + } + } +} + +impl std::error::Error for PersisterError {} + +#[derive(Clone)] +pub(crate) struct ReceiverPersister { + db: Arc, + pub session_id: SessionId, +} + +impl ReceiverPersister { + pub fn new(db: Arc) -> Self { + let mut db_conn = db.connection(); + let session_id = db_conn.save_new_payjoin_receiver_session(); + Self { + db, + session_id: SessionId(session_id), + } + } + + pub fn from_id(db: Arc, id: SessionId) -> Self { + Self { db, session_id: id } + } +} + +impl SessionPersister for ReceiverPersister { + type SessionEvent = ReceiverSessionEvent; + type InternalStorageError = PersisterError; + + fn save_event( + &self, + event: &Self::SessionEvent, + ) -> std::result::Result<(), Self::InternalStorageError> { + let mut db_conn = self.db.connection(); + let event_ser = serde_json::to_vec(event).map_err(PersisterError::Serialize)?; + db_conn.save_receiver_session_event(&self.session_id, event_ser); + Ok(()) + } + + fn load( + &self, + ) -> std::result::Result>, Self::InternalStorageError> + { + let mut db_conn = self.db.connection(); + let events = db_conn.load_receiver_session_events(&self.session_id); + let iter = events + .into_iter() + .map(|event| serde_json::from_slice(&event).expect("Event to be serialized correctly")); + Ok(Box::new(iter)) + } + + fn close(&self) -> std::result::Result<(), Self::InternalStorageError> { + let mut db_conn = self.db.connection(); + db_conn.update_receiver_session_completed_at(&self.session_id); + Ok(()) + } +} + +#[derive(Clone)] +pub(crate) struct SenderPersister { + db: Arc, + pub session_id: SessionId, +} + +impl SenderPersister { + pub fn new(db: Arc, original_txid: &bitcoin::Txid) -> Self { + let mut db_conn = db.connection(); + let session_id = db_conn.save_new_payjoin_sender_session(original_txid); + Self { + db, + session_id: SessionId(session_id), + } + } + + pub fn from_id(db: Arc, id: SessionId) -> Self { + Self { db, session_id: id } + } +} + +impl SessionPersister for SenderPersister { + type SessionEvent = SenderSessionEvent; + type InternalStorageError = PersisterError; + + fn save_event( + &self, + event: &Self::SessionEvent, + ) -> std::result::Result<(), Self::InternalStorageError> { + let mut db_conn = self.db.connection(); + let event_ser = serde_json::to_vec(event).map_err(PersisterError::Serialize)?; + db_conn.save_sender_session_event(&self.session_id, event_ser); + Ok(()) + } + + fn load( + &self, + ) -> std::result::Result>, Self::InternalStorageError> + { + let mut db_conn = self.db.connection(); + let events = db_conn.get_all_sender_session_events(&self.session_id); + let iter = events + .into_iter() + .map(|event| serde_json::from_slice(&event).expect("Event to be serialized correctly")); + Ok(Box::new(iter)) + } + + fn close(&self) -> std::result::Result<(), Self::InternalStorageError> { + let mut db_conn = self.db.connection(); + db_conn.update_sender_session_completed_at(&self.session_id); + Ok(()) + } +} diff --git a/lianad/src/payjoin/helpers.rs b/lianad/src/payjoin/helpers.rs new file mode 100644 index 000000000..dd31c76f2 --- /dev/null +++ b/lianad/src/payjoin/helpers.rs @@ -0,0 +1,130 @@ +use std::time::Duration; + +use miniscript::{ + bitcoin::{secp256k1, Psbt, ScriptBuf, TxOut}, + psbt::PsbtExt, +}; + +use payjoin::{bitcoin::Amount, IntoUrl, OhttpKeys}; +use reqwest::{header::ACCEPT, Proxy}; + +pub(crate) const OHTTP_RELAY: &str = "https://pj.bobspacebkk.com"; +pub(crate) const PAYJOIN_DIRECTORY: &str = "https://payjo.in"; + +pub(crate) fn http_agent() -> reqwest::blocking::Client { + reqwest::blocking::Client::new() +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum FetchOhttpKeysError { + Reqwest(String), + InvalidOhttpKeys(String), + InvalidUrl(String), + UrlParseError, + UnexpectedStatusCode(reqwest::StatusCode), +} + +impl std::error::Error for FetchOhttpKeysError {} +impl std::fmt::Display for FetchOhttpKeysError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{self:?}") + } +} + +pub(crate) fn fetch_ohttp_keys( + ohttp_relay: impl IntoUrl, + payjoin_directory: impl IntoUrl, +) -> Result { + let payjoin_directory_str = payjoin_directory.as_str().to_string(); + let payjoin_directory_url = payjoin_directory + .into_url() + .map_err(|_| FetchOhttpKeysError::InvalidUrl(payjoin_directory_str.clone()))? + .join("/.well-known/ohttp-gateway") + .map_err(|_| FetchOhttpKeysError::UrlParseError)?; + + let ohttp_relay_str = ohttp_relay.as_str().to_string(); + let proxy = Proxy::all( + ohttp_relay + .into_url() + .map_err(|_| FetchOhttpKeysError::InvalidUrl(ohttp_relay_str.clone()))? + .as_str(), + ) + .map_err(|e| FetchOhttpKeysError::Reqwest(e.to_string()))?; + let client = reqwest::blocking::Client::builder() + .proxy(proxy) + .build() + .map_err(|e| FetchOhttpKeysError::Reqwest(e.to_string()))?; + let res = client + .get(payjoin_directory_url) + .header(ACCEPT, "application/ohttp-keys") + .send() + .map_err(|e| FetchOhttpKeysError::Reqwest(e.to_string()))?; + validate_ohttp_keys_response(res) +} + +fn validate_ohttp_keys_response( + res: reqwest::blocking::Response, +) -> Result { + if !res.status().is_success() { + return Err(FetchOhttpKeysError::UnexpectedStatusCode(res.status())); + } + + let body = res.bytes().unwrap().to_vec(); + match OhttpKeys::decode(&body) { + Ok(ohttp_keys) => Ok(ohttp_keys), + Err(err) => Err(FetchOhttpKeysError::InvalidOhttpKeys(err.to_string())), + } +} + +pub(crate) fn post_request( + req: payjoin::Request, +) -> Result { + let http = http_agent(); + http.post(req.url) + .header("Content-Type", req.content_type) + .body(req.body) + .timeout(Duration::from_secs(10)) + .send() +} + +/// Optimistically attempt to create witness for all inputs. +/// This method will not fail even if some inputs are not finalized or include invalid partial signatures. +pub(crate) fn finalize_psbt(psbt: &mut Psbt, secp: &secp256k1::Secp256k1) { + let mut witness_utxo_to_clean = vec![]; + let mut inputs_to_finalize = vec![]; + for (index, input) in psbt.inputs.iter_mut().enumerate() { + if input.witness_utxo.is_none() { + // Sender's wallet cleans this up (from original PSBT) but we need it to finalize_inp_mut() below + input.witness_utxo = Some(TxOut { + value: Amount::ZERO, + script_pubkey: ScriptBuf::default(), + }); + + input.final_script_sig = None; + input.final_script_witness = None; + + witness_utxo_to_clean.push(index); + continue; + } + if input.final_script_sig.is_some() + || input.final_script_witness.is_some() + || input.partial_sigs.is_empty() + { + input.final_script_sig = None; + input.final_script_witness = None; + continue; + } + inputs_to_finalize.push(index); + } + + for index in &inputs_to_finalize { + match psbt.finalize_inp_mut(secp, *index) { + Ok(_) => log::info!("Finalizing input at: {}", index), + Err(e) => log::warn!("Failed to finalize input at: {} | {}", index, e), + } + } + + for index in witness_utxo_to_clean { + psbt.inputs[index].witness_utxo = None; + } +} diff --git a/lianad/src/payjoin/mod.rs b/lianad/src/payjoin/mod.rs new file mode 100644 index 000000000..ec93c8c97 --- /dev/null +++ b/lianad/src/payjoin/mod.rs @@ -0,0 +1,5 @@ +pub(crate) mod db; +pub(crate) mod helpers; +pub(crate) mod receiver; +pub(crate) mod sender; +pub mod types; diff --git a/lianad/src/payjoin/receiver.rs b/lianad/src/payjoin/receiver.rs new file mode 100644 index 000000000..328320c97 --- /dev/null +++ b/lianad/src/payjoin/receiver.rs @@ -0,0 +1,375 @@ +use std::{ + collections::HashMap, + error::Error, + sync::{self, Arc}, +}; + +use liana::{descriptors, spend::AddrInfo}; + +use payjoin::{ + bitcoin::{ + self, consensus::encode::serialize_hex, psbt::Input, secp256k1, OutPoint, Sequence, TxIn, + Weight, + }, + persist::OptionalTransitionOutcome, + receive::{ + v2::{ + replay_event_log, Initialized, MaybeInputsOwned, MaybeInputsSeen, OutputsUnknown, + PayjoinProposal, ProvisionalProposal, ReceiveSession, Receiver, UncheckedProposal, + WantsFeeRange, WantsInputs, WantsOutputs, + }, + InputPair, + }, + ImplementationError, +}; + +use crate::{ + bitcoin::BitcoinInterface, + database::{Coin, CoinStatus, DatabaseConnection, DatabaseInterface}, + payjoin::helpers::{finalize_psbt, post_request, OHTTP_RELAY}, +}; + +use super::db::ReceiverPersister; + +fn read_from_directory( + receiver: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + bit: &mut sync::Arc>, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let mut receiver = receiver; + let (req, context) = receiver + .create_poll_request(OHTTP_RELAY) + .expect("Failed to extract request"); + let proposal = match post_request(req.clone()) { + Ok(ohttp_response) => { + let response_bytes = ohttp_response.bytes()?; + let state_transition = receiver + .process_response(response_bytes.as_ref(), context) + .save(persister); + match state_transition { + Ok(OptionalTransitionOutcome::Progress(next_state)) => next_state, + Ok(OptionalTransitionOutcome::Stasis(_current_state)) => { + return Err("NoResults".into()) + } + Err(e) => return Err(e.into()), + } + } + Err(e) => return Err(Box::new(e)), + }; + check_proposal(proposal, persister, db_conn, bit, desc, secp) +} + +fn check_proposal( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + bit: &mut sync::Arc>, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + // Receive Check 1: Can Broadcast + let proposal = proposal + .check_broadcast_suitability(None, |tx| { + let result = bit.test_mempool_accept(vec![serialize_hex(tx)]); + match result.first().cloned() { + Some(can_broadcast) => Ok(can_broadcast), + None => Ok(false), + } + }) + .save(persister)?; + check_inputs_not_owned(proposal, persister, db_conn, desc, secp) +} + +fn check_inputs_not_owned( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let proposal = proposal + .check_inputs_not_owned(&mut |script| { + let address = + bitcoin::Address::from_script(script, db_conn.network()).map_err(|e| { + ImplementationError::from(Box::new(e) as Box) + })?; + Ok(db_conn + .derivation_index_by_address(&address) + .map(|(index, is_change)| AddrInfo { index, is_change }) + .is_some()) + }) + .save(persister)?; + check_no_inputs_seen_before(proposal, persister, db_conn, desc, secp) +} + +fn check_no_inputs_seen_before( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let proposal = proposal + .check_no_inputs_seen_before(&mut |outpoint| { + let seen = db_conn.insert_input_seen_before(&[*outpoint]); + Ok(seen) + }) + .save(persister)?; + identify_receiver_outputs(proposal, persister, db_conn, desc, secp) +} + +fn identify_receiver_outputs( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + log::debug!("[Payjoin] receiver outputs"); + let proposal = proposal + .identify_receiver_outputs(&mut |script| { + let address = + bitcoin::Address::from_script(script, db_conn.network()).map_err(|e| { + ImplementationError::from(Box::new(e) as Box) + })?; + Ok(db_conn + .derivation_index_by_address(&address) + .map(|(index, is_change)| AddrInfo { index, is_change }) + .is_some()) + }) + .save(persister)?; + commit_outputs(proposal, persister, db_conn, desc, secp) +} + +fn commit_outputs( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let proposal = proposal.commit_outputs().save(persister)?; + contribute_inputs(proposal, persister, db_conn, desc, secp) +} + +fn contribute_inputs( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let coins = db_conn.coins(&[CoinStatus::Confirmed], &[]); + + let mut candidate_inputs_map = HashMap::::new(); + for (outpoint, coin) in coins.iter() { + let txs = db_conn.list_wallet_transactions(&[outpoint.txid]); + let (db_tx, _, _) = txs + .first() + .expect("There should be at least tx in the wallet"); + + let tx = db_tx.clone(); + + let txout = tx.tx_out(outpoint.vout as usize)?.clone(); + + let derived_desc = if coin.is_change { + desc.change_descriptor().derive(coin.derivation_index, secp) + } else { + desc.receive_descriptor() + .derive(coin.derivation_index, secp) + }; + + let txin = TxIn { + previous_output: *outpoint, + sequence: Sequence::ENABLE_RBF_NO_LOCKTIME, + ..Default::default() + }; + + let mut psbtin = Input { + non_witness_utxo: Some(tx.clone()), + witness_utxo: Some(txout.clone()), + ..Default::default() + }; + + derived_desc.update_psbt_in(&mut psbtin); + // TODO: revisit using primary path boolean. Perphaps we should use both paths and take the max. + let worse_case_weight = Weight::from_wu_usize(desc.max_sat_weight(true)) + // Segwit marker + + Weight::from_wu(2) + // Non-witness data size + + Weight::from_non_witness_data_size(txin.base_size() as u64); + + candidate_inputs_map.insert(*outpoint, (*coin, txin, psbtin, worse_case_weight)); + } + + let mut candidate_inputs = candidate_inputs_map + .values() + .map(|(_, txin, psbtin, weight)| { + InputPair::new(txin.clone(), psbtin.clone(), Some(*weight)).unwrap() + }); + log::info!("[Payjoin] Candidate inputs: {:?}", candidate_inputs); + + if candidate_inputs.len() == 0 { + return Err("No candidate inputs".into()); + } + + let selected_input = proposal + .try_preserving_privacy(candidate_inputs.clone()) + .unwrap_or( + candidate_inputs + .next() + .expect("Should have at least one input") + .clone(), + ); + + let proposal = proposal + .contribute_inputs(vec![selected_input])? + .commit_inputs() + .save(persister)?; + + apply_fee_range(proposal, persister, db_conn, secp)?; + Ok(()) +} + +fn apply_fee_range( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let proposal = proposal.apply_fee_range(None, None).save(persister)?; + let (_, session_history) = replay_event_log(persister)?; + let psbt = session_history + .psbt_ready_for_signing() + .expect("Just added fee applied psbt"); + + let txid = psbt.unsigned_tx.compute_txid(); + db_conn.save_receiver_session_original_txid(&persister.session_id, &txid); + db_conn.store_spend(&psbt); + log::info!("[Payjoin] PSBT in the DB..."); + + finalize_proposal(proposal, persister, db_conn, secp)?; + Ok(()) +} + +fn finalize_proposal( + proposal: Receiver, + persister: &ReceiverPersister, + db_conn: &mut Box, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let (_, session_history) = replay_event_log(persister)?; + let psbt = session_history + .psbt_ready_for_signing() + .expect("Just added fee applied psbt"); + + let txid = psbt.unsigned_tx.compute_txid(); + if let Some(psbt) = db_conn.spend_tx(&txid) { + let mut is_signed = false; + for psbtin in &psbt.inputs { + if !psbtin.partial_sigs.is_empty() { + log::debug!("[Payjoin] PSBT is signed!"); + is_signed = true; + break; + } + } + + if is_signed { + let proposal = proposal + .finalize_proposal(|_| { + let mut psbt = psbt.clone(); + finalize_psbt(&mut psbt, secp); + Ok(psbt) + }) + .save(persister)?; + + let proposed_txid = proposal.psbt().unsigned_tx.compute_txid(); + db_conn.save_receiver_session_proposed_txid(&persister.session_id, &proposed_txid); + send_payjoin_proposal(proposal, persister)?; + } + } + Ok(()) +} + +fn send_payjoin_proposal( + mut proposal: Receiver, + persister: &ReceiverPersister, +) -> Result<(), Box> { + let (req, ctx) = proposal + .create_post_request(OHTTP_RELAY) + .expect("Failed to extract request"); + + // Respond to sender + log::info!("[Payjoin] Receiver responding to sender..."); + match post_request(req) { + Ok(resp) => { + proposal + .process_response(resp.bytes().expect("Failed to read response").as_ref(), ctx) + .save(persister)?; + } + Err(err) => log::error!("[Payjoin] send_payjoin_proposal(): {}", err), + } + Ok(()) +} + +fn process_receiver_session( + db: &sync::Arc>, + bit: &mut sync::Arc>, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) -> Result<(), Box> { + let mut db_conn = db.connection(); + for session_id in db_conn.get_all_active_receiver_session_ids() { + let persister = ReceiverPersister::from_id(Arc::new(db.clone()), session_id.clone()); + + let (state, _) = replay_event_log(&persister) + .map_err(|e| format!("Failed to replay receiver event log: {:?}", e))?; + + match state { + ReceiveSession::Initialized(context) => { + read_from_directory(context, &persister, &mut db_conn, bit, desc, secp)?; + } + ReceiveSession::UncheckedProposal(proposal) => { + check_proposal(proposal, &persister, &mut db_conn, bit, desc, secp)?; + } + ReceiveSession::MaybeInputsOwned(proposal) => { + check_inputs_not_owned(proposal, &persister, &mut db_conn, desc, secp)?; + } + ReceiveSession::MaybeInputsSeen(proposal) => { + check_no_inputs_seen_before(proposal, &persister, &mut db_conn, desc, secp)?; + } + ReceiveSession::OutputsUnknown(proposal) => { + identify_receiver_outputs(proposal, &persister, &mut db_conn, desc, secp)?; + } + ReceiveSession::WantsOutputs(proposal) => { + commit_outputs(proposal, &persister, &mut db_conn, desc, secp)?; + } + ReceiveSession::WantsInputs(proposal) => { + contribute_inputs(proposal, &persister, &mut db_conn, desc, secp)? + } + ReceiveSession::ProvisionalProposal(proposal) => { + finalize_proposal(proposal, &persister, &mut db_conn, secp)? + } + ReceiveSession::PayjoinProposal(proposal) => { + send_payjoin_proposal(proposal, &persister)? + } + _ => return Err(format!("Unexpected receiver state: {:?}", state).into()), + } + } + Ok(()) +} + +pub(crate) fn payjoin_receiver_check( + db: &sync::Arc>, + bit: &mut sync::Arc>, + desc: &descriptors::LianaDescriptor, + secp: &secp256k1::Secp256k1, +) { + match process_receiver_session(db, bit, desc, secp) { + Ok(_) => (), + Err(e) => log::warn!("process_receiver_session(): {}", e), + } +} diff --git a/lianad/src/payjoin/sender.rs b/lianad/src/payjoin/sender.rs new file mode 100644 index 000000000..aaacd3647 --- /dev/null +++ b/lianad/src/payjoin/sender.rs @@ -0,0 +1,141 @@ +use crate::database::DatabaseInterface; + +use crate::payjoin::helpers::post_request; + +use std::error::Error; +use std::sync::{self, Arc}; + +use payjoin::bitcoin::Psbt; +use payjoin::persist::OptionalTransitionOutcome; +use payjoin::send::v2::{replay_event_log, SendSession, V2GetContext}; +use payjoin::send::v2::{Sender, WithReplyKey}; + +use super::db::SenderPersister; +use super::helpers::OHTTP_RELAY; + +fn get_proposed_payjoin_psbt( + context: Sender, + persister: &SenderPersister, + // TODO: replace with specific error +) -> Result, Box> { + let (req, ctx) = context.create_poll_request(OHTTP_RELAY)?; + match post_request(req) { + Ok(resp) => { + let res = context + .process_response(resp.bytes().expect("Failed to read response").as_ref(), ctx) + .save(persister); + match res { + Ok(OptionalTransitionOutcome::Progress(psbt)) => { + log::info!("[Payjoin] ProposalReceived!"); + Ok(Some(psbt)) + } + Ok(OptionalTransitionOutcome::Stasis(_current_state)) => { + log::info!("[Payjoin] No response yet."); + Ok(None) + } + Err(e) => { + log::error!("{:?}", e); + Err(format!("Response error: {}", e).into()) + } + } + } + Err(e) => Err(Box::new(e)), + } +} + +fn post_orginal_proposal( + sender: Sender, + persister: &SenderPersister, +) -> Result<(), Box> { + let (req, ctx) = sender.create_v2_post_request(OHTTP_RELAY)?; + match post_request(req) { + Ok(resp) => { + log::info!("[Payjoin] Posted original proposal..."); + sender + .process_response(resp.bytes().expect("Failed to read response").as_ref(), ctx) + .save(persister)?; + Ok(()) + } + Err(e) => Err(Box::new(e)), + } +} + +fn process_sender_session( + state: SendSession, + persister: &SenderPersister, +) -> Result, Box> { + match state { + SendSession::WithReplyKey(sender) => { + log::info!("[Payjoin] SenderState::WithReplyKey"); + match post_orginal_proposal(sender, persister) { + Ok(_) => {} + Err(err) => log::warn!("post_orginal_proposal(): {}", err), + } + Ok(None) + } + SendSession::V2GetContext(context) => { + log::info!("[Payjoin] SenderState::V2GetContext"); + get_proposed_payjoin_psbt(context, persister) + } + SendSession::ProposalReceived(psbt) => { + log::info!( + "[Payjoin] SenderState::ProposalReceived: {}", + psbt.to_string() + ); + Ok(Some(psbt.clone())) + } + _ => Err("Unexpected sender state".into()), + } +} + +pub(crate) fn payjoin_sender_check(db: &sync::Arc>) { + let mut db_conn = db.connection(); + for session_id in db_conn.get_all_active_sender_session_ids() { + let persister = SenderPersister::from_id(Arc::new(db.clone()), session_id.clone()); + + let (state, session_history) = replay_event_log(&persister) + .map_err(|e| format!("Failed to replay sender event log: {:?}", e)) + // TODO: handle error + .unwrap(); + let original_psbt = match session_history.fallback_tx().map(|tx| tx.compute_txid()) { + Some(txid) => { + // Get the original psbt so we can restore the input fields + let original_psbt = db_conn.spend_tx(&txid); + if original_psbt.is_none() { + log::error!("[Payjoin] expecting fallback txid for session={session_id:?}, but none found"); + return; + } + original_psbt.expect("checked above") + } + None => { + log::info!("[Payjoin] No fallback txid found for session={session_id:?}"); + return; + } + }; + + match process_sender_session(state, &persister) { + Ok(Some(proposal_psbt)) => { + let original_txid = original_psbt.unsigned_tx.compute_txid(); + // TODO: should we be deleting the original psbt? can we fallback without it? + log::info!("[Payjoin] Deleting original Payjoin psbt (txid={original_txid})"); + db_conn.delete_spend(&original_txid); + let new_txid = proposal_psbt.unsigned_tx.compute_txid(); + if db_conn.spend_tx(&new_txid).is_some() { + log::info!("[Payjoin] Proposal already exists in the db"); + return; + } + log::info!( + "[Payjoin] Updating Payjoin psbt: {} -> {}", + original_txid, + new_txid + ); + db_conn.store_spend(&proposal_psbt); + db_conn.save_proposed_payjoin_txid(&session_id, &new_txid); + } + Ok(None) => { + log::info!("[Payjoin] Proposal not received yet..."); + } + Err(e) => log::warn!("payjoin_sender_check(): {}", e), + } + } +} diff --git a/lianad/src/payjoin/types.rs b/lianad/src/payjoin/types.rs new file mode 100644 index 000000000..ae6fead08 --- /dev/null +++ b/lianad/src/payjoin/types.rs @@ -0,0 +1,49 @@ +use payjoin::{receive::v2::ReceiveSession, send::v2::SendSession}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub enum PayjoinStatus { + Pending, + WaitingToSign, + Success, + Failed, + Unknown, +} + +impl From for PayjoinStatus { + fn from(session: ReceiveSession) -> Self { + match session { + ReceiveSession::Uninitialized(_) + | ReceiveSession::Initialized(_) + | ReceiveSession::UncheckedProposal(_) + | ReceiveSession::MaybeInputsOwned(_) + | ReceiveSession::MaybeInputsSeen(_) + | ReceiveSession::OutputsUnknown(_) + | ReceiveSession::WantsOutputs(_) + | ReceiveSession::WantsInputs(_) + | ReceiveSession::WantsFeeRange(_) => PayjoinStatus::Pending, + ReceiveSession::ProvisionalProposal(_) => PayjoinStatus::WaitingToSign, + ReceiveSession::PayjoinProposal(_) => PayjoinStatus::Success, + ReceiveSession::TerminalFailure => PayjoinStatus::Failed, + } + } +} + +// TODO: None of the current states lead to a successful status +impl From for PayjoinStatus { + fn from(session: SendSession) -> Self { + match session { + SendSession::Uninitialized + | SendSession::WithReplyKey(_) + | SendSession::V2GetContext(_) => PayjoinStatus::Pending, + SendSession::ProposalReceived(_) => PayjoinStatus::WaitingToSign, + SendSession::TerminalFailure => PayjoinStatus::Failed, + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct PayjoinInfo { + pub status: PayjoinStatus, + pub bip21: String, +} diff --git a/lianad/src/testutils.rs b/lianad/src/testutils.rs index 5b24aeb8a..d73abd3ee 100644 --- a/lianad/src/testutils.rs +++ b/lianad/src/testutils.rs @@ -5,9 +5,11 @@ use crate::{ BlockInfo, Coin, CoinStatus, DatabaseConnection, DatabaseInterface, LabelItem, Wallet, }, datadir::DataDirectory, + payjoin::db::SessionId, DaemonControl, DaemonHandle, }; use liana::descriptors; +use payjoin::OhttpKeys; use std::convert::TryInto; use std::{ @@ -143,6 +145,18 @@ impl BitcoinInterface for DummyBitcoind { fn mempool_entry(&self, _: &bitcoin::Txid) -> Option { None } + + fn test_mempool_accept(&self, _rawtxs: Vec) -> Vec { + todo!() + } +} + +struct PayjoinSession { + completed: bool, +} + +struct PayjoinSessionEvent { + events: Vec>, } struct DummyDbState { @@ -156,6 +170,9 @@ struct DummyDbState { timestamp: u32, rescan_timestamp: Option, last_poll_timestamp: Option, + payjoin_sender_sessions: HashMap, + payjoin_receiver_sessions: HashMap, + payjoin_session_events: HashMap, } pub struct DummyDatabase { @@ -191,6 +208,9 @@ impl DummyDatabase { timestamp: now, rescan_timestamp: None, last_poll_timestamp: None, + payjoin_sender_sessions: HashMap::new(), + payjoin_receiver_sessions: HashMap::new(), + payjoin_session_events: HashMap::new(), })), } } @@ -547,9 +567,171 @@ impl DatabaseConnection for DummyDatabase { wallet_txs } + fn insert_input_seen_before(&mut self, _outpoints: &[bitcoin::OutPoint]) -> bool { + todo!() + } + fn get_labels_bip329(&mut self, _offset: u32, _limit: u32) -> bip329::Labels { todo!() } + fn payjoin_get_ohttp_keys(&mut self, _ohttp_relay: &str) -> Option<(u32, OhttpKeys)> { + todo!() + } + + fn payjoin_save_ohttp_keys(&mut self, _ohttp_relay: &str, _ohttp_keys: payjoin::OhttpKeys) { + todo!() + } + + fn get_all_active_receiver_session_ids(&mut self) -> Vec { + self.db + .read() + .expect("lock should not be poisoned") + .payjoin_receiver_sessions + .keys() + .map(|id| SessionId(*id)) + .collect() + } + fn save_new_payjoin_sender_session(&mut self, _txid: &bitcoin::Txid) -> i64 { + let id = self + .db + .read() + .expect("lock should not be poisoned") + .payjoin_sender_sessions + .len() as i64 + + 1; + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_sender_sessions + .insert(id, PayjoinSession { completed: false }); + id + } + + fn get_all_active_sender_session_ids(&mut self) -> Vec { + self.db + .read() + .expect("lock should not be poisoned") + .payjoin_sender_sessions + .keys() + .map(|id| SessionId(*id)) + .collect() + } + + fn save_new_payjoin_receiver_session(&mut self) -> i64 { + let id = self + .db + .read() + .expect("lock should not be poisoned") + .payjoin_receiver_sessions + .len() as i64 + + 1; + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_receiver_sessions + .insert(id, PayjoinSession { completed: false }); + id + } + + fn save_receiver_session_event(&mut self, session_id: &SessionId, event: Vec) { + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_session_events + .entry(session_id.0) + .or_insert(PayjoinSessionEvent { events: Vec::new() }) + .events + .push(event); + } + + fn update_receiver_session_completed_at(&mut self, session_id: &SessionId) { + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_receiver_sessions + .entry(session_id.0) + .or_insert(PayjoinSession { completed: false }) + .completed = true; + } + + fn load_receiver_session_events(&mut self, session_id: &SessionId) -> Vec> { + self.db + .read() + .expect("lock should not be poisoned") + .payjoin_session_events + .get(&session_id.0) + .map(|e| e.events.clone()) + .unwrap_or_default() + } + + fn save_sender_session_event(&mut self, session_id: &SessionId, event: Vec) { + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_session_events + .entry(session_id.0) + .or_insert(PayjoinSessionEvent { events: Vec::new() }) + .events + .push(event); + } + + fn get_all_sender_session_events(&mut self, session_id: &SessionId) -> Vec> { + self.db + .read() + .expect("lock should not be poisoned") + .payjoin_session_events + .get(&session_id.0) + .map(|e| e.events.clone()) + .unwrap_or_default() + } + + fn update_sender_session_completed_at(&mut self, session_id: &SessionId) { + self.db + .write() + .expect("lock should not be poisoned") + .payjoin_receiver_sessions + .entry(session_id.0) + .or_insert(PayjoinSession { completed: false }) + .completed = true; + } + + fn save_receiver_session_original_txid( + &mut self, + _session_id: &SessionId, + _original_txid: &bitcoin::Txid, + ) { + todo!() + } + + fn save_receiver_session_proposed_txid( + &mut self, + _session_id: &SessionId, + _proposed_txid: &bitcoin::Txid, + ) { + todo!() + } + + fn get_payjoin_receiver_session_id_from_txid( + &mut self, + _txid: &bitcoin::Txid, + ) -> Option { + todo!() + } + + fn save_proposed_payjoin_txid( + &mut self, + _session_id: &SessionId, + _proposed_txid: &bitcoin::Txid, + ) { + todo!() + } + + fn get_payjoin_sender_session_id_from_txid( + &mut self, + _txid: &bitcoin::Txid, + ) -> Option { + todo!() + } } pub struct DummyLiana { From 9710a5d69068c1c2d4daf1793b85830cc9e833c8 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 14 Aug 2025 13:46:02 -0400 Subject: [PATCH 2/5] Remove uneeded PSBT fields when extracting request --- lianad/src/payjoin/sender.rs | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/lianad/src/payjoin/sender.rs b/lianad/src/payjoin/sender.rs index aaacd3647..3d7a72708 100644 --- a/lianad/src/payjoin/sender.rs +++ b/lianad/src/payjoin/sender.rs @@ -97,25 +97,13 @@ pub(crate) fn payjoin_sender_check(db: &sync::Arc { - // Get the original psbt so we can restore the input fields - let original_psbt = db_conn.spend_tx(&txid); - if original_psbt.is_none() { - log::error!("[Payjoin] expecting fallback txid for session={session_id:?}, but none found"); - return; - } - original_psbt.expect("checked above") - } - None => { - log::info!("[Payjoin] No fallback txid found for session={session_id:?}"); - return; - } - }; match process_sender_session(state, &persister) { Ok(Some(proposal_psbt)) => { - let original_txid = original_psbt.unsigned_tx.compute_txid(); + let original_txid = session_history + .fallback_tx() + .map(|tx| tx.compute_txid()) + .expect("Fallback tx should be present"); // TODO: should we be deleting the original psbt? can we fallback without it? log::info!("[Payjoin] Deleting original Payjoin psbt (txid={original_txid})"); db_conn.delete_spend(&original_txid); From b44553175ffcaa66fc1f0b67b399245aa524f298 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 14 Aug 2025 13:46:40 -0400 Subject: [PATCH 3/5] Payjoin sender and receiver skips failing receiver sessions. When the receive session for loop failed to proceed past a certain callback method it stopped the entire for loop but now it simply skips over those sessions allowing the other sessions to proceed giving those older sessions an opportunity to be fixed or deleted. --- lianad/src/payjoin/receiver.rs | 79 ++++++++++++++--------------- lianad/src/payjoin/sender.rs | 91 +++++++++++++++++++--------------- 2 files changed, 91 insertions(+), 79 deletions(-) diff --git a/lianad/src/payjoin/receiver.rs b/lianad/src/payjoin/receiver.rs index 328320c97..ec2bb3f1e 100644 --- a/lianad/src/payjoin/receiver.rs +++ b/lianad/src/payjoin/receiver.rs @@ -316,48 +316,42 @@ fn send_payjoin_proposal( } fn process_receiver_session( - db: &sync::Arc>, + db_conn: &mut Box, bit: &mut sync::Arc>, desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, + persister: ReceiverPersister, ) -> Result<(), Box> { - let mut db_conn = db.connection(); - for session_id in db_conn.get_all_active_receiver_session_ids() { - let persister = ReceiverPersister::from_id(Arc::new(db.clone()), session_id.clone()); - - let (state, _) = replay_event_log(&persister) - .map_err(|e| format!("Failed to replay receiver event log: {:?}", e))?; + let (state, _) = replay_event_log(&persister) + .map_err(|e| format!("Failed to replay receiver event log: {:?}", e))?; - match state { - ReceiveSession::Initialized(context) => { - read_from_directory(context, &persister, &mut db_conn, bit, desc, secp)?; - } - ReceiveSession::UncheckedProposal(proposal) => { - check_proposal(proposal, &persister, &mut db_conn, bit, desc, secp)?; - } - ReceiveSession::MaybeInputsOwned(proposal) => { - check_inputs_not_owned(proposal, &persister, &mut db_conn, desc, secp)?; - } - ReceiveSession::MaybeInputsSeen(proposal) => { - check_no_inputs_seen_before(proposal, &persister, &mut db_conn, desc, secp)?; - } - ReceiveSession::OutputsUnknown(proposal) => { - identify_receiver_outputs(proposal, &persister, &mut db_conn, desc, secp)?; - } - ReceiveSession::WantsOutputs(proposal) => { - commit_outputs(proposal, &persister, &mut db_conn, desc, secp)?; - } - ReceiveSession::WantsInputs(proposal) => { - contribute_inputs(proposal, &persister, &mut db_conn, desc, secp)? - } - ReceiveSession::ProvisionalProposal(proposal) => { - finalize_proposal(proposal, &persister, &mut db_conn, secp)? - } - ReceiveSession::PayjoinProposal(proposal) => { - send_payjoin_proposal(proposal, &persister)? - } - _ => return Err(format!("Unexpected receiver state: {:?}", state).into()), + match state { + ReceiveSession::Initialized(context) => { + read_from_directory(context, &persister, db_conn, bit, desc, secp)?; + } + ReceiveSession::UncheckedProposal(proposal) => { + check_proposal(proposal, &persister, db_conn, bit, desc, secp)?; + } + ReceiveSession::MaybeInputsOwned(proposal) => { + check_inputs_not_owned(proposal, &persister, db_conn, desc, secp)?; + } + ReceiveSession::MaybeInputsSeen(proposal) => { + check_no_inputs_seen_before(proposal, &persister, db_conn, desc, secp)?; + } + ReceiveSession::OutputsUnknown(proposal) => { + identify_receiver_outputs(proposal, &persister, db_conn, desc, secp)?; + } + ReceiveSession::WantsOutputs(proposal) => { + commit_outputs(proposal, &persister, db_conn, desc, secp)?; + } + ReceiveSession::WantsInputs(proposal) => { + contribute_inputs(proposal, &persister, db_conn, desc, secp)? } + ReceiveSession::ProvisionalProposal(proposal) => { + finalize_proposal(proposal, &persister, db_conn, secp)? + } + ReceiveSession::PayjoinProposal(proposal) => send_payjoin_proposal(proposal, &persister)?, + _ => return Err(format!("Unexpected receiver state: {:?}", state).into()), } Ok(()) } @@ -368,8 +362,15 @@ pub(crate) fn payjoin_receiver_check( desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, ) { - match process_receiver_session(db, bit, desc, secp) { - Ok(_) => (), - Err(e) => log::warn!("process_receiver_session(): {}", e), + let mut db_conn = db.connection(); + for session_id in db_conn.get_all_active_receiver_session_ids() { + let persister = ReceiverPersister::from_id(Arc::new(db.clone()), session_id.clone()); + match process_receiver_session(&mut db_conn, bit, desc, secp, persister) { + Ok(_) => (), + Err(e) => { + log::warn!("process_receiver_session(): {}", e); + continue; + } + } } } diff --git a/lianad/src/payjoin/sender.rs b/lianad/src/payjoin/sender.rs index 3d7a72708..03a2c9690 100644 --- a/lianad/src/payjoin/sender.rs +++ b/lianad/src/payjoin/sender.rs @@ -1,5 +1,6 @@ -use crate::database::DatabaseInterface; +use crate::database::{DatabaseConnection, DatabaseInterface}; +use crate::payjoin::db::SessionId; use crate::payjoin::helpers::post_request; use std::error::Error; @@ -43,6 +44,35 @@ fn get_proposed_payjoin_psbt( } } +fn update_db_with_psbt( + db_conn: &mut Box, + session_history: &SessionHistory, + session_id: &SessionId, + psbt: Psbt, +) { + let original_txid = session_history + .fallback_tx() + .map(|tx| tx.compute_txid()) + .expect("fallback tx should be present"); + + log::info!("[Payjoin] Deleting original Payjoin psbt (txid={original_txid})"); + db_conn.delete_spend(&original_txid); + + let new_txid = psbt.unsigned_tx.compute_txid(); + if db_conn.spend_tx(&new_txid).is_some() { + log::info!("[Payjoin] Proposal already exists in the db"); + return; + } + + log::info!( + "[Payjoin] Updating Payjoin psbt: {} -> {}", + original_txid, + new_txid + ); + db_conn.store_spend(&psbt); + db_conn.save_proposed_payjoin_txid(session_id, &new_txid); +} + fn post_orginal_proposal( sender: Sender, persister: &SenderPersister, @@ -61,28 +91,35 @@ fn post_orginal_proposal( } fn process_sender_session( - state: SendSession, + db_conn: &mut Box, + session_id: SessionId, persister: &SenderPersister, -) -> Result, Box> { +) -> Result<(), Box> { + let (state, session_history) = replay_event_log(persister) + .map_err(|e| format!("Failed to replay sender event log: {:?}", e))?; + match state { SendSession::WithReplyKey(sender) => { log::info!("[Payjoin] SenderState::WithReplyKey"); - match post_orginal_proposal(sender, persister) { - Ok(_) => {} - Err(err) => log::warn!("post_orginal_proposal(): {}", err), + if let Err(err) = post_orginal_proposal(sender, persister) { + log::warn!("post_orginal_proposal(): {}", err); } - Ok(None) + Ok(()) } SendSession::V2GetContext(context) => { log::info!("[Payjoin] SenderState::V2GetContext"); - get_proposed_payjoin_psbt(context, persister) + if let Ok(Some(psbt)) = get_proposed_payjoin_psbt(context, persister) { + update_db_with_psbt(db_conn, &session_history, &session_id, psbt); + } + Ok(()) } SendSession::ProposalReceived(psbt) => { log::info!( "[Payjoin] SenderState::ProposalReceived: {}", psbt.to_string() ); - Ok(Some(psbt.clone())) + update_db_with_psbt(db_conn, &session_history, &session_id, psbt.clone()); + Ok(()) } _ => Err("Unexpected sender state".into()), } @@ -92,38 +129,12 @@ pub(crate) fn payjoin_sender_check(db: &sync::Arc { - let original_txid = session_history - .fallback_tx() - .map(|tx| tx.compute_txid()) - .expect("Fallback tx should be present"); - // TODO: should we be deleting the original psbt? can we fallback without it? - log::info!("[Payjoin] Deleting original Payjoin psbt (txid={original_txid})"); - db_conn.delete_spend(&original_txid); - let new_txid = proposal_psbt.unsigned_tx.compute_txid(); - if db_conn.spend_tx(&new_txid).is_some() { - log::info!("[Payjoin] Proposal already exists in the db"); - return; - } - log::info!( - "[Payjoin] Updating Payjoin psbt: {} -> {}", - original_txid, - new_txid - ); - db_conn.store_spend(&proposal_psbt); - db_conn.save_proposed_payjoin_txid(&session_id, &new_txid); - } - Ok(None) => { - log::info!("[Payjoin] Proposal not received yet..."); + match process_sender_session(&mut db_conn, session_id, &persister) { + Ok(_) => (), + Err(e) => { + log::warn!("payjoin_sender_check(): {}", e); + continue; } - Err(e) => log::warn!("payjoin_sender_check(): {}", e), } } } From 0fca57bcaf975c13a53c9c5a4070598501d08eff Mon Sep 17 00:00:00 2001 From: user Date: Wed, 20 Aug 2025 15:43:16 -0400 Subject: [PATCH 4/5] catch more panics --- lianad/src/commands/mod.rs | 10 ++++++++-- lianad/src/jsonrpc/rpc.rs | 4 ++++ lianad/src/payjoin/receiver.rs | 3 ++- lianad/src/payjoin/sender.rs | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lianad/src/commands/mod.rs b/lianad/src/commands/mod.rs index 30be76553..5d7af1ba7 100644 --- a/lianad/src/commands/mod.rs +++ b/lianad/src/commands/mod.rs @@ -90,6 +90,7 @@ pub enum CommandError { FailedToFetchOhttpKeys(FetchOhttpKeysError), // Same FIXME as `SpendFinalization` FailedToPostOriginalPayjoinProposal(String), + ReplayError(String), } impl fmt::Display for CommandError { @@ -152,6 +153,9 @@ impl fmt::Display for CommandError { Self::FailedToPostOriginalPayjoinProposal(e) => { write!(f, "Failed to post original payjoin proposal: '{}'.", e) } + Self::ReplayError(e) => { + write!(f, "Payjoin replay failed: '{}'.", e) + } } } } @@ -469,14 +473,16 @@ impl DaemonControl { if let Some(session_id) = db_conn.get_payjoin_receiver_session_id_from_txid(txid) { let persister = ReceiverPersister::from_id(Arc::new(self.db.clone()), session_id.clone()); - let (state, _) = replay_receiver_event_log(&persister).unwrap(); + let (state, _) = replay_receiver_event_log(&persister) + .map_err(|e| CommandError::ReplayError(format!("Receiver replay failed: {e:?}")))?; return Ok(state.into()); } if let Some(session_id) = db_conn.get_payjoin_sender_session_id_from_txid(txid) { log::info!("Checking sender session: {:?}", session_id); let persister = SenderPersister::from_id(Arc::new(self.db.clone()), session_id.clone()); - let (state, _) = replay_sender_event_log(&persister).unwrap(); + let (state, _) = replay_sender_event_log(&persister) + .map_err(|e| CommandError::ReplayError(format!("Sender replay failed: {e:?}")))?; log::info!("Sender state: {:?}", state); return Ok(state.into()); } diff --git a/lianad/src/jsonrpc/rpc.rs b/lianad/src/jsonrpc/rpc.rs index de56ed6ec..67b9e94b6 100644 --- a/lianad/src/jsonrpc/rpc.rs +++ b/lianad/src/jsonrpc/rpc.rs @@ -50,6 +50,7 @@ pub struct Request { /// A failure to broadcast a transaction to the P2P network. const BROADCAST_ERROR: i64 = 1_000; +const REPLAY_ERROR: i64 = 1_001; /// JSONRPC2 error codes. See https://www.jsonrpc.org/specification#error_object. #[derive(Debug, PartialEq, Eq, Clone)] @@ -177,6 +178,9 @@ impl From for Error { commands::CommandError::FailedToPostOriginalPayjoinProposal(_) => { Error::new(ErrorCode::ServerError(BROADCAST_ERROR), e.to_string()) } + commands::CommandError::ReplayError(_) => { + Error::new(ErrorCode::ServerError(REPLAY_ERROR), e.to_string()) + } } } } diff --git a/lianad/src/payjoin/receiver.rs b/lianad/src/payjoin/receiver.rs index ec2bb3f1e..d304a487b 100644 --- a/lianad/src/payjoin/receiver.rs +++ b/lianad/src/payjoin/receiver.rs @@ -42,7 +42,8 @@ fn read_from_directory( let mut receiver = receiver; let (req, context) = receiver .create_poll_request(OHTTP_RELAY) - .expect("Failed to extract request"); + .map_err(|e| format!("Failed to extract request: {:?}", e))?; + let proposal = match post_request(req.clone()) { Ok(ohttp_response) => { let response_bytes = ohttp_response.bytes()?; diff --git a/lianad/src/payjoin/sender.rs b/lianad/src/payjoin/sender.rs index 03a2c9690..15218fc2f 100644 --- a/lianad/src/payjoin/sender.rs +++ b/lianad/src/payjoin/sender.rs @@ -8,7 +8,7 @@ use std::sync::{self, Arc}; use payjoin::bitcoin::Psbt; use payjoin::persist::OptionalTransitionOutcome; -use payjoin::send::v2::{replay_event_log, SendSession, V2GetContext}; +use payjoin::send::v2::{replay_event_log, SendSession, SessionHistory, V2GetContext}; use payjoin::send::v2::{Sender, WithReplyKey}; use super::db::SenderPersister; From b4b90f6f0c3626b7a044a7c2b8af78a8ea8abdc2 Mon Sep 17 00:00:00 2001 From: user Date: Thu, 9 Oct 2025 09:52:45 -0400 Subject: [PATCH 5/5] Update payjoin to 1.0.0-rc update msrv to 1.85.0 --- .github/workflows/main.yml | 4 +- Cargo.lock | 1825 ++++++++++++---------------- liana-gui/Cargo.toml | 2 +- liana-gui/src/app/message.rs | 3 +- liana-gui/src/app/state/receive.rs | 5 +- liana-gui/src/app/view/receive.rs | 5 +- liana/src/signer.rs | 4 +- lianad/Cargo.toml | 2 +- lianad/src/commands/mod.rs | 29 +- lianad/src/jsonrpc/rpc.rs | 4 + lianad/src/payjoin/db.rs | 8 +- lianad/src/payjoin/receiver.rs | 22 +- lianad/src/payjoin/sender.rs | 11 +- lianad/src/payjoin/types.rs | 28 +- rust-toolchain.toml | 2 +- 15 files changed, 867 insertions(+), 1087 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e0d4e52d8..55f4f12e2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions-rs/toolchain@v1 with: - toolchain: 1.82.0 + toolchain: 1.85.0 components: rustfmt, clippy override: true - name: rustfmt @@ -27,7 +27,7 @@ jobs: strategy: matrix: toolchain: - - 1.80.0 + - 1.85.0 - nightly os: - ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index 276152b8d..46cd16454 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.32" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,24 +14,24 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.10" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.25.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] name = "adler2" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -106,12 +106,12 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.12" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -145,7 +145,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.9.4", + "bitflags 2.8.0", "cc", "cesu8", "jni", @@ -165,6 +165,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -176,9 +182,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "approx" @@ -191,9 +197,9 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -227,16 +233,16 @@ dependencies = [ [[package]] name = "ashpd" -version = "0.11.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" dependencies = [ "async-fs", "async-net", "enumflags2", "futures-channel", "futures-util", - "rand 0.9.2", + "rand 0.8.5", "raw-window-handle", "serde", "serde_repr", @@ -261,9 +267,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.5.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -273,15 +279,14 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", - "pin-project-lite", "slab", ] @@ -294,7 +299,7 @@ dependencies = [ "async-trait", "cfg-if", "pin-project", - "rustix 0.38.44", + "rustix", "thiserror 1.0.69", "tokio", "windows-sys 0.52.0", @@ -302,9 +307,9 @@ dependencies = [ [[package]] name = "async-fs" -version = "2.2.0" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" dependencies = [ "async-lock", "blocking", @@ -338,27 +343,28 @@ dependencies = [ [[package]] name = "async-io" -version = "2.6.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ - "autocfg", + "async-lock", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 1.1.2", + "rustix", "slab", - "windows-sys 0.61.2", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ "event-listener", "event-listener-strategy", @@ -378,9 +384,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" dependencies = [ "async-channel", "async-io", @@ -391,7 +397,8 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix 1.1.2", + "rustix", + "tracing", ] [[package]] @@ -402,14 +409,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "async-signal" -version = "0.2.13" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" dependencies = [ "async-io", "async-lock", @@ -417,10 +424,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.1.2", + "rustix", "signal-hook-registry", "slab", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -431,13 +438,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -448,15 +455,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.76" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", "cfg-if", @@ -464,7 +471,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link", + "windows-targets 0.52.6", ] [[package]] @@ -524,9 +531,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bdk_chain" @@ -539,9 +546,9 @@ dependencies = [ [[package]] name = "bdk_coin_select" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43064fa3dd1d3a8b24079cfcb5ede6b785857edc782277f17a1736511ccc1916" +checksum = "d2e57e4db8b917d554a0eb142be5267bbc88d787c3346c8dc0590fbe76be68bd" [[package]] name = "bdk_electrum" @@ -576,14 +583,14 @@ dependencies = [ "bitcoin", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.12", ] [[package]] name = "bip39" -version = "2.2.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d193de1f7487df1914d3a568b772458861d33f9c54249612cc2893d6915054" +checksum = "33415e24172c1b7d6066f6d999545375ab8e1d95421d6784bdfff9496f292387" dependencies = [ "bitcoin_hashes 0.13.0", "serde", @@ -607,9 +614,9 @@ checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] name = "bit_field" -version = "0.10.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitbox-api" @@ -622,13 +629,13 @@ dependencies = [ "bitcoin", "byteorder", "chrono", - "getrandom 0.2.16", + "getrandom 0.2.15", "hex", "hidapi", "noise-protocol", "noise-rust-crypto", "num-bigint", - "prost 0.13.5", + "prost 0.13.4", "prost-build", "semver", "serde", @@ -683,7 +690,7 @@ dependencies = [ "hmac 0.12.1", "rand_core 0.6.4", "secp256k1", - "sha2 0.10.9", + "sha2 0.10.8", "subtle", "zeroize", ] @@ -796,9 +803,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "blake2" @@ -839,23 +846,14 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2 0.6.3", + "objc2", ] [[package]] name = "blocking" -version = "1.6.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" dependencies = [ "async-channel", "async-task", @@ -866,9 +864,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "by_address" @@ -878,22 +876,22 @@ checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -904,9 +902,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bzip2" @@ -920,11 +918,12 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.13+1.0.8" +version = "0.1.11+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" dependencies = [ "cc", + "libc", "pkg-config", ] @@ -934,10 +933,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "log", "polling", - "rustix 0.38.44", + "rustix", "slab", "thiserror 1.0.69", ] @@ -949,18 +948,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", - "rustix 0.38.44", + "rustix", "wayland-backend", "wayland-client", ] [[package]] name = "cc" -version = "1.2.40" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" +checksum = "755717a7de9ec452bf7f3f1a3099085deabd7f2962b861dae91ecd7a365903d2" dependencies = [ - "find-msvc-tools", "jobserver", "libc", "shlex", @@ -974,9 +972,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" @@ -1041,15 +1039,16 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-link", + "windows-targets 0.52.6", ] [[package]] @@ -1074,9 +1073,9 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "5.4.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" dependencies = [ "error-code", ] @@ -1087,9 +1086,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b7f4aaa047ba3c3630b080bb9860894732ff23e2aee290a418909aa6d5df38f" dependencies = [ - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] @@ -1213,7 +1212,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -1230,9 +1229,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" dependencies = [ "core-foundation-sys", "libc", @@ -1263,8 +1262,8 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.9.4", - "core-foundation 0.10.1", + "bitflags 2.8.0", + "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", "libc", @@ -1287,8 +1286,8 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.9.4", - "core-foundation 0.10.1", + "bitflags 2.8.0", + "core-foundation 0.10.0", "libc", ] @@ -1298,7 +1297,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "fontdb 0.16.2", "log", "rangemap", @@ -1335,9 +1334,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -1369,9 +1368,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -1432,9 +1431,9 @@ dependencies = [ [[package]] name = "cursor-icon" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" [[package]] name = "curve25519-dalek" @@ -1459,7 +1458,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -1468,22 +1467,22 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" dependencies = [ - "bitflags 2.9.4", - "libloading 0.8.9", + "bitflags 2.8.0", + "libloading 0.8.6", "winapi", ] [[package]] name = "data-url" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" +checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" [[package]] name = "der" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", "zeroize", @@ -1491,13 +1490,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -1568,18 +1567,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "libc", - "objc2 0.6.3", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -1588,7 +1575,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -1597,7 +1584,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.9", + "libloading 0.8.6", ] [[package]] @@ -1623,9 +1610,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "dpi" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" [[package]] name = "drm" @@ -1633,11 +1620,11 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98888c4bbd601524c11a7ed63f814b8825f420514f78e96f752c437ae9cbb5d1" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytemuck", "drm-ffi", "drm-fourcc", - "rustix 0.38.44", + "rustix", ] [[package]] @@ -1647,7 +1634,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97c98727e48b7ccb4f4aea8cfe881e5b07f702d17b7875991881b41af7278d53" dependencies = [ "drm-sys", - "rustix 0.38.44", + "rustix", ] [[package]] @@ -1682,9 +1669,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "electrum-client" @@ -1696,7 +1683,7 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.32", + "rustls 0.23.27", "serde", "serde_json", "webpki-roots 0.25.4", @@ -1748,9 +1735,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -1758,36 +1745,36 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.12" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "equivalent" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.14" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] name = "error-code" -version = "3.3.2" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" [[package]] name = "etagere" @@ -1810,9 +1797,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1821,9 +1808,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener", "pin-project-lite", @@ -1836,7 +1823,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "half 2.6.0", + "half 2.4.1", "lebe", "miniz_oxide", "rayon-core", @@ -1888,9 +1875,9 @@ dependencies = [ [[package]] name = "ff" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ "rand_core 0.6.4", "subtle", @@ -1904,22 +1891,16 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "filetime" -version = "0.2.26" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] -[[package]] -name = "find-msvc-tools" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" - [[package]] name = "fixedbitset" version = "0.4.2" @@ -1928,9 +1909,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.1.4" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1965,9 +1946,9 @@ dependencies = [ [[package]] name = "fontconfig-parser" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" dependencies = [ "roxmltree", ] @@ -2018,7 +1999,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -2029,9 +2010,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2097,9 +2078,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "fastrand", "futures-core", @@ -2116,7 +2097,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -2162,39 +2143,39 @@ dependencies = [ [[package]] name = "gethostname" -version = "1.0.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ - "rustix 1.1.2", - "windows-targets 0.52.6", + "libc", + "windows-targets 0.48.5", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasi 0.13.3+wasi-0.2.2", "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] @@ -2219,9 +2200,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -2229,9 +2210,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.32.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gl_generator" @@ -2277,7 +2258,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "gpu-alloc-types", ] @@ -2287,7 +2268,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", ] [[package]] @@ -2309,7 +2290,7 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "gpu-descriptor-types", "hashbrown 0.14.5", ] @@ -2320,7 +2301,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", ] [[package]] @@ -2346,9 +2327,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.27" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -2371,9 +2352,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.6.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ "cfg-if", "crunchy", @@ -2397,9 +2378,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "hashlink" @@ -2416,10 +2397,10 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "com", "libc", - "libloading 0.8.9", + "libloading 0.8.6", "thiserror 1.0.69", "widestring", "winapi", @@ -2433,9 +2414,15 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" [[package]] name = "hex" @@ -2588,9 +2575,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.10.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -2615,7 +2602,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.10", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -2666,7 +2653,7 @@ dependencies = [ "http 1.3.1", "hyper 1.7.0", "hyper-util", - "rustls 0.23.32", + "rustls 0.23.27", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -2700,17 +2687,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", - "log", "wasm-bindgen", - "windows-core 0.62.2", + "windows-core", ] [[package]] @@ -2745,7 +2731,7 @@ checksum = "582c517a94ce3205da98e9c10b26bb71aa36b7d7d084441d826dc912711d1bac" dependencies = [ "cfg-if", "chrono", - "getrandom 0.3.3", + "getrandom 0.3.1", "iced", "iced_fonts", "itertools 0.14.0", @@ -2760,7 +2746,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0013a238275494641bf8f1732a23a808196540dc67b22ff97099c044ae4c8a1c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytes", "glam", "log", @@ -2816,10 +2802,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba25a18cfa6d5cc160aca7e1b34f73ccdff21680fa8702168c09739767b6c66f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytemuck", "cosmic-text", - "half 2.6.0", + "half 2.4.1", "iced_core", "iced_futures", "image", @@ -2882,7 +2868,7 @@ version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15708887133671d2bcc6c1d01d1f176f43a64d6cdc3b2bf893396c3ee498295f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytemuck", "futures", "glam", @@ -2937,22 +2923,21 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "icu_locid" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" dependencies = [ "displaydoc", "litemap", @@ -2961,11 +2946,31 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", "icu_collections", @@ -2973,59 +2978,72 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", + "utf16_iter", + "utf8_iter", + "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" [[package]] name = "icu_properties" -version = "2.0.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", "icu_collections", - "icu_locale_core", + "icu_locid_transform", "icu_properties_data", "icu_provider", - "potential_utf", - "zerotrie", + "tinystr", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" [[package]] name = "icu_provider" -version = "2.0.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" dependencies = [ "displaydoc", - "icu_locale_core", + "icu_locid", + "icu_provider_macros", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", - "zerotrie", "zerovec", ] +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "idna" -version = "1.1.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ "idna_adapter", "smallvec", @@ -3034,9 +3052,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ "icu_normalizer", "icu_properties", @@ -3068,19 +3086,19 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "indexmap" -version = "2.11.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.2", ] [[package]] name = "inout" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ "generic-array", ] @@ -3104,17 +3122,6 @@ dependencies = [ "mach2", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -3159,6 +3166,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -3170,9 +3186,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jni" @@ -3198,28 +3214,27 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ - "getrandom 0.3.3", "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -3259,7 +3274,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2 0.10.9", + "sha2 0.10.8", "signature", ] @@ -3279,7 +3294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.9", + "libloading 0.8.6", "pkg-config", ] @@ -3301,12 +3316,11 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f" dependencies = [ "arrayvec", - "euclid", "smallvec", ] @@ -3318,9 +3332,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "ledger-apdu" @@ -3376,7 +3390,7 @@ version = "13.0.0" dependencies = [ "bdk_coin_select", "bip39", - "getrandom 0.3.3", + "getrandom 0.3.1", "log", "miniscript", "rdrand", @@ -3471,15 +3485,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libfuzzer-sys" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5037190e1f70cbeef565bd267599242926f724d3b8a9f510fd7e0b540cfa4404" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" dependencies = [ "arbitrary", "cc", @@ -3497,29 +3511,29 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-link", + "windows-targets 0.52.6", ] [[package]] name = "libm" -version = "0.2.15" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.8", ] [[package]] @@ -3565,32 +3579,27 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a385b1be4e5c3e362ad2ffa73c392e53f031eaa5b7d648e64cd87f27f6063d7" -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - [[package]] name = "litemap" -version = "0.8.0" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" -version = "0.4.14" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "lru" @@ -3606,9 +3615,9 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lyon" -version = "1.0.16" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcb7d54d54c8937364c9d41902d066656817dce1e03a44e5533afebd1ef4352" +checksum = "91e7f9cda98b5430809e63ca5197b06c7d191bf7e26dfc467d5a3f0290e2a74f" dependencies = [ "lyon_algorithms", "lyon_tessellation", @@ -3616,9 +3625,9 @@ dependencies = [ [[package]] name = "lyon_algorithms" -version = "1.0.16" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c0829e28c4f336396f250d850c3987e16ce6db057ffe047ce0dd54aab6b647" +checksum = "f13c9be19d257c7d37e70608ed858e8eab4b2afcea2e3c9a622e892acbf43c08" dependencies = [ "lyon_path", "num-traits", @@ -3626,9 +3635,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.17" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e16770d760c7848b0c1c2d209101e408207a65168109509f8483837a36cf2e7" +checksum = "8af69edc087272df438b3ee436c4bb6d7c04aa8af665cfd398feae627dbd8570" dependencies = [ "arrayvec", "euclid", @@ -3637,9 +3646,9 @@ dependencies = [ [[package]] name = "lyon_path" -version = "1.0.16" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aeca86bcfd632a15984ba029b539ffb811e0a70bf55e814ef8b0f54f506fdeb" +checksum = "8e0b8aec2f58586f6eef237985b9a9b7cb3a3aff4417c575075cf95bf925252e" dependencies = [ "lyon_geom", "num-traits", @@ -3647,9 +3656,9 @@ dependencies = [ [[package]] name = "lyon_tessellation" -version = "1.0.16" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f586142e1280335b1bc89539f7c97dd80f08fc43e9ab1b74ef0a42b04aa353" +checksum = "579d42360a4b09846eff2feef28f538696c7d6c7439bfa65874ff3cbe0951b2c" dependencies = [ "float_next_after", "lyon_path", @@ -3658,9 +3667,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -3676,15 +3685,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.8" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -3704,7 +3713,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "block", "core-graphics-types 0.1.3", "foreign-types", @@ -3721,9 +3730,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniscript" -version = "12.3.5" +version = "12.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487906208f38448e186e3deb02f2b8ef046a9078b0de00bdb28bf4fb9b76951c" +checksum = "82911d2fb527bb9aacd2446d2f517aff3f8e3846ace1b3c24258b61ea3cce2bc" dependencies = [ "bech32", "bitcoin", @@ -3732,9 +3741,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.9" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", "simd-adler32", @@ -3742,24 +3751,25 @@ dependencies = [ [[package]] name = "minreq" -version = "2.14.1" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05015102dad0f7d61691ca347e9d9d9006685a64aefb3d79eecf62665de2153d" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" dependencies = [ + "log", "serde", "serde_json", ] [[package]] name = "mio" -version = "1.0.4" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", ] [[package]] @@ -3783,9 +3793,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "mutate_once" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d2233c9842d08cfe13f9eac96e207ca6a2ea10b80259ebe8ad0268be27d2af" +checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" [[package]] name = "naga" @@ -3794,7 +3804,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" dependencies = [ "bit-set", - "bitflags 2.9.4", + "bitflags 2.8.0", "codespan-reporting", "hexf-parse", "indexmap", @@ -3813,7 +3823,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -3863,19 +3873,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "cfg_aliases 0.2.1", - "libc", -] - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "cfg-if", "cfg_aliases 0.2.1", "libc", @@ -3907,18 +3905,19 @@ dependencies = [ "blake2", "chacha20poly1305 0.10.1", "noise-protocol", - "sha2 0.10.9", + "sha2 0.10.8", "x25519-dalek", "zeroize", ] [[package]] name = "nu-ansi-term" -version = "0.50.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "windows-sys 0.52.0", + "overload", + "winapi", ] [[package]] @@ -3962,34 +3961,33 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.17.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", - "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -4018,54 +4016,33 @@ dependencies = [ "objc2-encode", ] -[[package]] -name = "objc2" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" -dependencies = [ - "objc2-encode", -] - [[package]] name = "objc2-app-kit" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", + "bitflags 2.8.0", + "block2", "libc", - "objc2 0.5.2", + "objc2", "objc2-core-data", "objc2-core-image", - "objc2-foundation 0.2.2", + "objc2-foundation", "objc2-quartz-core", ] -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.9.4", - "block2 0.6.2", - "objc2 0.6.3", - "objc2-foundation 0.3.2", -] - [[package]] name = "objc2-cloud-kit" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", + "bitflags 2.8.0", + "block2", + "objc2", "objc2-core-location", - "objc2-foundation 0.2.2", + "objc2-foundation", ] [[package]] @@ -4074,9 +4051,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "block2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4085,21 +4062,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.9.4", - "dispatch2", - "objc2 0.6.3", + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4108,9 +4074,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "block2", + "objc2", + "objc2-foundation", "objc2-metal", ] @@ -4120,10 +4086,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", + "block2", + "objc2", "objc2-contacts", - "objc2-foundation 0.2.2", + "objc2-foundation", ] [[package]] @@ -4138,22 +4104,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", + "bitflags 2.8.0", + "block2", "dispatch", "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.3", - "objc2-core-foundation", + "objc2", ] [[package]] @@ -4162,10 +4117,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", ] [[package]] @@ -4174,10 +4129,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4186,10 +4141,10 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "bitflags 2.8.0", + "block2", + "objc2", + "objc2-foundation", "objc2-metal", ] @@ -4199,8 +4154,8 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4209,14 +4164,14 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", + "bitflags 2.8.0", + "block2", + "objc2", "objc2-cloud-kit", "objc2-core-data", "objc2-core-image", "objc2-core-location", - "objc2-foundation 0.2.2", + "objc2-foundation", "objc2-link-presentation", "objc2-quartz-core", "objc2-symbols", @@ -4230,9 +4185,9 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "block2", + "objc2", + "objc2-foundation", ] [[package]] @@ -4241,11 +4196,11 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.9.4", - "block2 0.5.1", - "objc2 0.5.2", + "bitflags 2.8.0", + "block2", + "objc2", "objc2-core-location", - "objc2-foundation 0.2.2", + "objc2-foundation", ] [[package]] @@ -4259,18 +4214,18 @@ dependencies = [ [[package]] name = "object" -version = "0.37.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -4345,15 +4300,21 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] -name = "owned_ttf_parser" -version = "0.25.1" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ "ttf-parser 0.25.1", ] @@ -4378,7 +4339,7 @@ dependencies = [ "by_address", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -4400,12 +4361,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.5" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.12", + "parking_lot_core 0.9.10", ] [[package]] @@ -4424,15 +4385,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.12" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.8", "smallvec", - "windows-link", + "windows-targets 0.52.6", ] [[package]] @@ -4450,7 +4411,8 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "payjoin" version = "1.0.0-rc.0" -source = "git+https://github.com/payjoin/rust-payjoin.git?branch=master#b97ffb7129aceea4bb56ec7789681d56423572b6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7009c5298439d27ba52548c3ecc59d12e3208004c2b910066a968aae5e948d22" dependencies = [ "bhttp", "bitcoin", @@ -4467,9 +4429,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "percent-encoding-rfc3986" @@ -4517,7 +4479,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -4537,22 +4499,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -4590,9 +4552,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "png" @@ -4609,16 +4571,17 @@ dependencies = [ [[package]] name = "polling" -version = "3.11.0" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi", + "hermit-abi 0.4.0", "pin-project-lite", - "rustix 1.1.2", - "windows-sys 0.61.2", + "rustix", + "tracing", + "windows-sys 0.59.0", ] [[package]] @@ -4673,20 +4636,11 @@ dependencies = [ "universal-hash 0.5.1", ] -[[package]] -name = "potential_utf" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" -dependencies = [ - "zerovec", -] - [[package]] name = "ppv-lite86" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ "zerocopy", ] @@ -4709,18 +4663,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.23.6", + "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -4733,16 +4687,16 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "version_check", "yansi", ] [[package]] name = "profiling" -version = "1.0.17" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" [[package]] name = "prost" @@ -4756,12 +4710,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.5" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" dependencies = [ "bytes", - "prost-derive 0.13.5", + "prost-derive 0.13.4", ] [[package]] @@ -4801,15 +4755,15 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.5" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -4838,9 +4792,9 @@ checksum = "166f136dfdb199f98186f3649cf7a0536534a61417a1a30221b492b4fb60ce3f" [[package]] name = "quick-xml" -version = "0.37.5" +version = "0.37.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" dependencies = [ "memchr", ] @@ -4857,9 +4811,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.32", - "socket2 0.6.0", - "thiserror 2.0.17", + "rustls 0.23.27", + "socket2 0.5.8", + "thiserror 2.0.12", "tokio", "tracing", "web-time", @@ -4872,15 +4826,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.1", "lru-slab", "rand 0.9.2", "ring", "rustc-hash 2.1.1", - "rustls 0.23.32", + "rustls 0.23.27", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.12", "tinyvec", "tracing", "web-time", @@ -4895,26 +4849,20 @@ dependencies = [ "cfg_aliases 0.2.1", "libc", "once_cell", - "socket2 0.6.0", + "socket2 0.5.8", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "rand" version = "0.8.5" @@ -4962,7 +4910,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", ] [[package]] @@ -4971,7 +4919,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.1", ] [[package]] @@ -4982,9 +4930,9 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rangemap" -version = "1.6.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" [[package]] name = "raw-window-handle" @@ -4994,9 +4942,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -5004,9 +4952,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -5051,11 +4999,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", ] [[package]] @@ -5064,16 +5012,16 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.11.3" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -5083,9 +5031,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -5094,9 +5042,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "renderdoc-sys" @@ -5167,7 +5115,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.32", + "rustls 0.23.27", "rustls-pki-types", "serde", "serde_json", @@ -5213,19 +5161,19 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.4" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" +checksum = "6a24763657bff09769a8ccf12c8b8a50416fb035fe199263b4c5071e4e3f006f" dependencies = [ "ashpd", - "block2 0.6.2", - "dispatch2", + "block2", + "core-foundation 0.10.0", + "core-foundation-sys", "js-sys", "log", - "objc2 0.6.3", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-foundation 0.3.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "pollster", "raw-window-handle", "urlencoding", @@ -5237,23 +5185,24 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] [[package]] name = "ring" -version = "0.17.14" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.15", "libc", + "spin", "untrusted", "windows-sys 0.52.0", ] @@ -5270,7 +5219,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -5290,9 +5239,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -5321,26 +5270,13 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys 0.4.15", "windows-sys 0.59.0", ] -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.9.4", - "errno", - "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", -] - [[package]] name = "rustls" version = "0.21.12" @@ -5355,15 +5291,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.7", + "rustls-webpki 0.103.3", "subtle", "zeroize", ] @@ -5399,9 +5335,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.7" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -5410,9 +5346,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "rustybuzz" @@ -5420,7 +5356,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytemuck", "libm", "smallvec", @@ -5433,9 +5369,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "same-file" @@ -5518,15 +5454,15 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "semver" -version = "1.0.27" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" @@ -5540,12 +5476,11 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.19" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", - "serde_core", ] [[package]] @@ -5575,7 +5510,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -5593,13 +5528,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.20" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -5625,13 +5560,13 @@ dependencies = [ [[package]] name = "serialport" -version = "4.7.3" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acaf3f973e8616d7ceac415f53fc60e190b2a686fbcf8d27d0256c741c5007b" +checksum = "5ecfc4858c2266c7695d8b8460bbd612fa81bd2e250f5f0dd16195e4b4f8b3d8" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "cfg-if", - "core-foundation 0.10.1", + "core-foundation 0.10.0", "core-foundation-sys", "io-kit-sys", "libudev", @@ -5657,9 +5592,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.9" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures 0.2.17", @@ -5683,9 +5618,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -5733,9 +5668,12 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "slotmap" @@ -5748,9 +5686,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" @@ -5758,14 +5696,14 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "calloop", "calloop-wayland-source", "cursor-icon", "libc", "log", "memmap2", - "rustix 0.38.44", + "rustix", "thiserror 1.0.69", "wayland-backend", "wayland-client", @@ -5821,9 +5759,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -5855,12 +5793,12 @@ dependencies = [ "js-sys", "log", "memmap2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "objc2", + "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "redox_syscall 0.5.18", - "rustix 0.38.44", + "redox_syscall 0.5.8", + "rustix", "tiny-xlib", "wasm-bindgen", "wayland-backend", @@ -5871,13 +5809,19 @@ dependencies = [ "x11rb", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", ] [[package]] @@ -5919,9 +5863,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svg_fmt" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" +checksum = "ce5d813d71d82c4cbc1742135004e4a79fd870214c155443451c139c9470a0aa" [[package]] name = "svgtypes" @@ -5929,7 +5873,7 @@ version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" dependencies = [ - "kurbo 0.11.3", + "kurbo 0.11.1", "siphasher", ] @@ -5957,9 +5901,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -5983,13 +5927,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -6024,9 +5968,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.44" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" dependencies = [ "filetime", "libc", @@ -6034,15 +5978,16 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.23.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ + "cfg-if", "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.1", "once_cell", - "rustix 1.1.2", - "windows-sys 0.61.2", + "rustix", + "windows-sys 0.59.0", ] [[package]] @@ -6065,11 +6010,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.12", ] [[package]] @@ -6080,27 +6025,28 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", + "once_cell", ] [[package]] @@ -6157,16 +6103,16 @@ checksum = "0324504befd01cab6e0c994f34b2ffa257849ee019d3fb3b64fb2c858887d89e" dependencies = [ "as-raw-xcb-connection", "ctor-lite", - "libloading 0.8.9", + "libloading 0.8.6", "pkg-config", "tracing", ] [[package]] name = "tinystr" -version = "0.8.1" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", "zerovec", @@ -6174,9 +6120,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -6189,21 +6135,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "slab", - "socket2 0.6.0", + "socket2 0.5.8", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6214,7 +6158,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -6233,7 +6177,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.32", + "rustls 0.23.27", "tokio", ] @@ -6253,9 +6197,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -6275,75 +6219,38 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.23" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "toml_datetime", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] -[[package]] -name = "toml_datetime" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" -dependencies = [ - "serde_core", -] - [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.22.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "02a8b472d1a3d7c18e2d61a489aee3453fd9031c33e4f55bd533f4a7adca1bee" dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" -dependencies = [ - "indexmap", - "toml_datetime 0.7.2", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" -dependencies = [ + "toml_datetime", "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "tower" version = "0.5.2" @@ -6365,7 +6272,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "bytes", "futures-util", "http 1.3.1", @@ -6402,20 +6309,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -6434,9 +6341,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.20" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -6472,9 +6379,9 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "typenum" -version = "1.19.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uds_windows" @@ -6489,11 +6396,11 @@ dependencies = [ [[package]] name = "unescaper" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" +checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" dependencies = [ - "thiserror 2.0.17", + "thiserror 1.0.69", ] [[package]] @@ -6516,9 +6423,9 @@ checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-linebreak" @@ -6528,9 +6435,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-normalization" -version = "0.1.24" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] @@ -6599,9 +6506,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.7" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -6626,7 +6533,7 @@ dependencies = [ "flate2", "fontdb 0.18.0", "imagesize", - "kurbo 0.11.3", + "kurbo 0.11.1", "log", "pico-args", "roxmltree", @@ -6642,6 +6549,12 @@ dependencies = [ "xmlwriter", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -6687,60 +6600,50 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "0.13.3+wasi-0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" dependencies = [ - "wit-bindgen", + "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" -version = "0.2.104" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", - "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.104" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.54" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -6751,9 +6654,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6761,22 +6664,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ "unicode-ident", ] @@ -6811,13 +6714,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.11" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.2", + "rustix", "scoped-tls", "smallvec", "wayland-sys", @@ -6825,12 +6728,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.11" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ - "bitflags 2.9.4", - "rustix 1.1.2", + "bitflags 2.8.0", + "rustix", "wayland-backend", "wayland-scanner", ] @@ -6841,29 +6744,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.11" +version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" +checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" dependencies = [ - "rustix 1.1.2", + "rustix", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.9" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -6871,11 +6774,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.9" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6884,11 +6787,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.9" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6897,9 +6800,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.7" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", "quick-xml", @@ -6908,9 +6811,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.7" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ "dlib", "log", @@ -6920,9 +6823,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.81" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -6955,9 +6858,9 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.10" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" @@ -6971,7 +6874,7 @@ dependencies = [ "js-sys", "log", "naga", - "parking_lot 0.12.5", + "parking_lot 0.12.3", "profiling", "raw-window-handle", "smallvec", @@ -6992,14 +6895,14 @@ checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.9.4", + "bitflags 2.8.0", "cfg_aliases 0.1.1", "codespan-reporting", "indexmap", "log", "naga", "once_cell", - "parking_lot 0.12.5", + "parking_lot 0.12.3", "profiling", "raw-window-handle", "rustc-hash 1.1.0", @@ -7020,7 +6923,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.9.4", + "bitflags 2.8.0", "block", "cfg_aliases 0.1.1", "core-graphics-types 0.1.3", @@ -7034,14 +6937,14 @@ dependencies = [ "js-sys", "khronos-egl", "libc", - "libloading 0.8.9", + "libloading 0.8.6", "log", "metal", "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", - "parking_lot 0.12.5", + "parking_lot 0.12.3", "profiling", "range-alloc", "raw-window-handle", @@ -7061,7 +6964,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "js-sys", "web-sys", ] @@ -7075,14 +6978,14 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.44", + "rustix", ] [[package]] name = "widestring" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" [[package]] name = "winapi" @@ -7102,11 +7005,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.11" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -7135,7 +7038,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core 0.52.0", + "windows-core", "windows-targets 0.52.6", ] @@ -7148,65 +7051,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-sys" version = "0.45.0" @@ -7243,24 +7087,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - [[package]] name = "windows-targets" version = "0.42.2" @@ -7300,30 +7126,13 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7342,12 +7151,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -7366,12 +7169,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -7390,24 +7187,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -7426,12 +7211,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -7450,12 +7229,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7474,12 +7247,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -7498,23 +7265,17 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - [[package]] name = "winit" -version = "0.30.12" +version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +checksum = "f5d74280aabb958072864bff6cfbcf9025cf8bfacdde5e32b5e12920ef703b0f" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.9.4", - "block2 0.5.1", + "bitflags 2.8.0", + "block2", "bytemuck", "calloop", "cfg_aliases 0.2.1", @@ -7527,16 +7288,16 @@ dependencies = [ "libc", "memmap2", "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", + "objc2", + "objc2-app-kit", + "objc2-foundation", "objc2-ui-kit", "orbclient", "percent-encoding", "pin-project", "raw-window-handle", "redox_syscall 0.4.1", - "rustix 0.38.44", + "rustix", "sctk-adwaita", "smithay-client-toolkit", "smol_str", @@ -7558,9 +7319,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "86e376c75f4f43f44db463cf729e0d3acbf954d13e22c51e26e4c264b4ab545f" dependencies = [ "memchr", ] @@ -7581,21 +7342,30 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcacf11b6f48dd21b9ba002f991bdd5de29b2da8cc2800412f4b80f677e4957" dependencies = [ - "toml 0.8.23", + "toml 0.8.20", "version_check", ] [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + +[[package]] +name = "write16" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" [[package]] name = "writeable" -version = "0.6.1" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "x11-dl" @@ -7610,24 +7380,24 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.9", + "libloading 0.8.6", "once_cell", - "rustix 1.1.2", + "rustix", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "x25519-dalek" @@ -7642,9 +7412,19 @@ dependencies = [ [[package]] name = "xcursor" -version = "0.3.10" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] [[package]] name = "xkbcommon-dl" @@ -7652,7 +7432,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.8.0", "dlib", "log", "once_cell", @@ -7667,9 +7447,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.27" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" [[package]] name = "xmlwriter" @@ -7691,9 +7471,9 @@ checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" [[package]] name = "yoke" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -7703,24 +7483,25 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "synstructure", ] [[package]] name = "zbus" -version = "5.11.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d07e46d035fb8e375b2ce63ba4e4ff90a7f73cf2ffb0138b29e1158d2eaadf7" +checksum = "cbddd8b6cb25d5d8ec1b23277b45299a98bfb220f1761ca11e186d5c702507f8" dependencies = [ "async-broadcast", "async-executor", + "async-fs", "async-io", "async-lock", "async-process", @@ -7731,16 +7512,18 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-lite", + "futures-util", "hex", - "nix 0.30.1", + "nix 0.29.0", "ordered-stream", "serde", "serde_repr", + "static_assertions", "tracing", "uds_windows", - "windows-sys 0.60.2", + "windows-sys 0.59.0", "winnow", + "xdg-home", "zbus_macros", "zbus_names", "zvariant", @@ -7748,14 +7531,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.11.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e797a9c847ed3ccc5b6254e8bcce056494b375b511b3d6edcec0aeb4defaca" +checksum = "dac404d48b4e9cf193c8b49589f3280ceca5ff63519e7e64f55b4cf9c47ce146" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "zbus_names", "zvariant", "zvariant_utils", @@ -7781,50 +7564,51 @@ checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] @@ -7837,25 +7621,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "zerotrie" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", + "syn 2.0.98", ] [[package]] name = "zerovec" -version = "0.11.4" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ "yoke", "zerofrom", @@ -7864,13 +7637,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", ] [[package]] @@ -7897,13 +7670,14 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.7.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "999dd3be73c52b1fccd109a4a81e4fcd20fab1d3599c8121b38d04e1419498db" +checksum = "31c951c21879c6e1d46ac5adfc34f698fefb465d498cf4ac87545849bd71bb5a" dependencies = [ "endi", "enumflags2", "serde", + "static_assertions", "url", "winnow", "zvariant_derive", @@ -7912,26 +7686,27 @@ dependencies = [ [[package]] name = "zvariant_derive" -version = "5.7.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6643fd0b26a46d226bd90d3f07c1b5321fe9bb7f04673cb37ac6d6883885b68e" +checksum = "9eeb539471af098d9e63faf428c71ac4cd4efe0b5baa3c8a6b991c5f2543b70e" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.98", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.106", + "static_assertions", + "syn 2.0.98", "winnow", ] diff --git a/liana-gui/Cargo.toml b/liana-gui/Cargo.toml index b630b46f8..f053e9216 100644 --- a/liana-gui/Cargo.toml +++ b/liana-gui/Cargo.toml @@ -64,7 +64,7 @@ open = "5.3" encrypted_backup = { version = "0.0.1", default-features=false, features = ["miniscript_12_0"], package = "bitcoin-encrypted-backup" } # Payjoin -payjoin = { git = "https://github.com/payjoin/rust-payjoin.git", branch = "master", features = ["v2", "io"] } +payjoin = { version = "1.0.0-rc", features = ["v2", "io"] } [target.'cfg(windows)'.dependencies] zip = { version = "0.6", default-features=false, features = ["bzip2", "deflate"] } diff --git a/liana-gui/src/app/message.rs b/liana-gui/src/app/message.rs index fed0edb91..0de34bc55 100644 --- a/liana-gui/src/app/message.rs +++ b/liana-gui/src/app/message.rs @@ -7,7 +7,6 @@ use liana::miniscript::bitcoin::{ Address, Txid, }; use lianad::config::Config as DaemonConfig; -use payjoin::Url; use crate::{ app::{ @@ -37,7 +36,7 @@ pub enum Message { DaemonConfigLoaded(Result<(), Error>), LoadWallet(Wallet), Info(Result), - ReceiveAddress(Result<(Address, ChildNumber, Option), Error>), + ReceiveAddress(Result<(Address, ChildNumber, Option), Error>), /// Revealed addresses. The second element contains the start index used for the request. RevealedAddresses( Result, diff --git a/liana-gui/src/app/state/receive.rs b/liana-gui/src/app/state/receive.rs index 8e7a680a0..3e562fdd8 100644 --- a/liana-gui/src/app/state/receive.rs +++ b/liana-gui/src/app/state/receive.rs @@ -7,7 +7,6 @@ use liana::miniscript::bitcoin::{ Address, Network, }; use liana_ui::{widget::modal, widget::*}; -use payjoin::Url; use crate::daemon::model::LabelsLoader; use crate::dir::LianaDirectory; @@ -41,7 +40,7 @@ pub enum Modal { #[derive(Debug, Default)] pub struct Addresses { list: Vec
, - bip21s: HashMap, + bip21s: HashMap, derivation_indexes: Vec, labels: HashMap, } @@ -477,7 +476,7 @@ pub struct ShowBip21QrCodeModal { } impl ShowBip21QrCodeModal { - pub fn new(bip21: &payjoin::Url, _index: ChildNumber) -> Option { + pub fn new(bip21: &String, _index: ChildNumber) -> Option { qr_code::Data::new(format!("{}", bip21)) .ok() .map(|qr_code| Self { diff --git a/liana-gui/src/app/view/receive.rs b/liana-gui/src/app/view/receive.rs index 11984922f..02358f40c 100644 --- a/liana-gui/src/app/view/receive.rs +++ b/liana-gui/src/app/view/receive.rs @@ -23,7 +23,6 @@ use liana_ui::{ icon, theme, widget::*, }; -use payjoin::Url; use crate::{ app::{ @@ -38,7 +37,7 @@ use super::message::Message; fn address_card<'a>( row_index: usize, address: &'a bitcoin::Address, - maybe_bip21: Option<&Url>, + maybe_bip21: Option<&String>, labels: &'a HashMap, labels_editing: &'a HashMap>, ) -> Container<'a, Message> { @@ -132,7 +131,7 @@ fn address_card<'a>( #[allow(clippy::too_many_arguments)] pub fn receive<'a>( addresses: &'a [bitcoin::Address], - bip21s: &'a HashMap, + bip21s: &'a HashMap, labels: &'a HashMap, prev_addresses: &'a [bitcoin::Address], prev_labels: &'a HashMap, diff --git a/liana/src/signer.rs b/liana/src/signer.rs index 2d88b9679..c923858bc 100644 --- a/liana/src/signer.rs +++ b/liana/src/signer.rs @@ -307,7 +307,9 @@ impl HotSigner { if keypair.x_only_public_key().0 != *int_key { return Err(SignerError::InsanePsbt); } - let keypair = keypair.tap_tweak(secp, psbt_in.tap_merkle_root).to_inner(); + let keypair = keypair + .tap_tweak(secp, psbt_in.tap_merkle_root) + .to_keypair(); let sighash = sighash_cache .taproot_key_spend_signature_hash(input_index, &prevouts, sighash_type) .map_err(|_| SignerError::InsanePsbt)?; diff --git a/lianad/Cargo.toml b/lianad/Cargo.toml index 942f70812..3ff61b5f2 100644 --- a/lianad/Cargo.toml +++ b/lianad/Cargo.toml @@ -61,5 +61,5 @@ jsonrpc = { version = "0.17", features = ["minreq_http"], default-features = fal bip329 = { version = "0.3.0", default-features = false } # Payjoin -payjoin = { git = "https://github.com/payjoin/rust-payjoin.git", branch = "master", features = ["v2", "io"] } +payjoin = { version = "1.0.0-rc", features = ["v2", "io"] } reqwest = { version = "0.11", default-features=false, features = ["json", "rustls-tls", "stream", "blocking"] } diff --git a/lianad/src/commands/mod.rs b/lianad/src/commands/mod.rs index 5d7af1ba7..aa60578f6 100644 --- a/lianad/src/commands/mod.rs +++ b/lianad/src/commands/mod.rs @@ -37,7 +37,6 @@ use std::{ collections::{hash_map, HashMap, HashSet}, convert::{TryFrom, TryInto}, fmt, - str::FromStr, sync::{self, mpsc, Arc}, time::SystemTime, }; @@ -52,9 +51,9 @@ use miniscript::{ }; use payjoin::{ bitcoin::{key::Secp256k1, FeeRate}, - receive::v2::{replay_event_log as replay_receiver_event_log, Receiver, UninitializedReceiver}, + receive::v2::{replay_event_log as replay_receiver_event_log, ReceiverBuilder}, send::v2::{replay_event_log as replay_sender_event_log, SenderBuilder}, - Uri, UriExt, Url, + Uri, UriExt, }; use serde::{Deserialize, Serialize}; @@ -91,6 +90,7 @@ pub enum CommandError { // Same FIXME as `SpendFinalization` FailedToPostOriginalPayjoinProposal(String), ReplayError(String), + IntoUrlError(String), } impl fmt::Display for CommandError { @@ -156,6 +156,9 @@ impl fmt::Display for CommandError { Self::ReplayError(e) => { write!(f, "Payjoin replay failed: '{}'.", e) } + Self::IntoUrlError(e) => { + write!(f, "Payjoin into url failed: '{}'.", e) + } } } } @@ -414,19 +417,16 @@ impl DaemonControl { .address(self.config.bitcoin_config.network); let persister = ReceiverPersister::new(Arc::new(self.db.clone())); - let session = Receiver::::create_session( - address.clone(), - PAYJOIN_DIRECTORY, - ohttp_keys.clone(), - None, - ) - .save(&persister) - .unwrap(); + let session = ReceiverBuilder::new(address.clone(), PAYJOIN_DIRECTORY, ohttp_keys.clone()) + .map_err(|e| CommandError::IntoUrlError(e.to_string()))? + .build() + .save(&persister) + .unwrap(); Ok(GetAddressResult::new( address, new_index, - Some(Url::from_str(session.pj_uri().to_string().as_str()).expect("Should be valid")), + Some(session.pj_uri().to_string()), )) } @@ -460,6 +460,7 @@ impl DaemonControl { let persister = SenderPersister::new(Arc::new(self.db.clone()), &original_txid); let _sender = SenderBuilder::new(original_psbt.clone(), uri) .build_recommended(FeeRate::BROADCAST_MIN) + .map_err(|e| CommandError::IntoUrlError(e.to_string()))? .save(&persister) .unwrap(); @@ -1499,14 +1500,14 @@ pub struct GetAddressResult { #[serde(deserialize_with = "deser_addr_assume_checked")] pub address: bitcoin::Address, pub derivation_index: bip32::ChildNumber, - pub bip21: Option, + pub bip21: Option, } impl GetAddressResult { pub fn new( address: bitcoin::Address, derivation_index: bip32::ChildNumber, - bip21: Option, + bip21: Option, ) -> Self { Self { address, diff --git a/lianad/src/jsonrpc/rpc.rs b/lianad/src/jsonrpc/rpc.rs index 67b9e94b6..56ea91655 100644 --- a/lianad/src/jsonrpc/rpc.rs +++ b/lianad/src/jsonrpc/rpc.rs @@ -51,6 +51,7 @@ pub struct Request { /// A failure to broadcast a transaction to the P2P network. const BROADCAST_ERROR: i64 = 1_000; const REPLAY_ERROR: i64 = 1_001; +const INTO_URL_ERROR: i64 = 1_002; /// JSONRPC2 error codes. See https://www.jsonrpc.org/specification#error_object. #[derive(Debug, PartialEq, Eq, Clone)] @@ -181,6 +182,9 @@ impl From for Error { commands::CommandError::ReplayError(_) => { Error::new(ErrorCode::ServerError(REPLAY_ERROR), e.to_string()) } + commands::CommandError::IntoUrlError(_) => { + Error::new(ErrorCode::ServerError(INTO_URL_ERROR), e.to_string()) + } } } } diff --git a/lianad/src/payjoin/db.rs b/lianad/src/payjoin/db.rs index bf4883042..656556bb1 100644 --- a/lianad/src/payjoin/db.rs +++ b/lianad/src/payjoin/db.rs @@ -59,10 +59,10 @@ impl SessionPersister for ReceiverPersister { fn save_event( &self, - event: &Self::SessionEvent, + event: Self::SessionEvent, ) -> std::result::Result<(), Self::InternalStorageError> { let mut db_conn = self.db.connection(); - let event_ser = serde_json::to_vec(event).map_err(PersisterError::Serialize)?; + let event_ser = serde_json::to_vec(&event).map_err(PersisterError::Serialize)?; db_conn.save_receiver_session_event(&self.session_id, event_ser); Ok(()) } @@ -113,10 +113,10 @@ impl SessionPersister for SenderPersister { fn save_event( &self, - event: &Self::SessionEvent, + event: Self::SessionEvent, ) -> std::result::Result<(), Self::InternalStorageError> { let mut db_conn = self.db.connection(); - let event_ser = serde_json::to_vec(event).map_err(PersisterError::Serialize)?; + let event_ser = serde_json::to_vec(&event).map_err(PersisterError::Serialize)?; db_conn.save_sender_session_event(&self.session_id, event_ser); Ok(()) } diff --git a/lianad/src/payjoin/receiver.rs b/lianad/src/payjoin/receiver.rs index d304a487b..c0eb4bd6d 100644 --- a/lianad/src/payjoin/receiver.rs +++ b/lianad/src/payjoin/receiver.rs @@ -15,8 +15,8 @@ use payjoin::{ receive::{ v2::{ replay_event_log, Initialized, MaybeInputsOwned, MaybeInputsSeen, OutputsUnknown, - PayjoinProposal, ProvisionalProposal, ReceiveSession, Receiver, UncheckedProposal, - WantsFeeRange, WantsInputs, WantsOutputs, + PayjoinProposal, ProvisionalProposal, ReceiveSession, Receiver, + UncheckedOriginalPayload, WantsFeeRange, WantsInputs, WantsOutputs, }, InputPair, }, @@ -39,7 +39,7 @@ fn read_from_directory( desc: &descriptors::LianaDescriptor, secp: &secp256k1::Secp256k1, ) -> Result<(), Box> { - let mut receiver = receiver; + let receiver = receiver; let (req, context) = receiver .create_poll_request(OHTTP_RELAY) .map_err(|e| format!("Failed to extract request: {:?}", e))?; @@ -64,7 +64,7 @@ fn read_from_directory( } fn check_proposal( - proposal: Receiver, + proposal: Receiver, persister: &ReceiverPersister, db_conn: &mut Box, bit: &mut sync::Arc>, @@ -242,10 +242,7 @@ fn apply_fee_range( secp: &secp256k1::Secp256k1, ) -> Result<(), Box> { let proposal = proposal.apply_fee_range(None, None).save(persister)?; - let (_, session_history) = replay_event_log(persister)?; - let psbt = session_history - .psbt_ready_for_signing() - .expect("Just added fee applied psbt"); + let psbt = proposal.psbt_to_sign(); let txid = psbt.unsigned_tx.compute_txid(); db_conn.save_receiver_session_original_txid(&persister.session_id, &txid); @@ -262,10 +259,7 @@ fn finalize_proposal( db_conn: &mut Box, secp: &secp256k1::Secp256k1, ) -> Result<(), Box> { - let (_, session_history) = replay_event_log(persister)?; - let psbt = session_history - .psbt_ready_for_signing() - .expect("Just added fee applied psbt"); + let psbt = proposal.psbt_to_sign(); let txid = psbt.unsigned_tx.compute_txid(); if let Some(psbt) = db_conn.spend_tx(&txid) { @@ -296,7 +290,7 @@ fn finalize_proposal( } fn send_payjoin_proposal( - mut proposal: Receiver, + proposal: Receiver, persister: &ReceiverPersister, ) -> Result<(), Box> { let (req, ctx) = proposal @@ -330,7 +324,7 @@ fn process_receiver_session( ReceiveSession::Initialized(context) => { read_from_directory(context, &persister, db_conn, bit, desc, secp)?; } - ReceiveSession::UncheckedProposal(proposal) => { + ReceiveSession::UncheckedOriginalPayload(proposal) => { check_proposal(proposal, &persister, db_conn, bit, desc, secp)?; } ReceiveSession::MaybeInputsOwned(proposal) => { diff --git a/lianad/src/payjoin/sender.rs b/lianad/src/payjoin/sender.rs index 15218fc2f..bf4c20e54 100644 --- a/lianad/src/payjoin/sender.rs +++ b/lianad/src/payjoin/sender.rs @@ -8,14 +8,14 @@ use std::sync::{self, Arc}; use payjoin::bitcoin::Psbt; use payjoin::persist::OptionalTransitionOutcome; -use payjoin::send::v2::{replay_event_log, SendSession, SessionHistory, V2GetContext}; +use payjoin::send::v2::{replay_event_log, PollingForProposal, SendSession, SessionHistory}; use payjoin::send::v2::{Sender, WithReplyKey}; use super::db::SenderPersister; use super::helpers::OHTTP_RELAY; fn get_proposed_payjoin_psbt( - context: Sender, + context: Sender, persister: &SenderPersister, // TODO: replace with specific error ) -> Result, Box> { @@ -50,10 +50,7 @@ fn update_db_with_psbt( session_id: &SessionId, psbt: Psbt, ) { - let original_txid = session_history - .fallback_tx() - .map(|tx| tx.compute_txid()) - .expect("fallback tx should be present"); + let original_txid = session_history.fallback_tx().compute_txid(); log::info!("[Payjoin] Deleting original Payjoin psbt (txid={original_txid})"); db_conn.delete_spend(&original_txid); @@ -106,7 +103,7 @@ fn process_sender_session( } Ok(()) } - SendSession::V2GetContext(context) => { + SendSession::PollingForProposal(context) => { log::info!("[Payjoin] SenderState::V2GetContext"); if let Ok(Some(psbt)) = get_proposed_payjoin_psbt(context, persister) { update_db_with_psbt(db_conn, &session_history, &session_id, psbt); diff --git a/lianad/src/payjoin/types.rs b/lianad/src/payjoin/types.rs index ae6fead08..1f5c4e09c 100644 --- a/lianad/src/payjoin/types.rs +++ b/lianad/src/payjoin/types.rs @@ -1,4 +1,7 @@ -use payjoin::{receive::v2::ReceiveSession, send::v2::SendSession}; +use payjoin::{ + receive::v2::ReceiveSession, receive::v2::SessionOutcome as ReceiveSessionOutcome, + send::v2::SendSession, send::v2::SessionOutcome as SendSessionOutcome, +}; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] @@ -13,9 +16,8 @@ pub enum PayjoinStatus { impl From for PayjoinStatus { fn from(session: ReceiveSession) -> Self { match session { - ReceiveSession::Uninitialized(_) - | ReceiveSession::Initialized(_) - | ReceiveSession::UncheckedProposal(_) + ReceiveSession::Initialized(_) + | ReceiveSession::UncheckedOriginalPayload(_) | ReceiveSession::MaybeInputsOwned(_) | ReceiveSession::MaybeInputsSeen(_) | ReceiveSession::OutputsUnknown(_) @@ -24,7 +26,12 @@ impl From for PayjoinStatus { | ReceiveSession::WantsFeeRange(_) => PayjoinStatus::Pending, ReceiveSession::ProvisionalProposal(_) => PayjoinStatus::WaitingToSign, ReceiveSession::PayjoinProposal(_) => PayjoinStatus::Success, - ReceiveSession::TerminalFailure => PayjoinStatus::Failed, + ReceiveSession::HasReplyableError(_) => PayjoinStatus::Failed, + ReceiveSession::Closed(outcome) => match outcome { + ReceiveSessionOutcome::Success(_) => PayjoinStatus::Success, + _ => PayjoinStatus::Failed, + }, + ReceiveSession::Monitor(_) => PayjoinStatus::Unknown, } } } @@ -33,11 +40,14 @@ impl From for PayjoinStatus { impl From for PayjoinStatus { fn from(session: SendSession) -> Self { match session { - SendSession::Uninitialized - | SendSession::WithReplyKey(_) - | SendSession::V2GetContext(_) => PayjoinStatus::Pending, + SendSession::WithReplyKey(_) | SendSession::PollingForProposal(_) => { + PayjoinStatus::Pending + } SendSession::ProposalReceived(_) => PayjoinStatus::WaitingToSign, - SendSession::TerminalFailure => PayjoinStatus::Failed, + SendSession::Closed(outcome) => match outcome { + SendSessionOutcome::Success => PayjoinStatus::Success, + _ => PayjoinStatus::Failed, + }, } } } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 3515e4fc6..e5201521e 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "1.80.0" +channel = "1.85.0" profile = "default" components = ["rust-src", "rust-analyzer"]