From a14b15d1232d7728768b708f1c336c4bf8a8c854 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Sat, 25 Oct 2025 00:34:02 -0300 Subject: [PATCH 1/8] add Cargo.lock --- nssa/program_methods/guest/Cargo.lock | 3618 +++++++++++++++++++++++++ 1 file changed, 3618 insertions(+) create mode 100644 nssa/program_methods/guest/Cargo.lock diff --git a/nssa/program_methods/guest/Cargo.lock b/nssa/program_methods/guest/Cargo.lock new file mode 100644 index 0000000..47585ba --- /dev/null +++ b/nssa/program_methods/guest/Cargo.lock @@ -0,0 +1,3618 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-r1cs-std", + "ark-std", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0c292754729c8a190e50414fd1a37093c786c709899f29c9f7daccecfa855e" +dependencies = [ + "ahash", + "ark-crypto-primitives-macros", + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "fnv", + "merlin", + "sha2", +] + +[[package]] +name = "ark-crypto-primitives-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "arrayvec", + "digest", + "educe", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ark-groth16" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f1d0f3a534bb54188b8dcc104307db6c56cdae574ddc3212aec0625740fc7e" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff", + "ark-serialize", + "ark-std", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-r1cs-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "941551ef1df4c7a401de7068758db6503598e6f01850bdb2cfdb614a1f9dbea1" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-std", + "educe", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec46ddc93e7af44bcab5230937635b06fb5744464dd6a7e7b083e80ebd274384" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "arrayvec", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "ark-snark" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d368e2848c2d4c129ce7679a7d0d2d612b6a274d3ea6a13bad4445d61b381b88" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arraydeque" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bonsai-sdk" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +dependencies = [ + "duplicate", + "maybe-async", + "reqwest", + "serde", + "thiserror", +] + +[[package]] +name = "borsh" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "camino" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.2.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling 0.20.11", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.106", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "docker-generate" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf673e0848ef09fa4aeeba78e681cf651c0c7d35f76ee38cec8e55bc32fa111" + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "duplicate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1" +dependencies = [ + "heck", + "proc-macro2", + "proc-macro2-diagnostics", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elf" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4445909572dbd556c457c849c4ca58623d84b27c8fff1e74b0b4227d8b90d17b" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +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 = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "include_bytes_aligned" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy-regex" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.106", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-async" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.4", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "no_std_strings" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b0c77c1b780822bc749a33e39aeb2c07584ab93332303babeabb645298a76e" + +[[package]] +name = "nssa-core" +version = "0.1.0" +dependencies = [ + "chacha20", + "risc0-zkvm", + "serde", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.7", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "version_check", + "yansi", +] + +[[package]] +name = "programs" +version = "0.1.0" +dependencies = [ + "nssa-core", + "risc0-zkvm", + "serde", +] + +[[package]] +name = "proptest" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" +dependencies = [ + "bitflags 2.9.4", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "unarray", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "reqwest" +version = "0.12.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "risc0-binfmt" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c8f97f81bcdead4101bca06469ecef481a2695cd04e7e877b49dea56a7f6f2a" +dependencies = [ + "anyhow", + "borsh", + "bytemuck", + "derive_more", + "elf", + "lazy_static", + "postcard", + "rand 0.9.2", + "risc0-zkp", + "risc0-zkvm-platform", + "ruint", + "semver", + "serde", + "tracing", +] + +[[package]] +name = "risc0-build" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bbb512d728e011d03ce0958ca7954624ee13a215bcafd859623b3c63b2a3f60" +dependencies = [ + "anyhow", + "cargo_metadata", + "derive_builder", + "dirs", + "docker-generate", + "hex", + "risc0-binfmt", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rzup", + "semver", + "serde", + "serde_json", + "stability", + "tempfile", +] + +[[package]] +name = "risc0-circuit-keccak" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f195f865ac1afdc21a172d7756fdcc21be18e13eb01d78d3d7f2b128fa881ba" +dependencies = [ + "anyhow", + "bytemuck", + "paste", + "risc0-binfmt", + "risc0-circuit-recursion", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-recursion" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca8f15c8abc0fd8c097aa7459879110334d191c63dd51d4c28881c4a497279e" +dependencies = [ + "anyhow", + "bytemuck", + "hex", + "metal", + "risc0-core", + "risc0-zkp", + "tracing", +] + +[[package]] +name = "risc0-circuit-rv32im" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1b0689f4a270a2f247b04397ebb431b8f64fe5170e98ee4f9d71bd04825205" +dependencies = [ + "anyhow", + "bit-vec", + "bytemuck", + "derive_more", + "paste", + "risc0-binfmt", + "risc0-core", + "risc0-zkp", + "serde", + "tracing", +] + +[[package]] +name = "risc0-core" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f2723fedace48c6c5a505bd8f97ac4e1712bc4cb769083e10536d862b66987" +dependencies = [ + "bytemuck", + "rand_core 0.9.3", +] + +[[package]] +name = "risc0-groth16" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "724285dc79604abfb2d40feaefe3e335420a6b293511661f77d6af62f1f5fae9" +dependencies = [ + "anyhow", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-serialize", + "bytemuck", + "hex", + "num-bigint", + "num-traits", + "risc0-binfmt", + "risc0-zkp", + "serde", +] + +[[package]] +name = "risc0-zkos-v1compat" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840c2228803557a8b7dc035a8f196516b6fd68c9dc6ac092f0c86241b5b1bafb" +dependencies = [ + "include_bytes_aligned", + "no_std_strings", + "risc0-zkvm-platform", +] + +[[package]] +name = "risc0-zkp" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb6bf356f469bb8744f72a07a37134c5812c1d55d6271bba80e87bdb7a58c8e" +dependencies = [ + "anyhow", + "blake2", + "borsh", + "bytemuck", + "cfg-if", + "digest", + "hex", + "hex-literal", + "metal", + "paste", + "rand_core 0.9.3", + "risc0-core", + "risc0-zkvm-platform", + "serde", + "sha2", + "stability", + "tracing", +] + +[[package]] +name = "risc0-zkvm" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fcce11648a9ff60b8e7af2f0ce7fbf8d25275ab6d414cc91b9da69ee75bc978" +dependencies = [ + "anyhow", + "bincode", + "bonsai-sdk", + "borsh", + "bytemuck", + "bytes", + "derive_more", + "hex", + "lazy-regex", + "prost", + "risc0-binfmt", + "risc0-build", + "risc0-circuit-keccak", + "risc0-circuit-recursion", + "risc0-circuit-rv32im", + "risc0-core", + "risc0-groth16", + "risc0-zkos-v1compat", + "risc0-zkp", + "risc0-zkvm-platform", + "rrs-lib", + "rzup", + "semver", + "serde", + "sha2", + "stability", + "tempfile", + "tracing", +] + +[[package]] +name = "risc0-zkvm-platform" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfaa10feba15828c788837ddde84b994393936d8f5715228627cfe8625122a40" +dependencies = [ + "bytemuck", + "cfg-if", + "getrandom 0.2.16", + "getrandom 0.3.3", + "libm", + "num_enum", + "paste", + "stability", +] + +[[package]] +name = "rrs-lib" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +dependencies = [ + "downcast-rs", + "paste", +] + +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "ruint" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +dependencies = [ + "borsh", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "rzup" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d2aed296f203fa64bcb4b52069356dd86d6ec578593985b919b6995bee1f0ae" +dependencies = [ + "hex", + "rsa", + "semver", + "serde", + "serde_with", + "sha2", + "strum", + "tempfile", + "thiserror", + "toml", + "yaml-rust2", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +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 = "serde_with" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.11.4", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +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 = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.106", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +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.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "time" +version = "0.3.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" + +[[package]] +name = "time-macros" +version = "0.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +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.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.11.4", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.11.4", + "toml_datetime 0.7.3", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yaml-rust2" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" +dependencies = [ + "arraydeque", + "encoding_rs", + "hashlink", +] + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +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.106", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] From 6d9d6b3d280315e191b0f1be60902e050f81c809 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Wed, 29 Oct 2025 00:40:56 -0300 Subject: [PATCH 2/8] add chained_call field to program output --- nssa/core/src/program.rs | 10 ++++++++++ .../guest/src/bin/privacy_preserving_circuit.rs | 1 + 2 files changed, 11 insertions(+) diff --git a/nssa/core/src/program.rs b/nssa/core/src/program.rs index 82023f3..a96d3cf 100644 --- a/nssa/core/src/program.rs +++ b/nssa/core/src/program.rs @@ -12,11 +12,20 @@ pub struct ProgramInput { pub instruction: T, } +#[derive(Serialize, Deserialize, Clone)] +#[cfg_attr(any(feature = "host", test), derive(Debug, PartialEq, Eq))] +pub struct ChainedCall { + pub program_id: ProgramId, + pub instruction_data: InstructionData, + pub account_indices: Vec, +} + #[derive(Serialize, Deserialize, Clone)] #[cfg_attr(any(feature = "host", test), derive(Debug, PartialEq, Eq))] pub struct ProgramOutput { pub pre_states: Vec, pub post_states: Vec, + pub chained_call: Option } pub fn read_nssa_inputs() -> ProgramInput { @@ -33,6 +42,7 @@ pub fn write_nssa_outputs(pre_states: Vec, post_states: Vec let output = ProgramOutput { pre_states, post_states, + chained_call: None }; env::commit(&output); } diff --git a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs index a1aa8c9..1baa5a0 100644 --- a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs +++ b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs @@ -27,6 +27,7 @@ fn main() { let ProgramOutput { pre_states, post_states, + chained_call: _, } = program_output; // Check that there are no repeated account ids From 3a277193928b2343d291a8ff8a04783b209d5ca9 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Wed, 29 Oct 2025 01:51:09 -0300 Subject: [PATCH 3/8] add tail-chain logic for public transactions --- integration_tests/src/data_changer.bin | Bin 366692 -> 371388 bytes .../src/bin/privacy_preserving_circuit.rs | 7 +- nssa/src/program.rs | 12 ++-- nssa/src/public_transaction/transaction.rs | 67 +++++++++++++++--- 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/integration_tests/src/data_changer.bin b/integration_tests/src/data_changer.bin index d201f91960c9f4739d4a4ee0c94fb4a356f50e24..c4fbec0f1c44d11a802a9f10e241da57d768ea88 100644 GIT binary patch delta 95675 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 Dh4?oR delta 92914 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 bSUtX~I!ejRNpDzx4emAaxmG#pb0_{k(z`m7 diff --git a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs index 1baa5a0..345198a 100644 --- a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs +++ b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs @@ -27,9 +27,14 @@ fn main() { let ProgramOutput { pre_states, post_states, - chained_call: _, + chained_call, } = program_output; + // TODO: implement tail calls for privacy preserving transactions + if chained_call.is_some() { + panic!("Privacy preserving transactions do not support yet tail calls.") + } + // Check that there are no repeated account ids if !validate_uniqueness_of_account_ids(&pre_states) { panic!("Repeated account ids found") diff --git a/nssa/src/program.rs b/nssa/src/program.rs index 7771aaf..877b01b 100644 --- a/nssa/src/program.rs +++ b/nssa/src/program.rs @@ -48,7 +48,7 @@ impl Program { &self, pre_states: &[AccountWithMetadata], instruction_data: &InstructionData, - ) -> Result, NssaError> { + ) -> Result { // Write inputs to the program let mut env_builder = ExecutorEnv::builder(); env_builder.session_limit(Some(MAX_NUM_CYCLES_PUBLIC_EXECUTION)); @@ -62,12 +62,12 @@ impl Program { .map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?; // Get outputs - let ProgramOutput { post_states, .. } = session_info + let program_output = session_info .journal .decode() .map_err(|e| NssaError::ProgramExecutionFailed(e.to_string()))?; - Ok(post_states) + Ok(program_output) } /// Writes inputs to `env_builder` in the order expected by the programs @@ -221,12 +221,12 @@ mod tests { balance: balance_to_move, ..Account::default() }; - let [sender_post, recipient_post] = program + let program_output = program .execute(&[sender, recipient], &instruction_data) - .unwrap() - .try_into() .unwrap(); + let [sender_post, recipient_post] = program_output.post_states.try_into().unwrap(); + assert_eq!(sender_post, expected_sender_post); assert_eq!(recipient_post, expected_recipient_post); } diff --git a/nssa/src/public_transaction/transaction.rs b/nssa/src/public_transaction/transaction.rs index b0b8f73..7079074 100644 --- a/nssa/src/public_transaction/transaction.rs +++ b/nssa/src/public_transaction/transaction.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use nssa_core::{ account::{Account, AccountWithMetadata}, address::Address, - program::validate_execution, + program::{ChainedCall, validate_execution}, }; use sha2::{Digest, digest::FixedOutput}; @@ -18,6 +18,7 @@ pub struct PublicTransaction { message: Message, witness_set: WitnessSet, } +const MAX_NUMBER_CHAINED_CALLS: usize = 10; impl PublicTransaction { pub fn new(message: Message, witness_set: WitnessSet) -> Self { @@ -100,21 +101,65 @@ impl PublicTransaction { }) .collect(); - // Check the `program_id` corresponds to a deployed program - let Some(program) = state.programs().get(&message.program_id) else { - return Err(NssaError::InvalidInput("Unknown program".into())); + let mut state_diff: HashMap = message + .addresses + .iter() + .cloned() + .zip(pre_states.iter().map(|pre| pre.account.clone())) + .collect(); + + let mut chained_call = ChainedCall { + program_id: message.program_id, + instruction_data: message.instruction_data.clone(), + account_indices: (0..pre_states.len()).collect(), }; - // // Execute program - let post_states = program.execute(&pre_states, &message.instruction_data)?; + for _ in 0..MAX_NUMBER_CHAINED_CALLS { + // Check the `program_id` corresponds to a deployed program + let Some(program) = state.programs().get(&chained_call.program_id) else { + return Err(NssaError::InvalidInput("Unknown program".into())); + }; - // Verify execution corresponds to a well-behaved program. - // See the # Programs section for the definition of the `validate_execution` method. - if !validate_execution(&pre_states, &post_states, message.program_id) { - return Err(NssaError::InvalidProgramBehavior); + let pre_states_chained_call = chained_call + .account_indices + .iter() + .map(|&i| { + pre_states + .get(i) + .ok_or_else(|| NssaError::InvalidInput("Invalid account indices".into())) + .cloned() + }) + .collect::, NssaError>>()?; + + let program_output = + program.execute(&pre_states_chained_call, &chained_call.instruction_data)?; + + // Verify execution corresponds to a well-behaved program. + // See the # Programs section for the definition of the `validate_execution` method. + if validate_execution( + &program_output.pre_states, + &program_output.post_states, + message.program_id, + ) { + for (pre, post) in program_output + .pre_states + .iter() + .zip(program_output.post_states) + { + state_diff.insert(pre.account_id, post); + } + } else { + return Err(NssaError::InvalidProgramBehavior); + } + + if let Some(next_chained_call) = program_output.chained_call { + chained_call = next_chained_call; + } else { + break; + }; } - Ok(message.addresses.iter().cloned().zip(post_states).collect()) + Ok(state_diff) } } From 48fc64395204df128f8d2d47270e16b9745c0d11 Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Wed, 29 Oct 2025 15:34:11 -0300 Subject: [PATCH 4/8] add chained call test --- nssa/core/src/program.rs | 17 +++++++-- .../src/bin/privacy_preserving_circuit.rs | 4 +-- nssa/src/program.rs | 15 ++++++-- nssa/src/public_transaction/transaction.rs | 4 +-- nssa/src/state.rs | 36 +++++++++++++++++++ nssa/test_program_methods/guest/Cargo.lock | 2 ++ nssa/test_program_methods/guest/Cargo.toml | 2 ++ .../guest/src/bin/chain_caller.rs | 32 +++++++++++++++++ 8 files changed, 103 insertions(+), 9 deletions(-) create mode 100644 nssa/test_program_methods/guest/src/bin/chain_caller.rs diff --git a/nssa/core/src/program.rs b/nssa/core/src/program.rs index a96d3cf..6582984 100644 --- a/nssa/core/src/program.rs +++ b/nssa/core/src/program.rs @@ -25,7 +25,7 @@ pub struct ChainedCall { pub struct ProgramOutput { pub pre_states: Vec, pub post_states: Vec, - pub chained_call: Option + pub chained_call: Option, } pub fn read_nssa_inputs() -> ProgramInput { @@ -42,7 +42,20 @@ pub fn write_nssa_outputs(pre_states: Vec, post_states: Vec let output = ProgramOutput { pre_states, post_states, - chained_call: None + chained_call: None, + }; + env::commit(&output); +} + +pub fn write_nssa_outputs_with_chained_call( + pre_states: Vec, + post_states: Vec, + chained_call: Option, +) { + let output = ProgramOutput { + pre_states, + post_states, + chained_call, }; env::commit(&output); } diff --git a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs index 345198a..d8ed15d 100644 --- a/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs +++ b/nssa/program_methods/guest/src/bin/privacy_preserving_circuit.rs @@ -30,9 +30,9 @@ fn main() { chained_call, } = program_output; - // TODO: implement tail calls for privacy preserving transactions + // TODO: implement chained calls for privacy preserving transactions if chained_call.is_some() { - panic!("Privacy preserving transactions do not support yet tail calls.") + panic!("Privacy preserving transactions do not support yet chained calls.") } // Check that there are no repeated account ids diff --git a/nssa/src/program.rs b/nssa/src/program.rs index 877b01b..11eb413 100644 --- a/nssa/src/program.rs +++ b/nssa/src/program.rs @@ -1,6 +1,6 @@ use crate::program_methods::{AUTHENTICATED_TRANSFER_ELF, PINATA_ELF, TOKEN_ELF}; use nssa_core::{ - account::{Account, AccountWithMetadata}, + account::AccountWithMetadata, program::{InstructionData, ProgramId, ProgramOutput}, }; @@ -107,11 +107,11 @@ impl Program { #[cfg(test)] mod tests { - use nssa_core::account::{Account, AccountId, AccountWithMetadata}; - use program_methods::{ + use crate::program_methods::{ AUTHENTICATED_TRANSFER_ELF, AUTHENTICATED_TRANSFER_ID, PINATA_ELF, PINATA_ID, TOKEN_ELF, TOKEN_ID, }; + use nssa_core::account::{Account, AccountId, AccountWithMetadata}; use crate::program::Program; @@ -195,6 +195,15 @@ mod tests { elf: BURNER_ELF.to_vec(), } } + + pub fn chain_caller() -> Self { + use test_program_methods::{CHAIN_CALLER_ELF, CHAIN_CALLER_ID}; + + Program { + id: CHAIN_CALLER_ID, + elf: CHAIN_CALLER_ELF.to_vec(), + } + } } #[test] diff --git a/nssa/src/public_transaction/transaction.rs b/nssa/src/public_transaction/transaction.rs index 7079074..70d22a3 100644 --- a/nssa/src/public_transaction/transaction.rs +++ b/nssa/src/public_transaction/transaction.rs @@ -114,7 +114,7 @@ impl PublicTransaction { account_indices: (0..pre_states.len()).collect(), }; - for _ in 0..MAX_NUMBER_CHAINED_CALLS { + for _i in 0..MAX_NUMBER_CHAINED_CALLS { // Check the `program_id` corresponds to a deployed program let Some(program) = state.programs().get(&chained_call.program_id) else { return Err(NssaError::InvalidInput("Unknown program".into())); @@ -139,7 +139,7 @@ impl PublicTransaction { if validate_execution( &program_output.pre_states, &program_output.post_states, - message.program_id, + chained_call.program_id, ) { for (pre, post) in program_output .pre_states diff --git a/nssa/src/state.rs b/nssa/src/state.rs index 83183f5..5a0b87b 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -263,6 +263,7 @@ pub mod tests { Commitment, Nullifier, NullifierPublicKey, NullifierSecretKey, SharedSecretKey, account::{Account, AccountId, AccountWithMetadata, Nonce}, encryption::{EphemeralPublicKey, IncomingViewingPublicKey, Scalar}, + program::ProgramId, }; fn transfer_transaction( @@ -475,6 +476,7 @@ pub mod tests { self.insert_program(Program::data_changer()); self.insert_program(Program::minter()); self.insert_program(Program::burner()); + self.insert_program(Program::chain_caller()); self } @@ -2045,4 +2047,38 @@ pub mod tests { assert!(matches!(result, Err(NssaError::CircuitProvingError(_)))); } + + #[test] + fn test_chained_call() { + let program = Program::chain_caller(); + let key = PrivateKey::try_new([1; 32]).unwrap(); + let address = Address::from(&PublicKey::new_from_private_key(&key)); + let initial_balance = 100; + let initial_data = [(address, initial_balance)]; + let mut state = + V02State::new_with_genesis_accounts(&initial_data, &[]).with_test_programs(); + let from = address; + let from_key = key; + let to = Address::new([2; 32]); + let amount: u128 = 37; + let instruction: (u128, ProgramId) = + (amount, Program::authenticated_transfer_program().id()); + + let message = public_transaction::Message::try_new( + program.id(), + vec![to, from], + vec![0], + instruction, + ) + .unwrap(); + let witness_set = public_transaction::WitnessSet::for_message(&message, &[&from_key]); + let tx = PublicTransaction::new(message, witness_set); + + state.transition_from_public_transaction(&tx).unwrap(); + + let from_post = state.get_account_by_address(&from); + let to_post = state.get_account_by_address(&to); + assert_eq!(from_post.balance, initial_balance - amount); + assert_eq!(to_post.balance, amount); + } } diff --git a/nssa/test_program_methods/guest/Cargo.lock b/nssa/test_program_methods/guest/Cargo.lock index 8cb2bec..d7e5b67 100644 --- a/nssa/test_program_methods/guest/Cargo.lock +++ b/nssa/test_program_methods/guest/Cargo.lock @@ -1824,6 +1824,8 @@ name = "programs" version = "0.1.0" dependencies = [ "nssa-core", + "risc0-zkvm", + "serde", ] [[package]] diff --git a/nssa/test_program_methods/guest/Cargo.toml b/nssa/test_program_methods/guest/Cargo.toml index 2289292..9e5f543 100644 --- a/nssa/test_program_methods/guest/Cargo.toml +++ b/nssa/test_program_methods/guest/Cargo.toml @@ -6,4 +6,6 @@ edition = "2024" [workspace] [dependencies] +risc0-zkvm = { version = "3.0.3", features = ['std'] } nssa-core = { path = "../../core" } +serde = { version = "1.0.219", default-features = false } diff --git a/nssa/test_program_methods/guest/src/bin/chain_caller.rs b/nssa/test_program_methods/guest/src/bin/chain_caller.rs new file mode 100644 index 0000000..321d032 --- /dev/null +++ b/nssa/test_program_methods/guest/src/bin/chain_caller.rs @@ -0,0 +1,32 @@ +use nssa_core::program::{ + ChainedCall, ProgramId, ProgramInput, read_nssa_inputs, write_nssa_outputs_with_chained_call, +}; +use risc0_zkvm::serde::to_vec; + +type Instruction = (u128, ProgramId); + +fn main() { + let ProgramInput { + pre_states, + instruction: (balance, program_id), + } = read_nssa_inputs::(); + + let [sender_pre, receiver_pre] = match pre_states.try_into() { + Ok(array) => array, + Err(_) => return, + }; + + let instruction_data = to_vec(&balance).unwrap(); + + let chained_call = Some(ChainedCall { + program_id, + instruction_data, + account_indices: vec![1, 0], + }); + + write_nssa_outputs_with_chained_call( + vec![sender_pre.clone(), receiver_pre.clone()], + vec![sender_pre.account, receiver_pre.account], + chained_call, + ); +} From c2b8459645878fbd3c6c5e2e230417fd214602e1 Mon Sep 17 00:00:00 2001 From: Oleksandr Pravdyvyi Date: Thu, 30 Oct 2025 15:00:21 +0200 Subject: [PATCH 5/8] fix: suggestions fix 1 --- wallet/src/cli/account.rs | 18 +++++++++++++++--- wallet/src/cli/token_program.rs | 4 ++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/wallet/src/cli/account.rs b/wallet/src/cli/account.rs index 54e383a..3ff4470 100644 --- a/wallet/src/cli/account.rs +++ b/wallet/src/cli/account.rs @@ -1,7 +1,7 @@ use anyhow::Result; use base58::ToBase58; use clap::Subcommand; -use nssa::{Address, program::Program}; +use nssa::{Account, Address, program::Program}; use serde::Serialize; use crate::{ @@ -103,7 +103,7 @@ impl WalletSubcommand for NewSubcommand { NewSubcommand::Public {} => { let addr = wallet_core.create_new_account_public(); - println!("Generated new account with addr {addr}"); + println!("Generated new account with addr Public/{addr}"); let path = wallet_core.store_persistent_data().await?; @@ -121,7 +121,7 @@ impl WalletSubcommand for NewSubcommand { .unwrap(); println!( - "Generated new account with addr {}", + "Generated new account with addr Private/{}", addr.to_bytes().to_base58() ); println!("With npk {}", hex::encode(key.nullifer_public_key.0)); @@ -205,6 +205,12 @@ impl WalletSubcommand for AccountSubcommand { .ok_or(anyhow::anyhow!("Private account not found in storage"))?, }; + if account == Account::default() { + println!("Account is Uninitialized"); + + return Ok(SubcommandReturnValue::Empty); + } + if raw { let account_hr: HumanReadableAccount = account.clone().into(); println!("{}", serde_json::to_string(&account_hr).unwrap()); @@ -219,16 +225,22 @@ impl WalletSubcommand for AccountSubcommand { _ if account.program_owner == auth_tr_prog_id => { let acc_view: AuthenticatedTransferAccountView = account.into(); + println!("Account owned by authenticated transfer program"); + serde_json::to_string(&acc_view)? } _ if account.program_owner == token_prog_id => { if let Some(token_def) = TokenDefinition::parse(&account.data) { let acc_view: TokedDefinitionAccountView = token_def.into(); + println!("Definition account owned by token program"); + serde_json::to_string(&acc_view)? } else if let Some(token_hold) = TokenHolding::parse(&account.data) { let acc_view: TokedHoldingAccountView = token_hold.into(); + println!("Holding account owned by token program"); + serde_json::to_string(&acc_view)? } else { anyhow::bail!("Invalid data for account {addr:#?} with token program"); diff --git a/wallet/src/cli/token_program.rs b/wallet/src/cli/token_program.rs index 483dee5..6ce7dbe 100644 --- a/wallet/src/cli/token_program.rs +++ b/wallet/src/cli/token_program.rs @@ -12,7 +12,7 @@ use crate::{ ///Represents generic CLI subcommand for a wallet working with token program #[derive(Subcommand, Debug, Clone)] pub enum TokenProgramAgnosticSubcommand { - ///Produce new ERC-20 token + ///Produce a new token /// ///Currently the only supported privacy options is for public definition New { @@ -94,7 +94,7 @@ impl WalletSubcommand for TokenProgramAgnosticSubcommand { anyhow::bail!("Unavailable privacy pairing") } (AddressPrivacyKind::Private, AddressPrivacyKind::Public) => { - //Probably valid. If definition is not public, but supply is it is very suspicious. + //ToDo: Probably valid. If definition is not public, but supply is it is very suspicious. anyhow::bail!("Unavailable privacy pairing") } }; From 0fb72e452f5b021e365d7a2ba8ca144003b80e4a Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Thu, 30 Oct 2025 10:52:31 -0300 Subject: [PATCH 6/8] fix claiming mechanism for chained calls --- nssa/core/src/program.rs | 7 ++- nssa/src/public_transaction/transaction.rs | 29 ++++++---- nssa/src/state.rs | 54 ++++++++++++++++--- .../guest/src/bin/chain_caller.rs | 4 +- 4 files changed, 73 insertions(+), 21 deletions(-) diff --git a/nssa/core/src/program.rs b/nssa/core/src/program.rs index 6582984..3ecee30 100644 --- a/nssa/core/src/program.rs +++ b/nssa/core/src/program.rs @@ -102,9 +102,14 @@ pub fn validate_execution( { return false; } + + // 6. If a post state has default program owner, the pre state must have been a default account + if post.program_owner == DEFAULT_PROGRAM_ID && pre.account != Account::default() { + return false; + } } - // 6. Total balance is preserved + // 7. Total balance is preserved let total_balance_pre_states: u128 = pre_states.iter().map(|pre| pre.account.balance).sum(); let total_balance_post_states: u128 = post_states.iter().map(|post| post.balance).sum(); if total_balance_pre_states != total_balance_post_states { diff --git a/nssa/src/public_transaction/transaction.rs b/nssa/src/public_transaction/transaction.rs index 70d22a3..900a476 100644 --- a/nssa/src/public_transaction/transaction.rs +++ b/nssa/src/public_transaction/transaction.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use nssa_core::{ account::{Account, AccountWithMetadata}, address::Address, - program::{ChainedCall, validate_execution}, + program::{ChainedCall, DEFAULT_PROGRAM_ID, validate_execution}, }; use sha2::{Digest, digest::FixedOutput}; @@ -131,27 +131,34 @@ impl PublicTransaction { }) .collect::, NssaError>>()?; - let program_output = + let mut program_output = program.execute(&pre_states_chained_call, &chained_call.instruction_data)?; // Verify execution corresponds to a well-behaved program. // See the # Programs section for the definition of the `validate_execution` method. - if validate_execution( + if !validate_execution( &program_output.pre_states, &program_output.post_states, chained_call.program_id, ) { - for (pre, post) in program_output - .pre_states - .iter() - .zip(program_output.post_states) - { - state_diff.insert(pre.account_id, post); - } - } else { return Err(NssaError::InvalidProgramBehavior); } + for post in program_output.post_states.iter_mut() { + // The invoked program claims the accounts with default program id. + if post.program_owner == DEFAULT_PROGRAM_ID { + post.program_owner = chained_call.program_id; + } + } + + for (pre, post) in program_output + .pre_states + .iter() + .zip(program_output.post_states) + { + state_diff.insert(pre.account_id, post); + } + if let Some(next_chained_call) = program_output.chained_call { chained_call = next_chained_call; } else { diff --git a/nssa/src/state.rs b/nssa/src/state.rs index 5a0b87b..2119929 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -8,7 +8,7 @@ use nssa_core::{ Commitment, CommitmentSetDigest, DUMMY_COMMITMENT, MembershipProof, Nullifier, account::Account, address::Address, - program::{DEFAULT_PROGRAM_ID, ProgramId}, + program::ProgramId, }; use std::collections::{HashMap, HashSet}; @@ -114,10 +114,6 @@ impl V02State { let current_account = self.get_account_by_address_mut(address); *current_account = post; - // The invoked program claims the accounts with default program id. - if current_account.program_owner == DEFAULT_PROGRAM_ID { - current_account.program_owner = tx.message().program_id; - } } for address in tx.signer_addresses() { @@ -437,7 +433,7 @@ pub mod tests { } #[test] - fn transition_from_chained_authenticated_transfer_program_invocations() { + fn transition_from_sequence_of_authenticated_transfer_program_invocations() { let key1 = PrivateKey::try_new([8; 32]).unwrap(); let address1 = Address::from(&PublicKey::new_from_private_key(&key1)); let key2 = PrivateKey::try_new([2; 32]).unwrap(); @@ -2048,6 +2044,42 @@ pub mod tests { assert!(matches!(result, Err(NssaError::CircuitProvingError(_)))); } + #[test] + fn test_claiming_mechanism() { + let program = Program::authenticated_transfer_program(); + let key = PrivateKey::try_new([1; 32]).unwrap(); + let address = Address::from(&PublicKey::new_from_private_key(&key)); + let initial_balance = 100; + let initial_data = [(address, initial_balance)]; + let mut state = + V02State::new_with_genesis_accounts(&initial_data, &[]).with_test_programs(); + let from = address; + let from_key = key; + let to = Address::new([2; 32]); + let amount: u128 = 37; + + // Check the recipient is an uninitialized account + assert_eq!(state.get_account_by_address(&to), Account::default()); + + let expected_recipient_post = Account { + program_owner: program.id(), + balance: amount, + ..Account::default() + }; + + let message = + public_transaction::Message::try_new(program.id(), vec![from, to], vec![0], amount) + .unwrap(); + let witness_set = public_transaction::WitnessSet::for_message(&message, &[&from_key]); + let tx = PublicTransaction::new(message, witness_set); + + state.transition_from_public_transaction(&tx).unwrap(); + + let recipient_post = state.get_account_by_address(&to); + + assert_eq!(recipient_post, expected_recipient_post); + } + #[test] fn test_chained_call() { let program = Program::chain_caller(); @@ -2064,9 +2096,15 @@ pub mod tests { let instruction: (u128, ProgramId) = (amount, Program::authenticated_transfer_program().id()); + let expected_to_post = Account { + program_owner: Program::authenticated_transfer_program().id(), + balance: amount, + ..Account::default() + }; + let message = public_transaction::Message::try_new( program.id(), - vec![to, from], + vec![to, from], //The chain_caller program permutes the account order in the chain call vec![0], instruction, ) @@ -2079,6 +2117,6 @@ pub mod tests { let from_post = state.get_account_by_address(&from); let to_post = state.get_account_by_address(&to); assert_eq!(from_post.balance, initial_balance - amount); - assert_eq!(to_post.balance, amount); + assert_eq!(to_post, expected_to_post); } } diff --git a/nssa/test_program_methods/guest/src/bin/chain_caller.rs b/nssa/test_program_methods/guest/src/bin/chain_caller.rs index 321d032..dfd77b1 100644 --- a/nssa/test_program_methods/guest/src/bin/chain_caller.rs +++ b/nssa/test_program_methods/guest/src/bin/chain_caller.rs @@ -5,6 +5,8 @@ use risc0_zkvm::serde::to_vec; type Instruction = (u128, ProgramId); +/// A program that calls another program. +/// It permutes the order of the input accounts on the subsequent call fn main() { let ProgramInput { pre_states, @@ -21,7 +23,7 @@ fn main() { let chained_call = Some(ChainedCall { program_id, instruction_data, - account_indices: vec![1, 0], + account_indices: vec![1, 0], // <- Account order permutation here }); write_nssa_outputs_with_chained_call( From 12974f6f6b8662d4107b8e04d3baaa28c7dc32ad Mon Sep 17 00:00:00 2001 From: Sergio Chouhy Date: Thu, 30 Oct 2025 13:47:52 -0300 Subject: [PATCH 7/8] refactor --- nssa/src/public_transaction/transaction.rs | 78 +++++++++++++--------- nssa/src/state.rs | 6 +- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/nssa/src/public_transaction/transaction.rs b/nssa/src/public_transaction/transaction.rs index 900a476..d118d0c 100644 --- a/nssa/src/public_transaction/transaction.rs +++ b/nssa/src/public_transaction/transaction.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use nssa_core::{ account::{Account, AccountWithMetadata}, address::Address, - program::{ChainedCall, DEFAULT_PROGRAM_ID, validate_execution}, + program::{DEFAULT_PROGRAM_ID, validate_execution}, }; use sha2::{Digest, digest::FixedOutput}; @@ -89,7 +89,7 @@ impl PublicTransaction { } // Build pre_states for execution - let pre_states: Vec<_> = message + let mut input_pre_states: Vec<_> = message .addresses .iter() .map(|address| { @@ -101,66 +101,80 @@ impl PublicTransaction { }) .collect(); - let mut state_diff: HashMap = message - .addresses - .iter() - .cloned() - .zip(pre_states.iter().map(|pre| pre.account.clone())) - .collect(); + let mut state_diff: HashMap = HashMap::new(); - let mut chained_call = ChainedCall { - program_id: message.program_id, - instruction_data: message.instruction_data.clone(), - account_indices: (0..pre_states.len()).collect(), - }; + let mut program_id = message.program_id; + let mut instruction_data = message.instruction_data.clone(); for _i in 0..MAX_NUMBER_CHAINED_CALLS { // Check the `program_id` corresponds to a deployed program - let Some(program) = state.programs().get(&chained_call.program_id) else { + let Some(program) = state.programs().get(&program_id) else { return Err(NssaError::InvalidInput("Unknown program".into())); }; - let pre_states_chained_call = chained_call - .account_indices - .iter() - .map(|&i| { - pre_states - .get(i) - .ok_or_else(|| NssaError::InvalidInput("Invalid account indices".into())) - .cloned() - }) - .collect::, NssaError>>()?; + let mut program_output = program.execute(&input_pre_states, &instruction_data)?; - let mut program_output = - program.execute(&pre_states_chained_call, &chained_call.instruction_data)?; + // This check is equivalent to checking that the program output pre_states coinicide + // with the values in the public state or with any modifications to those values + // during the chain of calls. + if input_pre_states != program_output.pre_states { + return Err(NssaError::InvalidProgramBehavior); + } // Verify execution corresponds to a well-behaved program. // See the # Programs section for the definition of the `validate_execution` method. if !validate_execution( &program_output.pre_states, &program_output.post_states, - chained_call.program_id, + program_id, ) { return Err(NssaError::InvalidProgramBehavior); } + // The invoked program claims the accounts with default program id. for post in program_output.post_states.iter_mut() { - // The invoked program claims the accounts with default program id. if post.program_owner == DEFAULT_PROGRAM_ID { - post.program_owner = chained_call.program_id; + post.program_owner = program_id; } } + // Update the state diff for (pre, post) in program_output .pre_states .iter() - .zip(program_output.post_states) + .zip(program_output.post_states.iter()) { - state_diff.insert(pre.account_id, post); + state_diff.insert(pre.account_id, post.clone()); } if let Some(next_chained_call) = program_output.chained_call { - chained_call = next_chained_call; + program_id = next_chained_call.program_id; + instruction_data = next_chained_call.instruction_data; + + // Build post states with metadata for next call + let mut post_states_with_metadata = Vec::new(); + for (pre, post) in program_output + .pre_states + .iter() + .zip(program_output.post_states) + { + let mut post_with_metadata = pre.clone(); + post_with_metadata.account = post.clone(); + post_states_with_metadata.push(post_with_metadata); + } + + input_pre_states = next_chained_call + .account_indices + .iter() + .map(|&i| { + post_states_with_metadata + .get(i) + .ok_or_else(|| { + NssaError::InvalidInput("Invalid account indices".into()) + }) + .cloned() + }) + .collect::, NssaError>>()?; } else { break; }; diff --git a/nssa/src/state.rs b/nssa/src/state.rs index 2119929..4120824 100644 --- a/nssa/src/state.rs +++ b/nssa/src/state.rs @@ -6,9 +6,7 @@ use crate::{ }; use nssa_core::{ Commitment, CommitmentSetDigest, DUMMY_COMMITMENT, MembershipProof, Nullifier, - account::Account, - address::Address, - program::ProgramId, + account::Account, address::Address, program::ProgramId, }; use std::collections::{HashMap, HashSet}; @@ -2097,7 +2095,7 @@ pub mod tests { (amount, Program::authenticated_transfer_program().id()); let expected_to_post = Account { - program_owner: Program::authenticated_transfer_program().id(), + program_owner: Program::chain_caller().id(), balance: amount, ..Account::default() }; From 18dca9407c5b017c8ec677cf93451e518c52a073 Mon Sep 17 00:00:00 2001 From: Oleksandr Pravdyvyi Date: Fri, 31 Oct 2025 10:16:15 +0200 Subject: [PATCH 8/8] fix: config update --- .../configs/debug/sequencer_config.json | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/sequencer_runner/configs/debug/sequencer_config.json b/sequencer_runner/configs/debug/sequencer_config.json index 19ff458..acd0caa 100644 --- a/sequencer_runner/configs/debug/sequencer_config.json +++ b/sequencer_runner/configs/debug/sequencer_config.json @@ -8,49 +8,49 @@ "port": 3040, "initial_accounts": [ { - "addr": "d07ad2e84b27fa00c262f0a1eea0ff35ca0973547e6a106f72f193c2dc838b44", + "addr": "BLgCRDXYdQPMMWVHYRFGQZbgeHx9frkipa8GtpG2Syqy", "balance": 10000 }, { - "addr": "e7ae77c5ef1a05999344af499fc78a1705398d62ed06cf2e1479f6def89a39bc", + "addr": "Gj1mJy5W7J5pfmLRujmQaLfLMWidNxQ6uwnhb666ZwHw", "balance": 20000 } ], "initial_commitments": [ { "npk": [ - 193, - 209, - 150, - 113, - 47, - 241, - 48, - 145, - 250, - 79, - 235, - 51, - 119, - 40, - 184, - 232, - 5, + 63, + 202, + 178, + 231, + 183, + 82, + 237, + 212, + 216, 221, - 36, - 21, - 201, - 106, - 90, - 210, - 129, - 106, - 71, - 99, - 208, + 215, + 255, 153, - 75, - 215 + 101, + 177, + 161, + 254, + 210, + 128, + 122, + 54, + 190, + 230, + 151, + 183, + 64, + 225, + 229, + 113, + 1, + 228, + 97 ], "account": { "program_owner": [ @@ -70,38 +70,38 @@ }, { "npk": [ - 27, - 250, + 192, + 251, + 166, + 243, + 167, + 236, + 84, + 249, + 35, 136, - 142, - 88, - 128, - 138, - 21, - 49, - 183, - 118, - 160, - 117, - 114, - 110, - 47, - 136, - 87, - 60, - 70, - 59, - 60, - 18, - 223, - 23, - 147, - 241, - 5, - 184, - 103, + 130, + 172, + 219, 225, - 105 + 161, + 139, + 229, + 89, + 243, + 125, + 194, + 213, + 209, + 30, + 23, + 174, + 100, + 244, + 124, + 74, + 140, + 47 ], "account": { "program_owner": [ @@ -154,4 +154,4 @@ 37, 37 ] -} +} \ No newline at end of file