diff --git a/Cargo.lock b/Cargo.lock index 9448395..9dbbc0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,14 +16,14 @@ dependencies = [ [[package]] name = "amplify" -version = "3.10.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e697a05044f8907e8fedcce97eea262384831dd3a9d9d493dbd61127286897" +checksum = "47cfa6a69eeb140125a63e4f5ae1156a530f8744ea1d35aa1b8b5613e4d8b41d" dependencies = [ "amplify_derive", "amplify_num", "amplify_syn", - "rand 0.8.4", + "rand 0.8.5", "serde", "serde_json", "serde_yaml", @@ -33,9 +33,9 @@ dependencies = [ [[package]] name = "amplify_derive" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c23b638ee8bc11c30ff16b73c75362c3efd00bb1ebd1c5462a5ff5bb5132794" +checksum = "bcd9d6315c0fb32fb125a50992f64bca686a7012e8b897316cb8e30b0294315c" dependencies = [ "amplify_syn", "proc-macro2", @@ -45,9 +45,9 @@ dependencies = [ [[package]] name = "amplify_num" -version = "0.2.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2f04ef9ef18297ed29418a8c5a93569ae07934234a423fd77b68a9dbd1e491" +checksum = "8d987f94e7127a80238f8f467b756d248bb72345dff59673ffe3fa213b15e503" dependencies = [ "serde", ] @@ -71,20 +71,23 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", - "winapi 0.3.9", + "winapi", ] [[package]] name = "autocfg" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.1.0", +] [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -124,13 +127,14 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.28.0" -source = "git+https://github.com/LNP-BP/rust-bitcoin?branch=taproot/all#ffad87681934371f9ab6492953f7ccf30cbcda75" +version = "0.28.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d21919f8ef56dced9c7a35d28dea7c344566e32a19533f9070d150ec33512152" dependencies = [ "base64-compat", "bech32", "bitcoin_hashes 0.10.0", - "secp256k1", + "secp256k1 0.21.3", "serde", ] @@ -151,7 +155,7 @@ dependencies = [ [[package]] name = "bitcoin_hd" -version = "0.6.0" +version = "0.6.0-beta.2" dependencies = [ "amplify", "bitcoin", @@ -164,7 +168,7 @@ dependencies = [ [[package]] name = "bitcoin_onchain" -version = "0.6.0" +version = "0.6.0-beta.1" dependencies = [ "amplify", "bitcoin", @@ -178,12 +182,12 @@ dependencies = [ [[package]] name = "bitcoin_scripts" -version = "0.6.0" +version = "0.6.0-beta.2" dependencies = [ "amplify", "bitcoin", "miniscript", - "secp256k1", + "secp256k1 0.22.1", "serde", "serde_with", "strict_encoding", @@ -197,9 +201,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bumpalo" -version = "3.8.0" +version = "3.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" [[package]] name = "byteorder" @@ -209,9 +213,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.72" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" [[package]] name = "cfg-if" @@ -229,7 +233,7 @@ dependencies = [ "num-integer", "num-traits", "time", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -243,9 +247,9 @@ dependencies = [ [[package]] name = "clap" -version = "3.0.0-rc.4" +version = "3.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "967965e82fc46fee1a88147a7a977a66d615ed5f83eb95b18577b342c08f90ff" +checksum = "d8c93436c21e4698bacadf42917db28b23017027a4deccb35dbe47a7e7840123" dependencies = [ "atty", "bitflags", @@ -260,9 +264,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.0.0-rc.4" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85946d4034625800196413478a1c6d3a57c12785e1f3970e590e0137dfa07342" +checksum = "da95d038ede1a964ce99f49cbe27a7fb538d1da595e4b4f70b8c8f338d17bf16" dependencies = [ "heck", "proc-macro-error", @@ -288,17 +292,18 @@ checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" dependencies = [ "atty", "lazy_static", - "winapi 0.3.9", + "winapi", ] [[package]] name = "commit_verify" -version = "0.6.0" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#cdd541c385854a710804ddf58fc2a3e005f41f65" +version = "0.6.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d2d2463805ad24755758763ffd06f0468bd0e54ac2a9c8714da59272c3a21e" dependencies = [ "amplify", "bitcoin_hashes 0.10.0", - "rand 0.8.4", + "rand 0.8.5", "strict_encoding", ] @@ -348,7 +353,7 @@ dependencies = [ [[package]] name = "descriptor-wallet" -version = "0.6.0" +version = "0.6.0-beta.1" dependencies = [ "aes", "amplify", @@ -363,7 +368,6 @@ dependencies = [ "commit_verify", "descriptors", "electrum-client", - "lightning_encoding", "miniscript", "psbt", "rpassword", @@ -376,7 +380,7 @@ dependencies = [ [[package]] name = "descriptors" -version = "0.6.0" +version = "0.6.0-beta.1" dependencies = [ "amplify", "bitcoin", @@ -386,16 +390,11 @@ dependencies = [ "strict_encoding", ] -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - [[package]] name = "electrum-client" -version = "0.9.0" -source = "git+https://github.com/LNP-BP/rust-electrum-client?branch=taproot#afd5a533a387afa52c7bd15c988980fe945d0d0b" +version = "0.9.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "182e971ff003d1d1eaec804dcb96cdec8f4ffb7bc342ae565f579af1100197e7" dependencies = [ "bitcoin", "log", @@ -407,17 +406,6 @@ dependencies = [ "webpki-roots", ] -[[package]] -name = "encoding_derive_helpers" -version = "1.7.4" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#cdd541c385854a710804ddf58fc2a3e005f41f65" -dependencies = [ - "amplify", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "encoding_derive_helpers" version = "1.7.6" @@ -444,9 +432,9 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" dependencies = [ "typenum", "version_check", @@ -454,9 +442,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" dependencies = [ "cfg-if", "libc", @@ -471,12 +459,9 @@ checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" [[package]] name = "heck" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" @@ -501,25 +486,25 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "hashbrown", ] [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" dependencies = [ "wasm-bindgen", ] @@ -532,7 +517,7 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libbitcoin" -version = "0.3.0" +version = "0.3.0-rc.1" dependencies = [ "amplify", "amplify_derive", @@ -540,7 +525,7 @@ dependencies = [ "bitcoin", "lazy_static", "libc", - "rand 0.8.4", + "rand 0.8.5", "serde", "serde_json", "serde_with", @@ -549,36 +534,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.111" +version = "0.2.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e167738f1866a7ec625567bae89ca0d44477232a4f7c52b1c7f2adc2c98804f" - -[[package]] -name = "lightning_encoding" -version = "0.6.0" -source = "git+https://github.com/LNP-BP/lnp-core?branch=v0.6#2bd8f95f329f7ea46d6038ce91ce69fbfea055f9" -dependencies = [ - "amplify", - "bitcoin", - "bitcoin_hashes 0.10.0", - "chrono", - "lightning_encoding_derive", - "secp256k1", - "strict_encoding", -] - -[[package]] -name = "lightning_encoding_derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2093982a69f3230186cc918f377804bc59a47560a1763cba0ecd16e9d0d6a0" -dependencies = [ - "amplify_syn", - "encoding_derive_helpers 1.7.6", - "proc-macro2", - "quote", - "syn", -] +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" [[package]] name = "linked-hash-map" @@ -609,11 +567,10 @@ checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "miniscript" -version = "7.0.0" -source = "git+https://github.com/LNP-BP/rust-miniscript?branch=taproot#a47f92c9b8ee9de24dfddcc8d42e456f18aff63d" +version = "6.0.1" +source = "git+https://github.com/rust-bitcoin/rust-miniscript#a881b476ecb01aa507c7e4cf253b2ed718bf914e" dependencies = [ "bitcoin", - "serde", ] [[package]] @@ -622,7 +579,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", "num-traits", ] @@ -632,14 +589,14 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ - "autocfg 1.0.1", + "autocfg 1.1.0", ] [[package]] name = "once_cell" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "opaque-debug" @@ -664,9 +621,9 @@ checksum = "0744126afe1a6dd7f394cb50a716dbe086cb06e255e53d8d0185d82828358fb5" [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro-error" @@ -694,16 +651,16 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] [[package]] name = "psbt" -version = "0.6.0" +version = "0.6.0-beta.1" dependencies = [ "amplify", "bitcoin", @@ -716,9 +673,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.10" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" dependencies = [ "proc-macro2", ] @@ -729,29 +686,28 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "libc", "rand_chacha 0.1.1", "rand_core 0.4.2", - "rand_hc 0.1.0", + "rand_hc", "rand_isaac", "rand_jitter", "rand_os", "rand_pcg", "rand_xorshift", - "winapi 0.3.9", + "winapi", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.3", - "rand_hc 0.3.1", ] [[package]] @@ -760,7 +716,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.3.1", ] @@ -807,15 +763,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "rand_isaac" version = "0.1.1" @@ -833,7 +780,7 @@ checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" dependencies = [ "libc", "rand_core 0.4.2", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -847,7 +794,7 @@ dependencies = [ "libc", "rand_core 0.4.2", "rdrand", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -856,7 +803,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" dependencies = [ - "autocfg 0.1.7", + "autocfg 0.1.8", "rand_core 0.4.2", ] @@ -890,7 +837,7 @@ dependencies = [ "spin", "untrusted", "web-sys", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -900,7 +847,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -924,9 +871,9 @@ checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" [[package]] name = "ryu" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254df5081ce98661a883445175e52efe99d1cb2a5552891d965d2f5d0cad1c16" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" [[package]] name = "sct" @@ -940,38 +887,56 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.20.3" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d03ceae636d0fed5bae6a7f4f664354c5f4fcedf6eef053fef17e49f837d0a" +checksum = "9c42e6f1735c5f00f51e43e28d6634141f2bcad10931b2609ddd74a86d751260" dependencies = [ "rand 0.6.5", - "secp256k1-sys", + "secp256k1-sys 0.4.2", "serde", ] +[[package]] +name = "secp256k1" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26947345339603ae8395f68e2f3d85a6b0a8ddfe6315818e80b8504415099db0" +dependencies = [ + "secp256k1-sys 0.5.0", +] + [[package]] name = "secp256k1-sys" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "827cb7cce42533829c792fc51b82fbf18b125b45a702ef2c8be77fce65463a7b" +checksum = "957da2573cde917463ece3570eab4a0b3f19de6f1646cde62e6fd3868f566036" +dependencies = [ + "cc", +] + +[[package]] +name = "secp256k1-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07b5b9d7322572e1f3aeed208668ce87789b3645dbb73082c5ce99a004103a35" dependencies = [ "cc", ] [[package]] name = "serde" -version = "1.0.131" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ad69dfbd3e45369132cc64e6748c2d65cdfb001a2b1c232d128b4ad60561c1" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.131" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b710a83c4e0dff6a3d511946b95274ad9ca9e5d3ae497b63fda866ac955358d2" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -980,9 +945,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.72" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" dependencies = [ "itoa", "ryu", @@ -1001,9 +966,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad6056b4cb69b6e43e3a0f055def223380baecc99da683884f205bf347f7c4b3" +checksum = "ec1e6ec4d8950e5b1e894eac0d360742f3b1407a6078a604a731c4b3f49cefbc" dependencies = [ "hex", "rustversion", @@ -1025,19 +990,19 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.8.21" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c608a35705a5d3cdc9fbe403147647ff34b921f8e833e49306df898f9b20af" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" dependencies = [ - "dtoa", "indexmap", + "ryu", "serde", "yaml-rust", ] [[package]] name = "slip132" -version = "0.6.0" +version = "0.6.0-beta.1" dependencies = [ "amplify", "bitcoin", @@ -1057,14 +1022,13 @@ dependencies = [ [[package]] name = "socks" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30f86c7635fadf2814201a4f67efefb0007588ae7422ce299f354ab5c97f61ae" +checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" dependencies = [ "byteorder", "libc", - "winapi 0.2.8", - "ws2_32-sys", + "winapi", ] [[package]] @@ -1075,24 +1039,25 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "strict_encoding" -version = "1.8.0" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#cdd541c385854a710804ddf58fc2a3e005f41f65" +version = "1.8.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a18273d2d1d8d8711e24d3aaabb8ba5b5686d237fca819bb8b482206a22aca" dependencies = [ "amplify", "bitcoin", "bitcoin_hashes 0.10.0", "chrono", - "miniscript", "strict_encoding_derive", ] [[package]] name = "strict_encoding_derive" -version = "1.7.4" -source = "git+https://github.com/LNP-BP/client_side_validation?branch=develop#cdd541c385854a710804ddf58fc2a3e005f41f65" +version = "1.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bc7b868cb00c8861784b7f463c984c4b2ad20d1f23cec5997ad9cb41e559239" dependencies = [ "amplify_syn", - "encoding_derive_helpers 1.7.4", + "encoding_derive_helpers", "proc-macro2", "syn", ] @@ -1115,9 +1080,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" dependencies = [ "proc-macro2", "quote", @@ -1126,18 +1091,18 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] [[package]] name = "textwrap" -version = "0.14.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" +checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" [[package]] name = "time" @@ -1147,7 +1112,7 @@ checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", "wasi", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1161,9 +1126,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] name = "unicode-normalization" @@ -1174,12 +1139,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - [[package]] name = "unicode-xid" version = "0.2.2" @@ -1194,9 +1153,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" @@ -1206,9 +1165,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1216,9 +1175,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" dependencies = [ "bumpalo", "lazy_static", @@ -1231,9 +1190,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1241,9 +1200,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ "proc-macro2", "quote", @@ -1254,15 +1213,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" dependencies = [ "js-sys", "wasm-bindgen", @@ -1287,12 +1246,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -1303,12 +1256,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1321,7 +1268,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1330,16 +1277,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "yaml-rust" version = "0.4.5" diff --git a/Cargo.toml b/Cargo.toml index ced0cb2..651669a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "descriptor-wallet" -version = "0.6.0" +version = "0.6.0-beta.1" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Libraries and command line tool for building descriptor-based bitcoin wallets" @@ -23,44 +23,44 @@ required-features = ["keygen", "bip39", "aes", "rpassword", "cli"] [[bin]] name = "btc-cold" -required-features = ["electrum", "cli"] +required-features = ["electrum", "cli", "miniscript"] [dependencies] -amplify = "3.9.1" -descriptors = { version = "0.6.0", path = "./descriptors", optional = true } -bitcoin_scripts = { version = "0.6.0", path = "./scripts" } -bitcoin_hd = { version = "0.6.0", path = "./hd" } -bitcoin_onchain = { version = "0.6.0", path = "./onchain" } -psbt = { version = "0.6.0", path = "./psbt" } -slip132 = { version = "0.6.0", path = "./slip132", features = ["strict_encoding"] } -commit_verify = { version = "0.6.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +amplify = "3.12.0" +descriptors = { version = "0.6.0-beta.1", path = "./descriptors", optional = true, default-features = false } +bitcoin_scripts = { version = "0.6.0-beta.2", path = "./scripts" } +bitcoin_hd = { version = "0.6.0-beta.2", path = "./hd" } +bitcoin_onchain = { version = "0.6.0-beta.1", path = "./onchain" } +psbt = { version = "0.6.0-beta.1", path = "./psbt", default-features = false } +slip132 = { version = "0.6.0-beta.1", path = "./slip132", features = ["strict_encoding"] } +commit_verify = "0.6.0-alpha.1" # TODO #5: Make strict encoding optional -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop", features = ["bitcoin", "miniscript", "derive"] } -lightning_encoding = { version = "0.6.0", git = "https://github.com/LNP-BP/lnp-core", branch = "v0.6" } -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot", features = ["compiler"] } -electrum-client = { version = "0.9", git = "https://github.com/LNP-BP/rust-electrum-client", branch = "taproot", optional = true } +strict_encoding = { version = "1.8.0-rc.1", features = ["bitcoin", "derive"] } +bitcoin = "0.28.0-rc.1" +miniscript_crate = { package = "miniscript", version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", optional = true } +electrum-client = { version = "0.9.0-rc.1", optional = true } serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } serde_with = { version = "1.5", features = ["hex"], optional = true } serde_yaml = { version = "0.8.21", optional = true } chrono = "0.4" -clap = { version = "3.0.0-rc.4", optional = true, features = ["derive"] } +clap = { version = "3.0", optional = true, features = ["derive"] } bip39 = { version = "1.0.1", optional = true } aes = { version = "0.7.5", optional = true } rpassword = { version = "5.0.1", optional = true } colored = { version = "2", optional = true } [dev-dependencies] -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all", features = ["rand"] } +bitcoin = { version = "0.28.0-rc.1", features = ["rand"] } [features] default = [] all = ["keygen", "serde", "electrum"] +miniscript = ["miniscript_crate", "bitcoin_hd/miniscript", "bitcoin_onchain/miniscript", "descriptors/miniscript", "psbt/miniscript", "bitcoin_scripts/miniscript"] cli = ["serde", "colored", "clap", "serde_yaml", "bitcoin/base64"] electrum = ["electrum-client", "bitcoin_onchain/electrum"] keygen = ["bitcoin/rand", "commit_verify/rand", "amplify/rand", "descriptors/rand", "psbt/sign"] serde = ["serde_crate", "serde_with", "amplify/serde", - "bitcoin/use-serde", "bitcoin_scripts/serde", "bitcoin_hd/serde", "miniscript/serde", "slip132/serde"] + "bitcoin/use-serde", "bitcoin_scripts/serde", "bitcoin_hd/serde", "slip132/serde"] [workspace] members = [".", "slip132", "libbitcoin", "descriptors", "scripts", "hd", "psbt", "onchain"] diff --git a/descriptors/Cargo.toml b/descriptors/Cargo.toml index f8ce9c2..560e836 100644 --- a/descriptors/Cargo.toml +++ b/descriptors/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "descriptors" -version = "0.6.0" +version = "0.6.0-beta.1" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Bitcoin descriptors library (part of descriptor-wallet)" @@ -13,12 +13,12 @@ edition = "2018" exclude = [] [dependencies] -amplify = "3.9.1" -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop", features = ["bitcoin", "miniscript"] } -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot", features = ["compiler"], optional = true } -bitcoin_hd = { version = "0.6.0", path = "../hd" } -bitcoin_scripts = { version = "0.6.0", path = "../scripts" } +amplify = "3.12.0" +strict_encoding = "1.8.0-rc.1" +bitcoin = "0.28.0-rc.1" +miniscript = { version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", features = ["compiler"], optional = true } +bitcoin_hd = { version = "0.6.0-beta.1", path = "../hd" } +bitcoin_scripts = { version = "0.6.0-beta.1", path = "../scripts" } [features] all = ["rand", "miniscript"] diff --git a/descriptors/src/descriptor.rs b/descriptors/src/descriptor.rs index b9cfbeb..4d3e0e6 100644 --- a/descriptors/src/descriptor.rs +++ b/descriptors/src/descriptor.rs @@ -18,11 +18,11 @@ use std::str::FromStr; use amplify::Wrapper; use bitcoin::hashes::Hash; -use bitcoin::schnorr::{self as bip340, TweakedPublicKey, UntweakedPublicKey}; +use bitcoin::schnorr::{TweakedPublicKey, UntweakedPublicKey}; use bitcoin::secp256k1::{self, Secp256k1, Verification}; use bitcoin::util::address::WitnessVersion; use bitcoin::util::taproot::TapBranchHash; -use bitcoin::{PubkeyHash, Script, ScriptHash, WPubkeyHash, WScriptHash}; +use bitcoin::{PubkeyHash, Script, ScriptHash, WPubkeyHash, WScriptHash, XOnlyPublicKey}; use bitcoin_scripts::convert::{LockScriptError, ToPubkeyScript}; use bitcoin_scripts::{ConvertInfo, PubkeyScript, RedeemScript, WitnessScript}; #[cfg(feature = "miniscript")] @@ -584,8 +584,9 @@ impl FromStr for ScriptPubkeyDescr { )) } else if s.starts_with("tr(") { let inner = s.trim_start_matches("tr("); + let pk = XOnlyPublicKey::from_str(inner).map_err(|_| Error::CantParseDescriptor)?; Ok(ScriptPubkeyDescr::Tr( - inner.parse().map_err(|_| Error::CantParseDescriptor)?, + TweakedPublicKey::dangerous_assume_tweaked(pk), )) } else { Err(Error::CantParseDescriptor) @@ -641,7 +642,7 @@ impl TryFrom for ScriptPubkeyDescr { Ok(ScriptPubkeyDescr::Wsh(WScriptHash::from_inner(hash_inner))) } (spk, _) if spk.is_v1_p2tr() => Ok(ScriptPubkeyDescr::Tr( - TweakedPublicKey::dangerous_assume_tweaked(bip340::PublicKey::from_slice( + TweakedPublicKey::dangerous_assume_tweaked(XOnlyPublicKey::from_slice( &bytes[2..], )?), )), @@ -829,7 +830,9 @@ pub enum ParseError { } #[cfg(not(feature = "miniscript"))] -#[derive(Copy, Clone, PartialEq, Eq, Debug, Display)] +#[derive( + Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, Error +)] #[display(Debug)] pub enum CompilerError {} diff --git a/hd/Cargo.toml b/hd/Cargo.toml index b2767e1..540df5a 100644 --- a/hd/Cargo.toml +++ b/hd/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitcoin_hd" -version = "0.6.0" +version = "0.6.0-beta.2" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Bitcoin hierarchical deterministic wallet library" @@ -13,15 +13,15 @@ edition = "2018" exclude = [] [dependencies] -amplify = "3.9.1" -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot" } -slip132 = { version = "0.6.0", path = "../slip132" } +amplify = "3.12.0" +strict_encoding = "1.8.0-rc.1" +bitcoin = "0.28.0-rc.1" +miniscript = { version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", optional = true } +slip132 = { version = "0.6.0-beta.1", path = "../slip132" } serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } serde_with = { version = "1.5", features = ["hex"], optional = true } [features] default = [] -all = ["serde"] -serde = ["serde_crate", "serde_with", "amplify/serde", "bitcoin/serde", "miniscript/serde", "slip132/serde"] +all = ["serde", "miniscript"] +serde = ["serde_crate", "serde_with", "amplify/serde", "bitcoin/serde", "slip132/serde"] diff --git a/hd/src/account.rs b/hd/src/account.rs index 15e1cbf..58a3b9c 100644 --- a/hd/src/account.rs +++ b/hd/src/account.rs @@ -22,13 +22,12 @@ use bitcoin::util::bip32::{ ChildNumber, DerivationPath, ExtendedPrivKey, ExtendedPubKey, Fingerprint, KeySource, }; use bitcoin::{OutPoint, XpubIdentifier}; +#[cfg(feature = "miniscript")] use miniscript::MiniscriptKey; use slip132::{Error, FromSlip132}; -use crate::{ - AccountStep, DerivePatternError, DerivePublicKey, HardenedIndex, SegmentIndexes, TerminalStep, - UnhardenedIndex, XpubRef, -}; +use crate::{AccountStep, HardenedIndex, SegmentIndexes, TerminalStep, UnhardenedIndex, XpubRef}; +use crate::{DerivePatternError, DerivePublicKey}; /// Tracking HD wallet account guaranteeing key derivation without access to the /// private keys. @@ -106,12 +105,16 @@ impl TrackingAccount { /// Returns fingerprint of the master key, if known #[inline] - pub fn master_fingerprint(&self) -> Option { self.master.fingerprint() } + pub fn master_fingerprint(&self) -> Option { + self.master.fingerprint() + } /// Returns fingerprint of the master key - or, if no master key present, of /// the account key #[inline] - pub fn account_fingerprint(&self) -> Fingerprint { self.account_xpub.fingerprint() } + pub fn account_fingerprint(&self) -> Fingerprint { + self.account_xpub.fingerprint() + } /// Constructs [`DerivationPath`] for the account extended public key #[inline] @@ -322,10 +325,13 @@ impl FromStr for TrackingAccount { } } +#[cfg(feature = "miniscript")] impl MiniscriptKey for TrackingAccount { type Hash = Self; - fn to_pubkeyhash(&self) -> Self::Hash { self.clone() } + fn to_pubkeyhash(&self) -> Self::Hash { + self.clone() + } } #[cfg(test)] diff --git a/hd/src/derive.rs b/hd/src/derive.rs index c864776..31b3d41 100644 --- a/hd/src/derive.rs +++ b/hd/src/derive.rs @@ -12,13 +12,17 @@ // along with this software. // If not, see . +#[cfg(feature = "miniscript")] use std::cell::Cell; use bitcoin::secp256k1::{self, Secp256k1, Verification}; use bitcoin::{Address, Network, Script}; +#[cfg(feature = "miniscript")] use miniscript::{Descriptor, DescriptorTrait, ForEach, ForEachKey, TranslatePk2}; -use crate::{SegmentIndexes, TrackingAccount, UnhardenedIndex}; +use crate::UnhardenedIndex; +#[cfg(feature = "miniscript")] +use crate::{SegmentIndexes, TrackingAccount}; /// the provided derive pattern does not match descriptor derivation /// wildcard @@ -41,6 +45,15 @@ pub trait DerivePublicKey { ) -> Result; } +#[cfg(not(feature = "miniscript"))] +pub mod miniscript { + #[derive( + Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, Error + )] + #[display(Debug)] + pub enum Error {} +} + /// Errors during descriptor derivation #[derive(Debug, Display, From)] #[display(doc_comments)] @@ -101,11 +114,12 @@ pub trait DescriptorDerive { fn network(&self) -> Result; /// Translate descriptor to a specifically-derived form + #[cfg(feature = "miniscript")] fn derive_descriptor( &self, secp: &Secp256k1, pat: impl AsRef<[UnhardenedIndex]>, - ) -> Result, DeriveError>; + ) -> Result, DeriveError>; /// Create scriptPubkey for specific derive pattern fn script_pubkey( @@ -122,7 +136,8 @@ pub trait DescriptorDerive { ) -> Result; } -impl DescriptorDerive for miniscript::Descriptor { +#[cfg(feature = "miniscript")] +impl DescriptorDerive for Descriptor { #[inline] fn check_sanity(&self) -> Result<(), DeriveError> { self.derive_pattern_len()?; @@ -180,18 +195,17 @@ impl DescriptorDerive for miniscript::Descriptor { &self, secp: &Secp256k1, pat: impl AsRef<[UnhardenedIndex]>, - ) -> Result, DeriveError> { + ) -> Result, DeriveError> { let pat = pat.as_ref(); if pat.len() != self.derive_pattern_len()? { return Err(DeriveError::DerivePatternMismatch); } - let mut descriptor = self - .translate_pk2(|account| account.derive_public_key(secp, pat)) - .map_err(DeriveError::from)?; - if let Descriptor::Tr(ref mut tr) = descriptor { - tr.spend_info(secp); - } - Ok(descriptor) + self.translate_pk2(|account| { + account + .derive_public_key(secp, pat) + .map(bitcoin::PublicKey::new) + }) + .map_err(DeriveError::from) } #[inline] @@ -201,7 +215,7 @@ impl DescriptorDerive for miniscript::Descriptor { pat: impl AsRef<[UnhardenedIndex]>, ) -> Result { let d = self.derive_descriptor(secp, pat)?; - DescriptorTrait::script_pubkey(&d).map_err(DeriveError::from) + Ok(DescriptorTrait::script_pubkey(&d)) } #[inline] diff --git a/hd/src/schemata.rs b/hd/src/schemata.rs index 875c65d..43229cd 100644 --- a/hd/src/schemata.rs +++ b/hd/src/schemata.rs @@ -19,9 +19,12 @@ use core::str::FromStr; use std::convert::TryFrom; use bitcoin::util::bip32::{ChildNumber, DerivationPath}; +#[cfg(feature = "miniscript")] use miniscript::descriptor::DescriptorType; -use crate::{HardenedIndex, SegmentIndexes, UnhardenedIndex}; +#[cfg(feature = "miniscript")] +use crate::SegmentIndexes; +use crate::{HardenedIndex, UnhardenedIndex}; /// Errors in parsing derivation scheme string representation #[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, Error, Display)] @@ -345,6 +348,7 @@ impl DerivationScheme { /// Check whether provided descriptor type can be used with this derivation /// scheme + #[cfg(feature = "miniscript")] pub fn check_descriptor_type(&self, descriptor_type: DescriptorType) -> bool { match (self, descriptor_type) { (DerivationScheme::Bip44, DescriptorType::Pkh) diff --git a/libbitcoin/Cargo.toml b/libbitcoin/Cargo.toml index 6f4c2ee..a086f1e 100644 --- a/libbitcoin/Cargo.toml +++ b/libbitcoin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libbitcoin" -version = "0.3.0" +version = "0.3.0-rc.1" license = "Apache-2.0" authors = ["Dr Maxim Orlovsky "] description = "C library for building descriptor-based bitcoin wallets" @@ -16,7 +16,7 @@ libc = "0.2" lazy_static = "1.4" amplify = "3" amplify_derive = "2.4" -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } +bitcoin = "0.28.0-rc.1" bip39 = "1.0.1" rand = "0.8.3" serde = { version = "1.0", features = ["derive"] } diff --git a/onchain/Cargo.toml b/onchain/Cargo.toml index 70a162c..0b4e0c3 100644 --- a/onchain/Cargo.toml +++ b/onchain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitcoin_onchain" -version = "0.6.0" +version = "0.6.0-beta.1" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Bitcoin descriptors library (part of descriptor-wallet)" @@ -13,16 +13,17 @@ edition = "2018" exclude = [] [dependencies] -amplify = "3.9.1" -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } -descriptors = { version = "0.6.0-alpha.1", path = "../descriptors" } -bitcoin_hd = { version = "0.6.0-alpha.1", path = "../hd" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot", features = ["compiler"] } +amplify = "3.12.0" +bitcoin = "0.28.0-rc.1" +strict_encoding = "1.8.0-rc.1" +descriptors = { version = "0.6.0-beta.1", path = "../descriptors", default-features = false } +bitcoin_hd = { version = "0.6.0-beta.1", path = "../hd" } +miniscript_crate = { package = "miniscript", version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", optional = true } +electrum-client = { version = "0.9.0-rc.1", optional = true } chrono = "0.4.19" -electrum-client = { version = "0.9", git = "https://github.com/LNP-BP/rust-electrum-client", branch = "taproot", optional = true } [features] default = [] -all = ["electrum"] +all = ["electrum", "miniscript"] +miniscript = ["miniscript_crate", "descriptors/miniscript", "bitcoin_hd/miniscript"] electrum = ["electrum-client"] diff --git a/onchain/src/lib.rs b/onchain/src/lib.rs index 1efec91..fc1b7dd 100644 --- a/onchain/src/lib.rs +++ b/onchain/src/lib.rs @@ -21,6 +21,8 @@ #[macro_use] extern crate amplify; +#[cfg(feature = "miniscript")] +extern crate miniscript_crate as miniscript; pub mod blockchain; mod resolvers; diff --git a/onchain/src/resolvers/mod.rs b/onchain/src/resolvers/mod.rs index 0ca5fc4..4453383 100644 --- a/onchain/src/resolvers/mod.rs +++ b/onchain/src/resolvers/mod.rs @@ -18,13 +18,19 @@ #[cfg(feature = "electrum")] mod electrum; +#[cfg(feature = "miniscript")] use std::cell::RefCell; use std::collections::{BTreeMap, HashSet}; +#[cfg(feature = "miniscript")] use std::rc::Rc; +#[cfg(feature = "miniscript")] use bitcoin::secp256k1::{Secp256k1, Verification}; use bitcoin::{Script, Transaction, Txid}; -use bitcoin_hd::{DeriveError, DescriptorDerive, SegmentIndexes, TrackingAccount, UnhardenedIndex}; +use bitcoin_hd::DeriveError; +#[cfg(feature = "miniscript")] +use bitcoin_hd::{DescriptorDerive, SegmentIndexes, TrackingAccount, UnhardenedIndex}; +#[cfg(feature = "miniscript")] use miniscript::Descriptor; use crate::blockchain::Utxo; @@ -43,7 +49,9 @@ impl TxResolverError { /// Convenience function for constructing resolver error from simple /// transaction id without error message #[inline] - pub fn with(txid: Txid) -> TxResolverError { TxResolverError { txid, err: None } } + pub fn with(txid: Txid) -> TxResolverError { + TxResolverError { txid, err: None } + } } /// Transaction resolver @@ -80,6 +88,7 @@ pub trait ResolveUtxo { ) -> Result>, UtxoResolverError>; /// Finds UTXO set for the addresses derivable from the given descriptor + #[cfg(feature = "miniscript")] fn resolve_descriptor_utxo( &self, secp: &Secp256k1, diff --git a/psbt/Cargo.toml b/psbt/Cargo.toml index 653c863..5186eb1 100644 --- a/psbt/Cargo.toml +++ b/psbt/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "psbt" -version = "0.6.0" +version = "0.6.0-beta.1" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Partially signed bitcoin transaction v0-2 library (bip174, bip370, bip371)" @@ -13,15 +13,16 @@ edition = "2018" exclude = [] [dependencies] -amplify = "3.9.1" -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot", optional = true } -descriptors = { version = "0.6.0", path = "../descriptors" } -bitcoin_scripts = { version = "0.6.0", path = "../scripts" } -bitcoin_hd = { version = "0.6.0", path = "../hd" } -bitcoin_onchain = { version = "0.6.0", path = "../onchain" } +amplify = "3.12.0" +bitcoin = { version = "0.28.0-rc.1", features = ["base64"] } +miniscript_crate = { package = "miniscript", version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", optional = true } +descriptors = { version = "0.6.0-beta.1", path = "../descriptors", default-features = false } +bitcoin_scripts = { version = "0.6.0-beta.1", path = "../scripts" } +bitcoin_hd = { version = "0.6.0-beta.1", path = "../hd" } +bitcoin_onchain = { version = "0.6.0-beta.1", path = "../onchain" } [features] default = ["miniscript"] all = ["sign", "miniscript"] +miniscript = ["miniscript_crate", "descriptors/miniscript", "bitcoin_scripts/miniscript", "bitcoin_onchain/miniscript"] sign = ["bitcoin/rand"] diff --git a/psbt/src/construct.rs b/psbt/src/construct.rs index fea6073..92c6933 100644 --- a/psbt/src/construct.rs +++ b/psbt/src/construct.rs @@ -121,7 +121,7 @@ impl Construct for Psbt { .get(input.outpoint.vout as usize) .ok_or(Error::OutputUnknown(txid, input.outpoint.vout))?; let output_descriptor = descriptor.derive_descriptor(secp, &input.terminal)?; - let script_pubkey = output_descriptor.script_pubkey()?; + let script_pubkey = output_descriptor.script_pubkey(); if output.script_pubkey != script_pubkey { return Err(Error::ScriptPubkeyMismatch( txid, @@ -230,7 +230,7 @@ impl Construct for Psbt { if change > 0 { let change_derivation = [UnhardenedIndex::one(), change_index]; let change_descriptor = descriptor.derive_descriptor(secp, &change_derivation)?; - let change_script_pubkey = change_descriptor.script_pubkey()?.into(); + let change_script_pubkey = change_descriptor.script_pubkey().into(); outputs.push((change_script_pubkey, change)); let mut bip32_derivation = bmap! {}; descriptor.for_each_key(|key| { diff --git a/psbt/src/deduction.rs b/psbt/src/deduction.rs index 958133c..269a271 100644 --- a/psbt/src/deduction.rs +++ b/psbt/src/deduction.rs @@ -13,6 +13,8 @@ // If not, see . use bitcoin::util::address::WitnessVersion; +use bitcoin::TxIn; +use bitcoin_scripts::PubkeyScript; use descriptors::CompositeDescrType; use crate::{Input, InputPrevout}; @@ -54,12 +56,13 @@ pub trait InputDeduce { fn composite_descr_type(&self) -> Result; } -impl InputDeduce for Input { +impl InputDeduce for (&Input, &TxIn) { fn composite_descr_type(&self) -> Result { let spk = &self .input_prevout() .expect("PSBT integrity is broken") .script_pubkey; + let spk = PubkeyScript::from(spk.clone()); match (spk, spk.witness_version()) { (spk, _) if spk.is_p2pk() => Ok(CompositeDescrType::Pk), (spk, _) if spk.is_p2pkh() => Ok(CompositeDescrType::Pkh), @@ -67,12 +70,12 @@ impl InputDeduce for Input { (spk, _) if spk.is_v0_p2wsh() => Ok(CompositeDescrType::Wsh), (spk, _) if spk.is_v1_p2tr() => Ok(CompositeDescrType::Tr), (spk, _) if spk.is_p2sh() => { - let redeem_script = if let Some(redeem_script) = &self.redeem_script { + let redeem_script = if let Some(redeem_script) = &self.0.redeem_script { redeem_script } else { return Err(DeductionError::P2shWithoutRedeemScript); }; - if self.witness_script.is_some() { + if self.0.witness_script.is_some() { if redeem_script.is_v0_p2wpkh() { Ok(CompositeDescrType::ShWpkh) } else if redeem_script.is_v0_p2wsh() { diff --git a/psbt/src/lib.rs b/psbt/src/lib.rs index 36a96fa..91d2236 100644 --- a/psbt/src/lib.rs +++ b/psbt/src/lib.rs @@ -20,6 +20,8 @@ #[macro_use] extern crate amplify; +#[cfg(feature = "miniscript")] +extern crate miniscript_crate as miniscript; #[cfg(feature = "miniscript")] pub mod construct; @@ -30,7 +32,9 @@ pub mod sign; mod util; pub use bitcoin::util::psbt::raw::{ProprietaryKey, ProprietaryType}; -pub use bitcoin::util::psbt::{raw, Error, Input, Map, Output, PartiallySignedTransaction as Psbt}; +pub use bitcoin::util::psbt::{ + raw, Error, Input, Output, PartiallySignedTransaction as Psbt, PsbtParseError, +}; #[cfg(feature = "miniscript")] pub use deduction::{DeductionError, InputDeduce}; pub use proprietary::{InputP2cTweak, PSBT_IN_P2C_TWEAK, PSBT_P2C_PREFIX}; diff --git a/psbt/src/sign/inmem.rs b/psbt/src/sign/inmem.rs index 1b0b297..ae2aa3a 100644 --- a/psbt/src/sign/inmem.rs +++ b/psbt/src/sign/inmem.rs @@ -20,8 +20,7 @@ use std::io; use bitcoin::consensus::{Decodable, Encodable}; use bitcoin::hashes::Hash; -use bitcoin::schnorr::KeyPair; -use bitcoin::secp256k1::{schnorrsig as bip340, PublicKey, Secp256k1, SecretKey, Signing}; +use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, SecretKey, Signing, XOnlyPublicKey}; use bitcoin::util::bip32::{ ChildNumber, DerivationPath, ExtendedPrivKey, ExtendedPubKey, Fingerprint, }; @@ -175,8 +174,8 @@ impl MemorySigningAccount { &self, secp: &Secp256k1, derivation: &DerivationPath, - ) -> bip340::KeyPair { - bip340::KeyPair::from_secret_key(secp, self.derive_seckey(secp, derivation)) + ) -> KeyPair { + KeyPair::from_secret_key(secp, self.derive_seckey(secp, derivation)) } #[inline] @@ -316,12 +315,12 @@ where &self, fingerprint: Fingerprint, derivation: &DerivationPath, - pubkey: bip340::PublicKey, + pubkey: XOnlyPublicKey, ) -> Result { let mut data: Vec = vec![0x02]; data.extend(pubkey.serialize().iter()); let pk = PublicKey::from_slice(&data).expect("fixed size slice"); let seckey = self.secret_key(fingerprint, derivation, pk)?; - Ok(bip340::KeyPair::from_secret_key(self.secp, seckey)) + Ok(KeyPair::from_secret_key(self.secp, seckey)) } } diff --git a/psbt/src/sign/mod.rs b/psbt/src/sign/mod.rs index 3f12b50..28dd563 100644 --- a/psbt/src/sign/mod.rs +++ b/psbt/src/sign/mod.rs @@ -16,7 +16,7 @@ // TODO: Add Hash secret provider and hash secret satisfaction -use bitcoin::secp256k1::{schnorrsig as bip340, PublicKey, Secp256k1, SecretKey, Signing}; +use bitcoin::secp256k1::{KeyPair, PublicKey, Secp256k1, SecretKey, Signing, XOnlyPublicKey}; use bitcoin::util::bip32::{DerivationPath, Fingerprint}; mod inmem; @@ -82,6 +82,6 @@ pub trait SecretProvider { &self, fingerprint: Fingerprint, derivation: &DerivationPath, - pubkey: bip340::PublicKey, - ) -> Result; + pubkey: XOnlyPublicKey, + ) -> Result; } diff --git a/psbt/src/sign/signer.rs b/psbt/src/sign/signer.rs index d7e1e6a..5815840 100644 --- a/psbt/src/sign/signer.rs +++ b/psbt/src/sign/signer.rs @@ -19,14 +19,11 @@ use core::ops::Deref; use amplify::Wrapper; use bitcoin::hashes::Hash; use bitcoin::schnorr::TapTweak; -use bitcoin::secp256k1::{self, Signing, Verification}; +use bitcoin::secp256k1::{self, KeyPair, Signing, Verification, XOnlyPublicKey}; use bitcoin::util::address::WitnessVersion; use bitcoin::util::sighash::{self, Prevouts, ScriptPath, SigHashCache}; use bitcoin::util::taproot::TapLeafHash; -use bitcoin::{ - schnorr as bip340, EcdsaSigHashType, PubkeyHash, PublicKey, SchnorrSigHashType, Script, - Transaction, -}; +use bitcoin::{EcdsaSigHashType, PubkeyHash, PublicKey, SchnorrSigHashType, Script, Transaction}; use bitcoin_scripts::PubkeyScript; use descriptors::{self, CompositeDescrType}; use miniscript::{Miniscript, ToPublicKey}; @@ -425,8 +422,8 @@ fn sign_taproot_input_with( index: usize, provider: &impl SecretProvider, sig_hasher: &mut SigHashCache, - pubkey: bip340::PublicKey, - mut keypair: bip340::KeyPair, + pubkey: XOnlyPublicKey, + mut keypair: KeyPair, leaves: &[TapLeafHash], prevouts: &Prevouts, ) -> Result @@ -476,7 +473,7 @@ where if !leaves.contains(&tapleaf_hash) { continue; } - let ms: Miniscript = Miniscript::parse(script)?; + let ms: Miniscript = Miniscript::parse(script)?; for pk in ms.iter_pk() { if pk != pubkey { continue; @@ -526,8 +523,8 @@ where let mut signature = [0u8; 64]; signature[..32].copy_from_slice(&r.serialize()[1..]); signature[32..].copy_from_slice(&s[..]); - *prev_signature = secp256k1::schnorrsig::Signature::from_slice(&signature) - .expect("zero negligibility"); + *prev_signature = + secp256k1::schnorr::Signature::from_slice(&signature).expect("zero negligibility"); } None => input.tap_key_sig = Some((signature, sighash_type)), Some((_, prev_sighash_type)) => { diff --git a/psbt/src/util.rs b/psbt/src/util.rs index 87a25d3..1da9f96 100644 --- a/psbt/src/util.rs +++ b/psbt/src/util.rs @@ -12,7 +12,7 @@ // along with this software. // If not, see . -use bitcoin::{Transaction, TxOut, Txid}; +use bitcoin::{Transaction, TxIn, TxOut, Txid}; use crate::{Input, Psbt}; @@ -63,16 +63,17 @@ pub trait Fee { fn fee(&self) -> Result; } -impl InputPrevout for Input { +impl InputPrevout for (&Input, &TxIn) { fn input_prevout(&self) -> Result<&TxOut, InputMatchError> { - let txid = self.txin.previous_output.txid; - if let Some(txout) = &self.witness_utxo { + let (input, txin) = self; + let txid = txin.previous_output.txid; + if let Some(txout) = &input.witness_utxo { Ok(txout) - } else if let Some(tx) = &self.non_witness_utxo { + } else if let Some(tx) = &input.non_witness_utxo { if tx.txid() != txid { return Err(InputMatchError::NoTxidMatch(txid)); } - let prev_index = self.txin.previous_output.vout; + let prev_index = txin.previous_output.vout; tx.output .get(prev_index as usize) .ok_or(InputMatchError::UnmatchedInputNumber(prev_index)) @@ -85,7 +86,7 @@ impl InputPrevout for Input { impl Fee for Psbt { fn fee(&self) -> Result { let mut input_sum = 0; - for inp in &self.inputs { + for inp in self.inputs.iter().zip(&self.unsigned_tx.input) { input_sum += inp.input_prevout()?.value; } @@ -109,7 +110,9 @@ pub trait Tx { /// Returns transaction ID for an unsigned transaction. For SegWit /// transactions this is equal to the signed transaction id. #[inline] - fn to_txid(&self) -> Txid { self.to_transaction().txid() } + fn to_txid(&self) -> Txid { + self.to_transaction().txid() + } /// Returns transaction with empty `scriptSig` and witness fn to_transaction(&self) -> Transaction; diff --git a/scripts/Cargo.toml b/scripts/Cargo.toml index 196a54a..1e56b59 100644 --- a/scripts/Cargo.toml +++ b/scripts/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitcoin_scripts" -version = "0.6.0" +version = "0.6.0-beta.2" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Bitcoin extended script types" @@ -13,17 +13,17 @@ edition = "2018" exclude = [] [dependencies] -amplify = "3.9.1" -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -miniscript = { version = "7", git = "https://github.com/LNP-BP/rust-miniscript", branch = "taproot" } -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop" } +amplify = "3.12.0" +bitcoin = "0.28.0-rc.1" +miniscript = { version = "6.0.1", git = "https://github.com/rust-bitcoin/rust-miniscript", optional = true } +strict_encoding = "1.8.0-rc.1" serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } serde_with = { version = "1.8", optional = true } [dev-dependencies] -secp256k1 = { version = "0.20.3", features = ["global-context-less-secure"] } +secp256k1 = { version = "0.22.0", features = ["global-context-less-secure"] } [features] default = [] -all = ["serde"] -serde = ["serde_crate", "serde_with", "amplify/serde", "bitcoin/use-serde", "miniscript/serde"] +all = ["serde", "miniscript"] +serde = ["serde_crate", "serde_with", "amplify/serde", "bitcoin/use-serde"] diff --git a/scripts/src/convert.rs b/scripts/src/convert.rs index 7588b0a..0503a85 100644 --- a/scripts/src/convert.rs +++ b/scripts/src/convert.rs @@ -19,7 +19,9 @@ use amplify::Wrapper; use bitcoin::blockdata::script; use bitcoin::blockdata::witness::Witness; use bitcoin::{secp256k1, Script}; +#[cfg(feature = "miniscript")] use miniscript::descriptor::DescriptorType; +#[cfg(feature = "miniscript")] use miniscript::{Descriptor, MiniscriptKey, ToPublicKey}; use crate::{LockScript, PubkeyScript, RedeemScript, ScriptSet, SigScript, WitnessScript}; @@ -75,6 +77,7 @@ pub enum ConvertInfo { Taproot, } +#[cfg(feature = "miniscript")] impl From<&Descriptor> for ConvertInfo where Pk: MiniscriptKey + ToPublicKey, @@ -97,22 +100,29 @@ where } } +#[cfg(feature = "miniscript")] impl From> for ConvertInfo where Pk: MiniscriptKey + ToPublicKey, { #[inline] - fn from(descriptor: Descriptor) -> Self { Self::from(&descriptor) } + fn from(descriptor: Descriptor) -> Self { + Self::from(&descriptor) + } } impl ConvertInfo { /// Detects whether conversion is a non-nested segwit #[inline] - pub fn is_segwit(self) -> bool { !matches!(self, ConvertInfo::Bare | ConvertInfo::Hashed) } + pub fn is_segwit(self) -> bool { + !matches!(self, ConvertInfo::Bare | ConvertInfo::Hashed) + } /// Detects whether conversion is a taproot conversion #[inline] - pub fn is_taproot(self) -> bool { !matches!(self, ConvertInfo::Taproot { .. }) } + pub fn is_taproot(self) -> bool { + !matches!(self, ConvertInfo::Taproot { .. }) + } } /// Errors converting to [`LockScript`] type returned by @@ -254,7 +264,7 @@ impl ToScripts for LockScript { ConvertInfo::Bare | ConvertInfo::Hashed => None, ConvertInfo::SegWitV0 | ConvertInfo::NestedV0 => { let witness_script = WitnessScript::from(self.clone()); - Some(Witness::from(vec![witness_script.to_bytes()])) + Some(Witness::from_vec(vec![witness_script.to_bytes()])) } ConvertInfo::Taproot => None, } @@ -267,8 +277,8 @@ impl ToPubkeyScript for bitcoin::PublicKey { ConvertInfo::Bare => Some(Script::new_p2pk(self).into()), ConvertInfo::Hashed => Some(Script::new_p2pkh(&self.pubkey_hash()).into()), // Uncompressed key in SegWit context - ConvertInfo::NestedV0 | ConvertInfo::SegWitV0 if self.is_uncompressed() => None, - ConvertInfo::NestedV0 | ConvertInfo::SegWitV0 => self.key.to_pubkey_script(strategy), + ConvertInfo::NestedV0 | ConvertInfo::SegWitV0 if !self.compressed => None, + ConvertInfo::NestedV0 | ConvertInfo::SegWitV0 => self.inner.to_pubkey_script(strategy), // Bitcoin public key can't be used in Taproot context ConvertInfo::Taproot => None, } @@ -304,7 +314,7 @@ impl ToScripts for bitcoin::PublicKey { match strategy { ConvertInfo::Bare | ConvertInfo::Hashed => None, ConvertInfo::SegWitV0 | ConvertInfo::NestedV0 => { - Some(Witness::from(vec![self.to_bytes()])) + Some(Witness::from_vec(vec![self.to_bytes()])) } // Bitcoin public key can't be used in Taproot context ConvertInfo::Taproot => None, @@ -355,6 +365,7 @@ pub trait ToP2pkh { fn to_p2sh_wpkh(&self) -> Option; } +#[cfg(feature = "miniscript")] impl ToP2pkh for T where T: ToPublicKey, diff --git a/scripts/src/lib.rs b/scripts/src/lib.rs index 0a0c48c..d4c7cda 100644 --- a/scripts/src/lib.rs +++ b/scripts/src/lib.rs @@ -81,10 +81,12 @@ extern crate amplify; extern crate serde_crate as serde; pub mod convert; +#[cfg(feature = "miniscript")] mod parser; mod types; pub use convert::ConvertInfo; +#[cfg(feature = "miniscript")] pub use parser::PubkeyParseError; pub use types::{ LeafScript, LockScript, PubkeyScript, RedeemScript, ScriptCode, ScriptSet, SigScript, diff --git a/scripts/src/types.rs b/scripts/src/types.rs index db069a3..730b9bf 100644 --- a/scripts/src/types.rs +++ b/scripts/src/types.rs @@ -17,15 +17,16 @@ use std::fmt::{self, Display, Formatter}; use std::io::{self, Read, Write}; use amplify::hex::ToHex; -use amplify::Wrapper; +use amplify::{hex, Wrapper}; use bitcoin::blockdata::script::*; use bitcoin::blockdata::witness::Witness; use bitcoin::blockdata::{opcodes, script}; use bitcoin::schnorr::TweakedPublicKey; use bitcoin::util::address::WitnessVersion; -use bitcoin::util::taproot::{ControlBlock, LeafVersion, TaprootError}; +use bitcoin::util::taproot::{ControlBlock, LeafVersion, TaprootError, TAPROOT_ANNEX_PREFIX}; use bitcoin::{ - Address, Network, PubkeyHash, SchnorrSig, SchnorrSigError, ScriptHash, WPubkeyHash, WScriptHash, + consensus, Address, Network, PubkeyHash, SchnorrSig, SchnorrSigError, ScriptHash, WPubkeyHash, + WScriptHash, }; /// Script whose knowledge and satisfaction is required for spending some @@ -93,25 +94,26 @@ impl PubkeyScript { Address::from_script(self.as_inner(), network) } - /// Computes witness version of the `pubkeyScript` + /// Returns witness version of the `scriptPubkey`, if any + // TODO: Replace with Script::witness_version once # in rust-bitcoin gets merged pub fn witness_version(&self) -> Option { - if self.0.is_witness_program() { - Some( - WitnessVersion::from_opcode(opcodes::All::from(self.0[0])) - .expect("Script::is_witness_program is broken"), - ) - } else { - None - } + self.0 + .as_ref() + .get(0) + .and_then(|opcode| WitnessVersion::from_opcode(opcodes::All::from(*opcode)).ok()) } } impl From for PubkeyScript { - fn from(pkh: PubkeyHash) -> Self { Script::new_p2pkh(&pkh).into() } + fn from(pkh: PubkeyHash) -> Self { + Script::new_p2pkh(&pkh).into() + } } impl From for PubkeyScript { - fn from(wpkh: WPubkeyHash) -> Self { Script::new_v0_p2wpkh(&wpkh).into() } + fn from(wpkh: WPubkeyHash) -> Self { + Script::new_v0_p2wpkh(&wpkh).into() + } } /// A content of `scriptSig` from a transaction input @@ -200,26 +202,55 @@ impl TryFrom for TaprootWitness { return Err(TaprootWitnessError::EmptyWitnessStack); } - let (len, annex) = if witness.len() > 1 { - let len = witness.len() - 1; - let annex = &witness[len]; - (len, Some(Box::from(annex))) + let mut len = witness.len(); + let annex = if len > 1 { + witness + .last() + .filter(|annex| annex[0] == TAPROOT_ANNEX_PREFIX) + .map(Box::from) } else { - (witness.len(), None) + None }; + if annex.is_some() { + len -= 1; + } Ok(if len == 1 { TaprootWitness::PubkeySpending { - sig: SchnorrSig::from_slice(&witness[0])?, + sig: SchnorrSig::from_slice( + witness + .last() + .expect("witness must have at least 1 element"), + )?, annex, } } else { - let control_block = ControlBlock::from_slice(&witness[len - 1])?; - let s = bitcoin::consensus::deserialize(&witness[len - 2]) + let (control_block, script) = if annex.is_some() { + ( + witness + .second_to_last() + .expect("witness must have at least 3 elements"), + witness + .iter() + .nth(len - 2) + .expect("witness must have at least 3 elements"), + ) + } else { + ( + witness + .last() + .expect("witness must have at least 2 elements"), + witness + .second_to_last() + .expect("witness must have at least 2 elements"), + ) + }; + let control_block = ControlBlock::from_slice(control_block)?; + let script = bitcoin::consensus::deserialize(script) .map_err(TaprootWitnessError::ScriptError)?; let script = LeafScript { version: control_block.leaf_version, - script: LockScript::from_inner(s), + script: LockScript::from_inner(script), }; TaprootWitness::ScriptSpending { control_block, @@ -233,7 +264,9 @@ impl TryFrom for TaprootWitness { impl From for Witness { #[inline] - fn from(tw: TaprootWitness) -> Self { Witness::from(&tw) } + fn from(tw: TaprootWitness) -> Self { + Witness::from(&tw) + } } impl From<&TaprootWitness> for Witness { @@ -305,11 +338,15 @@ impl strict_encoding::Strategy for RedeemScript { impl RedeemScript { /// Computes script commitment hash which participates in [`PubkeyScript`] #[inline] - pub fn script_hash(&self) -> ScriptHash { self.as_inner().script_hash() } + pub fn script_hash(&self) -> ScriptHash { + self.as_inner().script_hash() + } /// Generates [`PubkeyScript`] matching given `redeemScript` #[inline] - pub fn to_p2sh(&self) -> PubkeyScript { Script::new_p2sh(&self.script_hash()).into() } + pub fn to_p2sh(&self) -> PubkeyScript { + Script::new_p2sh(&self.script_hash()).into() + } } impl From for SigScript { @@ -349,17 +386,23 @@ impl WitnessScript { /// Computes script commitment which participates in [`Witness`] or /// [`RedeemScript`]. #[inline] - pub fn script_hash(&self) -> WScriptHash { self.as_inner().wscript_hash() } + pub fn script_hash(&self) -> WScriptHash { + self.as_inner().wscript_hash() + } /// Generates [`PubkeyScript`] matching given `witnessScript` for native /// SegWit outputs. #[inline] - pub fn to_p2wsh(&self) -> PubkeyScript { Script::new_v0_p2wsh(&self.script_hash()).into() } + pub fn to_p2wsh(&self) -> PubkeyScript { + Script::new_v0_p2wsh(&self.script_hash()).into() + } /// Generates [`PubkeyScript`] matching given `witnessScript` for legacy /// P2WSH-in-P2SH outputs. #[inline] - pub fn to_p2sh_wsh(&self) -> PubkeyScript { RedeemScript::from(self.clone()).to_p2sh() } + pub fn to_p2sh_wsh(&self) -> PubkeyScript { + RedeemScript::from(self.clone()).to_p2sh() + } } impl From for RedeemScript { @@ -369,19 +412,27 @@ impl From for RedeemScript { } impl From for WitnessScript { - fn from(lock_script: LockScript) -> Self { WitnessScript(lock_script.to_inner()) } + fn from(lock_script: LockScript) -> Self { + WitnessScript(lock_script.to_inner()) + } } impl From for RedeemScript { - fn from(lock_script: LockScript) -> Self { RedeemScript(lock_script.to_inner()) } + fn from(lock_script: LockScript) -> Self { + RedeemScript(lock_script.to_inner()) + } } impl From for LockScript { - fn from(witness_script: WitnessScript) -> Self { LockScript(witness_script.to_inner()) } + fn from(witness_script: WitnessScript) -> Self { + LockScript(witness_script.to_inner()) + } } impl From for LockScript { - fn from(redeem_script: RedeemScript) -> Self { LockScript(redeem_script.to_inner()) } + fn from(redeem_script: RedeemScript) -> Self { + LockScript(redeem_script.to_inner()) + } } /// Any valid branch of taproot script spending @@ -402,7 +453,7 @@ pub struct LeafScript { impl strict_encoding::StrictEncode for LeafScript { fn strict_encode(&self, mut e: E) -> Result { - self.version.as_u8().strict_encode(&mut e)?; + self.version.into_consensus().strict_encode(&mut e)?; self.script.as_inner().to_bytes().strict_encode(&mut e) } } @@ -410,7 +461,7 @@ impl strict_encoding::StrictEncode for LeafScript { impl strict_encoding::StrictDecode for LeafScript { fn strict_decode(mut d: D) -> Result { let version = u8::strict_decode(&mut d)?; - let version = LeafVersion::from_u8(version) + let version = LeafVersion::from_consensus(version) .map_err(|_| bitcoin::consensus::encode::Error::ParseFailed("invalid leaf version"))?; let script = LockScript::from_inner(Script::from(Vec::::strict_decode(d)?)); Ok(LeafScript { version, script }) @@ -447,7 +498,9 @@ impl strict_encoding::Strategy for TapScript { } impl From for TapScript { - fn from(lock_script: LockScript) -> Self { TapScript(lock_script.to_inner()) } + fn from(lock_script: LockScript) -> Self { + TapScript(lock_script.to_inner()) + } } impl From for LeafScript { @@ -472,22 +525,30 @@ impl strict_encoding::Strategy for WitnessProgram { impl Display for WitnessProgram { #[inline] - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { writeln!(f, "{}", self.0.to_hex()) } + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + writeln!(f, "{}", self.0.to_hex()) + } } impl From for WitnessProgram { #[inline] - fn from(wpkh: WPubkeyHash) -> Self { WitnessProgram(Box::from(&wpkh[..])) } + fn from(wpkh: WPubkeyHash) -> Self { + WitnessProgram(Box::from(&wpkh[..])) + } } impl From for WitnessProgram { #[inline] - fn from(wsh: WScriptHash) -> Self { WitnessProgram(Box::from(&wsh[..])) } + fn from(wsh: WScriptHash) -> Self { + WitnessProgram(Box::from(&wsh[..])) + } } impl From for WitnessProgram { #[inline] - fn from(tpk: TweakedPublicKey) -> Self { WitnessProgram(Box::from(&tpk.serialize()[..])) } + fn from(tpk: TweakedPublicKey) -> Self { + WitnessProgram(Box::from(&tpk.serialize()[..])) + } } /// Scripting data for both transaction output and spending transaction input @@ -512,23 +573,25 @@ pub struct ScriptSet { impl Display for ScriptSet { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "{} {} <- {}", - self.sig_script, - self.witness + write!(f, "{} ", self.sig_script,)?; + hex::format_hex( + &self + .witness .as_ref() - .map(Witness::to_string) + .map(consensus::serialize) .unwrap_or_default(), - self.pubkey_script - ) + f, + )?; + write!(f, " <- {}", self.pubkey_script) } } impl ScriptSet { /// Detects whether the structure contains witness data #[inline] - pub fn has_witness(&self) -> bool { self.witness != None } + pub fn has_witness(&self) -> bool { + self.witness != None + } /// Detects whether the structure is either P2SH-P2WPKH or P2SH-P2WSH pub fn is_witness_sh(&self) -> bool { @@ -550,20 +613,19 @@ impl ScriptSet { } if self.has_witness() != use_witness { if use_witness { - self.witness = Some( - self.sig_script - .as_inner() - .instructions_minimal() - .filter_map(|instr| { - if let Ok(Instruction::PushBytes(bytes)) = instr { - Some(bytes.to_vec()) - } else { - None - } - }) - .collect::>>() - .into(), - ); + let witness = self + .sig_script + .as_inner() + .instructions_minimal() + .filter_map(|instr| { + if let Ok(Instruction::PushBytes(bytes)) = instr { + Some(bytes.to_vec()) + } else { + None + } + }) + .collect::>>(); + self.witness = Some(Witness::from_vec(witness)); self.sig_script = SigScript::default(); true } else if let Some(ref witness_script) = self.witness { diff --git a/slip132/Cargo.toml b/slip132/Cargo.toml index f4e522b..e7b4cd4 100644 --- a/slip132/Cargo.toml +++ b/slip132/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "slip132" -version = "0.6.0" +version = "0.6.0-beta.1" license = "Apache-2.0" authors = ["Dr. Maxim Orlovsky "] description = "Bitcoin SLIP-132 standard implementation (parsing custom xpub/xpriv key formats)" @@ -17,9 +17,9 @@ name = "slip132" path = "src/lib.rs" [dependencies] -amplify = "3.9.1" -bitcoin = { version = "0.28", git = "https://github.com/LNP-BP/rust-bitcoin", branch = "taproot/all" } -strict_encoding = { version = "1.8.0", git = "https://github.com/LNP-BP/client_side_validation", branch = "develop", optional = true } +amplify = "3.12.0" +bitcoin = "0.28.0-rc.1" +strict_encoding = { version = "1.8.0-rc.1", optional = true } serde_crate = { package = "serde", version = "1", features = ["derive"], optional = true } serde_with = { version = "1.5", features = ["hex"], optional = true } diff --git a/src/address.rs b/src/address.rs index 0929a75..7b1ae1f 100644 --- a/src/address.rs +++ b/src/address.rs @@ -18,7 +18,7 @@ use std::str::FromStr; use bitcoin::hashes::{hex, Hash}; use bitcoin::schnorr::TweakedPublicKey; -use bitcoin::secp256k1::schnorrsig as bip340; +use bitcoin::secp256k1::XOnlyPublicKey; use bitcoin::util::address::{self, Payload, WitnessVersion}; use bitcoin::{ secp256k1, Address, Network, PubkeyHash, Script, ScriptHash, WPubkeyHash, WScriptHash, @@ -109,11 +109,15 @@ impl TryFrom
for AddressCompat { } impl From for PubkeyScript { - fn from(payload: AddressCompat) -> Self { Address::from(payload).script_pubkey().into() } + fn from(payload: AddressCompat) -> Self { + Address::from(payload).script_pubkey().into() + } } impl Display for AddressCompat { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { Display::fmt(&Address::from(*self), f) } + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + Display::fmt(&Address::from(*self), f) + } } impl FromStr for AddressCompat { @@ -160,7 +164,9 @@ impl AddressPayload { } } - pub fn from_address(address: Address) -> Option { Self::from_payload(address.payload) } + pub fn from_address(address: Address) -> Option { + Self::from_payload(address.payload) + } pub fn from_payload(payload: Payload) -> Option { Some(match payload { @@ -187,7 +193,7 @@ impl AddressPayload { { AddressPayload::Taproot { output_key: TweakedPublicKey::dangerous_assume_tweaked( - bip340::PublicKey::from_slice(&program) + XOnlyPublicKey::from_slice(&program) .expect("Taproot public key vec length estimation is broken"), ), } @@ -251,7 +257,7 @@ impl TryFrom for AddressPayload { if program.len() == 32 { AddressPayload::Taproot { output_key: TweakedPublicKey::dangerous_assume_tweaked( - bip340::PublicKey::from_slice(&program) + XOnlyPublicKey::from_slice(&program) .expect("bip340::PublicKey is broken: it must be 32 byte len"), ), } @@ -270,7 +276,9 @@ impl TryFrom for AddressPayload { } impl From for PubkeyScript { - fn from(ap: AddressPayload) -> Self { ap.into_address(Network::Bitcoin).script_pubkey().into() } + fn from(ap: AddressPayload) -> Self { + ap.into_address(Network::Bitcoin).script_pubkey().into() + } } #[derive( @@ -330,9 +338,9 @@ impl FromStr for AddressPayload { AddressPayload::WScriptHash(WScriptHash::from_str(hash)?) } (Some("pkxo"), Some(hash), None) => AddressPayload::Taproot { - output_key: TweakedPublicKey::dangerous_assume_tweaked( - bip340::PublicKey::from_str(hash)?, - ), + output_key: TweakedPublicKey::dangerous_assume_tweaked(XOnlyPublicKey::from_str( + hash, + )?), }, (Some(prefix), ..) => return Err(AddressParseError::UnknownPrefix(prefix.to_owned())), (None, ..) => return Err(AddressParseError::PrefixAbsent), @@ -374,7 +382,9 @@ impl AddressFormat { } impl From
for AddressFormat { - fn from(address: Address) -> Self { address.payload.into() } + fn from(address: Address) -> Self { + address.payload.into() + } } impl From for AddressFormat { @@ -446,7 +456,9 @@ impl FromStr for AddressNetwork { } impl From
for AddressNetwork { - fn from(address: Address) -> Self { address.network.into() } + fn from(address: Address) -> Self { + address.network.into() + } } impl From for AddressNetwork { diff --git a/src/hlc.rs b/src/hlc.rs index 7005542..195fb6f 100644 --- a/src/hlc.rs +++ b/src/hlc.rs @@ -32,7 +32,6 @@ use serde_with::{As, DisplayFromStr}; Wrapper, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, From )] #[derive(StrictEncode, StrictDecode)] -#[derive(LightningEncode, LightningDecode)] #[display(LowerHex)] #[wrapper(FromStr, LowerHex, UpperHex)] pub struct HashLock(#[cfg_attr(feature = "serde", serde(with = "As::"))] Slice32); @@ -68,7 +67,6 @@ impl AsRef<[u8]> for HashLock { Wrapper, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Display, From )] #[derive(StrictEncode, StrictDecode)] -#[derive(LightningEncode, LightningDecode)] #[display(LowerHex)] #[wrapper(FromStr, LowerHex, UpperHex)] pub struct HashPreimage( diff --git a/src/lib.rs b/src/lib.rs index a8c3791..ce29ae9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,12 +20,12 @@ extern crate amplify; #[macro_use] extern crate strict_encoding; -#[macro_use] -extern crate lightning_encoding; #[cfg(feature = "serde")] #[macro_use] extern crate serde_with; +#[cfg(feature = "miniscript")] +extern crate miniscript_crate as miniscript; #[cfg(feature = "serde")] extern crate serde_crate as serde; @@ -56,14 +56,14 @@ impl IntoPk for secp256k1::PublicKey { fn into_pk(self) -> bitcoin::PublicKey { ::bitcoin::PublicKey { compressed: true, - key: self, + inner: self, } } fn into_legacy_pk(self) -> bitcoin::PublicKey { ::bitcoin::PublicKey { compressed: true, - key: self, + inner: self, } } }