diff --git a/Cargo.lock b/Cargo.lock index 42eb4638..20dc8849 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 4 +version = 3 [[package]] name = "addr2line" @@ -243,9 +243,9 @@ dependencies = [ [[package]] name = "arboard" -version = "3.5.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" +checksum = "55f533f8e0af236ffe5eb979b99381df3258853f00ba2e44b6e1955292c75227" dependencies = [ "clipboard-win", "image", @@ -345,6 +345,9 @@ dependencies = [ "serde_repr", "tokio", "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", "zbus", ] @@ -456,9 +459,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", @@ -483,9 +486,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.25" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40f6024f3f856663b45fd0c9b6f2024034a702f453549449e0d84a305900dad4" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "flate2", "futures-core", @@ -763,7 +766,7 @@ dependencies = [ "http-body-util", "hyper 1.6.0", "hyper-util", - "itoa 1.0.15", + "itoa", "matchit", "memchr", "mime", @@ -939,11 +942,11 @@ dependencies = [ [[package]] name = "bdk_chain" version = "0.20.0" -source = "git+https://github.com/Einliterflasche/bdk?branch=bump%2Frusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" +source = "git+https://github.com/Einliterflasche/bdk?branch=bump/rusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" dependencies = [ "bdk_core", "bitcoin 0.32.6", - "miniscript 12.3.2", + "miniscript 12.3.4", "rusqlite", "serde", ] @@ -951,7 +954,7 @@ dependencies = [ [[package]] name = "bdk_core" version = "0.3.0" -source = "git+https://github.com/Einliterflasche/bdk?branch=bump%2Frusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" +source = "git+https://github.com/Einliterflasche/bdk?branch=bump/rusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" dependencies = [ "bitcoin 0.32.6", "hashbrown 0.14.5", @@ -961,7 +964,7 @@ dependencies = [ [[package]] name = "bdk_electrum" version = "0.19.0" -source = "git+https://github.com/Einliterflasche/bdk?branch=bump%2Frusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" +source = "git+https://github.com/Einliterflasche/bdk?branch=bump/rusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" dependencies = [ "bdk_core", "electrum-client 0.22.0", @@ -970,11 +973,11 @@ dependencies = [ [[package]] name = "bdk_wallet" version = "1.0.0-beta.5" -source = "git+https://github.com/Einliterflasche/bdk?branch=bump%2Frusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" +source = "git+https://github.com/Einliterflasche/bdk?branch=bump/rusqlite-0.32#2e57dc7495c14ed334fb525bf17f002d0a8ff6df" dependencies = [ "bdk_chain", "bitcoin 0.32.6", - "miniscript 12.3.2", + "miniscript 12.3.4", "rand_core 0.6.4", "serde", "serde_json", @@ -1245,9 +1248,9 @@ dependencies = [ [[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", @@ -1318,13 +1321,13 @@ dependencies = [ [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor 4.0.3", + "brotli-decompressor 5.0.0", ] [[package]] @@ -1339,9 +1342,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.3" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1369,9 +1372,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "by_address" @@ -1440,11 +1443,11 @@ dependencies = [ [[package]] name = "bzip2" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" +checksum = "bea8dcd42434048e4f7a304411d9273a411f647446c1234a65ce0554923f4cff" dependencies = [ - "bzip2-sys", + "libbz2-rs-sys", ] [[package]] @@ -1493,9 +1496,9 @@ dependencies = [ [[package]] name = "caret" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887ce2cf6dd0aacf15ce11190546d4348dbebce576cc11b57010a023907f7aa9" +checksum = "061dc3258f029feaf9ff02b43c6af5ea67a7dfaed5d2aef36204c812e614ef9c" [[package]] name = "cargo-platform" @@ -1527,7 +1530,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" dependencies = [ "serde", - "toml", + "toml 0.8.23", ] [[package]] @@ -1541,9 +1544,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.27" +version = "1.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" dependencies = [ "jobserver", "libc", @@ -1656,9 +1659,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -1666,9 +1669,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -1678,9 +1681,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1788,7 +1791,7 @@ dependencies = [ "nom", "pathdiff", "serde", - "toml", + "toml 0.8.23", ] [[package]] @@ -1909,7 +1912,7 @@ dependencies = [ "bitflags 2.9.1", "core-foundation 0.10.1", "core-graphics-types", - "foreign-types 0.5.0", + "foreign-types", "libc", ] @@ -1959,9 +1962,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[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", ] @@ -2033,9 +2036,9 @@ dependencies = [ [[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" @@ -2062,15 +2065,15 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.27.2" +version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 0.4.8", + "itoa", "matches", - "phf 0.8.0", + "phf 0.10.1", "proc-macro2", "quote", "smallvec", @@ -2164,9 +2167,9 @@ dependencies = [ [[package]] name = "cxx" -version = "1.0.158" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a71ea7f29c73f7ffa64c50b83c9fe4d3a6d4be89a86b009eb80d5a6d3429d741" +checksum = "be1149bab7a5580cb267215751389597c021bfad13c0bb00c54e19559333764c" dependencies = [ "cc", "cxxbridge-cmd", @@ -2178,12 +2181,13 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.158" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8232661d66dcf713394726157d3cfe0a89bfc85f52d6e9f9bbc2306797fe7" +checksum = "6aeeaf1aefae8e0f5141920a7ecbc64a22ab038d4b4ac59f2d19e0effafd5b53" dependencies = [ "cc", "codespan-reporting", + "indexmap 2.10.0", "proc-macro2", "quote", "scratch", @@ -2192,12 +2196,13 @@ dependencies = [ [[package]] name = "cxxbridge-cmd" -version = "1.0.158" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f44296c8693e9ea226a48f6a122727f77aa9e9e338380cb021accaeeb7ee279" +checksum = "c36ac1f9a72064b1f41fd7b49a4c1b3bf33b9ccb1274874dda6d264f57c55964" dependencies = [ - "clap 4.5.40", + "clap 4.5.41", "codespan-reporting", + "indexmap 2.10.0", "proc-macro2", "quote", "syn 2.0.104", @@ -2205,16 +2210,17 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.158" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f69c181c176981ae44ba9876e2ea41ce8e574c296b38d06925ce9214fb8e4" +checksum = "170c6ff5d009663866857a91ebee55b98ea4d4b34e7d7aba6dc4a4c95cc7b748" [[package]] name = "cxxbridge-macro" -version = "1.0.158" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8faff5d4467e0709448187df29ccbf3b0982cc426ee444a193f87b11afb565a8" +checksum = "4984a142211026786011a7e79fa22faa1eca1e9cbf0e60bffecfd57fd3db88f1" dependencies = [ + "indexmap 2.10.0", "proc-macro2", "quote", "rustversion", @@ -2224,7 +2230,7 @@ dependencies = [ [[package]] name = "dalek-ff-group" version = "0.4.1" -source = "git+https://github.com/serai-dex/serai#dc1b8dfccd68b7c2eb4359a1e37b55ce5e4453b5" +source = "git+https://github.com/serai-dex/serai#eab5d9e64fd27076a49583e5f45901d34b463c01" dependencies = [ "crypto-bigint", "curve25519-dalek 4.1.3", @@ -2441,7 +2447,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357422a457ccb850dc8f1c1680e0670079560feaad6c2e247e3f345c4fab8a3f" dependencies = [ "heck 0.5.0", - "indexmap 2.9.0", + "indexmap 2.10.0", "itertools 0.14.0", "proc-macro-crate 3.3.0", "proc-macro2", @@ -2703,18 +2709,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" -[[package]] -name = "dispatch2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" -dependencies = [ - "bitflags 2.9.1", - "block2 0.6.1", - "libc", - "objc2 0.6.1", -] - [[package]] name = "dispatch2" version = "0.3.0" @@ -2722,6 +2716,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.1", + "block2 0.6.1", + "libc", "objc2 0.6.1", ] @@ -2736,6 +2732,15 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.8", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -2868,9 +2873,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek 4.1.3", "ed25519 2.2.3", @@ -2931,7 +2936,7 @@ dependencies = [ "byteorder", "libc", "log", - "rustls 0.23.28", + "rustls 0.23.29", "serde", "serde_json", "webpki-roots 0.25.4", @@ -2973,14 +2978,14 @@ dependencies = [ [[package]] name = "embed-resource" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0963f530273dc3022ab2bdc3fcd6d488e850256f2284a82b7413cb9481ee85dd" +checksum = "4c6d81016d6c977deefb2ef8d8290da019e27cc26167e102185da528e6c0ab38" dependencies = [ "cc", "memchr", "rustc_version", - "toml", + "toml 0.9.2", "vswhom", "winreg 0.55.0", ] @@ -3194,7 +3199,7 @@ checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" dependencies = [ "atomic 0.6.1", "serde", - "toml", + "toml 0.8.23", "uncased", "version_check", ] @@ -3257,6 +3262,15 @@ dependencies = [ "spin 0.9.8", ] +[[package]] +name = "fns" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d318f82a68feac152dab48e8a6f1eb665a915ea6a0c76e4ad5ed137f80c368" +dependencies = [ + "log", +] + [[package]] name = "fnv" version = "1.0.7" @@ -3269,15 +3283,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -3285,7 +3290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -3299,12 +3304,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -3368,9 +3367,9 @@ dependencies = [ [[package]] name = "fslock-guard" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e83653bb011605793e687636bd1d24f1918f3c410f20e1d9173a37451cd351" +checksum = "ed387b899db1671a47eaf17e7e6d7008577262c09319cb8e19601371192b526f" dependencies = [ "fslock-arti-fork", "thiserror 2.0.12", @@ -3504,7 +3503,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-pki-types", ] @@ -3951,9 +3950,9 @@ 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", @@ -3961,7 +3960,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -3970,9 +3969,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -3980,7 +3979,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -4207,16 +4206,14 @@ checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" [[package]] name = "html5ever" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", "markup5ever", - "proc-macro2", - "quote", - "syn 1.0.109", + "match_token", ] [[package]] @@ -4227,7 +4224,7 @@ checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -4238,7 +4235,7 @@ checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -4319,12 +4316,12 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", - "itoa 1.0.15", + "itoa", "pin-project-lite", "socket2", "tokio", @@ -4342,12 +4339,12 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", - "itoa 1.0.15", + "itoa", "pin-project-lite", "smallvec", "tokio", @@ -4363,7 +4360,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -4372,27 +4369,11 @@ dependencies = [ "webpki-roots 1.0.1", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper 1.6.0", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df" dependencies = [ "base64 0.22.1", "bytes", @@ -4407,11 +4388,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", - "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -4639,9 +4618,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown 0.15.4", @@ -4704,6 +4683,17 @@ dependencies = [ "rustversion", ] +[[package]] +name = "io-uring" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -4784,12 +4774,6 @@ dependencies = [ "either", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.15" @@ -4984,14 +4968,13 @@ dependencies = [ [[package]] name = "kuchikiki" -version = "0.8.2" +version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 1.9.3", - "matches", + "indexmap 2.10.0", "selectors", ] @@ -5024,10 +5007,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" dependencies = [ "gtk-sys", - "libloading", + "libloading 0.7.4", "once_cell", ] +[[package]] +name = "libbz2-rs-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775bf80d5878ab7c2b1080b5351a48b2f737d9f6f8b383574eebcc22be0dfccb" + [[package]] name = "libc" version = "0.2.174" @@ -5056,6 +5045,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.2", +] + [[package]] name = "liblzma" version = "0.4.2" @@ -5265,13 +5264,13 @@ dependencies = [ [[package]] name = "libp2p-identity" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbb68ea10844211a59ce46230909fd0ea040e8a192454d4cc2ee0d53e12280eb" +checksum = "3104e13b51e4711ff5738caa1fb54467c8604c2e94d607e27745bcf709068774" dependencies = [ "asn1_der", "bs58", - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "hkdf", "multihash", "quick-protobuf", @@ -5413,7 +5412,7 @@ dependencies = [ "quinn", "rand 0.8.5", "ring 0.17.14", - "rustls 0.23.28", + "rustls 0.23.29", "socket2", "thiserror 1.0.69", "tokio", @@ -5551,7 +5550,7 @@ dependencies = [ "libp2p-identity", "rcgen", "ring 0.17.14", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-webpki 0.101.7", "thiserror 1.0.69", "x509-parser 0.16.0", @@ -5591,9 +5590,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" dependencies = [ "bitflags 2.9.1", "libc", @@ -5726,18 +5725,29 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "markup5ever" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" dependencies = [ "log", - "phf 0.10.1", - "phf_codegen 0.10.0", + "phf 0.11.3", + "phf_codegen 0.11.3", "string_cache", "string_cache_codegen", "tendril", ] +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "matchers" version = "0.1.0" @@ -5777,9 +5787,9 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" dependencies = [ "libc", ] @@ -5839,9 +5849,9 @@ dependencies = [ [[package]] name = "miniscript" -version = "12.3.2" +version = "12.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0760e92feaf4ee26bd2e616f557de64712bf1e75f3b1b218dfb475c0a84c7943" +checksum = "a1eeb3bbebc87062b99fbb8c9067d30dab85469f4cf12248a2667777cc86b282" dependencies = [ "bech32 0.11.0", "bitcoin 0.32.6", @@ -5951,7 +5961,7 @@ dependencies = [ [[package]] name = "monero-generators" version = "0.4.0" -source = "git+https://github.com/serai-dex/serai#dc1b8dfccd68b7c2eb4359a1e37b55ce5e4453b5" +source = "git+https://github.com/serai-dex/serai#eab5d9e64fd27076a49583e5f45901d34b463c01" dependencies = [ "curve25519-dalek 4.1.3", "dalek-ff-group", @@ -5971,7 +5981,7 @@ dependencies = [ "monero", "monero-rpc", "monero-sys", - "rand 0.7.3", + "rand 0.8.5", "reqwest", "testcontainers", "tokio", @@ -5982,7 +5992,7 @@ dependencies = [ [[package]] name = "monero-io" version = "0.1.0" -source = "git+https://github.com/serai-dex/serai#dc1b8dfccd68b7c2eb4359a1e37b55ce5e4453b5" +source = "git+https://github.com/serai-dex/serai#eab5d9e64fd27076a49583e5f45901d34b463c01" dependencies = [ "curve25519-dalek 4.1.3", "std-shims", @@ -5991,7 +6001,7 @@ dependencies = [ [[package]] name = "monero-primitives" version = "0.1.0" -source = "git+https://github.com/serai-dex/serai#dc1b8dfccd68b7c2eb4359a1e37b55ce5e4453b5" +source = "git+https://github.com/serai-dex/serai#eab5d9e64fd27076a49583e5f45901d34b463c01" dependencies = [ "curve25519-dalek 4.1.3", "monero-generators", @@ -6012,7 +6022,7 @@ dependencies = [ "jsonrpc_client", "monero", "monero-epee-bin-serde", - "rand 0.7.3", + "rand 0.8.5", "reqwest", "rust_decimal", "serde", @@ -6028,7 +6038,7 @@ dependencies = [ "anyhow", "axum", "chrono", - "clap 4.5.40", + "clap 4.5.41", "futures", "monero", "monero-rpc", @@ -6076,19 +6086,23 @@ dependencies = [ "monero", "quickcheck", "quickcheck_macros", + "serde", + "sqlx", + "swap-serde", "tempfile", "testcontainers", "tokio", "tracing", "tracing-subscriber", + "typeshare", "uuid", ] [[package]] name = "muda" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" +checksum = "58b89bf91c19bf036347f1ab85a81c560f08c0667c8601bece664d860a600988" dependencies = [ "crossbeam-channel", "dpi", @@ -6160,23 +6174,6 @@ dependencies = [ "unsigned-varint 0.7.2", ] -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - [[package]] name = "ndk" version = "0.9.0" @@ -6556,7 +6553,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", ] @@ -6567,7 +6564,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" dependencies = [ "bitflags 2.9.1", - "dispatch2 0.3.0", + "dispatch2", "objc2 0.6.1", "objc2-core-foundation", "objc2-io-surface", @@ -6749,9 +6746,9 @@ checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "oneshot-fused-workaround" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa302cded54727eedb3a0d246e14146fd2a36f4744e886169457b05ef3254e8" +checksum = "ff2948fd2414b613f9a97f8401270bd5d7638265ab940475cdbcfa28a0273d58" dependencies = [ "futures", ] @@ -6774,50 +6771,12 @@ dependencies = [ "pathdiff", ] -[[package]] -name = "openssl" -version = "0.10.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" -dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "foreign-types 0.3.2", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "openssl-probe" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" -[[package]] -name = "openssl-sys" -version = "0.9.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "option-ext" version = "0.2.0" @@ -7097,7 +7056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.9.0", + "indexmap 2.10.0", ] [[package]] @@ -7106,9 +7065,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0", "phf_shared 0.8.0", - "proc-macro-hack", ] [[package]] @@ -7117,7 +7074,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -7142,12 +7101,12 @@ dependencies = [ [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -7182,12 +7141,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -7306,13 +7265,13 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.2" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d77244ce2d584cd84f6a15f86195b8c9b2a0dfbfd817c09e0464244091a58ed" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64 0.22.1", - "indexmap 2.9.0", - "quick-xml", + "indexmap 2.10.0", + "quick-xml 0.38.0", "serde", "time 0.3.41", ] @@ -7404,6 +7363,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppmd-rust" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c834641d8ad1b348c9ee86dec3b9840d805acd5f24daa5f90c788951a52ff59b" + [[package]] name = "ppv-lite86" version = "0.2.21" @@ -7446,7 +7411,7 @@ checksum = "5676d703dda103cbb035b653a9f11448c0a7216c7926bd35fcb5865475d0c970" dependencies = [ "autocfg", "equivalent", - "indexmap 2.9.0", + "indexmap 2.10.0", ] [[package]] @@ -7523,7 +7488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "504ee9ff529add891127c4827eb481bd69dc0ebc72e9a682e187db4caa60c3ca" dependencies = [ "dtoa", - "itoa 1.0.15", + "itoa", "parking_lot 0.12.4", "prometheus-client-derive-encode", ] @@ -7641,6 +7606,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" +dependencies = [ + "memchr", +] + [[package]] name = "quickcheck" version = "1.0.3" @@ -7676,7 +7650,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.28", + "rustls 0.23.29", "socket2", "thiserror 2.0.12", "tokio", @@ -7696,7 +7670,7 @@ dependencies = [ "rand 0.9.1", "ring 0.17.14", "rustc-hash", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-pki-types", "slab", "thiserror 2.0.12", @@ -8021,31 +7995,27 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.20" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", - "encoding_rs", "futures-core", "futures-util", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "http-body-util", "hyper 1.6.0", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", - "mime", - "native-tls", "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "rustls-pki-types", "serde", @@ -8053,7 +8023,6 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-native-tls", "tokio-rustls 0.26.2", "tokio-util", "tower 0.5.2", @@ -8075,9 +8044,9 @@ checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" [[package]] name = "retry-error" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322bb522344455926af0c63db415ef6dd70599ad3f69e847ab95dc4d5537d728" +checksum = "ce97442758392c7e2a7716e06c514de75f0fe4b5a4b76e14ba1e5edfb7ba3512" [[package]] name = "rfc6979" @@ -8091,13 +8060,13 @@ dependencies = [ [[package]] name = "rfd" -version = "0.15.3" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", "block2 0.6.1", - "dispatch2 0.2.0", + "dispatch2", "glib-sys", "gobject-sys", "gtk-sys", @@ -8353,15 +8322,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -8412,9 +8381,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "ring 0.17.14", "rustls-pki-types", @@ -8458,9 +8427,9 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safelog" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ff608a21ec1d97035331c8944f01e3b57a083393cbb77b5a86b344aa02c827" +checksum = "5d343b15e1705331c25689e0fa87e8514fb33bd3c9beeb45658a7c355f317de2" dependencies = [ "derive_more 2.0.1", "educe", @@ -8532,6 +8501,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -8584,9 +8565,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" +checksum = "62f5557d2bbddd5afd236ba7856b0e494f5acc7ce805bb0774cc5674b20a06b4" [[package]] name = "seahash" @@ -8626,7 +8607,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ - "secp256k1-sys 0.8.1", + "secp256k1-sys 0.8.2", "serde", ] @@ -8663,9 +8644,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +checksum = "4473013577ec77b4ee3668179ef1186df3146e2cf2d927bd200974c6fe60fd99" dependencies = [ "cc", ] @@ -8752,22 +8733,20 @@ dependencies = [ [[package]] name = "selectors" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", "cssparser", "derive_more 0.99.20", "fxhash", "log", - "matches", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", - "thin-slice", ] [[package]] @@ -8874,7 +8853,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "itoa 1.0.15", + "itoa", "memchr", "ryu", "serde", @@ -8886,7 +8865,7 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ - "itoa 1.0.15", + "itoa", "serde", ] @@ -8910,6 +8889,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -8917,7 +8905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.15", + "itoa", "ryu", "serde", ] @@ -8934,20 +8922,21 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", + "indexmap 2.10.0", "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", - "serde_with_macros 3.13.0", + "serde_with_macros 3.14.0", "time 0.3.41", ] @@ -8965,9 +8954,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling 0.20.11", "proc-macro2", @@ -9024,9 +9013,9 @@ dependencies = [ [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" dependencies = [ "nodrop", "stable_deref_trait", @@ -9101,9 +9090,9 @@ dependencies = [ [[package]] name = "shared_child" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2778001df1384cf20b6dc5a5a90f48da35539885edaaefd887f8d744e939c0b" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" dependencies = [ "libc", "sigchld", @@ -9135,9 +9124,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "sigchld" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1219ef50fc0fdb04fcc243e6aa27f855553434ffafe4fa26554efb78b5b4bf89" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" dependencies = [ "libc", "os_pipe", @@ -9257,9 +9246,9 @@ dependencies = [ [[package]] name = "slotmap-careful" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f1f2df70e13b0bad4cd34fdf0c6091bf3cbe3e24c11d4b62ebbd523c7be716" +checksum = "9500059071474a36baac642b6bb99ca1dbac0ce43727abbba02dad83822dadf2" dependencies = [ "paste", "serde", @@ -9313,7 +9302,7 @@ dependencies = [ "bytemuck", "cfg_aliases", "core-graphics", - "foreign-types 0.5.0", + "foreign-types", "js-sys", "log", "objc2 0.5.2", @@ -9409,12 +9398,12 @@ dependencies = [ "futures-util", "hashbrown 0.15.4", "hashlink 0.10.0", - "indexmap 2.9.0", + "indexmap 2.10.0", "log", "memchr", "once_cell", "percent-encoding", - "rustls 0.23.28", + "rustls 0.23.29", "serde", "serde_json", "sha2 0.10.9", @@ -9489,7 +9478,7 @@ dependencies = [ "hex", "hkdf", "hmac", - "itoa 1.0.15", + "itoa", "log", "md-5", "memchr", @@ -9529,7 +9518,7 @@ dependencies = [ "hkdf", "hmac", "home", - "itoa 1.0.15", + "itoa", "log", "md-5", "memchr", @@ -9627,7 +9616,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "std-shims" version = "0.1.1" -source = "git+https://github.com/serai-dex/serai#dc1b8dfccd68b7c2eb4359a1e37b55ce5e4453b5" +source = "git+https://github.com/serai-dex/serai#eab5d9e64fd27076a49583e5f45901d34b463c01" dependencies = [ "hashbrown 0.14.5", "spin 0.9.8", @@ -9769,7 +9758,7 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" [[package]] name = "swap" -version = "2.4.0" +version = "2.4.3" dependencies = [ "anyhow", "arti-client", @@ -9794,10 +9783,10 @@ dependencies = [ "data-encoding", "derive_builder", "dialoguer", - "directories-next", "ecdsa_fun", "ed25519-dalek 1.0.1", "electrum-pool", + "fns", "futures", "get-port", "hex", @@ -9820,7 +9809,7 @@ dependencies = [ "reqwest", "rust_decimal", "rust_decimal_macros", - "rustls 0.23.28", + "rustls 0.23.29", "semver", "serde", "serde_cbor", @@ -9832,6 +9821,9 @@ dependencies = [ "sqlx", "structopt", "strum 0.26.3", + "swap-env", + "swap-fs", + "swap-serde", "tauri", "tempfile", "testcontainers", @@ -9841,7 +9833,6 @@ dependencies = [ "tokio-tar", "tokio-tungstenite", "tokio-util", - "toml", "tor-rtcompat", "tower 0.4.13", "tower-http 0.3.5", @@ -9858,6 +9849,52 @@ dependencies = [ "zip 0.5.13", ] +[[package]] +name = "swap-env" +version = "0.1.0" +dependencies = [ + "anyhow", + "bitcoin 0.32.6", + "config", + "dialoguer", + "libp2p", + "monero", + "rust_decimal", + "serde", + "serde_json", + "swap-fs", + "swap-serde", + "thiserror 1.0.69", + "time 0.3.41", + "toml 0.8.23", + "tracing", + "url", +] + +[[package]] +name = "swap-fs" +version = "0.1.0" +dependencies = [ + "anyhow", + "directories-next", + "tracing", +] + +[[package]] +name = "swap-serde" +version = "0.1.0" +dependencies = [ + "anyhow", + "bitcoin 0.32.6", + "hex", + "libp2p", + "monero", + "serde", + "serde_json", + "thiserror 1.0.69", + "url", +] + [[package]] name = "swift-rs" version = "1.0.7" @@ -9967,7 +10004,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml", + "toml 0.8.23", "version-compare", ] @@ -9979,9 +10016,9 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tao" -version = "0.33.0" +version = "0.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82" +checksum = "49c380ca75a231b87b6c9dd86948f035012e7171d1a7c40a9c2890489a7ffd8a" dependencies = [ "bitflags 2.9.1", "core-foundation 0.10.1", @@ -10052,17 +10089,16 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.5.1" +version = "2.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7b0bc1aec81bda6bc455ea98fcaed26b3c98c1648c627ad6ff1c704e8bf8cbc" +checksum = "124e129c9c0faa6bec792c5948c89e86c90094133b0b9044df0ce5f0a8efaa0d" dependencies = [ "anyhow", "bytes", "dirs 6.0.0", "dunce", "embed_plist", - "futures-util", - "getrandom 0.2.16", + "getrandom 0.3.3", "glob", "gtk", "heck 0.5.0", @@ -10103,9 +10139,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc" +checksum = "12f025c389d3adb83114bec704da973142e82fc6ec799c7c750c5e21cefaec83" dependencies = [ "anyhow", "cargo_toml", @@ -10119,18 +10155,18 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml", + "toml 0.8.23", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93f035551bf7b11b3f51ad9bc231ebbe5e085565527991c16cf326aa38cdf47" +checksum = "f5df493a1075a241065bc865ed5ef8d0fbc1e76c7afdc0bf0eccfaa7d4f0e406" dependencies = [ "base64 0.22.1", - "brotli 7.0.0", + "brotli 8.0.1", "ico", "json-patch", "plist", @@ -10152,9 +10188,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8db4df25e2d9d45de0c4c910da61cd5500190da14ae4830749fee3466dddd112" +checksum = "f237fbea5866fa5f2a60a21bea807a2d6e0379db070d89c3a10ac0f2d4649bbc" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -10166,9 +10202,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a5ebe6a610d1b78a94650896e6f7c9796323f408800cef436e0fa0539de601" +checksum = "1d9a0bd00bf1930ad1a604d08b0eb6b2a9c1822686d65d7f4731a7723b8901d3" dependencies = [ "anyhow", "glob", @@ -10177,17 +10213,17 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml", + "toml 0.8.23", "walkdir", ] [[package]] name = "tauri-plugin-cli" -version = "2.2.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "096abcf7c913b19f9f26f6a3a1d48b84e46b0274d6b6d164dcaa753f0d7a5700" +checksum = "53e76101cc9848adfb6a04aae48a389062be457a785bb4349ae1423ddab5a82d" dependencies = [ - "clap 4.5.40", + "clap 4.5.41", "log", "serde", "serde_json", @@ -10198,9 +10234,9 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.2.3" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fa4f17a6d380490597f7632aca40b65d379cb374cb92bd9d80f333309b7fd7" +checksum = "adddd9e9275b20e77af3061d100a25a884cced3c4c9ef680bd94dd0f7e26c1ca" dependencies = [ "arboard", "log", @@ -10213,9 +10249,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.2.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33318fe222fc2a612961de8b0419e2982767f213f54a4d3a21b0d7b85c41df8" +checksum = "1aefb14219b492afb30b12647b5b1247cadd2c0603467310c36e0f7ae1698c28" dependencies = [ "log", "raw-window-handle", @@ -10231,9 +10267,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ead0daec5d305adcefe05af9d970fc437bcc7996052d564e7393eb291252da" +checksum = "c341290d31991dbca38b31d412c73dfbdb070bb11536784f19dd2211d13b778f" dependencies = [ "anyhow", "dunce", @@ -10247,15 +10283,15 @@ dependencies = [ "tauri-plugin", "tauri-utils", "thiserror 2.0.12", - "toml", + "toml 0.8.23", "url", ] [[package]] name = "tauri-plugin-opener" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8983f50326d34437142a6d560b5c3426e91324297519b6eeb32ed0a1d1e0f2" +checksum = "ecee219f11cdac713ab32959db5d0cceec4810ba4f4458da992292ecf9660321" dependencies = [ "dunce", "glob", @@ -10275,9 +10311,9 @@ dependencies = [ [[package]] name = "tauri-plugin-process" -version = "2.2.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d870adae9408be585abd56eade2b5def2660339512b7c8de5ddf21238b67a34" +checksum = "7461c622a5ea00eb9cd9f7a08dbd3bf79484499fd5c21aa2964677f64ca651ab" dependencies = [ "tauri", "tauri-plugin", @@ -10285,9 +10321,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.2.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34e525a448b80ad5d906fcbd93838ac3ba37985b29ac699a045b5da9b0a1a22" +checksum = "2b9ffadec5c3523f11e8273465cacb3d86ea7652a28e6e2a2e9b5c182f791d25" dependencies = [ "encoding_rs", "log", @@ -10306,24 +10342,24 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" -version = "2.2.4" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d0e07b40fb2eb13778e30778f5979347a2bf30e1b9d47f78ff7fe92d2e4b3d" +checksum = "b441b6d5d1a194e9fee0b358fe0d602ded845d0f580e1f8c8ef78ebc3c8b225d" dependencies = [ "serde", "serde_json", "tauri", "thiserror 2.0.12", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "zbus", ] [[package]] name = "tauri-plugin-store" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada7e7aeea472dec9b8d09d25301e59fe3e8330dc11dbcf903d6388126cb3722" +checksum = "5916c609664a56c82aeaefffca9851fd072d4d41f73d63f22ee3ee451508194f" dependencies = [ "dunce", "serde", @@ -10337,9 +10373,9 @@ dependencies = [ [[package]] name = "tauri-plugin-updater" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b068673e9037376ca9906f99b00ae5f9e6eb62f456f900b4435c38d57cfa73e4" +checksum = "27cbc31740f4d507712550694749572ec0e43bdd66992db7599b89fbfd6b167b" dependencies = [ "base64 0.22.1", "dirs 6.0.0", @@ -10364,14 +10400,14 @@ dependencies = [ "tokio", "url", "windows-sys 0.60.2", - "zip 4.2.0", + "zip 4.3.0", ] [[package]] name = "tauri-runtime" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f004905d549854069e6774533d742b03cacfd6f03deb08940a8677586cbe39" +checksum = "9e7bb73d1bceac06c20b3f755b2c8a2cb13b20b50083084a8cf3700daf397ba4" dependencies = [ "cookie", "dpi", @@ -10391,9 +10427,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85d056f4d4b014fe874814034f3416d57114b617a493a4fe552580851a3f3a2" +checksum = "902b5aa9035e16f342eb64f8bf06ccdc2808e411a2525ed1d07672fa4e780bad" dependencies = [ "gtk", "http 1.3.1", @@ -10418,12 +10454,12 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4" +checksum = "41743bbbeb96c3a100d234e5a0b60a46d5aa068f266160862c7afdbf828ca02e" dependencies = [ "anyhow", - "brotli 7.0.0", + "brotli 8.0.1", "cargo_metadata", "ctor", "dunce", @@ -10445,10 +10481,10 @@ dependencies = [ "serde", "serde-untagged", "serde_json", - "serde_with 3.13.0", + "serde_with 3.14.0", "swift-rs", "thiserror 2.0.12", - "toml", + "toml 0.8.23", "url", "urlpattern", "uuid", @@ -10462,8 +10498,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" dependencies = [ "embed-resource", - "indexmap 2.9.0", - "toml", + "indexmap 2.10.0", + "toml 0.8.23", ] [[package]] @@ -10525,12 +10561,6 @@ dependencies = [ "unicode-width 0.1.14", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -10609,7 +10639,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", - "itoa 1.0.15", + "itoa", "libc", "num-conv", "num_threads", @@ -10671,17 +10701,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "tracing", @@ -10699,16 +10731,6 @@ dependencies = [ "syn 2.0.104", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.22.0" @@ -10726,7 +10748,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.28", + "rustls 0.23.29", "tokio", ] @@ -10809,11 +10831,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit 0.22.27", ] +[[package]] +name = "toml" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +dependencies = [ + "indexmap 2.10.0", + "serde", + "serde_spanned 1.0.0", + "toml_datetime 0.7.0", + "toml_parser", + "toml_writer", + "winnow 0.7.12", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -10823,14 +10860,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.9.0", - "toml_datetime", + "indexmap 2.10.0", + "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -10840,8 +10886,8 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.9.0", - "toml_datetime", + "indexmap 2.10.0", + "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -10851,12 +10897,21 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.10.0", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_write", - "winnow 0.7.11", + "winnow 0.7.12", +] + +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ + "winnow 0.7.12", ] [[package]] @@ -10865,6 +10920,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" + [[package]] name = "tor-async-utils" version = "0.25.0" @@ -11082,7 +11143,7 @@ dependencies = [ "serde_ignored", "strum 0.26.3", "thiserror 2.0.12", - "toml", + "toml 0.8.23", "tor-basic-utils", "tor-error", "tor-rtcompat", @@ -11123,7 +11184,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f4b1eec6c4cd0dbb682982ef3db87d0da030bff5d7903604529e8562eaacb45" dependencies = [ - "async-compression 0.4.25", + "async-compression 0.4.27", "base64ct", "derive_more 1.0.0", "futures", @@ -11369,7 +11430,7 @@ dependencies = [ "retry-error", "safelog", "serde", - "serde_with 3.13.0", + "serde_with 3.14.0", "strum 0.26.3", "thiserror 2.0.12", "tor-async-utils", @@ -11469,7 +11530,7 @@ dependencies = [ "itertools 0.13.0", "safelog", "serde", - "serde_with 3.13.0", + "serde_with 3.14.0", "strum 0.26.3", "thiserror 2.0.12", "tor-basic-utils", @@ -11494,7 +11555,7 @@ dependencies = [ "derive-deftly", "derive_more 1.0.0", "digest 0.10.7", - "ed25519-dalek 2.1.1", + "ed25519-dalek 2.2.0", "educe", "getrandom 0.2.16", "hex", @@ -11612,7 +11673,7 @@ dependencies = [ "phf 0.11.3", "rand 0.8.5", "serde", - "serde_with 3.13.0", + "serde_with 3.14.0", "signature 2.2.0", "smallvec", "subtle", @@ -12047,9 +12108,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.20.1" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7eee98ec5c90daf179d55c20a49d8c0d043054ce7c26336c09a24d31f14fa0" +checksum = "2da75ec677957aa21f6e0b361df0daab972f13a5bee3606de0638fd4ee1c666a" dependencies = [ "crossbeam-channel", "dirs 6.0.0", @@ -12323,11 +12384,11 @@ dependencies = [ [[package]] name = "unstoppableswap-gui-rs" -version = "2.4.0" +version = "2.4.3" dependencies = [ "anyhow", "monero-rpc-pool", - "rustls 0.23.28", + "rustls 0.23.29", "serde", "serde_json", "swap", @@ -12345,7 +12406,7 @@ dependencies = [ "tauri-plugin-updater", "tracing", "uuid", - "zip 4.2.0", + "zip 4.3.0", ] [[package]] @@ -12669,6 +12730,7 @@ dependencies = [ "cc", "downcast-rs", "rustix 0.38.44", + "scoped-tls", "smallvec", "wayland-sys", ] @@ -12717,7 +12779,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", - "quick-xml", + "quick-xml 0.37.5", "quote", ] @@ -12727,6 +12789,8 @@ version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ + "dlib", + "log", "pkg-config", ] @@ -12864,9 +12928,9 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", @@ -12889,9 +12953,9 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.37.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.12", "windows 0.61.3", @@ -13114,17 +13178,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link", - "windows-result 0.3.4", - "windows-strings", -] - [[package]] name = "windows-result" version = "0.1.2" @@ -13468,9 +13521,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -13531,9 +13584,9 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wry" -version = "0.51.2" +version = "0.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c886a0a9d2a94fd90cfa1d929629b79cfefb1546e2c7430c63a47f0664c0e4e2" +checksum = "12a714d9ba7075aae04a6e50229d6109e3d584774b99a6a8c60de1698ca111b9" dependencies = [ "base64 0.22.1", "block2 0.6.1", @@ -13678,9 +13731,9 @@ dependencies = [ [[package]] name = "xattr" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", "rustix 1.0.7", @@ -13688,9 +13741,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "xmltree" @@ -13773,9 +13826,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" dependencies = [ "async-broadcast", "async-executor", @@ -13799,7 +13852,7 @@ dependencies = [ "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.11", + "winnow 0.7.12", "zbus_macros", "zbus_names", "zvariant", @@ -13807,9 +13860,9 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.7.1" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -13828,7 +13881,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant", ] @@ -13942,23 +13995,24 @@ dependencies = [ [[package]] name = "zip" -version = "4.2.0" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ab361742de920c5535880f89bbd611ee62002bf11341d16a5f057bb8ba6899" +checksum = "9aed4ac33e8eb078c89e6cbb1d5c4c7703ec6d299fc3e7c3695af8f8b423468b" dependencies = [ "aes", "arbitrary", - "bzip2 0.5.2", + "bzip2 0.6.0", "constant_time_eq", "crc32fast", "deflate64", "flate2", "getrandom 0.3.3", "hmac", - "indexmap 2.9.0", + "indexmap 2.10.0", "liblzma", "memchr", "pbkdf2", + "ppmd-rust", "sha1", "time 0.3.41", "zeroize", @@ -14014,24 +14068,24 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" +checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" dependencies = [ "endi", "enumflags2", "serde", "url", - "winnow 0.7.11", + "winnow 0.7.12", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.5.3" +version = "5.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" +checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" dependencies = [ "proc-macro-crate 3.3.0", "proc-macro2", @@ -14051,5 +14105,5 @@ dependencies = [ "serde", "static_assertions", "syn 2.0.104", - "winnow 0.7.11", + "winnow 0.7.12", ] diff --git a/Cargo.toml b/Cargo.toml index 6875f9c1..f16e3fd0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,26 @@ [workspace] resolver = "2" -members = ["electrum-pool", "monero-rpc", "monero-rpc-pool", "monero-sys", "seed", "src-tauri", "swap"] +members = [ "electrum-pool", "monero-rpc", "monero-rpc-pool", "monero-sys", "seed", "src-tauri", "swap", "swap-env", "swap-fs", "swap-serde"] + +[workspace.dependencies] +anyhow = "1" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1" +tokio = { version = "1", features = ["rt-multi-thread", "time", "macros", "sync"] } +futures = { version = "0.3", default-features = false, features = ["std"] } +tracing = { version = "0.1", features = ["attributes"] } +bitcoin = { version = "0.32", features = ["rand", "serde"] } +monero = { version = "0.12", features = ["serde_support"] } +rand = "0.8" +uuid = { version = "1", features = ["v4"] } +typeshare = "1.0" +thiserror = "1" +reqwest = { version = "0.12", default-features = false, features = ["json"] } +rust_decimal = { version = "1", features = ["serde-float"] } +rust_decimal_macros = "1" +libp2p = { version = "0.53.2" } +url = { version = "2", features = ["serde"] } +hex = "0.4" [patch.crates-io] # patch until new release https://github.com/thomaseizinger/rust-jsonrpc-client/pull/51 diff --git a/electrum-pool/Cargo.toml b/electrum-pool/Cargo.toml index ab339379..9b3e5138 100644 --- a/electrum-pool/Cargo.toml +++ b/electrum-pool/Cargo.toml @@ -7,11 +7,11 @@ edition = "2021" [dependencies] backoff = { version = "0.4", features = ["tokio"] } bdk_electrum = { version = "0.19", default-features = false, features = ["use-rustls-ring"] } -bitcoin = { version = "0.32", features = ["rand", "serde"] } -futures = { version = "0.3", default-features = false, features = ["std"] } +bitcoin = { workspace = true } +futures = { workspace = true } once_cell = "1.19" -tokio = { version = "1", features = ["rt-multi-thread", "time", "macros", "sync"] } -tracing = { version = "0.1", features = ["attributes"] } +tokio = { workspace = true } +tracing = { workspace = true } [dev-dependencies] -serde_json = "1" +serde_json = { workspace = true } diff --git a/monero-harness/Cargo.toml b/monero-harness/Cargo.toml index 5498c7a9..02909139 100644 --- a/monero-harness/Cargo.toml +++ b/monero-harness/Cargo.toml @@ -6,14 +6,14 @@ edition = "2021" publish = false [dependencies] -anyhow = "1" -futures = "0.3" -monero = "0.12" +anyhow = { workspace = true } +futures = { workspace = true } +monero = { workspace = true } monero-rpc = { path = "../monero-rpc" } monero-sys = { path = "../monero-sys" } -rand = "0.7" -reqwest = "0.12.15" +rand = { workspace = true } +reqwest = { workspace = true } testcontainers = "0.15" -tokio = { version = "1", default-features = false, features = ["rt-multi-thread", "time", "macros"] } -tracing = "0.1" +tokio = { workspace = true, features = ["rt-multi-thread", "time", "macros"] } +tracing = { workspace = true } tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter", "tracing-log"] } diff --git a/monero-rpc-pool/Cargo.toml b/monero-rpc-pool/Cargo.toml index 8e3eb175..1e428fe1 100644 --- a/monero-rpc-pool/Cargo.toml +++ b/monero-rpc-pool/Cargo.toml @@ -9,27 +9,27 @@ name = "monero-rpc-pool" path = "src/main.rs" [dependencies] -anyhow = "1" +anyhow = { workspace = true } axum = { version = "0.7", features = ["macros"] } chrono = { version = "0.4", features = ["serde"] } clap = { version = "4.0", features = ["derive"] } -futures = "0.3" -monero = { version = "0.12", features = ["serde_support"] } +futures = { workspace = true } +monero = { workspace = true } monero-rpc = { path = "../monero-rpc" } -rand = "0.8" +rand = { workspace = true } regex = "1.0" -reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +reqwest = { workspace = true, features = ["rustls-tls"] } +serde = { workspace = true } +serde_json = { workspace = true } sqlx = { version = "0.8", features = ["runtime-tokio-rustls", "sqlite", "chrono", "migrate"] } -tokio = { version = "1", features = ["full"] } +tokio = { workspace = true, features = ["full"] } tower = "0.4" tower-http = { version = "0.5", features = ["cors"] } -tracing = "0.1" +tracing = { workspace = true } tracing-subscriber = { version = "0.3", features = ["env-filter"] } -typeshare = "1.0.3" +typeshare = { workspace = true } url = "2.0" -uuid = { version = "1.0", features = ["v4"] } +uuid = { workspace = true } [dev-dependencies] tokio-test = "0.4" diff --git a/monero-rpc/Cargo.toml b/monero-rpc/Cargo.toml index 44f13da7..2eb604a7 100644 --- a/monero-rpc/Cargo.toml +++ b/monero-rpc/Cargo.toml @@ -5,19 +5,19 @@ authors = ["CoBloX Team "] edition = "2021" [dependencies] -anyhow = "1" +anyhow = { workspace = true } curve25519-dalek = "3.1" hex = "0.4" jsonrpc_client = { version = "0.7", features = ["reqwest"] } -monero = "0.12" +monero = { workspace = true } monero-epee-bin-serde = "1" -rand = "0.7" -reqwest = { version = "0.12", default-features = false, features = ["json"] } -rust_decimal = { version = "1", features = ["serde-float"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -tracing = "0.1" +rand = { workspace = true } +reqwest = { workspace = true } +rust_decimal = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +tracing = { workspace = true } [dev-dependencies] hex-literal = "0.4" -tokio = { version = "1", features = ["full"] } +tokio = { workspace = true, features = ["full"] } diff --git a/monero-sys/Cargo.toml b/monero-sys/Cargo.toml index e9e7d655..d8f50438 100644 --- a/monero-sys/Cargo.toml +++ b/monero-sys/Cargo.toml @@ -4,12 +4,17 @@ version = "0.1.0" edition = "2021" [dependencies] -anyhow = "1.0.98" +anyhow = { workspace = true } backoff = { version = "0.4.0", features = ["futures", "tokio"] } cxx = "1.0.137" -monero = { version = "0.12", features = ["serde_support"] } -tokio = { version = "1.44.2", features = ["sync", "time", "rt"] } -tracing = "0.1.41" +monero = { workspace = true } +serde = { workspace = true } +sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-rustls", "macros", "chrono"] } +swap-serde = { path = "../swap-serde" } +tokio = { workspace = true, features = ["sync", "time", "rt"] } +tracing = { workspace = true } +typeshare = { workspace = true } +uuid = { workspace = true } [build-dependencies] cmake = "0.1.54" @@ -17,12 +22,12 @@ cxx-build = "1.0.137" diffy = "0.4.2" [dev-dependencies] -anyhow = "1.0.98" -futures = "0.3.31" +anyhow = { workspace = true } +futures = { workspace = true } quickcheck = "1.0" quickcheck_macros = "1.0" tempfile = "3.19.1" testcontainers = "0.15" -tokio = { version = "1.44.2", features = ["full"] } +tokio = { workspace = true, features = ["full"] } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } -uuid = { version = "1.16.0", features = ["v4"] } +uuid = { workspace = true } diff --git a/monero-wallet/Cargo.toml b/monero-wallet/Cargo.toml deleted file mode 100644 index ca96a637..00000000 --- a/monero-wallet/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "monero-wallet" -version = "0.1.0" -authors = ["CoBloX Team "] -edition = "2021" - -[dependencies] -anyhow = "1" -monero = "0.12" -monero-rpc = { path = "../monero-rpc" } -rand = "0.7" - -[dev-dependencies] -curve25519-dalek = "3" -monero-harness = { path = "../monero-harness" } -rand = "0.7" -testcontainers = "0.15" -tokio = { version = "1", features = ["rt-multi-thread", "time", "macros", "sync", "process", "fs"] } -tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter", "chrono", "tracing-log"] } diff --git a/seed/Cargo.toml b/seed/Cargo.toml index f05a99da..8b8d214d 100644 --- a/seed/Cargo.toml +++ b/seed/Cargo.toml @@ -17,12 +17,9 @@ workspace = true [dependencies] std-shims = { git = "https://github.com/serai-dex/serai", version = "^0.1.1", default-features = false } - -thiserror = { version = "1", default-features = false, optional = true } - +thiserror = { workspace = true, optional = true } rand_core = { version = "0.6", default-features = false } zeroize = { version = "^1.5", default-features = false, features = ["zeroize_derive"] } - curve25519-dalek = { version = "4", default-features = false, features = ["alloc", "zeroize"] } [dev-dependencies] @@ -32,9 +29,7 @@ monero-primitives = { git = "https://github.com/serai-dex/serai", default-featur [features] std = [ "std-shims/std", - "thiserror", - "zeroize/std", "rand_core/std", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index a31549a8..b7ae8bf8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -15,11 +15,11 @@ crate-type = [ "lib", "staticlib" ] tauri-build = { version = "^2.0.0", features = [ "config-json5" ] } [dependencies] -anyhow = "1" +anyhow = { workspace = true } monero-rpc-pool = { path = "../monero-rpc-pool" } rustls = { version = "0.23.26", default-features = false, features = ["ring"] } -serde = { version = "1", features = [ "derive" ] } -serde_json = "1" +serde = { workspace = true } +serde_json = { workspace = true } swap = { path = "../swap", features = [ "tauri" ] } sysinfo = "=0.32.1" tauri = { version = "^2.0.0", features = [ "config-json5" ] } @@ -30,8 +30,8 @@ tauri-plugin-process = "^2.0.0" tauri-plugin-shell = "^2.0.0" tauri-plugin-store = "^2.0.0" tauri-plugin-updater = "^2.0.0" -tracing = "0.1" -uuid = "1.16.0" +tracing = { workspace = true } +uuid = { workspace = true } zip = "4.0.0" [target."cfg(not(any(target_os = \"android\", target_os = \"ios\")))".dependencies] diff --git a/swap-env/Cargo.toml b/swap-env/Cargo.toml new file mode 100644 index 00000000..b29f55a6 --- /dev/null +++ b/swap-env/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "swap-env" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = { workspace = true } +time = "0.3" +swap-serde = { path = "../swap-serde" } +bitcoin = { workspace = true } +monero = { workspace = true } +anyhow = { workspace = true } +tracing = { workspace = true } +swap-fs = { path = "../swap-fs" } +dialoguer = "0.11" +config = { version = "0.14", default-features = false, features = ["toml"] } +libp2p = { workspace = true, features = ["serde"] } +thiserror = { workspace = true } +rust_decimal = { workspace = true } +url = { workspace = true } +toml = "0.8" + +[lints] +workspace = true diff --git a/swap/src/asb/config.rs b/swap-env/src/config.rs similarity index 84% rename from swap/src/asb/config.rs rename to swap-env/src/config.rs index 3da600fb..765ac8c7 100644 --- a/swap/src/asb/config.rs +++ b/swap-env/src/config.rs @@ -1,5 +1,5 @@ use crate::env::{Mainnet, Testnet}; -use crate::fs::{ensure_directory_exists, system_config_dir, system_data_dir}; +use swap_fs::{ensure_directory_exists, system_config_dir, system_data_dir}; use anyhow::{bail, Context, Result}; use config::ConfigError; use dialoguer::theme::ColorfulTheme; @@ -15,7 +15,7 @@ use std::str::FromStr; use url::Url; pub trait GetDefaults { - fn getConfigFileDefaults() -> Result; + fn get_config_file_defaults() -> Result; } pub struct Defaults { @@ -29,7 +29,7 @@ pub struct Defaults { } impl GetDefaults for Testnet { - fn getConfigFileDefaults() -> Result { + fn get_config_file_defaults() -> Result { let defaults = Defaults { config_path: default_asb_config_dir()? .join("testnet") @@ -47,7 +47,7 @@ impl GetDefaults for Testnet { } impl GetDefaults for Mainnet { - fn getConfigFileDefaults() -> Result { + fn get_config_file_defaults() -> Result { let defaults = Defaults { config_path: default_asb_config_dir()? .join("mainnet") @@ -128,104 +128,22 @@ pub struct Data { #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct Network { - #[serde(deserialize_with = "addr_list::deserialize")] + #[serde(deserialize_with = "swap_serde::libp2p::multiaddresses::deserialize")] pub listen: Vec, - #[serde(default, deserialize_with = "addr_list::deserialize")] + #[serde(default, deserialize_with = "swap_serde::libp2p::multiaddresses::deserialize")] pub rendezvous_point: Vec, - #[serde(default, deserialize_with = "addr_list::deserialize")] + #[serde(default, deserialize_with = "swap_serde::libp2p::multiaddresses::deserialize")] pub external_addresses: Vec, } -mod addr_list { - use libp2p::Multiaddr; - use serde::de::Unexpected; - use serde::{de, Deserialize, Deserializer}; - use serde_json::Value; - - pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - let s = Value::deserialize(deserializer)?; - match s { - Value::String(s) => { - let list: Result, _> = s - .split(',') - .filter(|s| !s.is_empty()) - .map(|s| s.trim().parse().map_err(de::Error::custom)) - .collect(); - Ok(list?) - } - Value::Array(a) => { - let list: Result, _> = a - .iter() - .map(|v| { - if let Value::String(s) = v { - s.trim().parse().map_err(de::Error::custom) - } else { - Err(de::Error::custom("expected a string")) - } - }) - .collect(); - Ok(list?) - } - value => Err(de::Error::invalid_type( - Unexpected::Other(&value.to_string()), - &"a string or array", - )), - } - } -} - -mod electrum_urls { - use serde::de::Unexpected; - use serde::{de, Deserialize, Deserializer}; - use serde_json::Value; - use url::Url; - - pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - let s = Value::deserialize(deserializer)?; - match s { - Value::String(s) => { - let list: Result, _> = s - .split(',') - .filter(|s| !s.is_empty()) - .map(|s| s.trim().parse().map_err(de::Error::custom)) - .collect(); - Ok(list?) - } - Value::Array(a) => { - let list: Result, _> = a - .iter() - .map(|v| { - if let Value::String(s) = v { - s.trim().parse().map_err(de::Error::custom) - } else { - Err(de::Error::custom("expected a string")) - } - }) - .collect(); - Ok(list?) - } - value => Err(de::Error::invalid_type( - Unexpected::Other(&value.to_string()), - &"a string or array", - )), - } - } -} - #[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)] #[serde(deny_unknown_fields)] pub struct Bitcoin { - #[serde(deserialize_with = "electrum_urls::deserialize")] + #[serde(deserialize_with = "swap_serde::electrum::urls::deserialize")] pub electrum_rpc_urls: Vec, pub target_block: u16, pub finality_confirmations: Option, - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] pub network: bitcoin::Network, #[serde(default = "default_use_mempool_space_fee_estimation")] pub use_mempool_space_fee_estimation: bool, @@ -240,7 +158,7 @@ fn default_use_mempool_space_fee_estimation() -> bool { pub struct Monero { pub daemon_url: Url, pub finality_confirmations: Option, - #[serde(with = "crate::monero::network")] + #[serde(with = "swap_serde::monero::network")] pub network: monero::Network, #[serde(default = "default_monero_node_pool")] pub monero_node_pool: bool, @@ -266,7 +184,7 @@ pub struct Maker { pub max_buy_btc: bitcoin::Amount, pub ask_spread: Decimal, pub price_ticker_ws_url: Url, - #[serde(default, with = "crate::bitcoin::address_serde::option")] + #[serde(default, with = "swap_serde::bitcoin::address_serde::option")] pub external_bitcoin_redeem_address: Option, } @@ -318,14 +236,14 @@ pub fn query_user_for_initial_config(testnet: bool) -> Result { let bitcoin_network = bitcoin::Network::Testnet; let monero_network = monero::Network::Stagenet; - let defaults = Testnet::getConfigFileDefaults()?; + let defaults = Testnet::get_config_file_defaults()?; (bitcoin_network, monero_network, defaults) } else { tracing::info!("Running initial setup for mainnet"); let bitcoin_network = bitcoin::Network::Bitcoin; let monero_network = monero::Network::Mainnet; - let defaults = Mainnet::getConfigFileDefaults()?; + let defaults = Mainnet::get_config_file_defaults()?; (bitcoin_network, monero_network, defaults) }; @@ -382,7 +300,8 @@ pub fn query_user_for_initial_config(testnet: bool) -> Result { .with_prompt(prompt) .allow_empty(true) .interact_text()?; - if electrum_url.as_str().is_empty() { + + if electrum_url.is_empty() { electrum_done = true; } else if electrum_rpc_urls .iter() @@ -500,7 +419,7 @@ mod tests { let temp_dir = tempdir().unwrap().path().to_path_buf(); let config_path = Path::join(&temp_dir, "config.toml"); - let defaults = Testnet::getConfigFileDefaults().unwrap(); + let defaults = Testnet::get_config_file_defaults().unwrap(); let expected = Config { data: Data { @@ -546,7 +465,7 @@ mod tests { let temp_dir = tempdir().unwrap().path().to_path_buf(); let config_path = Path::join(&temp_dir, "config.toml"); - let defaults = Mainnet::getConfigFileDefaults().unwrap(); + let defaults = Mainnet::get_config_file_defaults().unwrap(); let expected = Config { data: Data { @@ -592,7 +511,7 @@ mod tests { let temp_dir = tempfile::tempdir().unwrap().path().to_path_buf(); let config_path = Path::join(&temp_dir, "config.toml"); - let defaults = Mainnet::getConfigFileDefaults().unwrap(); + let defaults = Mainnet::get_config_file_defaults().unwrap(); let dir = PathBuf::from("/tmp/dir"); std::env::set_var("ASB__DATA__DIR", dir.clone()); diff --git a/swap/src/env.rs b/swap-env/src/env.rs similarity index 81% rename from swap/src/env.rs rename to swap-env/src/env.rs index a80d65a2..f33299fb 100644 --- a/swap/src/env.rs +++ b/swap-env/src/env.rs @@ -1,9 +1,8 @@ -use crate::asb; -use crate::bitcoin::{CancelTimelock, PunishTimelock}; use serde::Serialize; use std::cmp::max; use std::time::Duration; use time::ext::NumericalStdDuration; +use crate::config::Config as AsbConfig; #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize)] pub struct Config { @@ -11,8 +10,8 @@ pub struct Config { pub bitcoin_lock_confirmed_timeout: Duration, pub bitcoin_finality_confirmations: u32, pub bitcoin_avg_block_time: Duration, - pub bitcoin_cancel_timelock: CancelTimelock, - pub bitcoin_punish_timelock: PunishTimelock, + pub bitcoin_cancel_timelock: u32, + pub bitcoin_punish_timelock: u32, pub bitcoin_network: bitcoin::Network, pub monero_avg_block_time: Duration, pub monero_finality_confirmations: u64, @@ -20,7 +19,7 @@ pub struct Config { pub monero_lock_retry_timeout: Duration, // After this many confirmations we assume that the Monero transaction is safe from double spending pub monero_double_spend_safe_confirmations: u64, - #[serde(with = "monero_network")] + #[serde(with = "swap_serde::monero::network")] pub monero_network: monero::Network, } @@ -54,8 +53,8 @@ impl GetConfig for Mainnet { bitcoin_lock_confirmed_timeout: 2.std_hours(), bitcoin_finality_confirmations: 1, bitcoin_avg_block_time: 10.std_minutes(), - bitcoin_cancel_timelock: CancelTimelock::new(72), - bitcoin_punish_timelock: PunishTimelock::new(144), + bitcoin_cancel_timelock: 72, + bitcoin_punish_timelock: 144, bitcoin_network: bitcoin::Network::Bitcoin, monero_avg_block_time: 2.std_minutes(), // If Alice cannot lock her Monero within this timeout, @@ -75,8 +74,8 @@ impl GetConfig for Testnet { bitcoin_lock_confirmed_timeout: 1.std_hours(), bitcoin_finality_confirmations: 1, bitcoin_avg_block_time: 10.std_minutes(), - bitcoin_cancel_timelock: CancelTimelock::new(12), - bitcoin_punish_timelock: PunishTimelock::new(24), + bitcoin_cancel_timelock: 12, + bitcoin_punish_timelock: 24, bitcoin_network: bitcoin::Network::Testnet, monero_avg_block_time: 2.std_minutes(), monero_lock_retry_timeout: 10.std_minutes(), @@ -94,8 +93,8 @@ impl GetConfig for Regtest { bitcoin_lock_confirmed_timeout: 5.std_minutes(), bitcoin_finality_confirmations: 1, bitcoin_avg_block_time: 5.std_seconds(), - bitcoin_cancel_timelock: CancelTimelock::new(100), - bitcoin_punish_timelock: PunishTimelock::new(50), + bitcoin_cancel_timelock: 100, + bitcoin_punish_timelock: 50, bitcoin_network: bitcoin::Network::Regtest, monero_avg_block_time: 1.std_seconds(), monero_lock_retry_timeout: 1.std_minutes(), @@ -110,7 +109,7 @@ fn sync_interval(avg_block_time: Duration) -> Duration { max(avg_block_time / 10, Duration::from_secs(1)) } -pub fn new(is_testnet: bool, asb_config: &asb::config::Config) -> Config { +pub fn new(is_testnet: bool, asb_config: &AsbConfig) -> Config { let env_config = if is_testnet { Testnet::get_config() } else { @@ -137,22 +136,7 @@ pub fn new(is_testnet: bool, asb_config: &asb::config::Config) -> Config { } } -mod monero_network { - use crate::monero::Network; - use serde::Serializer; - pub fn serialize(x: &monero::Network, s: S) -> Result - where - S: Serializer, - { - let str = match x { - Network::Mainnet => "mainnet", - Network::Stagenet => "stagenet", - Network::Testnet => "testnet", - }; - s.serialize_str(str) - } -} #[cfg(test)] mod tests { diff --git a/swap-env/src/lib.rs b/swap-env/src/lib.rs new file mode 100644 index 00000000..07a0493a --- /dev/null +++ b/swap-env/src/lib.rs @@ -0,0 +1,2 @@ +pub mod env; +pub mod config; \ No newline at end of file diff --git a/swap-fs/Cargo.toml b/swap-fs/Cargo.toml new file mode 100644 index 00000000..4f92c417 --- /dev/null +++ b/swap-fs/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "swap-fs" +version = "0.1.0" +edition = "2024" + +[dependencies] +anyhow = { workspace = true } +directories-next = "2" +tracing = { workspace = true } + +[lints] +workspace = true diff --git a/swap/src/fs.rs b/swap-fs/src/lib.rs similarity index 100% rename from swap/src/fs.rs rename to swap-fs/src/lib.rs diff --git a/swap-serde/Cargo.toml b/swap-serde/Cargo.toml new file mode 100644 index 00000000..a3a54a3d --- /dev/null +++ b/swap-serde/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "swap-serde" +version = "0.1.0" +edition = "2024" + +[dependencies] +serde = { workspace = true } +monero = { workspace = true } +bitcoin = { workspace = true } +libp2p = { workspace = true } +serde_json = { workspace = true } +url = { workspace = true } +hex = { workspace = true } +anyhow = { workspace = true } +thiserror = { workspace = true } + +[lints] +workspace = true diff --git a/swap-serde/src/bitcoin.rs b/swap-serde/src/bitcoin.rs new file mode 100644 index 00000000..a2d1bbd0 --- /dev/null +++ b/swap-serde/src/bitcoin.rs @@ -0,0 +1,76 @@ +use serde::{Deserialize, Serialize}; +use bitcoin::{Network}; + +#[derive(Serialize, Deserialize)] +#[serde(remote = "Network")] +#[allow(non_camel_case_types)] +#[non_exhaustive] +pub enum network { + #[serde(rename = "Mainnet")] + Bitcoin, + Testnet, + Signet, + Regtest, +} + +/// This module is used to serialize and deserialize bitcoin addresses +/// even though the bitcoin crate does not support it for Address. +pub mod address_serde { + use std::str::FromStr; + + use bitcoin::address::{Address, NetworkChecked, NetworkUnchecked}; + use serde::{Deserialize, Deserializer, Serialize, Serializer}; + + pub fn serialize(address: &Address, serializer: S) -> Result + where + S: Serializer, + { + address.to_string().serialize(serializer) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let unchecked: Address = + Address::from_str(&String::deserialize(deserializer)?) + .map_err(serde::de::Error::custom)?; + + Ok(unchecked.assume_checked()) + } + + /// This submodule supports Option
. + pub mod option { + use super::*; + + pub fn serialize( + address: &Option>, + serializer: S, + ) -> Result + where + S: Serializer, + { + match address { + Some(addr) => addr.to_string().serialize(serializer), + None => serializer.serialize_none(), + } + } + + pub fn deserialize<'de, D>( + deserializer: D, + ) -> Result>, D::Error> + where + D: Deserializer<'de>, + { + let opt: Option = Option::deserialize(deserializer)?; + match opt { + Some(s) => { + let unchecked: Address = + Address::from_str(&s).map_err(serde::de::Error::custom)?; + Ok(Some(unchecked.assume_checked())) + } + None => Ok(None), + } + } + } +} \ No newline at end of file diff --git a/swap-serde/src/electrum.rs b/swap-serde/src/electrum.rs new file mode 100644 index 00000000..ba7d0832 --- /dev/null +++ b/swap-serde/src/electrum.rs @@ -0,0 +1,40 @@ +pub mod urls { + use serde::de::Unexpected; + use serde::{de, Deserialize, Deserializer}; + use serde_json::Value; + use url::Url; + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let s = Value::deserialize(deserializer)?; + match s { + Value::String(s) => { + let list: Result, _> = s + .split(',') + .filter(|s| !s.is_empty()) + .map(|s| s.trim().parse().map_err(de::Error::custom)) + .collect(); + Ok(list?) + } + Value::Array(a) => { + let list: Result, _> = a + .iter() + .map(|v| { + if let Value::String(s) = v { + s.trim().parse().map_err(de::Error::custom) + } else { + Err(de::Error::custom("expected a string")) + } + }) + .collect(); + Ok(list?) + } + value => Err(de::Error::invalid_type( + Unexpected::Other(&value.to_string()), + &"a string or array", + )), + } + } +} \ No newline at end of file diff --git a/swap-serde/src/lib.rs b/swap-serde/src/lib.rs new file mode 100644 index 00000000..868b9a4f --- /dev/null +++ b/swap-serde/src/lib.rs @@ -0,0 +1,4 @@ +pub mod monero; +pub mod bitcoin; +pub mod libp2p; +pub mod electrum; \ No newline at end of file diff --git a/swap-serde/src/libp2p.rs b/swap-serde/src/libp2p.rs new file mode 100644 index 00000000..e75fc6aa --- /dev/null +++ b/swap-serde/src/libp2p.rs @@ -0,0 +1,40 @@ +pub mod multiaddresses { + use libp2p::Multiaddr; + use serde::de::Unexpected; + use serde::{de, Deserialize, Deserializer}; + use serde_json::Value; + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let s = Value::deserialize(deserializer)?; + match s { + Value::String(s) => { + let list: Result, _> = s + .split(',') + .filter(|s| !s.is_empty()) + .map(|s| s.trim().parse().map_err(de::Error::custom)) + .collect(); + Ok(list?) + } + Value::Array(a) => { + let list: Result, _> = a + .iter() + .map(|v| { + if let Value::String(s) = v { + s.trim().parse().map_err(de::Error::custom) + } else { + Err(de::Error::custom("expected a string")) + } + }) + .collect(); + Ok(list?) + } + value => Err(de::Error::invalid_type( + Unexpected::Other(&value.to_string()), + &"a string or array", + )), + } + } +} \ No newline at end of file diff --git a/swap-serde/src/monero.rs b/swap-serde/src/monero.rs new file mode 100644 index 00000000..a95ee015 --- /dev/null +++ b/swap-serde/src/monero.rs @@ -0,0 +1,146 @@ +use monero::{Network, Amount}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +#[derive(Serialize, Deserialize)] +#[serde(remote = "Network")] +#[allow(non_camel_case_types)] +pub enum network { + Mainnet, + Stagenet, + Testnet, +} + +pub mod private_key { + use monero::consensus::{Decodable, Encodable}; + use monero::PrivateKey; + use serde::de::Visitor; + use serde::ser::Error; + use serde::{de, Deserializer, Serializer}; + use std::fmt; + use std::io::Cursor; + use hex; + + struct BytesVisitor; + + impl Visitor<'_> for BytesVisitor { + type Value = PrivateKey; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(formatter, "a byte array representing a Monero private key") + } + + fn visit_bytes(self, s: &[u8]) -> Result + where + E: de::Error, + { + let mut s = s; + PrivateKey::consensus_decode(&mut s).map_err(|err| E::custom(format!("{:?}", err))) + } + + fn visit_str(self, s: &str) -> Result + where + E: de::Error, + { + let bytes = hex::decode(s).map_err(|err| E::custom(format!("{:?}", err)))?; + PrivateKey::consensus_decode(&mut bytes.as_slice()) + .map_err(|err| E::custom(format!("{:?}", err))) + } + } + + pub fn serialize(x: &PrivateKey, s: S) -> Result + where + S: Serializer, + { + let mut bytes = Cursor::new(vec![]); + x.consensus_encode(&mut bytes) + .map_err(|err| S::Error::custom(format!("{:?}", err)))?; + if s.is_human_readable() { + s.serialize_str(&hex::encode(bytes.into_inner())) + } else { + s.serialize_bytes(bytes.into_inner().as_ref()) + } + } + + pub fn deserialize<'de, D>( + deserializer: D, + ) -> Result>::Error> + where + D: Deserializer<'de>, + { + let key = { + if deserializer.is_human_readable() { + deserializer.deserialize_string(BytesVisitor)? + } else { + deserializer.deserialize_bytes(BytesVisitor)? + } + }; + Ok(key) + } +} + +pub mod amount { + use super::*; + + pub fn serialize(x: &Amount, s: S) -> Result + where + S: Serializer, + { + s.serialize_u64(x.as_pico()) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result>::Error> + where + D: Deserializer<'de>, + { + let picos = u64::deserialize(deserializer)?; + let amount = Amount::from_pico(picos); + + Ok(amount) + } +} + +pub mod address { + use anyhow::{bail, Context, Result}; + use std::str::FromStr; + + #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq)] + #[error("Invalid monero address provided, expected address on network {expected:?} but address provided is on {actual:?}")] + pub struct MoneroAddressNetworkMismatch { + pub expected: monero::Network, + pub actual: monero::Network, + } + + pub fn parse(s: &str) -> Result { + monero::Address::from_str(s).with_context(|| { + format!( + "Failed to parse {} as a monero address, please make sure it is a valid address", + s + ) + }) + } + + pub fn validate( + address: monero::Address, + expected_network: monero::Network, + ) -> Result { + if address.network != expected_network { + bail!(MoneroAddressNetworkMismatch { + expected: expected_network, + actual: address.network, + }); + } + Ok(address) + } + + pub fn validate_is_testnet( + address: monero::Address, + is_testnet: bool, + ) -> Result { + let expected_network = if is_testnet { + monero::Network::Stagenet + } else { + monero::Network::Mainnet + }; + validate(address, expected_network) + } +} \ No newline at end of file diff --git a/swap/Cargo.toml b/swap/Cargo.toml index ca92b885..092e3107 100644 --- a/swap/Cargo.toml +++ b/swap/Cargo.toml @@ -12,7 +12,7 @@ name = "swap" tauri = ["dep:tauri"] [dependencies] -anyhow = "1" +anyhow = { workspace = true } arti-client = { version = "0.25.0", features = ["static-sqlite", "tokio", "rustls", "onion-service-service"], default-features = false } async-compression = { version = "0.3", features = ["bzip2", "tokio"] } async-trait = "0.1" @@ -25,7 +25,7 @@ bdk_chain = { version = "0.20" } bdk_electrum = { version = "0.19", default-features = false, features = ["use-rustls-ring"] } bdk_wallet = { version = "1.0.0-beta.5", features = ["rusqlite", "test-utils"] } big-bytes = "1" -bitcoin = { version = "0.32", features = ["rand", "serde"] } +bitcoin = { workspace = true } bmrng = "0.5.2" comfy-table = "7.1" config = { version = "0.14", default-features = false, features = ["toml"] } @@ -34,16 +34,16 @@ curve25519-dalek = { package = "curve25519-dalek-ng", version = "4" } data-encoding = "2.6" derive_builder = "0.20.2" dialoguer = "0.11" -directories-next = "2" ecdsa_fun = { version = "0.10", default-features = false, features = ["libsecp_compat", "serde", "adaptor"] } ed25519-dalek = "1" electrum-pool = { path = "../electrum-pool" } -futures = { version = "0.3", default-features = false, features = ["std"] } -hex = "0.4" -libp2p = { version = "0.53.2", features = ["tcp", "yamux", "dns", "noise", "request-response", "ping", "rendezvous", "identify", "macros", "cbor", "json", "tokio", "serde", "rsa"] } +fns = "0.0.7" +futures = { workspace = true } +hex = { workspace = true } +libp2p = { workspace = true, features = ["tcp", "yamux", "dns", "noise", "request-response", "ping", "rendezvous", "identify", "macros", "cbor", "json", "tokio", "serde", "rsa"] } libp2p-community-tor = { git = "https://github.com/umgefahren/libp2p-tor", rev = "e6b913e0f1ac1fc90b3ee4dd31b5511140c4a9af", features = ["listen-onion-service"] } moka = { version = "0.12", features = ["sync", "future"] } -monero = { version = "0.12", features = ["serde_support"] } +monero = { workspace = true } monero-rpc = { path = "../monero-rpc" } monero-rpc-pool = { path = "../monero-rpc-pool" } monero-seed = { version = "0.1.0", path = "../seed" } @@ -51,42 +51,44 @@ monero-sys = { path = "../monero-sys" } once_cell = "1.19" pem = "3.0" proptest = "1" -rand = "0.8" +rand = { workspace = true } rand_chacha = "0.3" regex = "1.10" -reqwest = { version = "0.12", features = ["http2", "rustls-tls-native-roots", "stream", "socks"], default-features = false } +reqwest = { workspace = true, features = ["http2", "rustls-tls-native-roots", "stream", "socks"] } rust_decimal = { version = "1", features = ["serde-float"] } rust_decimal_macros = "1" rustls = { version = "0.23", default-features = false, features = ["ring"] } semver = "1.0" -serde = { version = "1.0", features = ["derive"] } +serde = { workspace = true } serde_cbor = "0.11" -serde_json = "1" +serde_json = { workspace = true } serde_with = { version = "1", features = ["macros"] } sha2 = "0.10" +swap-serde = { path = "../swap-serde" } +swap-env = { path = "../swap-env" } sigma_fun = { version = "0.7", default-features = false, features = ["ed25519", "serde", "secp256k1", "alloc"] } sqlx = { version = "0.8", features = ["sqlite", "runtime-tokio-rustls"] } structopt = "0.3" strum = { version = "0.26", features = ["derive"] } tauri = { version = "2.0", features = ["config-json5"], optional = true, default-features = false } -thiserror = "1" +thiserror = { workspace = true } time = "0.3" -tokio = { version = "1", features = ["rt-multi-thread", "time", "macros", "sync", "process", "fs", "net", "parking_lot", "rt"] } +tokio = { workspace = true, features = ["process", "fs", "net", "parking_lot", "rt"] } tokio-tungstenite = { version = "0.15", features = ["rustls-tls"] } tokio-util = { version = "0.7", features = ["io", "codec", "rt"] } -toml = "0.8" tor-rtcompat = { version = "0.25.0", features = ["tokio"] } tower = { version = "0.4.13", features = ["full"] } tower-http = { version = "0.3.4", features = ["full"] } -tracing = { version = "0.1", features = ["attributes"] } +tracing = { workspace = true } tracing-appender = "0.2" tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "ansi", "env-filter", "time", "tracing-log", "json"] } -typeshare = "1.0.3" +typeshare = { workspace = true } unsigned-varint = { version = "0.8.0", features = ["codec", "asynchronous_codec"] } -url = { version = "2", features = ["serde"] } -uuid = { version = "1.9", features = ["serde", "v4"] } +url = { workspace = true } +uuid = { workspace = true, features = ["serde"] } void = "1" zeroize = "1.8.1" +swap-fs = { path = "../swap-fs" } [target.'cfg(not(windows))'.dependencies] tokio-tar = "0.3" @@ -106,5 +108,5 @@ tempfile = "3" testcontainers = "0.15" [build-dependencies] -anyhow = "1" +anyhow = { workspace = true } vergen = { version = "8.3", default-features = false, features = ["build", "git", "git2"] } diff --git a/swap/src/asb.rs b/swap/src/asb.rs index 404a3b61..236a5170 100644 --- a/swap/src/asb.rs +++ b/swap/src/asb.rs @@ -1,5 +1,4 @@ pub mod command; -pub mod config; mod event_loop; mod network; mod rate; diff --git a/swap/src/asb/command.rs b/swap/src/asb/command.rs index a280fd0e..5e434b51 100644 --- a/swap/src/asb/command.rs +++ b/swap/src/asb/command.rs @@ -1,7 +1,7 @@ -use crate::asb::config::GetDefaults; +use swap_env::config::GetDefaults; use crate::bitcoin::{bitcoin_address, Amount}; -use crate::env; -use crate::env::GetConfig; +use swap_env::env; +use swap_env::env::GetConfig; use anyhow::Result; use bitcoin::address::NetworkUnchecked; use bitcoin::Address; @@ -163,9 +163,9 @@ fn config_path(config: Option, is_testnet: bool) -> Result { let config_path = if let Some(config_path) = config { config_path } else if is_testnet { - env::Testnet::getConfigFileDefaults()?.config_path + env::Testnet::get_config_file_defaults()?.config_path } else { - env::Mainnet::getConfigFileDefaults()?.config_path + env::Mainnet::get_config_file_defaults()?.config_path }; Ok(config_path) @@ -182,9 +182,9 @@ fn env_config(is_testnet: bool) -> env::Config { #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq, Serialize)] #[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")] pub struct BitcoinAddressNetworkMismatch { - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] expected: bitcoin::Network, - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] actual: bitcoin::Network, } @@ -402,7 +402,7 @@ mod tests { #[test] fn ensure_start_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![BINARY_NAME, "start"]; @@ -420,7 +420,7 @@ mod tests { #[test] fn ensure_history_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![BINARY_NAME, "history"]; @@ -440,7 +440,7 @@ mod tests { #[test] fn ensure_balance_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![BINARY_NAME, "balance"]; @@ -458,7 +458,7 @@ mod tests { #[test] fn ensure_withdraw_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![ BINARY_NAME, @@ -484,7 +484,7 @@ mod tests { #[test] fn ensure_cancel_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![ @@ -510,7 +510,7 @@ mod tests { #[test] fn ensure_refund_command_mappin_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![ @@ -536,7 +536,7 @@ mod tests { #[test] fn ensure_punish_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![ @@ -562,7 +562,7 @@ mod tests { #[test] fn ensure_safely_abort_command_mapping_mainnet() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![ @@ -588,7 +588,7 @@ mod tests { #[test] fn ensure_start_command_mapping_for_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![BINARY_NAME, "--testnet", "start"]; @@ -606,7 +606,7 @@ mod tests { #[test] fn ensure_history_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![BINARY_NAME, "--testnet", "history"]; @@ -626,7 +626,7 @@ mod tests { #[test] fn ensure_balance_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![BINARY_NAME, "--testnet", "balance"]; @@ -644,7 +644,7 @@ mod tests { #[test] fn ensure_export_monero_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![BINARY_NAME, "--testnet", "export-monero-wallet"]; @@ -663,7 +663,7 @@ mod tests { #[test] fn ensure_withdraw_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![ @@ -690,7 +690,7 @@ mod tests { } #[test] fn ensure_cancel_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![ @@ -717,7 +717,7 @@ mod tests { #[test] fn ensure_refund_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![ @@ -744,7 +744,7 @@ mod tests { #[test] fn ensure_punish_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![ @@ -771,7 +771,7 @@ mod tests { #[test] fn ensure_safely_abort_command_mapping_testnet() { - let default_testnet_conf_path = env::Testnet::getConfigFileDefaults().unwrap().config_path; + let default_testnet_conf_path = env::Testnet::get_config_file_defaults().unwrap().config_path; let testnet_env_config = env::Testnet::get_config(); let raw_ars = vec![ @@ -798,7 +798,7 @@ mod tests { #[test] fn ensure_disable_timestamp_mapping() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![BINARY_NAME, "--disable-timestamp", "start"]; @@ -816,7 +816,7 @@ mod tests { #[test] fn ensure_trace_mapping() { - let default_mainnet_conf_path = env::Mainnet::getConfigFileDefaults().unwrap().config_path; + let default_mainnet_conf_path = env::Mainnet::get_config_file_defaults().unwrap().config_path; let mainnet_env_config = env::Mainnet::get_config(); let raw_ars = vec![BINARY_NAME, "--trace", "start"]; diff --git a/swap/src/asb/event_loop.rs b/swap/src/asb/event_loop.rs index 139ea34c..cec08dcd 100644 --- a/swap/src/asb/event_loop.rs +++ b/swap/src/asb/event_loop.rs @@ -7,7 +7,8 @@ use crate::network::transfer_proof; use crate::protocol::alice::swap::has_already_processed_enc_sig; use crate::protocol::alice::{AliceState, ReservesMonero, State3, Swap}; use crate::protocol::{Database, State}; -use crate::{bitcoin, env, kraken, monero}; +use crate::{bitcoin, kraken, monero}; +use swap_env::env; use anyhow::{anyhow, Context, Result}; use futures::future; use futures::future::{BoxFuture, FutureExt}; diff --git a/swap/src/asb/network.rs b/swap/src/asb/network.rs index 1148aa5d..02949e6f 100644 --- a/swap/src/asb/network.rs +++ b/swap/src/asb/network.rs @@ -1,5 +1,5 @@ use crate::asb::event_loop::LatestRate; -use crate::env; +use swap_env::env; use crate::network::quote::BidQuote; use crate::network::rendezvous::XmrBtcNamespace; use crate::network::swap_setup::alice; diff --git a/swap/src/bin/asb.rs b/swap/src/bin/asb.rs index 7bf8d702..d1c85756 100644 --- a/swap/src/bin/asb.rs +++ b/swap/src/bin/asb.rs @@ -24,7 +24,7 @@ use std::sync::Arc; use structopt::clap; use structopt::clap::ErrorKind; use swap::asb::command::{parse_args, Arguments, Command}; -use swap::asb::config::{ +use swap_env::config::{ initial_setup, query_user_for_initial_config, read_config, Config, ConfigNotInitialized, }; use swap::asb::{cancel, punish, redeem, refund, safely_abort, EventLoop, Finality, KrakenRate}; @@ -444,8 +444,7 @@ pub async fn main() -> Result<()> { async fn init_bitcoin_wallet( config: &Config, seed: &Seed, - env_config: swap::env::Config, - sync: bool, + env_config: swap_env::env::Config, ) -> Result { tracing::debug!("Opening Bitcoin wallet"); let wallet = bitcoin::wallet::WalletBuilder::default() @@ -481,7 +480,7 @@ async fn init_bitcoin_wallet( async fn init_monero_wallet( config: &Config, - env_config: swap::env::Config, + env_config: swap_env::env::Config, ) -> Result> { tracing::debug!("Initializing Monero wallets"); diff --git a/swap/src/bitcoin.rs b/swap/src/bitcoin.rs index bfbe7fd5..b2c5ba38 100644 --- a/swap/src/bitcoin.rs +++ b/swap/src/bitcoin.rs @@ -42,80 +42,6 @@ use serde::{Deserialize, Serialize}; use sha2::Sha256; use std::str::FromStr; -#[derive(Serialize, Deserialize)] -#[serde(remote = "Network")] -#[allow(non_camel_case_types)] -#[non_exhaustive] -pub enum network { - #[serde(rename = "Mainnet")] - Bitcoin, - Testnet, - Signet, - Regtest, -} - -/// This module is used to serialize and deserialize bitcoin addresses -/// even though the bitcoin crate does not support it for Address. -pub mod address_serde { - use std::str::FromStr; - - use bitcoin::address::{Address, NetworkChecked, NetworkUnchecked}; - use serde::{Deserialize, Deserializer, Serialize, Serializer}; - - pub fn serialize(address: &Address, serializer: S) -> Result - where - S: Serializer, - { - address.to_string().serialize(serializer) - } - - pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - let unchecked: Address = - Address::from_str(&String::deserialize(deserializer)?) - .map_err(serde::de::Error::custom)?; - - Ok(unchecked.assume_checked()) - } - - /// This submodule supports Option
. - pub mod option { - use super::*; - - pub fn serialize( - address: &Option>, - serializer: S, - ) -> Result - where - S: Serializer, - { - match address { - Some(addr) => addr.to_string().serialize(serializer), - None => serializer.serialize_none(), - } - } - - pub fn deserialize<'de, D>( - deserializer: D, - ) -> Result>, D::Error> - where - D: Deserializer<'de>, - { - let opt: Option = Option::deserialize(deserializer)?; - match opt { - Some(s) => { - let unchecked: Address = - Address::from_str(&s).map_err(serde::de::Error::custom)?; - Ok(Some(unchecked.assume_checked())) - } - None => Ok(None), - } - } - } -} - #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] pub struct SecretKey { inner: Scalar, @@ -336,9 +262,9 @@ pub mod bitcoin_address { #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Serialize)] #[error("Invalid Bitcoin address provided, expected address on network {expected:?} but address provided is on {actual:?}")] pub struct BitcoinAddressNetworkMismatch { - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] expected: bitcoin::Network, - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] actual: bitcoin::Network, } @@ -555,7 +481,7 @@ pub struct NotThreeWitnesses(usize); #[cfg(test)] mod tests { use super::*; - use crate::env::{GetConfig, Regtest}; + use swap_env::env::{GetConfig, Regtest}; use crate::monero::TransferProof; use crate::protocol::{alice, bob}; use bitcoin::secp256k1; diff --git a/swap/src/bitcoin/cancel.rs b/swap/src/bitcoin/cancel.rs index c7f2d615..42dec976 100644 --- a/swap/src/bitcoin/cancel.rs +++ b/swap/src/bitcoin/cancel.rs @@ -35,6 +35,12 @@ impl From for u32 { } } +impl From for CancelTimelock { + fn from(number_of_blocks: u32) -> Self { + Self(number_of_blocks) + } +} + impl CancelTimelock { pub const fn new(number_of_blocks: u32) -> Self { Self(number_of_blocks) @@ -86,6 +92,12 @@ impl From for u32 { } } +impl From for PunishTimelock { + fn from(number_of_blocks: u32) -> Self { + Self(number_of_blocks) + } +} + impl PunishTimelock { pub const fn new(number_of_blocks: u32) -> Self { Self(number_of_blocks) diff --git a/swap/src/bitcoin/wallet.rs b/swap/src/bitcoin/wallet.rs index 9ed7816e..5bb5ea93 100644 --- a/swap/src/bitcoin/wallet.rs +++ b/swap/src/bitcoin/wallet.rs @@ -441,7 +441,7 @@ impl Wallet { finality_confirmations: u32, target_block: u32, sync_interval: Duration, - env_config: crate::env::Config, + env_config: swap_env::env::Config, tauri_handle: Option, ) -> Result> { // Construct the private key, directory and wallet file for the new (>= 1.0.0) bdk wallet diff --git a/swap/src/cli/api.rs b/swap/src/cli/api.rs index b42ec9e0..881ad100 100644 --- a/swap/src/cli/api.rs +++ b/swap/src/cli/api.rs @@ -5,9 +5,8 @@ use crate::cli::command::{Bitcoin, Monero}; use crate::common::tor::init_tor_client; use crate::common::tracing_util::Format; use crate::database::{open_db, AccessMode}; -use crate::env::{Config as EnvConfig, GetConfig, Mainnet, Testnet}; -use crate::fs::system_data_dir; -use crate::monero::Wallets; +use swap_env::env::{Config as EnvConfig, GetConfig, Mainnet, Testnet}; +use swap_fs::system_data_dir; use crate::network::rendezvous::XmrBtcNamespace; use crate::protocol::Database; use crate::seed::Seed; diff --git a/swap/src/cli/api/request.rs b/swap/src/cli/api/request.rs index 2863a69e..e1593a61 100644 --- a/swap/src/cli/api/request.rs +++ b/swap/src/cli/api/request.rs @@ -155,7 +155,7 @@ pub struct WithdrawBtcArgs { #[serde(default, with = "::bitcoin::amount::serde::as_sat::opt")] pub amount: Option, #[typeshare(serialized_as = "string")] - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] pub address: bitcoin::Address, } diff --git a/swap/src/cli/behaviour.rs b/swap/src/cli/behaviour.rs index ece782a5..03eded8f 100644 --- a/swap/src/cli/behaviour.rs +++ b/swap/src/cli/behaviour.rs @@ -7,7 +7,8 @@ use crate::network::{ cooperative_xmr_redeem_after_punish, encrypted_signature, quote, redial, transfer_proof, }; use crate::protocol::bob::State2; -use crate::{bitcoin, env}; +use crate::bitcoin; +use swap_env::env; use anyhow::{anyhow, Error, Result}; use libp2p::request_response::{ InboundFailure, InboundRequestId, OutboundFailure, OutboundRequestId, ResponseChannel, diff --git a/swap/src/cli/command.rs b/swap/src/cli/command.rs index 0b115546..66213386 100644 --- a/swap/src/cli/command.rs +++ b/swap/src/cli/command.rs @@ -4,7 +4,7 @@ use crate::cli::api::request::{ GetHistoryArgs, ListSellersArgs, MoneroRecoveryArgs, Request, ResumeSwapArgs, WithdrawBtcArgs, }; use crate::cli::api::Context; -use crate::monero::monero_address; +use swap_serde::monero::address; use crate::monero::{self, MoneroAddressPool}; use anyhow::Result; use bitcoin::address::NetworkUnchecked; @@ -69,7 +69,7 @@ where tor, } => { let monero_receive_pool: MoneroAddressPool = - monero_address::validate_is_testnet(monero_receive_address, is_testnet)?.into(); + swap_serde::monero::address::validate_is_testnet(monero_receive_address, is_testnet)?.into(); let bitcoin_change_address = bitcoin_change_address .map(|address| bitcoin_address::validate(address, is_testnet)) @@ -354,7 +354,7 @@ enum CliCommand { #[structopt(long = "receive-address", help = "The monero address where you would like to receive monero", - parse(try_from_str = monero_address::parse) + parse(try_from_str = swap_serde::monero::address::parse) )] monero_receive_address: monero::Address, diff --git a/swap/src/database.rs b/swap/src/database.rs index fabc4ffc..f6e5acde 100644 --- a/swap/src/database.rs +++ b/swap/src/database.rs @@ -3,7 +3,7 @@ pub use bob::Bob; pub use sqlite::SqliteDatabase; use crate::cli::api::tauri_bindings::TauriHandle; -use crate::fs::ensure_directory_exists; +use swap_fs::ensure_directory_exists; use crate::protocol::{Database, State}; use anyhow::{bail, Result}; use serde::{Deserialize, Serialize}; diff --git a/swap/src/database/alice.rs b/swap/src/database/alice.rs index 041f0f6c..63d71c49 100644 --- a/swap/src/database/alice.rs +++ b/swap/src/database/alice.rs @@ -1,7 +1,7 @@ use crate::bitcoin::EncryptedSignature; use crate::monero; use crate::monero::BlockHeight; -use crate::monero::{monero_private_key, TransferProof}; +use crate::monero::TransferProof; use crate::protocol::alice; use crate::protocol::alice::AliceState; use serde::{Deserialize, Serialize}; @@ -68,7 +68,7 @@ pub enum Alice { monero_wallet_restore_blockheight: BlockHeight, transfer_proof: TransferProof, state3: alice::State3, - #[serde(with = "monero_private_key")] + #[serde(with = "swap_serde::monero::private_key")] spend_key: monero::PrivateKey, }, Done(AliceEndState), diff --git a/swap/src/database/bob.rs b/swap/src/database/bob.rs index 4439fcfa..d459cabe 100644 --- a/swap/src/database/bob.rs +++ b/swap/src/database/bob.rs @@ -10,7 +10,7 @@ pub enum Bob { Started { #[serde(with = "::bitcoin::amount::serde::as_sat")] btc_amount: bitcoin::Amount, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] change_address: bitcoin::Address, tx_lock_fee: bitcoin::Amount, }, diff --git a/swap/src/lib.rs b/swap/src/lib.rs index 7ab938d3..0f5e7cfc 100644 --- a/swap/src/lib.rs +++ b/swap/src/lib.rs @@ -21,8 +21,6 @@ pub mod bitcoin; pub mod cli; pub mod common; pub mod database; -pub mod env; -pub mod fs; pub mod kraken; pub mod libp2p_ext; pub mod monero; diff --git a/swap/src/monero.rs b/swap/src/monero.rs index 18fe6058..440634cd 100644 --- a/swap/src/monero.rs +++ b/swap/src/monero.rs @@ -52,7 +52,7 @@ pub fn private_key_from_secp256k1_scalar(scalar: bitcoin::Scalar) -> PrivateKey } #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] -pub struct PrivateViewKey(#[serde(with = "monero_private_key")] PrivateKey); +pub struct PrivateViewKey(#[serde(with = "swap_serde::monero::private_key")] PrivateKey); impl fmt::Display for PrivateViewKey { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -445,7 +445,7 @@ impl fmt::Display for Amount { #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct TransferProof { tx_hash: TxHash, - #[serde(with = "monero_private_key")] + #[serde(with = "swap_serde::monero::private_key")] tx_key: PrivateKey, } @@ -494,73 +494,6 @@ pub struct InsufficientFunds { #[error("Overflow, cannot convert {0} to u64")] pub struct OverflowError(pub String); -pub mod monero_private_key { - use monero::consensus::{Decodable, Encodable}; - use monero::PrivateKey; - use serde::de::Visitor; - use serde::ser::Error; - use serde::{de, Deserializer, Serializer}; - use std::fmt; - use std::io::Cursor; - - struct BytesVisitor; - - impl Visitor<'_> for BytesVisitor { - type Value = PrivateKey; - - fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(formatter, "a byte array representing a Monero private key") - } - - fn visit_bytes(self, s: &[u8]) -> Result - where - E: de::Error, - { - let mut s = s; - PrivateKey::consensus_decode(&mut s).map_err(|err| E::custom(format!("{:?}", err))) - } - - fn visit_str(self, s: &str) -> Result - where - E: de::Error, - { - let bytes = hex::decode(s).map_err(|err| E::custom(format!("{:?}", err)))?; - PrivateKey::consensus_decode(&mut bytes.as_slice()) - .map_err(|err| E::custom(format!("{:?}", err))) - } - } - - pub fn serialize(x: &PrivateKey, s: S) -> Result - where - S: Serializer, - { - let mut bytes = Cursor::new(vec![]); - x.consensus_encode(&mut bytes) - .map_err(|err| S::Error::custom(format!("{:?}", err)))?; - if s.is_human_readable() { - s.serialize_str(&hex::encode(bytes.into_inner())) - } else { - s.serialize_bytes(bytes.into_inner().as_ref()) - } - } - - pub fn deserialize<'de, D>( - deserializer: D, - ) -> Result>::Error> - where - D: Deserializer<'de>, - { - let key = { - if deserializer.is_human_readable() { - deserializer.deserialize_string(BytesVisitor)? - } else { - deserializer.deserialize_bytes(BytesVisitor)? - } - }; - Ok(key) - } -} - pub mod monero_amount { use crate::monero::Amount; use serde::{Deserialize, Deserializer, Serializer}; @@ -583,52 +516,6 @@ pub mod monero_amount { } } -pub mod monero_address { - use anyhow::{bail, Context, Result}; - use std::str::FromStr; - - #[derive(thiserror::Error, Debug, Clone, Copy, PartialEq)] - #[error("Invalid monero address provided, expected address on network {expected:?} but address provided is on {actual:?}")] - pub struct MoneroAddressNetworkMismatch { - pub expected: monero::Network, - pub actual: monero::Network, - } - - pub fn parse(s: &str) -> Result { - monero::Address::from_str(s).with_context(|| { - format!( - "Failed to parse {} as a monero address, please make sure it is a valid address", - s - ) - }) - } - - pub fn validate( - address: monero::Address, - expected_network: monero::Network, - ) -> Result { - if address.network != expected_network { - bail!(MoneroAddressNetworkMismatch { - expected: expected_network, - actual: address.network, - }); - } - Ok(address) - } - - pub fn validate_is_testnet( - address: monero::Address, - is_testnet: bool, - ) -> Result { - let expected_network = if is_testnet { - monero::Network::Stagenet - } else { - monero::Network::Mainnet - }; - validate(address, expected_network) - } -} - #[cfg(test)] mod tests { use super::*; diff --git a/swap/src/network/swap_setup.rs b/swap/src/network/swap_setup.rs index a8118198..6617ba65 100644 --- a/swap/src/network/swap_setup.rs +++ b/swap/src/network/swap_setup.rs @@ -36,9 +36,9 @@ pub mod protocol { #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] pub struct BlockchainNetwork { - #[serde(with = "crate::bitcoin::network")] + #[serde(with = "swap_serde::bitcoin::network")] pub bitcoin: bitcoin::Network, - #[serde(with = "crate::monero::network")] + #[serde(with = "swap_serde::monero::network")] pub monero: monero::Network, } diff --git a/swap/src/network/swap_setup/alice.rs b/swap/src/network/swap_setup/alice.rs index 68b1a92d..4050264a 100644 --- a/swap/src/network/swap_setup/alice.rs +++ b/swap/src/network/swap_setup/alice.rs @@ -5,7 +5,8 @@ use crate::network::swap_setup::{ }; use crate::protocol::alice::{State0, State3}; use crate::protocol::{Message0, Message2, Message4}; -use crate::{asb, bitcoin, env, monero}; +use crate::{asb, bitcoin, monero}; +use swap_env::env; use anyhow::{anyhow, Context, Result}; use futures::future::{BoxFuture, OptionFuture}; use futures::AsyncWriteExt; diff --git a/swap/src/network/swap_setup/bob.rs b/swap/src/network/swap_setup/bob.rs index ccfa2225..090cf1fb 100644 --- a/swap/src/network/swap_setup/bob.rs +++ b/swap/src/network/swap_setup/bob.rs @@ -1,7 +1,8 @@ use crate::network::swap_setup::{protocol, BlockchainNetwork, SpotPriceError, SpotPriceResponse}; use crate::protocol::bob::{State0, State2}; use crate::protocol::{Message1, Message3}; -use crate::{bitcoin, cli, env, monero}; +use crate::{bitcoin, cli, monero}; +use swap_env::env; use anyhow::{Context, Result}; use futures::future::{BoxFuture, OptionFuture}; use futures::AsyncWriteExt; @@ -210,8 +211,8 @@ impl ConnectionHandler for Handler { &mut rand::thread_rng(), new_swap_request.btc, xmr, - env_config.bitcoin_cancel_timelock, - env_config.bitcoin_punish_timelock, + env_config.bitcoin_cancel_timelock.into(), + env_config.bitcoin_punish_timelock.into(), new_swap_request.bitcoin_refund_address.clone(), env_config.monero_finality_confirmations, new_swap_request.tx_refund_fee, diff --git a/swap/src/network/swarm.rs b/swap/src/network/swarm.rs index 68ecb32a..7899f6b0 100644 --- a/swap/src/network/swarm.rs +++ b/swap/src/network/swarm.rs @@ -2,7 +2,8 @@ use crate::asb::{LatestRate, RendezvousNode}; use crate::libp2p_ext::MultiAddrExt; use crate::network::rendezvous::XmrBtcNamespace; use crate::seed::Seed; -use crate::{asb, bitcoin, cli, env}; +use crate::{asb, bitcoin, cli}; +use swap_env::env; use anyhow::Result; use arti_client::TorClient; use libp2p::swarm::NetworkBehaviour; diff --git a/swap/src/protocol.rs b/swap/src/protocol.rs index 515bacc5..ae0ca37e 100644 --- a/swap/src/protocol.rs +++ b/swap/src/protocol.rs @@ -35,7 +35,7 @@ pub struct Message0 { S_b_bitcoin: bitcoin::PublicKey, dleq_proof_s_b: CrossCurveDLEQProof, v_b: monero::PrivateViewKey, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] refund_address: bitcoin::Address, #[serde(with = "::bitcoin::amount::serde::as_sat")] tx_refund_fee: bitcoin::Amount, @@ -50,9 +50,9 @@ pub struct Message1 { S_a_bitcoin: bitcoin::PublicKey, dleq_proof_s_a: CrossCurveDLEQProof, v_a: monero::PrivateViewKey, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] redeem_address: bitcoin::Address, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] punish_address: bitcoin::Address, #[serde(with = "::bitcoin::amount::serde::as_sat")] tx_redeem_fee: bitcoin::Amount, diff --git a/swap/src/protocol/alice.rs b/swap/src/protocol/alice.rs index 3fd43760..f0e4cafb 100644 --- a/swap/src/protocol/alice.rs +++ b/swap/src/protocol/alice.rs @@ -1,6 +1,6 @@ //! Run an XMR/BTC swap in the role of Alice. //! Alice holds XMR and wishes receive BTC. -use crate::env::Config; +use swap_env::env::Config; use crate::protocol::Database; use crate::{asb, bitcoin, monero}; use std::sync::Arc; diff --git a/swap/src/protocol/alice/state.rs b/swap/src/protocol/alice/state.rs index b53f5a8b..f1e320bd 100644 --- a/swap/src/protocol/alice/state.rs +++ b/swap/src/protocol/alice/state.rs @@ -2,7 +2,7 @@ use crate::bitcoin::{ current_epoch, CancelTimelock, ExpiredTimelocks, PunishTimelock, Transaction, TxCancel, TxEarlyRefund, TxPunish, TxRedeem, TxRefund, Txid, }; -use crate::env::Config; +use swap_env::env::Config; use crate::monero::wallet::{TransferRequest, WatchRequest}; use crate::monero::BlockHeight; use crate::monero::TransferProof; @@ -170,8 +170,8 @@ impl State0 { punish_address, btc, xmr, - cancel_timelock: env_config.bitcoin_cancel_timelock, - punish_timelock: env_config.bitcoin_punish_timelock, + cancel_timelock: env_config.bitcoin_cancel_timelock.into(), + punish_timelock: env_config.bitcoin_punish_timelock.into(), tx_redeem_fee, tx_punish_fee, } @@ -413,11 +413,11 @@ pub struct State3 { pub xmr: monero::Amount, pub cancel_timelock: CancelTimelock, pub punish_timelock: PunishTimelock, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] refund_address: bitcoin::Address, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] redeem_address: bitcoin::Address, - #[serde(with = "crate::bitcoin::address_serde")] + #[serde(with = "swap_serde::bitcoin::address_serde")] punish_address: bitcoin::Address, pub tx_lock: bitcoin::TxLock, tx_punish_sig_bob: bitcoin::Signature, diff --git a/swap/src/protocol/alice/swap.rs b/swap/src/protocol/alice/swap.rs index cfc47b6f..c1cfde99 100644 --- a/swap/src/protocol/alice/swap.rs +++ b/swap/src/protocol/alice/swap.rs @@ -7,7 +7,7 @@ use std::time::Duration; use crate::asb::{EventLoopHandle, LatestRate}; use crate::bitcoin::ExpiredTimelocks; use crate::common::retry; -use crate::env::Config; +use swap_env::env::Config; use crate::monero::TransferProof; use crate::protocol::alice::{AliceState, Swap}; use crate::{bitcoin, monero}; diff --git a/swap/src/protocol/bob.rs b/swap/src/protocol/bob.rs index 029afc72..df2cb3d9 100644 --- a/swap/src/protocol/bob.rs +++ b/swap/src/protocol/bob.rs @@ -6,7 +6,8 @@ use uuid::Uuid; use crate::cli::api::tauri_bindings::TauriHandle; use crate::monero::MoneroAddressPool; use crate::protocol::Database; -use crate::{bitcoin, cli, env, monero}; +use crate::{bitcoin, cli, monero}; +use swap_env::env; pub use self::state::*; pub use self::swap::{run, run_until}; diff --git a/swap/src/protocol/bob/state.rs b/swap/src/protocol/bob/state.rs index fab57ac7..7de17688 100644 --- a/swap/src/protocol/bob/state.rs +++ b/swap/src/protocol/bob/state.rs @@ -1,4 +1,4 @@ -use crate::bitcoin::address_serde; +use swap_serde::bitcoin::address_serde; use crate::bitcoin::wallet::{EstimateFeeRate, Subscription}; use crate::bitcoin::{ self, current_epoch, CancelTimelock, ExpiredTimelocks, PunishTimelock, Transaction, TxCancel, @@ -6,7 +6,7 @@ use crate::bitcoin::{ }; use crate::monero::wallet::WatchRequest; use crate::monero::{self, MoneroAddressPool, TxHash}; -use crate::monero::{monero_private_key, TransferProof}; +use crate::monero::{TransferProof}; use crate::monero_ext::ScalarExt; use crate::protocol::{Message0, Message1, Message2, Message3, Message4, CROSS_CURVE_PROOF_SYSTEM}; use anyhow::{anyhow, bail, Context, Result}; @@ -685,7 +685,7 @@ impl State4 { #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] pub struct State5 { - #[serde(with = "monero_private_key")] + #[serde(with = "swap_serde::monero::private_key")] s_a: monero::PrivateKey, s_b: monero::Scalar, v: monero::PrivateViewKey, diff --git a/swap/src/protocol/bob/swap.rs b/swap/src/protocol/bob/swap.rs index 9050562d..8b563c08 100644 --- a/swap/src/protocol/bob/swap.rs +++ b/swap/src/protocol/bob/swap.rs @@ -9,7 +9,8 @@ use crate::network::cooperative_xmr_redeem_after_punish::Response::{Fullfilled, use crate::network::swap_setup::bob::NewSwap; use crate::protocol::bob::state::*; use crate::protocol::{bob, Database}; -use crate::{bitcoin, env, monero}; +use crate::{bitcoin, monero}; +use swap_env::env; use anyhow::{bail, Context as AnyContext, Result}; use std::sync::Arc; use std::time::Duration; diff --git a/swap/src/seed.rs b/swap/src/seed.rs index 0dc3860a..8f2376db 100644 --- a/swap/src/seed.rs +++ b/swap/src/seed.rs @@ -1,5 +1,5 @@ use crate::cli::api::tauri_bindings::{SeedChoice, TauriEmitter, TauriHandle}; -use crate::fs::ensure_directory_exists; +use swap_fs::ensure_directory_exists; use ::bitcoin::bip32::Xpriv as ExtendedPrivKey; use anyhow::{Context, Result}; use bitcoin::hashes::{sha256, Hash, HashEngine}; diff --git a/swap/tests/harness/mod.rs b/swap/tests/harness/mod.rs index 86849859..fb0b9da9 100644 --- a/swap/tests/harness/mod.rs +++ b/swap/tests/harness/mod.rs @@ -21,8 +21,8 @@ use swap::asb::FixedRate; use swap::bitcoin::{CancelTimelock, PunishTimelock}; use swap::cli::api; use swap::database::{AccessMode, SqliteDatabase}; -use swap::env::{Config, GetConfig}; -use swap::fs::ensure_directory_exists; +use swap_env::env::{Config, GetConfig}; +use swap_fs::ensure_directory_exists; use swap::monero::wallet::no_listener; use swap::monero::Wallets; use swap::network::rendezvous::XmrBtcNamespace; @@ -31,7 +31,8 @@ use swap::protocol::alice::{AliceState, Swap}; use swap::protocol::bob::BobState; use swap::protocol::{alice, bob, Database}; use swap::seed::Seed; -use swap::{asb, bitcoin, cli, env, monero}; +use swap::{asb, bitcoin, cli, monero}; +use swap_env::env; use tempfile::{NamedTempFile, TempDir}; use testcontainers::clients::Cli; use testcontainers::{Container, RunnableImage};