diff --git a/Cargo.lock b/Cargo.lock index 777de86..72f6600 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,6 +11,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anstream" version = "0.6.21" @@ -67,6 +73,15 @@ version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +dependencies = [ + "object", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -81,7 +96,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -255,9 +270,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "block-buffer" @@ -279,9 +294,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5c6f81257d10a0f602a294ae4182251151ff97dbb504ef9afcdda4a64b24d9b4" [[package]] name = "byteorder" @@ -297,9 +312,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.55" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", "shlex", @@ -317,11 +332,25 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chumsky" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acc17a6284abccac6e50db35c1cee87f605474a72939b959a3a67d9371800efd" +dependencies = [ + "hashbrown 0.15.5", + "regex-automata 0.3.9", + "serde", + "stacker", + "unicode-ident", + "unicode-segmentation", +] + [[package]] name = "clap" -version = "4.5.57" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a" +checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" dependencies = [ "clap_builder", "clap_derive", @@ -329,9 +358,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.57" +version = "4.5.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238" +checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" dependencies = [ "anstream", "anstyle", @@ -348,14 +377,14 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] name = "clap_lex" -version = "0.7.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" +checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" [[package]] name = "colorchoice" @@ -409,7 +438,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -423,7 +452,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -522,35 +551,34 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-task", "pin-project-lite", - "pin-utils", "slab", ] @@ -622,6 +650,8 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", ] @@ -1019,14 +1049,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata", + "regex-automata 0.4.14", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "memoffset" @@ -1091,7 +1121,7 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225e7cfe711e0ba79a68baeddb2982723e4235247aefce1482f2f16c27865b66" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "cfg_aliases", "libc", @@ -1121,6 +1151,15 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -1168,49 +1207,6 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" -[[package]] -name = "pest" -version = "2.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" -dependencies = [ - "memchr", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "pest_meta" -version = "2.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" -dependencies = [ - "pest", - "sha2", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1248,7 +1244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1284,6 +1280,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +dependencies = [ + "ar_archive_writer", + "cc", +] + [[package]] name = "quinn" version = "0.11.9" @@ -1419,7 +1425,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -1430,8 +1436,19 @@ checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.14", + "regex-syntax 0.8.9", +] + +[[package]] +name = "regex-automata" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", ] [[package]] @@ -1442,9 +1459,15 @@ checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.9", ] +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "regex-syntax" version = "0.8.9" @@ -1515,11 +1538,11 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1528,7 +1551,7 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys 0.11.0", @@ -1705,7 +1728,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1795,15 +1818,6 @@ dependencies = [ "trybuild", ] -[[package]] -name = "simplex-build" -version = "0.1.0" -dependencies = [ - "simplex-sdk", - "simplicityhl", - "thiserror", -] - [[package]] name = "simplex-cli" version = "0.1.0" @@ -1830,7 +1844,7 @@ dependencies = [ "simplex-core", "simplicityhl", "thiserror", - "toml", + "toml 0.9.12+spec-1.1.0", ] [[package]] @@ -1854,7 +1868,7 @@ dependencies = [ "proc-macro2", "quote", "simplicityhl", - "syn 2.0.114", + "syn 2.0.116", "thiserror", ] @@ -1864,7 +1878,7 @@ version = "0.1.0" dependencies = [ "serde", "simplex-macro-core", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -1908,6 +1922,14 @@ dependencies = [ "thiserror", ] +[[package]] +name = "simplex-user" +version = "0.1.0" +dependencies = [ + "simplex-sdk", + "thiserror", +] + [[package]] name = "simplicity-lang" version = "0.7.0" @@ -1938,16 +1960,15 @@ dependencies = [ [[package]] name = "simplicityhl" version = "0.4.1" -source = "git+https://github.com/ikripaka/SimplicityHL/?branch=feature%2Frich-params#69928ce05aa4450ccfdf93b226135f6e1496789a" +source = "git+https://github.com/ikripaka/SimplicityHL/?branch=feature%2Frich-params#77755254414093ff0e1b51beedbc27367745388e" dependencies = [ "base64 0.21.7", + "chumsky", "clap", "either", "getrandom 0.2.17", "itertools", "miniscript", - "pest", - "pest_derive", "serde", "serde_json", "simplicity-lang", @@ -1981,6 +2002,19 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stacker" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2005,9 +2039,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" dependencies = [ "proc-macro2", "quote", @@ -2031,7 +2065,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -2079,7 +2113,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -2141,7 +2175,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -2156,14 +2190,29 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.11+spec-1.1.0" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ "indexmap", "serde_core", "serde_spanned", - "toml_datetime", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml" +version = "1.0.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 1.0.0+spec-1.1.0", "toml_parser", "toml_writer", "winnow", @@ -2178,11 +2227,20 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ "winnow", ] @@ -2214,7 +2272,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytes", "futures-util", "http", @@ -2257,7 +2315,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -2290,7 +2348,7 @@ dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex-automata", + "regex-automata 0.4.14", "sharded-slab", "smallvec", "thread_local", @@ -2307,9 +2365,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.115" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f614c21bd3a61bad9501d75cbb7686f00386c806d7f456778432c25cf86948a" +checksum = "47c635f0191bd3a2941013e5062667100969f8c4e9cd787c14f977265d73616e" dependencies = [ "glob", "serde", @@ -2317,7 +2375,7 @@ dependencies = [ "serde_json", "target-triple", "termcolor", - "toml", + "toml 1.0.3+spec-1.1.0", ] [[package]] @@ -2327,16 +2385,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] -name = "ucd-trie" -version = "0.1.7" +name = "unicode-ident" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] -name = "unicode-ident" -version = "1.0.22" +name = "unicode-segmentation" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-xid" @@ -2483,7 +2541,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "wasm-bindgen-shared", ] @@ -2524,7 +2582,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -2601,6 +2659,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.60.2" @@ -2784,7 +2851,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn 2.0.114", + "syn 2.0.116", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -2800,7 +2867,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -2812,7 +2879,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.10.0", + "bitflags 2.11.0", "indexmap", "log", "serde", @@ -2867,28 +2934,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.38" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57cf3aa6855b23711ee9852dfc97dfaa51c45feaba5b645d0c777414d494a961" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.38" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a616990af1a287837c4fe6596ad77ef57948f787e46ce28e166facc0cc1cb75" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] @@ -2908,7 +2975,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", "synstructure", ] @@ -2948,11 +3015,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.116", ] [[package]] name = "zmij" -version = "1.0.19" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/crates/artifacts/Cargo.toml b/crates/artifacts/Cargo.toml deleted file mode 100644 index c50113f..0000000 --- a/crates/artifacts/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "simplex-build" -version = "0.1.0" -edition = "2024" -description = "Simplex Build" -license = "MIT OR Apache-2.0" -readme = "README.md" - -[lints] -workspace = true - -[dependencies] -thiserror = { workspace = true } - -simplex-sdk = { workspace = true } -simplicityhl = { workspace = true } diff --git a/crates/artifacts/src/asset_auth.rs b/crates/artifacts/src/asset_auth.rs deleted file mode 100644 index fea1b84..0000000 --- a/crates/artifacts/src/asset_auth.rs +++ /dev/null @@ -1,89 +0,0 @@ -use simplex_sdk::arguments::ArgumentsTrait; -use simplex_sdk::program::Program; - -use simplicityhl::simplicity::bitcoin::XOnlyPublicKey; - -// use simplex_macros::simplex_build; - -// #[derive(SimplexBuild)] -// #[simplex("../../contracts/src/asset_auth/source_simf/asset_auth.simf")] -pub struct AssetAuth<'a> { - program: Program<'a>, -} - -impl<'a> AssetAuth<'a> { - // the path is autogenerated - pub const SOURCE: &'static str = ""; - // include_str!("../../contracts/src/asset_auth/source_simf/asset_auth.simf"); - - pub fn new(public_key: &'a XOnlyPublicKey, arguments: &'a impl ArgumentsTrait) -> Self { - Self { - program: Program::new(Self::SOURCE, public_key, arguments), - } - } - - pub fn get_program(&self) -> &Program<'a> { - &self.program - } -} - -// Expanded by macro - -pub mod asset_auth_build { - use simplex_sdk::arguments::ArgumentsTrait; - use simplex_sdk::witness::WitnessTrait; - use simplicityhl::value::UIntValue; - use simplicityhl::value::ValueConstructible; - use simplicityhl::{Value, WitnessValues}; - use std::collections::HashMap; - - pub struct AssetAuthWitness { - pub path: (bool, u64, u64), - } - - pub struct AssetAuthArguments { - pub first: u64, - pub second: bool, - } - - impl WitnessTrait for AssetAuthWitness { - fn build_witness(&self) -> WitnessValues { - WitnessValues::from(HashMap::from([( - simplicityhl::str::WitnessName::from_str_unchecked("PATH"), - Value::tuple([ - Value::from(self.path.0), - Value::from(UIntValue::U64(self.path.1)), - Value::from(UIntValue::U64(self.path.1)), - ]), - )])) - } - - // fn from_witness(_witness: &::simplicityhl::WitnessValues) -> Self { - // Self { - // path: (false, 0, 0), - // } - // } - } - - impl ArgumentsTrait for AssetAuthArguments { - fn build_arguments(&self) -> simplicityhl::Arguments { - simplicityhl::Arguments::from(HashMap::from([ - ( - simplicityhl::str::WitnessName::from_str_unchecked("FIRST"), - Value::from(UIntValue::U64(self.first)), - ), - ( - simplicityhl::str::WitnessName::from_str_unchecked("SECOND"), - Value::from(self.second), - ), - ])) - } - - // fn from_arguments(_args: &simplicityhl::Arguments) -> Self { - // Self { - // first: 0, - // second: false, - // } - // } - } -} diff --git a/crates/artifacts/src/lib.rs b/crates/artifacts/src/lib.rs deleted file mode 100644 index c37f1ff..0000000 --- a/crates/artifacts/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod asset_auth; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index 1048084..333a736 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -15,4 +15,4 @@ simplex-runtime = { workspace = true } thiserror = { workspace = true } sha2 = { workspace = true } minreq = { workspace = true } -simplicityhl = { workspace = true } \ No newline at end of file +simplicityhl = { workspace = true } diff --git a/crates/sdk/src/constants.rs b/crates/sdk/src/constants.rs index b692d5b..87339cf 100644 --- a/crates/sdk/src/constants.rs +++ b/crates/sdk/src/constants.rs @@ -4,12 +4,15 @@ use simplicityhl::simplicity::hashes::{Hash, sha256}; use std::str::FromStr; pub const PUBLIC_SECRET_BLINDER_KEY: [u8; 32] = [1; 32]; +pub const DUMMY_SIGNATURE: [u8; 64] = [1; 64]; pub const DEFAULT_TARGET_BLOCKS: u32 = 0; pub const DEFAULT_FEE_RATE: f32 = 100.0; -pub const WITNESS_SCALE_FACTOR: usize = 4; +pub const MIN_FEE: u64 = 10; pub const PLACEHOLDER_FEE: u64 = 1; +pub const WITNESS_SCALE_FACTOR: usize = 4; + /// Policy asset id (hex, BE) for Liquid mainnet. pub const LIQUID_POLICY_ASSET_STR: &str = "6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d"; diff --git a/crates/sdk/src/error.rs b/crates/sdk/src/error.rs index dafe435..5ef80ad 100644 --- a/crates/sdk/src/error.rs +++ b/crates/sdk/src/error.rs @@ -2,6 +2,15 @@ use simplicityhl::elements::secp256k1_zkp; #[derive(Debug, thiserror::Error)] pub enum SimplexError { + #[error("Fee amount is too low: {0}")] + PstFailure(#[from] simplicityhl::elements::pset::Error), + + #[error("Fee amount is too low: {0}")] + DustAmount(u64), + + #[error("Not enough fee amount {0} to cover transaction costs: {1}")] + NotEnoughFeeAmount(u64, u64), + #[error("Failed to compile Simplicity program: {0}")] Compilation(String), diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index fe7733a..a0a5dc9 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -1,9 +1,10 @@ -pub mod arguments; -pub mod constants; -pub mod error; +pub mod witness_transaction; pub mod program; -pub mod provider; -pub mod signed_transaction; +pub mod arguments; +pub mod witness; pub mod signer; +pub mod provider; pub mod utils; -pub mod witness; +pub mod constants; +pub mod error; +pub mod presets; diff --git a/crates/sdk/src/presets/mod.rs b/crates/sdk/src/presets/mod.rs new file mode 100644 index 0000000..5083e09 --- /dev/null +++ b/crates/sdk/src/presets/mod.rs @@ -0,0 +1 @@ +pub mod p2pk; diff --git a/crates/sdk/src/presets/p2pk.rs b/crates/sdk/src/presets/p2pk.rs new file mode 100644 index 0000000..411f0be --- /dev/null +++ b/crates/sdk/src/presets/p2pk.rs @@ -0,0 +1,130 @@ +use crate::arguments::ArgumentsTrait; +use crate::program::Program; + +use simplicityhl::simplicity::bitcoin::XOnlyPublicKey; + +// TODO macro +pub struct P2PK<'a> { + program: Program<'a>, +} + +impl<'a> P2PK<'a> { + pub const SOURCE: &'static str = include_str!("./simf/p2pk.simf"); + + pub fn new(public_key: &'a XOnlyPublicKey, arguments: &'a impl ArgumentsTrait) -> Self { + Self { + program: Program::new(Self::SOURCE, public_key, arguments), + } + } + + pub fn get_program(&self) -> &Program<'a> { + &self.program + } + + pub fn get_program_mut(&mut self) -> &mut Program<'a> { + &mut self.program + } +} + +pub mod p2pk_build { + use crate::arguments::ArgumentsTrait; + use crate::witness::WitnessTrait; + use simplicityhl::num::U256; + use simplicityhl::str::WitnessName; + use simplicityhl::types::TypeConstructible; + use simplicityhl::value::UIntValue; + use simplicityhl::value::ValueConstructible; + use simplicityhl::{Arguments, ResolvedType, Value, WitnessValues}; + use std::collections::HashMap; + + pub struct P2PKWitness { + pub signature: [u8; 64usize], + } + + pub struct P2PKArguments { + pub public_key: [u8; 32], + } + + impl WitnessTrait for P2PKWitness { + fn build_witness(&self) -> WitnessValues { + WitnessValues::from(HashMap::from([(WitnessName::from_str_unchecked("SIGNATURE"), { + let elements = [ + Value::from(UIntValue::U8(self.signature[0])), + Value::from(UIntValue::U8(self.signature[1])), + Value::from(UIntValue::U8(self.signature[2])), + Value::from(UIntValue::U8(self.signature[3])), + Value::from(UIntValue::U8(self.signature[4])), + Value::from(UIntValue::U8(self.signature[5])), + Value::from(UIntValue::U8(self.signature[6])), + Value::from(UIntValue::U8(self.signature[7])), + Value::from(UIntValue::U8(self.signature[8])), + Value::from(UIntValue::U8(self.signature[9])), + Value::from(UIntValue::U8(self.signature[10])), + Value::from(UIntValue::U8(self.signature[11])), + Value::from(UIntValue::U8(self.signature[12])), + Value::from(UIntValue::U8(self.signature[13])), + Value::from(UIntValue::U8(self.signature[14])), + Value::from(UIntValue::U8(self.signature[15])), + Value::from(UIntValue::U8(self.signature[16])), + Value::from(UIntValue::U8(self.signature[17])), + Value::from(UIntValue::U8(self.signature[18])), + Value::from(UIntValue::U8(self.signature[19])), + Value::from(UIntValue::U8(self.signature[20])), + Value::from(UIntValue::U8(self.signature[21])), + Value::from(UIntValue::U8(self.signature[22])), + Value::from(UIntValue::U8(self.signature[23])), + Value::from(UIntValue::U8(self.signature[24])), + Value::from(UIntValue::U8(self.signature[25])), + Value::from(UIntValue::U8(self.signature[26])), + Value::from(UIntValue::U8(self.signature[27])), + Value::from(UIntValue::U8(self.signature[28])), + Value::from(UIntValue::U8(self.signature[29])), + Value::from(UIntValue::U8(self.signature[30])), + Value::from(UIntValue::U8(self.signature[31])), + Value::from(UIntValue::U8(self.signature[32])), + Value::from(UIntValue::U8(self.signature[33])), + Value::from(UIntValue::U8(self.signature[34])), + Value::from(UIntValue::U8(self.signature[35])), + Value::from(UIntValue::U8(self.signature[36])), + Value::from(UIntValue::U8(self.signature[37])), + Value::from(UIntValue::U8(self.signature[38])), + Value::from(UIntValue::U8(self.signature[39])), + Value::from(UIntValue::U8(self.signature[40])), + Value::from(UIntValue::U8(self.signature[41])), + Value::from(UIntValue::U8(self.signature[42])), + Value::from(UIntValue::U8(self.signature[43])), + Value::from(UIntValue::U8(self.signature[44])), + Value::from(UIntValue::U8(self.signature[45])), + Value::from(UIntValue::U8(self.signature[46])), + Value::from(UIntValue::U8(self.signature[47])), + Value::from(UIntValue::U8(self.signature[48])), + Value::from(UIntValue::U8(self.signature[49])), + Value::from(UIntValue::U8(self.signature[50])), + Value::from(UIntValue::U8(self.signature[51])), + Value::from(UIntValue::U8(self.signature[52])), + Value::from(UIntValue::U8(self.signature[53])), + Value::from(UIntValue::U8(self.signature[54])), + Value::from(UIntValue::U8(self.signature[55])), + Value::from(UIntValue::U8(self.signature[56])), + Value::from(UIntValue::U8(self.signature[57])), + Value::from(UIntValue::U8(self.signature[58])), + Value::from(UIntValue::U8(self.signature[59])), + Value::from(UIntValue::U8(self.signature[60])), + Value::from(UIntValue::U8(self.signature[61])), + Value::from(UIntValue::U8(self.signature[62])), + Value::from(UIntValue::U8(self.signature[63])), + ]; + Value::array(elements, ResolvedType::u8()) + })])) + } + } + + impl ArgumentsTrait for P2PKArguments { + fn build_arguments(&self) -> Arguments { + Arguments::from(HashMap::from([( + WitnessName::from_str_unchecked("PUBLIC_KEY"), + Value::from(UIntValue::U256(U256::from_byte_array(self.public_key))), + )])) + } + } +} diff --git a/crates/sdk/src/presets/simf/p2pk.simf b/crates/sdk/src/presets/simf/p2pk.simf new file mode 100644 index 0000000..db4f27c --- /dev/null +++ b/crates/sdk/src/presets/simf/p2pk.simf @@ -0,0 +1,3 @@ +fn main() { + jet::bip_0340_verify((param::PUBLIC_KEY, jet::sig_all_hash()), witness::SIGNATURE) +} \ No newline at end of file diff --git a/crates/sdk/src/signer.rs b/crates/sdk/src/signer.rs index fa3002a..d607309 100644 --- a/crates/sdk/src/signer.rs +++ b/crates/sdk/src/signer.rs @@ -31,6 +31,7 @@ impl SignerTrait for Signer { self.keypair.x_only_public_key().0 } + // TODO EIP-191 or EIP-712 messages fn personal_sign(&self, message: Message) -> Result { Ok(self.keypair.sign_schnorr(message)) } diff --git a/crates/sdk/src/utils.rs b/crates/sdk/src/utils.rs index d1577c8..a8398c1 100644 --- a/crates/sdk/src/utils.rs +++ b/crates/sdk/src/utils.rs @@ -2,8 +2,9 @@ use simplicityhl::simplicity::bitcoin::secp256k1; pub fn tr_unspendable_key() -> secp256k1::XOnlyPublicKey { secp256k1::XOnlyPublicKey::from_slice(&[ - 0x50, 0x92, 0x9b, 0x74, 0xc1, 0xa0, 0x49, 0x54, 0xb7, 0x8b, 0x4b, 0x60, 0x35, 0xe9, 0x7a, 0x5e, 0x07, 0x8a, - 0x5a, 0x0f, 0x28, 0xec, 0x96, 0xd5, 0x47, 0xbf, 0xee, 0x9a, 0xce, 0x80, 0x3a, 0xc0, + 0x50, 0x92, 0x9b, 0x74, 0xc1, 0xa0, 0x49, 0x54, 0xb7, 0x8b, 0x4b, 0x60, 0x35, 0xe9, 0x7a, + 0x5e, 0x07, 0x8a, 0x5a, 0x0f, 0x28, 0xec, 0x96, 0xd5, 0x47, 0xbf, 0xee, 0x9a, 0xce, 0x80, + 0x3a, 0xc0, ]) .expect("key should be valid") } diff --git a/crates/sdk/src/witness_transaction.rs b/crates/sdk/src/witness_transaction.rs new file mode 100644 index 0000000..ef6b05d --- /dev/null +++ b/crates/sdk/src/witness_transaction.rs @@ -0,0 +1,254 @@ +use simplicityhl::WitnessValues; +use simplicityhl::elements::pset::{Output, PartiallySignedTransaction}; +use simplicityhl::elements::secp256k1_zkp::schnorr::Signature; +use simplicityhl::elements::{Script, Transaction, TxOut}; + +use crate::constants::{MIN_FEE, PLACEHOLDER_FEE, SimplicityNetwork, WITNESS_SCALE_FACTOR}; +use crate::error::SimplexError; +use crate::program::ProgramTrait; +use crate::provider::Provider; +use crate::signer::SignerTrait; +use crate::witness::WitnessTrait; + +struct SignedInput<'a, T> { + program: &'a dyn ProgramTrait, + witness: &'a dyn WitnessTrait, + signer: Option<&'a dyn SignerTrait>, + signer_lambda: Option, +} + +pub struct WitnessTransaction<'a, T> { + pst: PartiallySignedTransaction, + network: SimplicityNetwork, + inputs: Vec>, +} + +impl<'a, T> WitnessTransaction<'a, T> +where + T: Fn(&WitnessValues, &Signature) -> Result + Clone, +{ + pub fn new(pst: PartiallySignedTransaction, network: SimplicityNetwork) -> Self { + Self { + pst: pst, + network: network, + inputs: Vec::new(), + } + } + + pub fn add_input(&mut self, program: &'a dyn ProgramTrait, witness: &'a dyn WitnessTrait) { + let signed_input = SignedInput { + program: program, + witness: witness, + signer: Option::None, + signer_lambda: Option::None, + }; + + self.inputs.push(signed_input); + } + + pub fn add_signed_input( + &mut self, + program: &'a dyn ProgramTrait, + witness: &'a dyn WitnessTrait, + signer: &'a dyn SignerTrait, + signer_lambda: T, + ) { + let signed_input = SignedInput { + program: program, + witness: witness, + signer: Option::Some(signer), + signer_lambda: Option::Some(signer_lambda), + }; + + self.inputs.push(signed_input); + } + + pub fn finalize_with_fee( + &self, + target_blocks: u32, + change_recipient_script: Script, + provider: impl Provider, + ) -> Result<(Transaction, u64), SimplexError> { + let policy_amount_delta = self.calculate_fee_delta(); + + if policy_amount_delta < MIN_FEE { + return Err(SimplexError::DustAmount(policy_amount_delta)); + } + + // estimate the tx fee with the change + let fee_rate = provider.get_fee_rate(target_blocks)?; + let mut fee_pst = self.pst.clone(); + + fee_pst.add_output(Output::new_explicit( + change_recipient_script.clone(), + PLACEHOLDER_FEE, + self.network.policy_asset(), + + None, + )); + + fee_pst.add_output(Output::new_explicit( + Script::new(), + PLACEHOLDER_FEE, + self.network.policy_asset(), + None, + )); + + let (final_tx, utxos) = self.extract_tx_and_utxos(&fee_pst)?; + let final_tx = self.finalize_tx(final_tx, utxos.as_slice())?; + let fee = self.calculate_fee(final_tx.weight(), fee_rate); + + if policy_amount_delta > fee && policy_amount_delta - fee >= MIN_FEE { + // we have enough funds to cover change UTXO + let mut fee_pst = self.pst.clone(); + + fee_pst.add_output(Output::new_explicit( + change_recipient_script, + policy_amount_delta - fee, + self.network.policy_asset(), + None, + )); + + fee_pst.add_output(Output::new_explicit( + Script::new(), + fee, + self.network.policy_asset(), + None, + )); + + let (final_tx, utxos) = self.extract_tx_and_utxos(&fee_pst)?; + let final_tx = self.finalize_tx(final_tx, utxos.as_slice())?; + + return Ok((final_tx, fee)); + } + + // not enough funds, so we need to estimate without the change + let mut fee_pst = self.pst.clone(); + + fee_pst.add_output(Output::new_explicit( + Script::new(), + PLACEHOLDER_FEE, + self.network.policy_asset(), + None, + )); + + let (final_tx, utxos) = self.extract_tx_and_utxos(&fee_pst)?; + let final_tx = self.finalize_tx(final_tx, utxos.as_slice())?; + let fee = self.calculate_fee(final_tx.weight(), fee_rate); + + // policy amount is not exact + if policy_amount_delta != fee { + return Err(SimplexError::NotEnoughFeeAmount(policy_amount_delta, fee)); + } + + // finalize the tx with fee and without the change + let mut fee_pst = self.pst.clone(); + + fee_pst.add_output(Output::new_explicit( + Script::new(), + fee, + self.network.policy_asset(), + None, + )); + + let (final_tx, utxos) = self.extract_tx_and_utxos(&fee_pst)?; + let final_tx = self.finalize_tx(final_tx, utxos.as_slice())?; + + Ok((final_tx, fee)) + } + + pub fn finalize(&self) -> Result { + let (final_tx, utxos) = self.extract_tx_and_utxos(&self.pst)?; + + Ok(self.finalize_tx(final_tx, utxos.as_slice())?) + } + + fn finalize_tx(&self, mut final_tx: Transaction, utxos: &[TxOut]) -> Result { + for index in 0..self.inputs.len() { + let (program, witness, signer, signer_lambda) = { + let input = &self.inputs[index]; + (input.program, input.witness, input.signer, input.signer_lambda.clone()) + }; + + if signer.is_some() { + final_tx = self.finalize_tx_with_signer( + final_tx, + utxos, + program, + witness.build_witness(), + index, + signer.unwrap(), + signer_lambda.unwrap(), + )?; + } else { + final_tx = self.finalize_tx_as_is(final_tx, utxos, program, witness.build_witness(), index)?; + } + } + + Ok(final_tx) + } + + fn finalize_tx_with_signer( + &self, + final_tx: Transaction, + utxos: &[TxOut], + program: &dyn ProgramTrait, + witness: WitnessValues, + index: usize, + signer: &dyn SignerTrait, + signer_lambda: T, + ) -> Result { + let signature = signer.sign(program, &final_tx, utxos, index, self.network)?; + let new_witness = signer_lambda(&witness, &signature)?; + + Ok(self.finalize_tx_as_is(final_tx, utxos, program, new_witness, index)?) + } + + fn finalize_tx_as_is( + &self, + final_tx: Transaction, + utxos: &[TxOut], + program: &dyn ProgramTrait, + witness: WitnessValues, + index: usize, + ) -> Result { + Ok(program.finalize(witness, final_tx, utxos, index, self.network)?) + } + + fn calculate_fee_delta(&self) -> u64 { + let available_amount = self + .pst + .inputs() + .iter() + .filter(|input| input.asset.unwrap() == self.network.policy_asset()) + .fold(0 as u64, |acc, input| acc + input.amount.unwrap()); + + let consumed_amount = self + .pst + .outputs() + .iter() + .filter(|output| output.asset.unwrap() == self.network.policy_asset()) + .fold(0 as u64, |acc, output| acc + output.amount.unwrap()); + + available_amount - consumed_amount + } + + fn calculate_fee(&self, weight: usize, fee_rate: f32) -> u64 { + let vsize = weight.div_ceil(WITNESS_SCALE_FACTOR); + (vsize as f32 * fee_rate / 1000.0).ceil() as u64 + } + + fn extract_tx_and_utxos( + &self, + pst: &PartiallySignedTransaction, + ) -> Result<(Transaction, Vec), SimplexError> { + let final_tx = pst.extract_tx()?; + let mut utxos: Vec = vec![]; + + for input in pst.inputs() { + utxos.push(input.witness_utxo.clone().unwrap()); + } + + Ok((final_tx, utxos)) + } +} diff --git a/crates/simplex/examples/example.rs b/crates/simplex/examples/example.rs index d5f6da7..58d1864 100644 --- a/crates/simplex/examples/example.rs +++ b/crates/simplex/examples/example.rs @@ -1,35 +1,35 @@ use simplex_macros::include_simf; -include_simf!("examples/source_simf/options.simf"); +include_simf!("examples/source_simf/p2pk.simf"); fn main() -> Result<(), String> { - let original_witness = derived_options::OptionsWitness { - path: simplicityhl::either::Either::Right(simplicityhl::either::Either::Left((true, 100, 200))), - }; + // let original_witness = derived_options::OptionsWitness { + // path: simplicityhl::either::Either::Right(simplicityhl::either::Either::Left((true, 100, 200))), + // }; - let witness_values = original_witness.build_witness(); - let recovered_witness = derived_options::OptionsWitness::from_witness(&witness_values)?; - assert_eq!(original_witness, recovered_witness); + // let witness_values = original_witness.build_witness(); + // let recovered_witness = derived_options::OptionsWitness::from_witness(&witness_values)?; + // assert_eq!(original_witness, recovered_witness); - let original_arguments = derived_options::OptionsArguments { - start_time: 0, - expiry_time: 0, - grantor_reissuance_token_asset: Default::default(), - grantor_token_asset: Default::default(), - settlement_per_contract: Default::default(), - settlement_asset_id: Default::default(), - collateral_per_contract: Default::default(), - collateral_asset_id: Default::default(), - option_reissuance_token_asset: Default::default(), - option_token_asset: Default::default(), - }; + // let original_arguments = derived_options::OptionsArguments { + // start_time: 0, + // expiry_time: 0, + // grantor_reissuance_token_asset: Default::default(), + // grantor_token_asset: Default::default(), + // settlement_per_contract: Default::default(), + // settlement_asset_id: Default::default(), + // collateral_per_contract: Default::default(), + // collateral_asset_id: Default::default(), + // option_reissuance_token_asset: Default::default(), + // option_token_asset: Default::default(), + // }; - let witness_values = original_arguments.build_arguments(); - let recovered_witness = derived_options::OptionsArguments::from_arguments(&witness_values)?; - assert_eq!(original_arguments, recovered_witness); + // let witness_values = original_arguments.build_arguments(); + // let recovered_witness = derived_options::OptionsArguments::from_arguments(&witness_values)?; + // assert_eq!(original_arguments, recovered_witness); - let _template = derived_options::get_template_program(); - let _compiled = derived_options::get_compiled_program(&original_arguments); + // let _template = derived_options::get_template_program(); + // let _compiled = derived_options::get_compiled_program(&original_arguments); Ok(()) } diff --git a/crates/simplex/examples/source_simf/p2pk.simf b/crates/simplex/examples/source_simf/p2pk.simf new file mode 100644 index 0000000..db4f27c --- /dev/null +++ b/crates/simplex/examples/source_simf/p2pk.simf @@ -0,0 +1,3 @@ +fn main() { + jet::bip_0340_verify((param::PUBLIC_KEY, jet::sig_all_hash()), witness::SIGNATURE) +} \ No newline at end of file diff --git a/crates/user/Cargo.toml b/crates/user/Cargo.toml new file mode 100644 index 0000000..6538daa --- /dev/null +++ b/crates/user/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "simplex-user" +version = "0.1.0" +edition = "2024" +description = "Simplex SDK" +license = "MIT OR Apache-2.0" +readme = "README.md" + +[lints] +workspace = true + +[dependencies] +thiserror = "2" + +simplex-sdk = { path = "../sdk" } diff --git a/crates/user/src/main.rs b/crates/user/src/main.rs new file mode 100644 index 0000000..65d8931 --- /dev/null +++ b/crates/user/src/main.rs @@ -0,0 +1,27 @@ +use simplex_sdk::presets::p2pk::P2PK; +use simplex_sdk::presets::p2pk::p2pk_build::{P2PKArguments, P2PKWitness}; + +use simplex_sdk::signer::{Signer, SignerTrait}; + +use simplex_sdk::constants::DUMMY_SIGNATURE; +use simplex_sdk::utils::tr_unspendable_key; + +fn main() { + let signer = Signer::from_seed( + "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + .as_bytes() + .try_into() + .unwrap(), + ) + .unwrap(); + + let witness = P2PKWitness { + signature: DUMMY_SIGNATURE, + }; + + // let arguments = P2PKArguments { + // public_key: signer.public_key(), + // }; + + // let p2pk = P2PK::new(&tr_unspendable_key(), &arguments); +}