diff --git a/.gitignore b/.gitignore index d03086c8a..e92749cc0 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ genesis.dat *.sqlite3 *.sqlite3-shm *.sqlite3-wal +db/ diff --git a/Cargo.lock b/Cargo.lock index 8ca119d6d..e873dd380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,223 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "actix-codec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +dependencies = [ + "bitflags 2.5.0", + "bytes", + "futures-core", + "futures-sink", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "actix-cors" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9e772b3bcafe335042b5db010ab7c09013dad6eac4915c91d8d50902769f331" +dependencies = [ + "actix-utils", + "actix-web", + "derive_more", + "futures-util", + "log", + "once_cell", + "smallvec", +] + +[[package]] +name = "actix-files" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0bdd6ff79de7c9a021f5d9ea79ce23e108d8bfc9b49b5b4a2cf6fad5a35212" +dependencies = [ + "actix-http", + "actix-service", + "actix-utils", + "actix-web", + "bitflags 2.5.0", + "bytes", + "derive_more", + "futures-core", + "http-range", + "log", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "v_htmlescape", +] + +[[package]] +name = "actix-http" +version = "3.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743" +dependencies = [ + "actix-codec", + "actix-rt", + "actix-service", + "actix-utils", + "ahash", + "base64", + "bitflags 2.5.0", + "brotli", + "bytes", + "bytestring", + "derive_more", + "encoding_rs", + "flate2", + "futures-core", + "h2", + "http", + "httparse", + "httpdate", + "itoa", + "language-tags", + "local-channel", + "mime", + "percent-encoding", + "pin-project-lite", + "rand", + "sha1", + "smallvec", + "tokio", + "tokio-util", + "tracing", + "zstd", +] + +[[package]] +name = "actix-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +dependencies = [ + "quote", + "syn 2.0.55", +] + +[[package]] +name = "actix-router" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511" +dependencies = [ + "bytestring", + "http", + "regex", + "serde", + "tracing", +] + +[[package]] +name = "actix-rt" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +dependencies = [ + "futures-core", + "tokio", +] + +[[package]] +name = "actix-server" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +dependencies = [ + "actix-rt", + "actix-service", + "actix-utils", + "futures-core", + "futures-util", + "mio", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "actix-service" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +dependencies = [ + "futures-core", + "paste", + "pin-project-lite", +] + +[[package]] +name = "actix-utils" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" +dependencies = [ + "local-waker", + "pin-project-lite", +] + +[[package]] +name = "actix-web" +version = "4.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984" +dependencies = [ + "actix-codec", + "actix-http", + "actix-macros", + "actix-router", + "actix-rt", + "actix-server", + "actix-service", + "actix-utils", + "actix-web-codegen", + "ahash", + "bytes", + "bytestring", + "cfg-if", + "cookie", + "derive_more", + "encoding_rs", + "futures-core", + "futures-util", + "itoa", + "language-tags", + "log", + "mime", + "once_cell", + "pin-project-lite", + "regex", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "socket2", + "time", + "url", +] + +[[package]] +name = "actix-web-codegen" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +dependencies = [ + "actix-router", + "proc-macro2", + "quote", + "syn 2.0.55", +] + [[package]] name = "addr2line" version = "0.21.0" @@ -24,6 +241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -31,13 +249,28 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.16" @@ -109,9 +342,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247" [[package]] name = "arrayref" @@ -125,6 +358,15 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -144,18 +386,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -169,9 +411,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" [[package]] name = "axum" @@ -220,9 +462,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" dependencies = [ "addr2line", "cc", @@ -260,7 +502,7 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -271,7 +513,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 2.0.55", ] [[package]] @@ -297,15 +539,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -323,6 +565,27 @@ dependencies = [ "generic-array", ] +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bumpalo" version = "3.15.4" @@ -331,15 +594,24 @@ checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "bytestring" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +dependencies = [ + "bytes", +] [[package]] name = "cc" @@ -368,9 +640,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.35" +version = "0.4.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf5903dcbc0a39312feb77df2ff4c76387d591b9fc7b04a238dcf8bb62639a" +checksum = "8a0d04d43504c61aa6c7531f1871dd0d418d91130162063b789da00fd7057a5e" dependencies = [ "android-tzdata", "iana-time-zone", @@ -393,9 +665,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.2" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b230ab84b0ffdf890d5a10abdbc8b83ae1c4918275daea1ab8801f71536b2651" +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" dependencies = [ "clap_builder", "clap_derive", @@ -415,14 +687,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.0" +version = "4.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -437,12 +709,41 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "comfy-table" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c64043d6c7b7a4c58e39e7efccfdea7b93d885a795d0c054a69dbbf4dd52686" +dependencies = [ + "crossterm", + "strum", + "strum_macros", + "unicode-width", +] + [[package]] name = "constant_time_eq" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -458,6 +759,62 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.5.0", + "crossterm_winapi", + "libc", + "parking_lot", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + [[package]] name = "crypto-common" version = "0.1.6" @@ -509,6 +866,28 @@ dependencies = [ "deadpool-runtime", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -546,6 +925,15 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -562,6 +950,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -576,15 +970,15 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" [[package]] name = "figment" -version = "0.10.14" +version = "0.10.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b6e5bc7bd59d60d0d45a6ccab6cf0f4ce28698fb4e81e750ddf229c9b824026" +checksum = "7270677e7067213e04f323b55084586195f18308cd7546cfac9f873344ccceb6" dependencies = [ "atomic", "parking_lot", @@ -602,12 +996,31 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures-channel" version = "0.3.30" @@ -645,6 +1058,7 @@ dependencies = [ "futures-task", "pin-project-lite", "pin-utils", + "slab", ] [[package]] @@ -682,9 +1096,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "4fbd2820c5e49886948654ab546d0688ff24530286bdcf8fca3cefb16d4618eb" dependencies = [ "bytes", "fnv", @@ -692,7 +1106,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.5", + "indexmap 2.2.6", "slab", "tokio", "tokio-util", @@ -730,6 +1144,12 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -773,6 +1193,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.8.0" @@ -844,6 +1270,16 @@ dependencies = [ "cc", ] +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -856,9 +1292,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -896,9 +1332,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" @@ -927,6 +1363,12 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "language-tags" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" + [[package]] name = "lazy_static" version = "1.4.0" @@ -967,7 +1409,7 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "libc", "redox_syscall", ] @@ -990,6 +1432,23 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +[[package]] +name = "local-channel" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8" +dependencies = [ + "futures-core", + "futures-sink", + "local-waker", +] + +[[package]] +name = "local-waker" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" + [[package]] name = "lock_api" version = "0.4.11" @@ -1026,7 +1485,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "syn", + "syn 2.0.55", ] [[package]] @@ -1055,9 +1514,9 @@ checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "miden-air" @@ -1081,6 +1540,32 @@ dependencies = [ "tracing", ] +[[package]] +name = "miden-client" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9cd9db9681b986edd6775559ebb79f90fb124af68dc9ccc69f3f2a88d61b960" +dependencies = [ + "async-trait", + "clap", + "comfy-table", + "figment", + "lazy_static", + "miden-lib", + "miden-node-proto 0.1.0", + "miden-objects", + "miden-tx", + "rand", + "rusqlite", + "rusqlite_migration", + "serde", + "serde_json", + "tokio", + "tonic", + "tracing", + "tracing-subscriber", +] + [[package]] name = "miden-core" version = "0.8.0" @@ -1094,14 +1579,14 @@ dependencies = [ [[package]] name = "miden-crypto" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f42129adccef0debcdfcadb1a34323b765fe5895303a71bad820cc67ad2a1db7" +checksum = "a186bed6fd782e0af049164f7e3b565aabf30227ce75e3405550930eebf14627" dependencies = [ "blake3", "cc", "glob", - "libc", + "serde", "winter-crypto", "winter-math", "winter-utils", @@ -1129,7 +1614,7 @@ dependencies = [ "miden-node-block-producer", "miden-node-rpc", "miden-node-store", - "miden-node-utils", + "miden-node-utils 0.2.0", "miden-objects", "serde", "tokio", @@ -1147,10 +1632,10 @@ dependencies = [ "figment", "itertools 0.12.1", "miden-air", - "miden-node-proto", + "miden-node-proto 0.2.0", "miden-node-store", "miden-node-test-macro", - "miden-node-utils", + "miden-node-utils 0.2.0", "miden-objects", "miden-processor", "miden-stdlib", @@ -1166,12 +1651,51 @@ dependencies = [ "winterfell", ] +[[package]] +name = "miden-node-faucet" +version = "0.1.0" +dependencies = [ + "actix-cors", + "actix-files", + "actix-web", + "async-mutex", + "clap", + "derive_more", + "figment", + "miden-client", + "miden-lib", + "miden-node-proto 0.2.0", + "miden-node-utils 0.2.0", + "miden-objects", + "serde", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "miden-node-proto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdcb2af46af307aaf5d80e940200c08e86d7d7491854f5a9cc33bb3ada7e757" +dependencies = [ + "hex", + "miden-node-utils 0.1.0", + "miden-objects", + "miette", + "prost", + "prost-build", + "protox", + "thiserror", + "tonic", + "tonic-build", +] + [[package]] name = "miden-node-proto" version = "0.2.0" dependencies = [ "hex", - "miden-node-utils", + "miden-node-utils 0.2.0", "miden-objects", "miette", "proptest", @@ -1193,9 +1717,9 @@ dependencies = [ "figment", "hex", "miden-node-block-producer", - "miden-node-proto", + "miden-node-proto 0.2.0", "miden-node-store", - "miden-node-utils", + "miden-node-utils 0.2.0", "miden-objects", "miden-tx", "prost", @@ -1218,8 +1742,8 @@ dependencies = [ "figment", "hex", "miden-lib", - "miden-node-proto", - "miden-node-utils", + "miden-node-proto 0.2.0", + "miden-node-utils 0.2.0", "miden-objects", "once_cell", "prost", @@ -1239,7 +1763,22 @@ name = "miden-node-test-macro" version = "0.1.0" dependencies = [ "quote", - "syn", + "syn 2.0.55", +] + +[[package]] +name = "miden-node-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd92792c7a90a2ea6e7e7e2f1c84d675b9ba84385cbf95ce04ab1f04cf46a1f" +dependencies = [ + "anyhow", + "figment", + "itertools 0.12.1", + "miden-objects", + "serde", + "tracing", + "tracing-subscriber", ] [[package]] @@ -1267,6 +1806,7 @@ dependencies = [ "miden-crypto", "miden-processor", "miden-verifier", + "serde", "winter-rand-utils", ] @@ -1356,7 +1896,7 @@ checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1365,6 +1905,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1387,6 +1937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", + "log", "wasi", "windows-sys 0.48.0", ] @@ -1417,6 +1968,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" version = "0.2.18" @@ -1455,7 +2012,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1514,11 +2071,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pear" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ccca0f6c17acc81df8e242ed473ec144cbf5c98037e69aa6d144780aad103c8" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" dependencies = [ "inlinable_string", "pear_codegen", @@ -1527,14 +2090,14 @@ dependencies = [ [[package]] name = "pear_codegen" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e22670e8eb757cff11d6c199ca7b987f352f0346e0be4dd23869ec72cb53c77" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1550,7 +2113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.2.5", + "indexmap 2.2.6", ] [[package]] @@ -1570,7 +2133,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1591,6 +2154,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1599,12 +2168,12 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.55", ] [[package]] @@ -1618,9 +2187,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -1633,7 +2202,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", "version_check", "yansi", ] @@ -1646,13 +2215,13 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.2", + "bitflags 2.5.0", "lazy_static", "num-traits", "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", "rusty-fork", "tempfile", "unarray", @@ -1675,7 +2244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", - "heck", + "heck 0.4.1", "itertools 0.11.0", "log", "multimap", @@ -1685,7 +2254,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn", + "syn 2.0.55", "tempfile", "which", ] @@ -1700,7 +2269,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -1806,6 +2375,26 @@ dependencies = [ "rand_core", ] +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -1828,14 +2417,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.3" +version = "1.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" dependencies = [ "aho-corasick", "memchr", "regex-automata 0.4.6", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -1855,7 +2444,7 @@ checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax 0.8.3", ] [[package]] @@ -1866,9 +2455,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rusqlite" @@ -1876,7 +2465,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -1906,13 +2495,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.5.0", "errno", "libc", "linux-raw-sys", @@ -1949,6 +2547,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + [[package]] name = "serde" version = "1.0.197" @@ -1966,14 +2570,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -1989,6 +2593,29 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha3" version = "0.10.8" @@ -2014,6 +2641,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + [[package]] name = "slab" version = "0.4.9" @@ -2025,9 +2661,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smawk" @@ -2051,6 +2687,25 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.55", +] + [[package]] name = "supports-color" version = "3.0.0" @@ -2074,9 +2729,20 @@ checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" [[package]] name = "syn" -version = "2.0.52" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0" dependencies = [ "proc-macro2", "quote", @@ -2124,22 +2790,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2152,18 +2818,66 @@ dependencies = [ "once_cell", ] +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" -version = "1.36.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", "bytes", "libc", "mio", "num_cpus", + "parking_lot", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", @@ -2187,14 +2901,14 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -2217,14 +2931,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af06656561d28735e9c1cd63dfd57132c8155426aa6af24f36a00a351f88c48e" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.7", + "toml_edit 0.22.9", ] [[package]] @@ -2242,18 +2956,18 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.7" +version = "0.22.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18769cd1cec395d70860ceb4d932812a0b4d06b1a4bb336745a4d21b9496e992" +checksum = "8e40bb779c5187258fd7aad0eb68cb8706a0a81fa712fbea808ab43c4b8374c4" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.2.6", "serde", "serde_spanned", "toml_datetime", @@ -2297,7 +3011,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2338,6 +3052,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2351,7 +3066,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", ] [[package]] @@ -2446,6 +3161,21 @@ dependencies = [ "version_check", ] +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -2458,18 +3188,44 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "v_htmlescape" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" + [[package]] name = "valuable" version = "0.1.0" @@ -2533,7 +3289,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.55", "wasm-bindgen-shared", ] @@ -2555,7 +3311,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2761,9 +3517,9 @@ dependencies = [ [[package]] name = "winter-air" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89fcd28faa34e8e4d1e03ee60b6ac6629cc01b344093cb3a4d45d84ef9bb3832" +checksum = "07390d3217bdd6410c1ef43f3d06510d3a424e7259b371fccbc7cd79a9c00a15" dependencies = [ "libm", "winter-crypto", @@ -2774,9 +3530,9 @@ dependencies = [ [[package]] name = "winter-crypto" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118a3228b6b2424df48d25941a85ad4b7a69fe877d31d8b5ed57935720ebd152" +checksum = "6aea508aa819e934c837f24bb706e69d890b9be2db82da39cde887e6f0a37246" dependencies = [ "blake3", "sha3", @@ -2786,9 +3542,9 @@ dependencies = [ [[package]] name = "winter-fri" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644b37fc9093fec78c272f3f594dd205ec21dd35d5722001b1d24383693bb6c6" +checksum = "660f47c5c9f5872940ac07a724b1df426590dcffad26776e0528466f2e3095f8" dependencies = [ "winter-crypto", "winter-math", @@ -2797,18 +3553,19 @@ dependencies = [ [[package]] name = "winter-math" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0dff7a27296595fbdc653751b3718acd9518288df646e860ecb48915ff0d6c3" +checksum = "a0c91111b368b08c5a76009514e9b6d26af41fbb28604ea77a249282323b64d5" dependencies = [ + "serde", "winter-utils", ] [[package]] name = "winter-prover" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ec0e854d35d5d35ae778ea2e5178f81507806071294104f3e1a807beb2554c" +checksum = "170c1ef487df609625580156ea0350c500aeabb3f429dc88cfe800c4b7893edf" dependencies = [ "tracing", "winter-air", @@ -2820,9 +3577,9 @@ dependencies = [ [[package]] name = "winter-rand-utils" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "042a5754bc7bbd2d0741f6658885c7567a4fbab52ad2efec9b797a82bfca7300" +checksum = "8b19ce50e688442052e957a69d72b8057d72ae8f03a7aea7c2538e11c76b2583" dependencies = [ "rand", "winter-utils", @@ -2830,15 +3587,18 @@ dependencies = [ [[package]] name = "winter-utils" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefd8f1108fd48c2516c316e0b42b78e7070e116d1373322bf58993c68cf036" +checksum = "ab6efccf6efa6fd0a80784f3894bc372ada67cc30d9c017fc907d4c0cdce86e7" +dependencies = [ + "rayon", +] [[package]] name = "winter-verifier" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4135f28670385a66d2c80943d7998d383660ff63f8c9f544555d9849eb621ba0" +checksum = "6f817a425ca4aa7acefb356601798d0b86b9c0e383b397af69e7e5e97f5b4008" dependencies = [ "winter-air", "winter-crypto", @@ -2849,9 +3609,9 @@ dependencies = [ [[package]] name = "winterfell" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a4f653cb8281d965ec77b87354f1a87da3bc0e15b3e40262a1e64fa93a947b3" +checksum = "be0a6acdc1fd126ba950b0e5bfaafd9f294fc157b285f35541603164054e9358" dependencies = [ "winter-prover", "winter-verifier", @@ -2859,9 +3619,9 @@ dependencies = [ [[package]] name = "yansi" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2861d76f58ec8fc95708b9b1e417f7b12fd72ad33c01fa6886707092dea0d3" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" @@ -2880,5 +3640,33 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.55", +] + +[[package]] +name = "zstd" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.10+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +dependencies = [ + "cc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index 81310bd4a..8c7fc933a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "store", "utils", "test-macro", + "faucet" ] resolver = "2" diff --git a/faucet/Cargo.toml b/faucet/Cargo.toml new file mode 100644 index 000000000..50fc69be6 --- /dev/null +++ b/faucet/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "miden-node-faucet" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[features] +# Makes `make-genesis` subcommand run faster. Is only suitable for testing. +testing = ["miden-client/testing"] + +[dependencies] +actix-web = "4" +actix-files = "0.6.5" +actix-cors = "0.7.0" +derive_more = "0.99.17" +figment = { version = "0.10", features = ["toml", "env"] } +miden-lib = { workspace = true } +miden-client = { version = "0.1.0", features = ["concurrent"] } +miden-node-proto = { path = "../proto", version = "0.2" } +miden-node-utils = { path = "../utils", version = "0.2" } +miden-objects = { workspace = true } +serde = { version = "1.0", features = ["derive"] } +clap = { version = "4.5.1", features = ["derive"] } +async-mutex = "1.4.0" +tracing = { workspace = true } +tracing-subscriber = { workspace = true } diff --git a/faucet/miden-faucet.toml b/faucet/miden-faucet.toml new file mode 100644 index 000000000..de62c291b --- /dev/null +++ b/faucet/miden-faucet.toml @@ -0,0 +1,3 @@ +endpoint = { protocol = "http", host = "localhost", port = 8080 } +rpc_url = "http://localhost:57291" +database_filepath = "miden-faucet.sqlite3" diff --git a/faucet/src/cli.rs b/faucet/src/cli.rs new file mode 100644 index 000000000..eeeae7252 --- /dev/null +++ b/faucet/src/cli.rs @@ -0,0 +1,54 @@ +use std::path::PathBuf; + +use clap::{Parser, Subcommand}; + +use crate::config; + +#[derive(Parser, Debug)] +#[clap(name = "Miden Faucet")] +#[clap(about = "A command line tool for the Miden faucet", long_about = None)] +pub struct Cli { + #[clap(subcommand)] + pub command: Commands, +} + +#[derive(Subcommand, Debug)] +pub enum Commands { + /// Initialise a new Miden faucet from arguments + Init(InitArgs), + + /// Imports an existing Miden faucet from specified file + Import(ImportArgs), +} + +#[derive(Parser, Debug)] +pub struct InitArgs { + #[clap(short, long)] + pub token_symbol: String, + + #[clap(short, long)] + pub decimals: u8, + + #[clap(short, long)] + pub max_supply: u64, + + /// Amount of assets to be dispersed by the faucet on each request + #[clap(short, long)] + pub asset_amount: u64, + + #[clap(short, long, value_name = "FILE", default_value = config::CONFIG_FILENAME)] + pub config: PathBuf, +} + +#[derive(Parser, Debug)] +pub struct ImportArgs { + #[clap(short, long)] + pub faucet_path: PathBuf, + + /// Amount of assets to be dispersed by the faucet on each request + #[clap(short, long)] + pub asset_amount: u64, + + #[clap(short, long, value_name = "FILE", default_value = config::CONFIG_FILENAME)] + pub config: PathBuf, +} diff --git a/faucet/src/config.rs b/faucet/src/config.rs new file mode 100644 index 000000000..3479fc124 --- /dev/null +++ b/faucet/src/config.rs @@ -0,0 +1,37 @@ +use std::fmt::{Display, Formatter}; + +use miden_node_utils::config::Endpoint; +use serde::{Deserialize, Serialize}; + +pub const CONFIG_FILENAME: &str = "miden-faucet.toml"; + +// Faucet config +// ================================================================================================ + +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Serialize, Deserialize)] +pub struct FaucetConfig { + /// Endpoint of the faucet + pub endpoint: Endpoint, + /// rpc gRPC endpoint in the format `http://[:]`. + pub rpc_url: String, + /// Location to store database files + pub database_filepath: String, +} + +impl FaucetConfig { + pub fn as_url(&self) -> String { + self.endpoint.to_string() + } +} + +impl Display for FaucetConfig { + fn fmt( + &self, + f: &mut Formatter<'_>, + ) -> std::fmt::Result { + f.write_fmt(format_args!( + "{{ endpoint: \"{}\", store_url: \"{}\", block_producer_url: \"{}\" }}", + self.endpoint, self.database_filepath, self.rpc_url + )) + } +} diff --git a/faucet/src/errors.rs b/faucet/src/errors.rs new file mode 100644 index 000000000..248b38a97 --- /dev/null +++ b/faucet/src/errors.rs @@ -0,0 +1,32 @@ +use actix_web::{ + error, + http::{header::ContentType, StatusCode}, + HttpResponse, +}; +use derive_more::Display; + +#[derive(Debug, Display)] +pub enum FaucetError { + BadRequest(String), + InternalServerError(String), +} + +impl error::ResponseError for FaucetError { + fn error_response(&self) -> HttpResponse { + let message = match self { + FaucetError::BadRequest(msg) => msg, + FaucetError::InternalServerError(msg) => msg, + }; + + HttpResponse::build(self.status_code()) + .insert_header(ContentType::html()) + .body(message.to_owned()) + } + + fn status_code(&self) -> actix_web::http::StatusCode { + match *self { + FaucetError::InternalServerError(_) => StatusCode::INTERNAL_SERVER_ERROR, + FaucetError::BadRequest(_) => StatusCode::BAD_REQUEST, + } + } +} diff --git a/faucet/src/handlers.rs b/faucet/src/handlers.rs new file mode 100644 index 000000000..f97047ca0 --- /dev/null +++ b/faucet/src/handlers.rs @@ -0,0 +1,102 @@ +use actix_web::{get, http::header, post, web, HttpResponse, Result}; +use miden_client::client::transactions::TransactionTemplate; +use miden_objects::{ + accounts::AccountId, assets::FungibleAsset, notes::NoteId, utils::serde::Serializable, +}; +use serde::{Deserialize, Serialize}; +use tracing::info; + +use crate::{errors::FaucetError, FaucetState}; + +#[derive(Deserialize)] +struct FaucetRequest { + account_id: String, +} + +#[derive(Serialize)] +struct FaucetMetadataReponse { + id: String, + asset_amount: u64, +} + +#[get("/get_metadata")] +pub async fn get_metadata(state: web::Data) -> HttpResponse { + let response = FaucetMetadataReponse { + id: state.id.to_string(), + asset_amount: state.asset_amount, + }; + + HttpResponse::Ok().json(response) +} + +#[post("/get_tokens")] +pub async fn get_tokens( + req: web::Json, + state: web::Data, +) -> Result { + info!("Received a request with account_id: {}", req.account_id); + + let client = state.client.clone(); + + // Receive and hex user account id + let target_account_id = AccountId::from_hex(req.account_id.as_str()) + .map_err(|err| FaucetError::BadRequest(err.to_string()))?; + + // Instantiate asset + let asset = + FungibleAsset::new(state.id, state.asset_amount).expect("Failed to instantiate asset."); + + // Instantiate transaction template + let tx_template = TransactionTemplate::MintFungibleAsset { + asset, + target_account_id, + }; + + // Run transaction executor & execute transaction + let tx_result = client + .lock() + .await + .new_transaction(tx_template) + .map_err(|err| FaucetError::InternalServerError(err.to_string()))?; + + // Get note id + let note_id: NoteId = tx_result + .created_notes() + .first() + .ok_or_else(|| { + FaucetError::InternalServerError("Failed to access generated note.".to_string()) + })? + .id(); + + // Run transaction prover & send transaction to node + { + let mut client_guard = client.lock().await; + client_guard + .send_transaction(tx_result) + .await + .map_err(|err| FaucetError::InternalServerError(err.to_string()))?; + } + + // Get note from client store + let input_note = state + .client + .clone() + .lock() + .await + .get_input_note(note_id) + .map_err(|err| FaucetError::InternalServerError(err.to_string()))?; + + // Serialize note for transport + let bytes = input_note.to_bytes(); + + // Send generated note to user + Ok(HttpResponse::Ok() + .content_type("application/octet-stream") + .append_header(header::ContentDisposition { + disposition: actix_web::http::header::DispositionType::Attachment, + parameters: vec![actix_web::http::header::DispositionParam::Filename( + "note.mno".to_string(), + )], + }) + .body(bytes)) +} diff --git a/faucet/src/main.rs b/faucet/src/main.rs new file mode 100644 index 000000000..68293c888 --- /dev/null +++ b/faucet/src/main.rs @@ -0,0 +1,140 @@ +use std::{io, sync::Arc}; + +use actix_cors::Cors; +use actix_files::Files; +use actix_web::{ + middleware::{DefaultHeaders, Logger}, + web, App, HttpServer, +}; +use async_mutex::Mutex; +use clap::Parser; +use cli::Cli; +use config::FaucetConfig; +use handlers::{get_metadata, get_tokens}; +use miden_client::{ + client::{rpc::TonicRpcClient, Client}, + store::sqlite_store::SqliteStore, +}; +use miden_node_utils::config::load_config; +use miden_objects::accounts::AccountId; +use tracing::info; + +use crate::cli::{ImportArgs, InitArgs}; + +mod cli; +mod config; +mod errors; +mod handlers; +mod utils; + +pub type FaucetClient = Client; + +#[derive(Clone)] +pub struct FaucetState { + id: AccountId, + asset_amount: u64, + client: Arc>, +} + +#[actix_web::main] +async fn main() -> std::io::Result<()> { + let cli = Cli::parse(); + + miden_node_utils::logging::setup_logging().map_err(|e| { + io::Error::new(io::ErrorKind::Other, format!("Failed to load logging: {}", e)) + })?; + + let mut client: FaucetClient; + let config: FaucetConfig; + let amount: u64; + + // Create faucet account + let faucet_account = match &cli.command { + cli::Commands::Init(InitArgs { + asset_amount, + token_symbol, + decimals, + max_supply, + config: faucet_config, + }) => { + config = load_config(faucet_config.as_path()).extract().map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to load configuration file: {}", e), + ) + })?; + + client = utils::build_client(config.database_filepath.clone()); + + amount = *asset_amount; + utils::create_fungible_faucet(token_symbol, decimals, max_supply, &mut client).map_err( + |e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to create faucet account: {}", e), + ) + }, + ) + }, + cli::Commands::Import(ImportArgs { + asset_amount, + faucet_path, + config: faucet_config, + }) => { + config = load_config(faucet_config.as_path()).extract().map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to load configuration file: {}", e), + ) + })?; + + client = utils::build_client(config.database_filepath.clone()); + + amount = *asset_amount; + utils::import_fungible_faucet(faucet_path, &mut client).map_err(|e| { + io::Error::new( + io::ErrorKind::InvalidData, + format!("Failed to import faucet account: {}", e), + ) + }) + }, + }?; + + // Sync client + client.sync_state().await.map_err(|e| { + io::Error::new(io::ErrorKind::NotConnected, format!("Failed to sync state: {e:?}")) + })?; + + info!("✅ Faucet setup successful, account id: {}", faucet_account.id()); + + info!("🚀 Starting server on: {}", config.as_url()); + + // Instantiate faucet state + let faucet_state = FaucetState { + id: faucet_account.id(), + asset_amount: amount, + client: Arc::new(Mutex::new(client)), + }; + + HttpServer::new(move || { + let cors = Cors::default().allow_any_origin().allow_any_method(); + App::new() + .app_data(web::Data::new(faucet_state.clone())) + .wrap(cors) + .wrap(Logger::default()) + .wrap(DefaultHeaders::new().add(("Cache-Control", "no-cache"))) + .service(get_metadata) + .service(get_tokens) + .service( + Files::new("/", "faucet/src/static") + .use_etag(false) + .use_last_modified(false) + .index_file("index.html"), + ) + }) + .bind((config.endpoint.host, config.endpoint.port))? + .run() + .await?; + + Ok(()) +} diff --git a/faucet/src/static/background.png b/faucet/src/static/background.png new file mode 100644 index 000000000..dbf2e4269 Binary files /dev/null and b/faucet/src/static/background.png differ diff --git a/faucet/src/static/favicon.ico b/faucet/src/static/favicon.ico new file mode 100644 index 000000000..056183ba1 Binary files /dev/null and b/faucet/src/static/favicon.ico differ diff --git a/faucet/src/static/index.css b/faucet/src/static/index.css new file mode 100644 index 000000000..4c9a7d2d7 --- /dev/null +++ b/faucet/src/static/index.css @@ -0,0 +1,90 @@ +input:focus { + outline: none; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + background-image: url(./background.png); + background-repeat: repeat; +} + +#error-message { + display: none; + color: red; + text-align: center; + margin-bottom: 5px; +} + +#navbar { + position: fixed; + top: 0; + left: 0; + background-color: rgb(17, 24, 39); + width: 100%; + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; +} + +#title { + font-size: x-large; + text-align: center; + font-weight: bold; + color: white; + margin: 0; +} + +#center-container { + background-color: rgb(17, 24, 39); + border-radius: 10px; + display: flex; + flex-direction: column; + padding: 30px; +} + +#subtitle { + font-size: large; + text-align: center; + font-weight: bold; + color: white; + margin: 0; + margin-bottom: 20px; +} + +#account-id { + padding: 10px; + border-radius: 10px; + border: 1px solid #ccc; + margin-bottom: 30px; + width: 300px; +} + +#faucetId { + color: white; + margin-top: 4px; +} + +#button { + color: white; + border-radius: 10px; + font-weight: bold; + padding: 10px 20px; + background-color: rgb(124, 58, 237); + width: 300px; +} diff --git a/faucet/src/static/index.html b/faucet/src/static/index.html new file mode 100644 index 000000000..aee693612 --- /dev/null +++ b/faucet/src/static/index.html @@ -0,0 +1,25 @@ + + + + + + + Miden Faucet + + + + + +
+

Request test tokens

+ + + +
+ + + + diff --git a/faucet/src/static/index.js b/faucet/src/static/index.js new file mode 100644 index 000000000..1dc7b81b2 --- /dev/null +++ b/faucet/src/static/index.js @@ -0,0 +1,70 @@ +document.addEventListener('DOMContentLoaded', function () { + const faucetIdElem = document.getElementById('faucetId'); + const button = document.getElementById('button'); + const accountIdInput = document.getElementById('account-id'); + const errorMessage = document.getElementById('error-message'); + + fetchMetadata(); + + button.addEventListener('click', handleButtonClick); + + function fetchMetadata() { + fetch('http://localhost:8080/get_metadata') + .then(response => response.json()) + .then(data => { + faucetIdElem.textContent = data.id; + button.textContent = `Send me ${data.asset_amount} tokens!`; + button.dataset.originalText = button.textContent; + }) + .catch(error => { + console.error('Error fetching metadata:', error); + faucetIdElem.textContent = 'Error loading Faucet ID.'; + button.textContent = 'Error retrieving Faucet asset amount.'; + }); + } + + async function handleButtonClick() { + let accountId = accountIdInput.value.trim(); + errorMessage.style.display = 'none'; + + if (!accountId || !/^0x[0-9a-fA-F]{16}$/i.test(accountId)) { + errorMessage.textContent = !accountId ? "Account ID is required." : "Invalid Account ID."; + errorMessage.style.display = 'block'; + return; + } + + button.textContent = 'Loading...'; + try { + const response = await fetch('http://localhost:8080/get_tokens', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ account_id: accountId }) + }); + + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } + + const blob = await response.blob(); + downloadBlob(blob, 'note.mno'); + } catch (error) { + console.error('Error:', error); + errorMessage.textContent = 'Failed to receive tokens. Please try again.'; + errorMessage.style.display = 'block'; + } finally { + button.textContent = button.dataset.originalText; + } + } + + function downloadBlob(blob, filename) { + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.style.display = 'none'; + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + window.URL.revokeObjectURL(url); + } +}); diff --git a/faucet/src/utils.rs b/faucet/src/utils.rs new file mode 100644 index 000000000..05a2288e3 --- /dev/null +++ b/faucet/src/utils.rs @@ -0,0 +1,102 @@ +use std::{ + fs::File, + io::{self, Read}, + path::{Path, PathBuf}, +}; + +use miden_client::{ + client::{rpc::TonicRpcClient, Client}, + config::{RpcConfig, StoreConfig}, + store::{sqlite_store::SqliteStore, AuthInfo}, +}; +use miden_lib::{accounts::faucets::create_basic_fungible_faucet, AuthScheme}; +use miden_objects::{ + accounts::{Account, AccountData}, + assets::TokenSymbol, + crypto::dsa::rpo_falcon512::KeyPair, + utils::serde::Deserializable, + Felt, +}; + +use crate::FaucetClient; + +/// Instantiates the Miden client +pub fn build_client(database_filepath: String) -> FaucetClient { + // Setup store + let store_config = StoreConfig { + database_filepath: database_filepath.clone(), + }; + let store = SqliteStore::new(store_config).expect("Failed to instantiate store."); + + // Setup the executor store + let executor_store_config = StoreConfig { + database_filepath: database_filepath.clone(), + }; + let executor_store = + SqliteStore::new(executor_store_config).expect("Failed to instantiate datastore store"); + + // Setup the tonic rpc client + let rpc_config = RpcConfig::default(); + let api = TonicRpcClient::new(&rpc_config.endpoint.to_string()); + + // Setup the client + Client::new(api, store, executor_store).expect("Failed to instantiate client.") +} + +/// Creates a Miden fungible faucet from arguments +pub fn create_fungible_faucet( + token_symbol: &str, + decimals: &u8, + max_supply: &u64, + client: &mut FaucetClient, +) -> Result { + let token_symbol = TokenSymbol::new(token_symbol).expect("Failed to parse token_symbol."); + + // Instantiate init_seed + let init_seed: [u8; 32] = [0; 32]; + + // Instantiate keypair and authscheme + let auth_seed: [u8; 40] = [0; 40]; + let keypair = KeyPair::from_seed(&auth_seed).expect("Failed to generate keypair."); + let auth_scheme = AuthScheme::RpoFalcon512 { + pub_key: keypair.public_key(), + }; + + let (account, account_seed) = create_basic_fungible_faucet( + init_seed, + token_symbol, + *decimals, + Felt::try_from(*max_supply).expect("Max_supply is outside of the possible range."), + auth_scheme, + ) + .expect("Failed to generate faucet account."); + + client + .insert_account(&account, Some(account_seed), &AuthInfo::RpoFalcon512(keypair)) + .map_err(|_| { + io::Error::new(io::ErrorKind::InvalidData, "Failed to insert account into client.") + })?; + + Ok(account) +} + +/// Imports a Miden fungible faucet from a file +pub fn import_fungible_faucet( + faucet_path: &PathBuf, + client: &mut FaucetClient, +) -> Result { + let path = Path::new(faucet_path); + let mut file = File::open(path).expect("Failed to open file."); + + let mut contents = Vec::new(); + let _ = file.read_to_end(&mut contents); + + let account_data = + AccountData::read_from_bytes(&contents).expect("Failed to deserialize faucet from file."); + + client.import_account(account_data.clone()).map_err(|_| { + io::Error::new(io::ErrorKind::InvalidData, "Failed to import account into client.") + })?; + + Ok(account_data.account) +}