diff --git a/Cargo.lock b/Cargo.lock index 80c38c8..44f9ae4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,6 +123,33 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "asteria-admin" +version = "0.1.0" +dependencies = [ + "balius-sdk", + "cargo_metadata", + "convert_case", + "hex", + "hex-literal", + "pallas-primitives", + "prettyplease", + "proc-macro2", + "quote", + "serde", + "serde_json", + "serde_with", + "syn 2.0.87", + "toml 0.8.19", + "uplc", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -142,7 +169,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -153,7 +180,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -252,7 +279,7 @@ name = "balius-macros" version = "0.1.0" dependencies = [ "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -305,7 +332,7 @@ dependencies = [ "balius-runtime", "config", "gasket", - "miette", + "miette 7.2.0", "serde", "serde_json", "serde_with", @@ -316,6 +343,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base58" version = "0.2.0" @@ -334,6 +367,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bech32" version = "0.9.1" @@ -373,6 +412,18 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blst" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -391,6 +442,38 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.1.20" @@ -452,7 +535,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -488,6 +571,21 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -524,18 +622,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305d51c180ebdc46ef61bc60c54ae6512db3bc9a05842a1f1e762e45977019ab" +checksum = "4a41b85213deedf877555a7878ca9fb680ccba8183611c4bb8030ed281b2ad83" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3247afacd9b13d620033f3190d9e49d1beefc1acb33d5604a249956c9c13709" +checksum = "690d8ae6c73748e5ce3d8fe59034dceadb8823e6c8994ba324141c5eae909b0e" dependencies = [ "serde", "serde_derive", @@ -543,9 +641,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7ca95e831c18d1356da783765c344207cbdffea91e13e47fa9327dbb2e0719" +checksum = "0ce027a7b16f8b86f60ff6819615273635186d607a0c225ee6ac340d7d18f978" dependencies = [ "bumpalo", "cranelift-bforest", @@ -566,33 +664,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "450c105fa1e51bfba4e95a86e926504a867ad5639d63f31d43fe3b7ec1f1c9ef" +checksum = "f0a2d2ab65e6cbf91f81781d8da65ec2005510f18300eff21a99526ed6785863" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5479117cd1266881479908d383086561cee37e49affbea9b1e6b594cc21cc220" +checksum = "efcff860573cf3db9ae98fbd949240d78b319df686cc306872e7fab60e9c84d7" [[package]] name = "cranelift-control" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34378804f0abfdd22c068a741cfeed86938b92375b2a96fb0b42c878e0141bfb" +checksum = "69d70e5b75c2d5541ef80a99966ccd97aaa54d2a6af19ea31759a28538e1685a" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a48cb0a194c9ba82fec35a1e492055388d89b2e3c03dee9dcf2488892be8004d" +checksum = "d21d3089714278920030321829090d9482c91e5ff2339f2f697f8425bffdcba3" dependencies = [ "cranelift-bitset", "serde", @@ -601,9 +699,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8327afc6c1c05f4be62fefce5b439fa83521c65363a322e86ea32c85e7ceaf64" +checksum = "7308482930f2a2fad4fe25a06054f6f9a4ee1ab97264308c661b037cb60001a3" dependencies = [ "cranelift-codegen", "log", @@ -613,15 +711,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b08621c00321efcfa3eee6a3179adc009e21ea8d24ca7adc3c326184bc3f48" +checksum = "ab4c59e259dab0e6958dabcc536b30845574f027ba6e5000498cdaf7e7ed2d30" [[package]] name = "cranelift-native" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51180b147c8557c1196c77b098f04140c91962e135ea152cd2fcabf40cf365c" +checksum = "d77ac3dfb61ef3159998105116acdfeaec75e4296c43ee2dcc4ea39838c0080e" dependencies = [ "cranelift-codegen", "libc", @@ -630,9 +728,9 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.110.2" +version = "0.110.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "019e3dccb7f15e0bc14f0ddc034ec608a66df8e05c9e1e16f75a7716f8461799" +checksum = "1d883f1b8d3d1dab4797407117bc8a1824f4a1fe86654aee2ee3205613f77d3e" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -730,6 +828,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -767,7 +877,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.87", ] [[package]] @@ -778,7 +888,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -796,6 +906,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "deranged" version = "0.3.11" @@ -813,7 +933,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -837,6 +959,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + [[package]] name = "ed25519-bip32" version = "0.4.1" @@ -852,6 +988,25 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + [[package]] name = "embedded-io" version = "0.4.0" @@ -901,6 +1056,16 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + [[package]] name = "filetime" version = "0.2.25" @@ -1038,7 +1203,7 @@ checksum = "d16f3b9da5c685c55178b9749f79bf6a6c62d1bd07656a0c8eeddadb80ef29c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1049,6 +1214,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -1079,6 +1245,23 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + [[package]] name = "h2" version = "0.3.26" @@ -1209,6 +1392,21 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" version = "0.2.12" @@ -1433,6 +1631,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -1495,6 +1702,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -1572,6 +1793,18 @@ dependencies = [ "rustix", ] +[[package]] +name = "miette" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" +dependencies = [ + "miette-derive 5.10.0", + "once_cell", + "thiserror", + "unicode-width", +] + [[package]] name = "miette" version = "7.2.0" @@ -1581,7 +1814,7 @@ dependencies = [ "backtrace", "backtrace-ext", "cfg-if", - "miette-derive", + "miette-derive 7.2.0", "owo-colors", "supports-color", "supports-hyperlinks", @@ -1592,6 +1825,17 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "miette-derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "miette-derive" version = "7.2.0" @@ -1600,7 +1844,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1637,7 +1881,7 @@ checksum = "bd2209fff77f705b00c737016a48e73733d7fbccb8b007194db148f03561fb70" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -1779,6 +2023,16 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + [[package]] name = "object" version = "0.36.5" @@ -1793,9 +2047,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl-probe" @@ -1871,6 +2125,7 @@ checksum = "1389b47a97864a7cb167e2392b44332930af90f6aaaac45eb2f369ccab95f4c7" dependencies = [ "hex", "minicbor", + "num-bigint", "serde", "thiserror", ] @@ -2056,6 +2311,33 @@ dependencies = [ "serde", ] +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -2089,7 +2371,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2104,6 +2386,16 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.31" @@ -2137,21 +2429,33 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pretty" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f3aa1e3ca87d3b124db7461265ac176b40c277f37e503eaa29c9c75c037846" +dependencies = [ + "arrayvec", + "log", + "typed-arena", + "unicode-segmentation", +] + [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.87", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2183,7 +2487,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn", + "syn 2.0.87", "tempfile", ] @@ -2197,7 +2501,7 @@ dependencies = [ "itertools 0.13.0", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2348,6 +2652,16 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + [[package]] name = "ring" version = "0.17.8" @@ -2469,6 +2783,38 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "secp256k1" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.0" @@ -2518,14 +2864,14 @@ checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -2581,7 +2927,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2640,6 +2986,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -2695,6 +3051,16 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sptr" version = "0.3.2" @@ -2713,6 +3079,25 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + [[package]] name = "subtle" version = "2.6.1" @@ -2742,9 +3127,20 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.85" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2780,6 +3176,16 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "telchar" +version = "0.1.0" +dependencies = [ + "balius-sdk", + "hex", + "pallas-primitives", + "serde", +] + [[package]] name = "tempfile" version = "3.13.0" @@ -2840,7 +3246,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -2853,6 +3259,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + [[package]] name = "time" version = "0.3.36" @@ -2924,7 +3339,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -3116,7 +3531,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -3179,6 +3594,12 @@ dependencies = [ "utf-8", ] +[[package]] +name = "typed-arena" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" + [[package]] name = "typenum" version = "1.17.0" @@ -3221,6 +3642,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.1.14" @@ -3239,6 +3666,38 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "uplc" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a9088742df018693bcdf85de363ba9e0554e0e39cced45b9cfab61b8cd3e2b9" +dependencies = [ + "blst", + "cryptoxide", + "hex", + "indexmap 1.9.3", + "itertools 0.10.5", + "k256", + "miette 5.10.0", + "num-bigint", + "num-integer", + "num-traits", + "once_cell", + "pallas-addresses", + "pallas-codec", + "pallas-crypto", + "pallas-primitives", + "pallas-traverse", + "peg", + "pretty", + "secp256k1", + "serde", + "serde_json", + "strum", + "strum_macros", + "thiserror", +] + [[package]] name = "url" version = "2.5.2" @@ -3405,7 +3864,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -3427,7 +3886,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3513,9 +3972,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07232e0b473af36112da7348f51e73fa8b11047a6cb546096da3812930b7c93a" +checksum = "fe501caefeb9f7b15360bdd7e47ad96e20223846f1c7db485ae5820ba5acc3d2" dependencies = [ "addr2line 0.21.0", "anyhow", @@ -3569,18 +4028,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a9c42562d879c749288d9a26acc0d95d2ca069e30c2ec2efce84461c4d62b3" +checksum = "c904a057d74bfa0ad9369a3fd99231d81ba0345f059d03c9148c3bb2abbf310f" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-cache" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d5d5aac98c8ae87cf5244495da7722e3fa022aa6f3f4fcd5e3d6e5699ce422" +checksum = "8dff4d467d6b5bd0d137f5426f45178222e40b59e49ab3a7361420262b9f00df" dependencies = [ "anyhow", "base64 0.21.7", @@ -3598,14 +4057,14 @@ dependencies = [ [[package]] name = "wasmtime-component-macro" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0c3f57c4bc96f9b4a6ff4d6cb6e837913eff32e98d09e2b6d79b5c4647b415b" +checksum = "3a96185dab1c14ffb986ff2b3a2185d15acf2b801ca7895aa35ee80328e2ce38" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser 0.212.0", @@ -3613,15 +4072,15 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1da707969bc31a565da9b32d087eb2370c95c6f2087c5539a15f2e3b27e77203" +checksum = "71a40200d42a8985edadb4007a0ed320756cbe28065b83e0027e39524c1b1b22" [[package]] name = "wasmtime-cranelift" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62cb6135ec46994299be711b78b03acaa9480de3715f827d450f0c947a84977c" +checksum = "b099ef9b7808fa8d18cad32243e78e9c07a4a8aacfa913d88dc08704b1643c49" dependencies = [ "anyhow", "cfg-if", @@ -3643,9 +4102,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bcaa3b42a0718e9123da7fb75e8e13fc95df7db2a7e32e2f2f4f0d3333b7d6f" +checksum = "e2f1765f6ca1a166927bee13ad4aed7bf18269f34c0cd7d6d523889a0b52e6ee" dependencies = [ "anyhow", "cpp_demangle", @@ -3670,9 +4129,9 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1c805515f4bc157f70f998038951009d21a19c1ef8c5fbb374a11b1d56672" +checksum = "047be22a9ebe0343e583edf52b89b60a87e37bec1bc71dc127d3c7fb287c4471" dependencies = [ "anyhow", "cc", @@ -3685,9 +4144,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-debug" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118e141e52f3898a531a612985bd09a5e05a1d646cad2f30a3020b675c21cd49" +checksum = "2383b29fd973222293b5ff562f81a67c7e558b669685ca13f8cb80d04ea24b2d" dependencies = [ "object", "once_cell", @@ -3697,9 +4156,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfee42dac5148fc2664ab1f5cb8d7fa77a28d1a2cf1d9483abc2c3d751a58b9" +checksum = "1e1a826e4ccd0803b2f7463289cad104f40d09d06bc8acf1a614230a47b4d96f" dependencies = [ "anyhow", "cfg-if", @@ -3709,15 +4168,15 @@ dependencies = [ [[package]] name = "wasmtime-slab" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42eb8f6515708ec67974998c3e644101db4186308985f5ef7c2ef324ff33c948" +checksum = "f92a137c17c992eb5eaacfa0f0590353471e49dbb4bdbdf9cf7536d66109e63a" [[package]] name = "wasmtime-types" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046873fb8fb3e9652f3fd76fe99c8c8129007695c3d73b2e307fdae40f6e324c" +checksum = "a6072ac3267866d99ca726b6a4f157df9b733aac8082e902d527368f07c303ba" dependencies = [ "anyhow", "cranelift-entity", @@ -3729,20 +4188,20 @@ dependencies = [ [[package]] name = "wasmtime-versioned-export-macros" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99c02af2e9dbeb427304d1a08787d70ed0dbfec1af2236616f84c9f1f03e7969" +checksum = "a2bde986038b819bc43a21fef0610aeb47aabfe3ea09ca3533a7b81023b84ec6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] name = "wasmtime-winch" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ceddc47a49af10908a288fdfdc296ab3932062cab62a785e3705bbb3709c59" +checksum = "beb1abdc26ddf1d7c819ea0fcbfccb0808410549d28bb3154c9bdb7d11fbcc58" dependencies = [ "anyhow", "cranelift-codegen", @@ -3757,9 +4216,9 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "23.0.2" +version = "23.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f528f8b8a2376a3dacaf497d960216dd466d324425361e1e00e26de0a7705c" +checksum = "8f88e49a9b81746ec0cede5505e40a4012c92cb5054cd7ef4300dc57c36f26b1" dependencies = [ "anyhow", "heck 0.4.1", @@ -3822,9 +4281,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a41b67a37ea74e83c38ef495cc213aba73385236b1deee883dc869e835003b9" +checksum = "a666bf2cdb838e68b9b8370d7ebf8806b87ccc0d89a634bfc9ed8ffca1f19591" dependencies = [ "anyhow", "cranelift-codegen", @@ -4043,7 +4502,7 @@ dependencies = [ "heck 0.5.0", "indexmap 2.6.0", "prettyplease", - "syn", + "syn 2.0.87", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -4059,7 +4518,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.87", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -4148,7 +4607,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.87", ] [[package]] @@ -4156,6 +4615,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] [[package]] name = "zstd" diff --git a/balius-sdk/src/txbuilder/asset_math.rs b/balius-sdk/src/txbuilder/asset_math.rs index f564ac1..77c8165 100644 --- a/balius-sdk/src/txbuilder/asset_math.rs +++ b/balius-sdk/src/txbuilder/asset_math.rs @@ -143,6 +143,13 @@ pub fn subtract_value(lhs: &Value, rhs: &Value) -> Result { } } +pub fn value_coin(value: &Value) -> u64 { + match value { + Value::Coin(x) => *x, + Value::Multiasset(x, _) => *x, + } +} + fn try_to_mint( assets: conway::Multiasset, f: F, diff --git a/balius-sdk/src/txbuilder/build.rs b/balius-sdk/src/txbuilder/build.rs index 5c71751..ebe6049 100644 --- a/balius-sdk/src/txbuilder/build.rs +++ b/balius-sdk/src/txbuilder/build.rs @@ -1,6 +1,6 @@ -use std::{collections::HashMap, ops::Deref as _}; - use pallas_traverse::MultiEraValue; +use std::sync::Arc; +use std::{collections::HashMap, ops::Deref as _}; use super::{ asset_math, primitives, BuildContext, BuildError, Ledger, PParams, TxExpr, TxoRef, UtxoPattern, @@ -83,7 +83,7 @@ impl crate::txbuilder::Ledger for ExtLedgerFacade { } } -pub fn build(tx: T, ledger: L) -> Result +pub fn build(mut tx: T, ledger: L) -> Result where T: TxExpr, L: Ledger + 'static, @@ -94,8 +94,9 @@ where total_input: primitives::Value::Coin(0), spent_output: primitives::Value::Coin(0), estimated_fee: 0, - ledger: Box::new(ledger), + ledger: Arc::new(Box::new(ledger)), tx_body: None, + parent_output: None, }; // Build the raw transaction, so we have the info needed to estimate fees and @@ -120,6 +121,10 @@ where // Now that we know the inputs/outputs/fee, build the "final" (unsigned)tx let body = tx.eval_body(&ctx)?; ctx.tx_body = Some(body); + for _ in 0..3 { + let body = tx.eval_body(&ctx)?; + ctx.tx_body = Some(body); + } let wit = tx.eval_witness_set(&ctx).unwrap(); diff --git a/balius-sdk/src/txbuilder/dsl.rs b/balius-sdk/src/txbuilder/dsl.rs index 3175cb9..d912bca 100644 --- a/balius-sdk/src/txbuilder/dsl.rs +++ b/balius-sdk/src/txbuilder/dsl.rs @@ -1,6 +1,7 @@ use pallas_primitives::conway; use pallas_traverse::MultiEraOutput; use serde::{Deserialize, Serialize}; +use serde_json::from_str; use serde_with::{serde_as, DisplayFromStr}; use std::collections::{HashMap, HashSet}; @@ -25,7 +26,12 @@ impl UtxoSet { } pub fn iter(&self) -> impl Iterator)> { - self.0.iter().map(|(k, v)| (k, MultiEraOutput::decode(pallas_traverse::Era::Conway, v).unwrap())) + self.0.iter().map(|(k, v)| { + ( + k, + MultiEraOutput::decode(pallas_traverse::Era::Conway, v).unwrap(), + ) + }) } pub fn refs(&self) -> impl Iterator { @@ -51,21 +57,6 @@ impl From> for UtxoSet { } } -impl Ledger for UtxoSet { - fn read_utxos(&self, refs: &[TxoRef]) -> Result { - let out: HashMap<_, _> = refs - .iter() - .filter_map(|r| self.0.get(r).map(|v| (r.clone(), v.clone()))) - .collect(); - - Ok(UtxoSet(out)) - } - - fn search_utxos(&self, _pattern: &UtxoPattern) -> Result { - todo!() - } -} - #[derive(Clone, Default, Serialize, Deserialize)] pub struct UtxoPattern { pub address: Option, @@ -338,11 +329,36 @@ impl ValueExpr for Option { } } +// calculate min utxo lovelace according to spec +// https://cips.cardano.org/cip/CIP-55 pub struct MinUtxoLovelace; impl ValueExpr for MinUtxoLovelace { fn eval(&self, ctx: &BuildContext) -> Result { - Ok(conway::Value::Coin(ctx.pparams.min_utxo_value)) + let parent = match &ctx.parent_output { + Some(x) => x, + None => return Ok(conway::Value::Coin(0)), + }; + + let serialized = pallas_codec::minicbor::to_vec(parent).unwrap(); + let min_lovelace = (160u64 + serialized.len() as u64) * ctx.pparams.coins_per_utxo_byte; + let current_value = match parent { + conway::PseudoTransactionOutput::PostAlonzo(x) => &x.value, + _ => unimplemented!(), + }; + + let current_lovelace = asset_math::value_coin(current_value); + + if current_lovelace >= min_lovelace { + return Ok(current_value.clone()); + } + + let optimized = asset_math::value_saturating_add_coin( + current_value.clone(), + (min_lovelace - current_lovelace) as i64, + ); + + Ok(optimized) } } @@ -367,6 +383,18 @@ pub trait AddressExpr: 'static + Send + Sync { fn eval(&self, ctx: &BuildContext) -> Result; } +impl AddressExpr for &'static str { + fn eval(&self, _ctx: &BuildContext) -> Result { + Address::from_bech32(*self).map_err(|_| BuildError::MalformedAddress) + } +} + +impl AddressExpr for String { + fn eval(&self, _ctx: &BuildContext) -> Result { + Address::from_bech32(self).map_err(|_| BuildError::MalformedAddress) + } +} + impl AddressExpr for Address { fn eval(&self, _ctx: &BuildContext) -> Result { Ok(self.clone()) @@ -398,7 +426,7 @@ where } pub trait OutputExpr: 'static + Send + Sync { - fn eval(&self, ctx: &BuildContext) -> Result; + fn eval(&mut self, ctx: &BuildContext) -> Result; } pub struct ChangeAddress(pub UtxoSource); @@ -439,7 +467,7 @@ impl ValueExpr for TotalChange { pub struct FeeChangeReturn(pub UtxoSource); impl OutputExpr for FeeChangeReturn { - fn eval(&self, ctx: &BuildContext) -> Result { + fn eval(&mut self, ctx: &BuildContext) -> Result { OutputBuilder::new() .address(ChangeAddress(self.0.clone())) .with_value(TotalChange) @@ -574,12 +602,29 @@ impl MintExpr for MintBuilder { } } +pub trait ScriptExpr: 'static + Send + Sync { + fn eval(&self, ctx: &BuildContext) -> Result; +} + +impl ScriptExpr for conway::ScriptRef { + fn eval(&self, _ctx: &BuildContext) -> Result { + Ok(self.clone()) + } +} + +impl ScriptExpr for conway::PlutusScript<3> { + fn eval(&self, _ctx: &BuildContext) -> Result { + Ok(conway::ScriptRef::PlutusV3Script(self.clone())) + } +} + #[derive(Default)] pub struct OutputBuilder { + pub previous: Option, pub address: Option>, pub values: Vec>, + pub script: Option>, // TODO: inline / hash datum - // TODO: script } impl OutputBuilder { @@ -596,42 +641,65 @@ impl OutputBuilder { self.values.push(Box::new(value)); self } + + pub fn with_script(mut self, script: impl ScriptExpr + 'static) -> Self { + self.script = Some(Box::new(script)); + self + } } impl OutputExpr for OutputBuilder { - fn eval(&self, ctx: &BuildContext) -> Result { - Ok(conway::TransactionOutput::PostAlonzo( - conway::PostAlonzoTransactionOutput { - address: self.address.eval(ctx)?.to_vec().into(), - value: self.values.eval(ctx)?, - datum_option: None, // TODO - script_ref: None, // TODO - }, - )) + fn eval(&mut self, ctx: &BuildContext) -> Result { + let ctx = match &self.previous { + Some(x) => &ctx.with_parent_output(x.clone()), + None => ctx, + }; + + let value = self.values.eval(ctx)?; + + let address = self.address.eval(ctx)?.to_vec().into(); + + let script_ref = self + .script + .as_ref() + .map(|s| s.eval(ctx)) + .transpose()? + .map(pallas_codec::utils::CborWrap); + + let output = conway::TransactionOutput::PostAlonzo(conway::PostAlonzoTransactionOutput { + value, + address, + script_ref, + datum_option: None, // TODO + }); + + self.previous = Some(output.clone()); + + Ok(output) } } pub trait TxExpr: 'static + Send + Sync { - fn eval_body(&self, ctx: &BuildContext) -> Result; - fn eval_witness_set(&self, ctx: &BuildContext) -> Result; + fn eval_body(&mut self, ctx: &BuildContext) -> Result; + fn eval_witness_set(&mut self, ctx: &BuildContext) -> Result; } -impl TxExpr for &'static T { - fn eval_body(&self, ctx: &BuildContext) -> Result { +impl TxExpr for &'static mut T { + fn eval_body(&mut self, ctx: &BuildContext) -> Result { (**self).eval_body(ctx) } - fn eval_witness_set(&self, ctx: &BuildContext) -> Result { + fn eval_witness_set(&mut self, ctx: &BuildContext) -> Result { (**self).eval_witness_set(ctx) } } impl TxExpr for Box { - fn eval_body(&self, ctx: &BuildContext) -> Result { + fn eval_body(&mut self, ctx: &BuildContext) -> Result { (**self).eval_body(ctx) } - fn eval_witness_set(&self, ctx: &BuildContext) -> Result { + fn eval_witness_set(&mut self, ctx: &BuildContext) -> Result { (**self).eval_witness_set(ctx) } } @@ -641,9 +709,8 @@ pub struct TxBuilder { pub reference_inputs: Vec>, pub inputs: Vec>, pub outputs: Vec>, - // pub outputs: Option>, - // pub fee: Option, pub mint: Vec>, + pub fee: Option, // pub valid_from_slot: Option, // pub invalid_from_slot: Option, // pub network_id: Option, @@ -688,10 +755,15 @@ impl TxBuilder { self.mint.push(Box::new(mint)); self } + + pub fn with_fee(mut self, fee: u64) -> Self { + self.fee = Some(fee); + self + } } impl TxExpr for TxBuilder { - fn eval_body(&self, ctx: &BuildContext) -> Result { + fn eval_body(&mut self, ctx: &BuildContext) -> Result { let out = conway::TransactionBody { inputs: self .inputs @@ -704,7 +776,7 @@ impl TxExpr for TxBuilder { .into(), outputs: self .outputs - .iter() + .iter_mut() .map(|o| o.eval(ctx)) .collect::, _>>()?, fee: ctx.estimated_fee, @@ -751,7 +823,7 @@ impl TxExpr for TxBuilder { Ok(out) } - fn eval_witness_set(&self, ctx: &BuildContext) -> Result { + fn eval_witness_set(&mut self, ctx: &BuildContext) -> Result { let out = conway::WitnessSet { redeemer: { let redeemers: Vec<_> = self diff --git a/balius-sdk/src/txbuilder/mod.rs b/balius-sdk/src/txbuilder/mod.rs index 8d103b0..317703a 100644 --- a/balius-sdk/src/txbuilder/mod.rs +++ b/balius-sdk/src/txbuilder/mod.rs @@ -1,4 +1,5 @@ pub(crate) mod asset_math; +pub mod plutus; #[derive(Debug, thiserror::Error)] pub enum BuildError { @@ -12,6 +13,8 @@ pub enum BuildError { EmptyUtxoSet, #[error("Transaction has no inputs")] MalformedScript, + #[error("Could not decode address")] + MalformedAddress, #[error("Could not decode datum bytes")] MalformedDatum, #[error("Invalid bytes length for datum hash")] @@ -44,6 +47,8 @@ impl From for BuildError { } } +use std::sync::Arc; + pub use pallas_codec as codec; pub use pallas_primitives::conway as primitives; pub use utxorpc_spec::utxorpc::v1alpha::cardano::PParams; @@ -54,15 +59,25 @@ pub trait Ledger { fn read_params(&self) -> Result; } +#[derive(Clone)] pub struct BuildContext { pub network: primitives::NetworkId, pub pparams: PParams, pub total_input: primitives::Value, pub spent_output: primitives::Value, pub estimated_fee: u64, - pub ledger: Box, + pub ledger: Arc>, pub tx_body: Option, + pub parent_output: Option, +} + +impl BuildContext { + pub fn with_parent_output(&self, output: primitives::TransactionOutput) -> Self { + let mut ctx = self.clone(); + ctx.parent_output = Some(output); + ctx + } } mod build; diff --git a/balius-sdk/src/txbuilder/plutus.rs b/balius-sdk/src/txbuilder/plutus.rs new file mode 100644 index 0000000..0a1f111 --- /dev/null +++ b/balius-sdk/src/txbuilder/plutus.rs @@ -0,0 +1,51 @@ +//use crate::txbuilder::primitives::{BoundedBytes, PlutusData}; + +pub use pallas_codec::utils::Int; +pub use pallas_primitives::{BigInt, BoundedBytes, Constr, MaybeIndefArray, PlutusData}; + +pub trait IntoData { + fn into_data(&self) -> PlutusData; +} + +#[macro_export] +macro_rules! constr { + ($tag:expr, $($field:expr),*) => { + { + use $crate::txbuilder::plutus::{Constr, PlutusData, MaybeIndefArray}; + + let inner = Constr { + tag: 121 + $tag, + any_constructor: None, + fields: MaybeIndefArray::Def(vec![$($field.into_data()),*]), + }; + + PlutusData::Constr(inner) + } + }; +} + +impl IntoData for [u8; N] { + fn into_data(&self) -> PlutusData { + PlutusData::BoundedBytes(BoundedBytes::from(self.to_vec())) + } +} + +impl IntoData for Vec { + fn into_data(&self) -> PlutusData { + PlutusData::BoundedBytes(BoundedBytes::from(self.clone())) + } +} + +impl IntoData for u64 { + fn into_data(&self) -> PlutusData { + PlutusData::BigInt(BigInt::Int(Int::from(*self as i64))) + } +} + +mod test { + use super::*; + + fn construct_constr() { + let x = constr!(0, b"abc", vec![1, 2, 3]); + } +}