diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5a61c1d --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5131 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + +[[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 = "alloy" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba1c79677c9ce51c8d45e20845b05e6fb070ea2c863fba03ad6af2c778474bd" +dependencies = [ + "alloy-consensus", + "alloy-contract", + "alloy-core", + "alloy-eips", + "alloy-genesis", + "alloy-network", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", +] + +[[package]] +name = "alloy-chains" +version = "0.1.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28e2652684758b0d9b389d248b209ed9fd9989ef489a550265fe4bb8454fe7eb" +dependencies = [ + "alloy-primitives 0.8.25", + "num_enum", + "strum", +] + +[[package]] +name = "alloy-consensus" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da374e868f54c7f4ad2ad56829827badca388efd645f8cf5fccc61c2b5343504" +dependencies = [ + "alloy-eips", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "serde", +] + +[[package]] +name = "alloy-contract" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dc6957ff706f9e5f6fd42f52a93e4bce476b726c92d077b348de28c4a76730c" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-network", + "alloy-primitives 0.7.7", + "alloy-provider", + "alloy-pubsub", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "futures", + "futures-util", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-core" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529fc6310dc1126c8de51c376cbc59c79c7f662bd742be7dc67055d5421a81b4" +dependencies = [ + "alloy-dyn-abi", + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-types", +] + +[[package]] +name = "alloy-dyn-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413902aa18a97569e60f679c23f46a18db1656d87ab4d4e49d0e1e52042f66df" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", + "winnow 0.6.26", +] + +[[package]] +name = "alloy-eips" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76ecab54890cdea1e4808fc0891c7e6cfcf71fe1a9fe26810c7280ef768f4ed" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "c-kzg", + "derive_more 0.99.20", + "once_cell", + "serde", + "sha2", +] + +[[package]] +name = "alloy-genesis" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca15afde1b6d15e3fc1c97421262b1bbb37aee45752e3c8b6d6f13f776554ff" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-serde", + "serde", +] + +[[package]] +name = "alloy-json-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d6f34930b7e3e2744bcc79056c217f00cb2abb33bc5d4ff88da7623c5bb078b" +dependencies = [ + "alloy-primitives 0.7.7", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "alloy-network" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f6895fc31b48fa12306ef9b4f78b7764f8bd6d7d91cdb0a40e233704a0f23f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives 0.7.7", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-signer", + "alloy-sol-types", + "async-trait", + "auto_impl", + "futures-utils-wasm", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 0.99.20", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand 0.8.5", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" +dependencies = [ + "bytes", + "cfg-if", + "const-hex", + "derive_more 2.0.1", + "itoa", + "paste", + "ruint", + "tiny-keccak", +] + +[[package]] +name = "alloy-provider" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c538bfa893d07e27cb4f3c1ab5f451592b7c526d511d62b576a2ce59e146e4a" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives 0.7.7", + "alloy-pubsub", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "async-stream", + "async-trait", + "auto_impl", + "dashmap 5.5.3", + "futures", + "futures-utils-wasm", + "lru", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "alloy-pubsub" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7341322d9bc0e49f6e9fd9f2eb8e30f73806f2dd12cbb3d6bab2694c921f87" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.7.7", + "alloy-transport", + "bimap", + "futures", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tracing", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +dependencies = [ + "alloy-rlp-derive", + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ba31bae67773fd5a60020bea900231f8396202b7feca4d0c70c6b59308ab4a8" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives 0.7.7", + "alloy-pubsub", + "alloy-transport", + "alloy-transport-http", + "alloy-transport-ipc", + "alloy-transport-ws", + "futures", + "pin-project", + "reqwest", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-rpc-types" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "184a7a42c7ba9141cc9e76368356168c282c3bc3d9e5d78f3556bdfe39343447" +dependencies = [ + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-serde", +] + +[[package]] +name = "alloy-rpc-types-engine" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e765962e3b82fd6f276a0873b5bd897e5d75a25f78fa9a6a21bd350d8e98a4e" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "jsonwebtoken", + "rand 0.8.5", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-rpc-types-eth" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab4123ee21f99ba4bd31bfa36ba89112a18a500f8b452f02b35708b1b951e2b9" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.7.7", + "alloy-rlp", + "alloy-serde", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-serde" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9416c52959e66ead795a11f4a86c248410e9e368a0765710e57055b8a1774dd6" +dependencies = [ + "alloy-primitives 0.7.7", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-signer" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b33753c09fa1ad85e5b092b8dc2372f1e337a42e84b9b4cff9fede75ba4adb32" +dependencies = [ + "alloy-primitives 0.7.7", + "async-trait", + "auto_impl", + "elliptic-curve", + "k256", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-signer-local" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dfc9c26fe6c6f1bad818c9a976de9044dd12e1f75f1f156a801ee3e8148c1b6" +dependencies = [ + "alloy-consensus", + "alloy-network", + "alloy-primitives 0.7.7", + "alloy-signer", + "async-trait", + "k256", + "rand 0.8.5", + "thiserror 1.0.69", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.104", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.104", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" +dependencies = [ + "serde", + "winnow 0.6.26", +] + +[[package]] +name = "alloy-sol-types" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "alloy-sol-macro", + "const-hex", + "serde", +] + +[[package]] +name = "alloy-transport" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b51a291f949f755e6165c3ed562883175c97423703703355f4faa4b7d0a57c" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-http" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d65871f9f1cafe1ed25cde2f1303be83e6473e995a2d56c275ae4fcce6119c" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest", + "serde_json", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "alloy-transport-ipc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7fbc8b6282ce41b01cbddef7bffb133fe6e1bf65dcd39770d45a905c051179" +dependencies = [ + "alloy-json-rpc", + "alloy-pubsub", + "alloy-transport", + "bytes", + "futures", + "interprocess", + "pin-project", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "alloy-transport-ws" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec83fd052684556c78c54df111433493267234d82321c2236560c752f595f20" +dependencies = [ + "alloy-pubsub", + "alloy-transport", + "futures", + "http", + "rustls", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "ws_stream_wasm", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstream" +version = "0.6.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.1", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "auto_impl" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +dependencies = [ + "bindgen", + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[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 = "bimap" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" + +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.104", + "which", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[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 = "blst" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd49896f12ac9b6dcd7a5998466b9b58263a695a3dd1ecc1aaca2e12a90b080" +dependencies = [ + "cc", + "glob", + "threadpool", + "zeroize", +] + +[[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.104", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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 = "c-kzg" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0307f72feab3300336fb803a57134159f6e20139af1357f36c54cb90d8e8928" +dependencies = [ + "blst", + "cc", + "glob", + "hex", + "libc", + "once_cell", + "serde", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "const-hex" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e22e0ed40b96a48d3db274f72fd365bd78f67af39b6bbd47e8a15e1c6207ff" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[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" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +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 = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "criterion" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "is-terminal", + "itertools 0.10.5", + "num-traits", + "once_cell", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" +dependencies = [ + "cast", + "itertools 0.10.5", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[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 = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", +] + +[[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_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version 0.4.1", + "syn 2.0.104", +] + +[[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.104", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[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 = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "doctest-file" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[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 = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastwebsockets" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63dd7b57f9b33b1741fa631c9522eb35d43e96dcca4a6a91d5e4ca7c93acdc1" +dependencies = [ + "base64 0.21.7", + "http-body-util", + "hyper", + "hyper-util", + "pin-project", + "rand 0.8.5", + "sha1", + "simdutf8", + "thiserror 1.0.69", + "tokio", + "utf-8", +] + +[[package]] +name = "ferrofluid" +version = "0.1.1" +dependencies = [ + "alloy", + "async-trait", + "base64 0.22.1", + "bytes", + "clap", + "criterion", + "dashmap 6.1.0", + "fastwebsockets", + "hex", + "http", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "parking_lot", + "rand 0.8.5", + "reqwest", + "rmp-serde", + "rust_decimal", + "rustls", + "rustls-native-certs 0.7.3", + "serde", + "serde_json", + "simd-json", + "thiserror 1.0.69", + "tokio", + "tokio-rustls", + "tokio-test", + "tower 0.4.13", + "tracing", + "tracing-subscriber", + "url", + "uuid", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[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.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[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-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[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.104", +] + +[[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-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[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", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "halfbrown" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" +dependencies = [ + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[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 = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "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", + "log", + "rustls", + "rustls-native-certs 0.8.1", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[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 = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +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 = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.4", +] + +[[package]] +name = "interprocess" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d941b405bd2322993887859a8ee6ac9134945a24ec5ec763a8a962fc64dfec2d" +dependencies = [ + "doctest-file", + "futures-core", + "libc", + "recvmsg", + "tokio", + "widestring", + "windows-sys 0.52.0", +] + +[[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 = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lexical-core" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.2", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.4", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[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 = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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-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-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[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.104", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pem" +version = "3.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.1", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[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 = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +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 = "prettyplease" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +dependencies = [ + "proc-macro2", + "syn 2.0.104", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "lazy_static", + "num-traits", + "rand 0.9.1", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +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 = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +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 = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "recvmsg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.12.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower 0.5.2", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.17.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 = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rustc-hex", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "ruint" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11256b5fe8c68f56ac6f39ef0720e592f33d2367a4782740d9c9142e889c7fb4" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.1", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rust_decimal" +version = "1.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.2.0", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simd-json" +version = "0.13.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0228a564470f81724e30996bbc2b171713b37b15254a6440c7e2d5449b95691" +dependencies = [ + "getrandom 0.2.16", + "halfbrown", + "lexical-core", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.104", +] + +[[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.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[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.104", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.0.7", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-test" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2468baabc3311435b55dd935f702f42cd1b8abb7e754fb7dfb16bd36aa88f9f7" +dependencies = [ + "async-stream", + "bytes", + "futures-core", + "tokio", + "tokio-stream", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6989540ced10490aaf14e6bad2e3d33728a2813310a0c71d1574304c49631cd" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.26.11", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.7.11", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[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", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "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.104", +] + +[[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-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e2ce1e47ed2994fd43b04c8f618008d4cabdd5ee34027cf14f9d918edd9c8" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-trait" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad8db98c1e677797df21ba03fca7d3bf9bec3ca38db930954e4fe6e1ea27eb4" +dependencies = [ + "float-cmp", + "halfbrown", + "itoa", + "ryu", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[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.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.1", +] + +[[package]] +name = "webpki-roots" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix 0.38.44", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +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.2", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c173014acad22e83f16403ee360115b38846fe754e735c5d9d3803fe70c6abc" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.1", + "send_wrapper", + "thiserror 2.0.12", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[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.104", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[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.104", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +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.104", +] diff --git a/examples/00_symbols.rs b/examples/00_symbols.rs index ce50dda..abb9ac8 100644 --- a/examples/00_symbols.rs +++ b/examples/00_symbols.rs @@ -1,6 +1,6 @@ //! Example showing how to use the Symbol type -use ferrofluid::types::{Symbol, symbols}; +use ferrofluid::types::{symbols, Symbol}; fn main() { // Using predefined constants diff --git a/examples/03_exchange_provider.rs b/examples/03_exchange_provider.rs index 6131e5c..0f09502 100644 --- a/examples/03_exchange_provider.rs +++ b/examples/03_exchange_provider.rs @@ -2,7 +2,7 @@ use alloy::primitives::Address; use alloy::signers::local::PrivateKeySigner; use ferrofluid::constants::TIF_GTC; use ferrofluid::types::requests::OrderRequest; -use ferrofluid::{ExchangeProvider, signers::AlloySigner}; +use ferrofluid::{signers::AlloySigner, ExchangeProvider}; use uuid::Uuid; #[tokio::main] diff --git a/examples/04_websocket.rs b/examples/04_websocket.rs index e303c8d..88bbe23 100644 --- a/examples/04_websocket.rs +++ b/examples/04_websocket.rs @@ -1,6 +1,6 @@ //! Example of using the WebSocket provider for real-time data -use ferrofluid::{Network, providers::WsProvider, types::ws::Message}; +use ferrofluid::{providers::WsProvider, types::ws::Message, Network}; #[tokio::main] async fn main() -> Result<(), Box> { diff --git a/examples/05_builder_orders.rs b/examples/05_builder_orders.rs index 9ec6366..5fb2586 100644 --- a/examples/05_builder_orders.rs +++ b/examples/05_builder_orders.rs @@ -1,6 +1,6 @@ //! Example of using builder functionality for orders -use alloy::primitives::{B256, address}; +use alloy::primitives::{address, B256}; use alloy::signers::local::PrivateKeySigner; use ferrofluid::{providers::ExchangeProvider, signers::AlloySigner}; diff --git a/src/lib.rs b/src/lib.rs index bd22dfa..3df23e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,6 @@ pub mod utils; pub use constants::Network; pub use errors::HyperliquidError; pub use providers::{ - ExchangeProvider, InfoProvider, - WsProvider, RawWsProvider, ManagedWsProvider, WsConfig, - ManagedExchangeProvider + ExchangeProvider, InfoProvider, ManagedExchangeProvider, ManagedWsProvider, + RawWsProvider, WsConfig, WsProvider, }; diff --git a/src/providers/agent.rs b/src/providers/agent.rs index 0059bc3..8855439 100644 --- a/src/providers/agent.rs +++ b/src/providers/agent.rs @@ -1,16 +1,14 @@ //! Agent wallet management with automatic rotation and safety features -use std::sync::Arc; -use std::time::{Duration, Instant}; -use alloy::primitives::Address; -use alloy::signers::local::PrivateKeySigner; -use tokio::sync::RwLock; use crate::{ - signers::HyperliquidSigner, - errors::HyperliquidError, - providers::nonce::NonceManager, + errors::HyperliquidError, providers::nonce::NonceManager, signers::HyperliquidSigner, Network, }; +use alloy::primitives::Address; +use alloy::signers::local::PrivateKeySigner; +use std::sync::Arc; +use std::time::{Duration, Instant}; +use tokio::sync::RwLock; /// Agent wallet with lifecycle tracking #[derive(Clone)] @@ -48,7 +46,7 @@ impl AgentWallet { status: AgentStatus::Active, } } - + /// Check if agent should be rotated based on TTL pub fn should_rotate(&self, ttl: Duration) -> bool { match self.status { @@ -56,7 +54,7 @@ impl AgentWallet { AgentStatus::PendingRotation | AgentStatus::Deregistered => true, } } - + /// Get next nonce for this agent pub fn next_nonce(&self) -> u64 { self.nonce_manager.next_nonce(None) @@ -106,70 +104,85 @@ impl AgentManager { network, } } - + /// Get or create an agent, rotating if necessary - pub async fn get_or_rotate_agent(&self, name: &str) -> Result { + pub async fn get_or_rotate_agent( + &self, + name: &str, + ) -> Result { let mut agents = self.agents.write().await; - + // Check if we have an active agent if let Some(agent) = agents.get(name) { - let effective_ttl = self.config.ttl.saturating_sub(self.config.proactive_rotation_buffer); - + let effective_ttl = self + .config + .ttl + .saturating_sub(self.config.proactive_rotation_buffer); + if !agent.should_rotate(effective_ttl) { return Ok(agent.clone()); } - + // Mark for rotation let mut agent_mut = agent.clone(); agent_mut.status = AgentStatus::PendingRotation; agents.insert(name.to_string(), agent_mut); } - + // Create new agent let new_agent = self.create_new_agent(name).await?; agents.insert(name.to_string(), new_agent.clone()); - + Ok(new_agent) } - + /// Create and approve a new agent - async fn create_new_agent(&self, name: &str) -> Result { + async fn create_new_agent( + &self, + name: &str, + ) -> Result { // Generate new key for agent let agent_signer = PrivateKeySigner::random(); let agent_wallet = AgentWallet::new(agent_signer.clone()); - + // We need to approve this agent using the exchange provider // This is a bit circular, but we'll handle it carefully - self.approve_agent_internal(agent_wallet.address, Some(name.to_string())).await?; - + self.approve_agent_internal(agent_wallet.address, Some(name.to_string())) + .await?; + Ok(agent_wallet) } - + /// Internal method to approve agent (will use exchange provider) - async fn approve_agent_internal(&self, agent_address: Address, name: Option) -> Result<(), HyperliquidError> { + async fn approve_agent_internal( + &self, + agent_address: Address, + name: Option, + ) -> Result<(), HyperliquidError> { use crate::providers::RawExchangeProvider; - + // Create a temporary raw provider just for agent approval let raw_provider = match self.network { Network::Mainnet => RawExchangeProvider::mainnet(self.master_signer.clone()), Network::Testnet => RawExchangeProvider::testnet(self.master_signer.clone()), }; - + // Approve the agent raw_provider.approve_agent(agent_address, name).await?; - + Ok(()) } - + /// Get all active agents pub async fn get_active_agents(&self) -> Vec<(String, AgentWallet)> { let agents = self.agents.read().await; - agents.iter() + agents + .iter() .filter(|(_, agent)| agent.status == AgentStatus::Active) .map(|(name, agent)| (name.clone(), agent.clone())) .collect() } - + /// Mark an agent as deregistered pub async fn mark_deregistered(&self, name: &str) { let mut agents = self.agents.write().await; @@ -177,7 +190,7 @@ impl AgentManager { agent.status = AgentStatus::Deregistered; } } - + /// Clean up deregistered agents pub async fn cleanup_deregistered(&self) { let mut agents = self.agents.write().await; @@ -188,27 +201,27 @@ impl AgentManager { #[cfg(test)] mod tests { use super::*; - + #[test] fn test_agent_rotation_check() { let signer = PrivateKeySigner::random(); let agent = AgentWallet::new(signer); - + // Should not rotate immediately assert!(!agent.should_rotate(Duration::from_secs(24 * 60 * 60))); - + // Test with zero duration (should always rotate) assert!(agent.should_rotate(Duration::ZERO)); } - + #[test] fn test_agent_nonce_generation() { let signer = PrivateKeySigner::random(); let agent = AgentWallet::new(signer); - + let nonce1 = agent.next_nonce(); let nonce2 = agent.next_nonce(); - + assert!(nonce2 > nonce1); } -} \ No newline at end of file +} diff --git a/src/providers/batcher.rs b/src/providers/batcher.rs index c2d8be2..02a4a55 100644 --- a/src/providers/batcher.rs +++ b/src/providers/batcher.rs @@ -1,15 +1,15 @@ //! Order batching for high-frequency trading strategies +use crate::errors::HyperliquidError; +use crate::types::requests::{CancelRequest, OrderRequest}; +use crate::types::responses::ExchangeResponseStatus; +use std::future::Future; +use std::pin::Pin; use std::sync::Arc; use std::time::Duration; -use std::pin::Pin; -use std::future::Future; -use tokio::sync::{Mutex, mpsc}; +use tokio::sync::{mpsc, Mutex}; use tokio::time::interval; use uuid::Uuid; -use crate::types::requests::{OrderRequest, CancelRequest}; -use crate::types::responses::ExchangeResponseStatus; -use crate::errors::HyperliquidError; type BoxFuture = Pin + Send + 'static>>; @@ -19,7 +19,8 @@ pub struct PendingOrder { pub order: OrderRequest, pub nonce: u64, pub id: Uuid, - pub response_tx: mpsc::UnboundedSender>, + pub response_tx: + mpsc::UnboundedSender>, } /// Cancel with metadata for batching @@ -28,7 +29,8 @@ pub struct PendingCancel { pub cancel: CancelRequest, pub nonce: u64, pub id: Uuid, - pub response_tx: mpsc::UnboundedSender>, + pub response_tx: + mpsc::UnboundedSender>, } /// Order type classification for priority batching @@ -91,57 +93,57 @@ impl OrderBatcher { /// Create a new order batcher pub fn new(config: BatchConfig) -> (Self, BatcherHandle) { let (shutdown_tx, shutdown_rx) = mpsc::channel(1); - + let batcher = Self { pending_orders: Arc::new(Mutex::new(Vec::new())), pending_cancels: Arc::new(Mutex::new(Vec::new())), _config: config, shutdown_tx, }; - + let handle = BatcherHandle { pending_orders: batcher.pending_orders.clone(), pending_cancels: batcher.pending_cancels.clone(), shutdown_rx, }; - + (batcher, handle) } - + /// Add an order to the batch queue pub async fn add_order(&self, order: OrderRequest, nonce: u64) -> OrderHandle { let id = Uuid::new_v4(); let (tx, rx) = mpsc::unbounded_channel(); - + let pending = PendingOrder { order, nonce, id, response_tx: tx, }; - + self.pending_orders.lock().await.push(pending); - + OrderHandle::Pending { id, rx } } - + /// Add a cancel to the batch queue pub async fn add_cancel(&self, cancel: CancelRequest, nonce: u64) -> OrderHandle { let id = Uuid::new_v4(); let (tx, rx) = mpsc::unbounded_channel(); - + let pending = PendingCancel { cancel, nonce, id, response_tx: tx, }; - + self.pending_cancels.lock().await.push(pending); - + OrderHandle::Pending { id, rx } } - + /// Shutdown the batcher pub async fn shutdown(self) { let _ = self.shutdown_tx.send(()).await; @@ -157,17 +159,21 @@ pub struct BatcherHandle { impl BatcherHandle { /// Run the batching loop (should be spawned as a task) - pub async fn run( - mut self, - mut order_executor: F, - mut cancel_executor: G, - ) + pub async fn run(mut self, mut order_executor: F, mut cancel_executor: G) where - F: FnMut(Vec) -> BoxFuture>> + Send, - G: FnMut(Vec) -> BoxFuture>> + Send, + F: FnMut( + Vec, + ) + -> BoxFuture>> + + Send, + G: FnMut( + Vec, + ) + -> BoxFuture>> + + Send, { let mut interval = interval(Duration::from_millis(100)); // Fixed interval for now - + loop { tokio::select! { _ = interval.tick() => { @@ -176,14 +182,14 @@ impl BatcherHandle { let mut pending = self.pending_orders.lock().await; std::mem::take(&mut *pending) }; - + if !orders.is_empty() { // Separate ALO from regular orders - let (alo_orders, regular_orders): (Vec<_>, Vec<_>) = + let (alo_orders, regular_orders): (Vec<_>, Vec<_>) = orders.into_iter().partition(|o| { o.order.is_alo() }); - + // Process ALO orders first (priority) if !alo_orders.is_empty() { let results = order_executor(alo_orders.clone()).await; @@ -191,7 +197,7 @@ impl BatcherHandle { let _ = order.response_tx.send(result); } } - + // Process regular orders if !regular_orders.is_empty() { let results = order_executor(regular_orders.clone()).await; @@ -200,13 +206,13 @@ impl BatcherHandle { } } } - + // Process cancels let cancels = { let mut pending = self.pending_cancels.lock().await; std::mem::take(&mut *pending) }; - + if !cancels.is_empty() { let results = cancel_executor(cancels.clone()).await; for (cancel, result) in cancels.into_iter().zip(results) { @@ -214,7 +220,7 @@ impl BatcherHandle { } } } - + _ = self.shutdown_rx.recv() => { // Graceful shutdown break; @@ -239,13 +245,13 @@ impl OrderRequest { #[cfg(test)] mod tests { use super::*; - use crate::types::requests::{OrderType, Limit}; - + use crate::types::requests::{Limit, OrderType}; + #[tokio::test] async fn test_order_batching() { let config = BatchConfig::default(); let (batcher, _handle) = OrderBatcher::new(config); - + // Create a test order let order = OrderRequest { asset: 0, @@ -253,14 +259,16 @@ mod tests { limit_px: "50000".to_string(), sz: "0.1".to_string(), reduce_only: false, - order_type: OrderType::Limit(Limit { tif: "Gtc".to_string() }), + order_type: OrderType::Limit(Limit { + tif: "Gtc".to_string(), + }), cloid: None, }; - + // Add to batch let handle = batcher.add_order(order, 123456789).await; - + // Should return pending handle assert!(matches!(handle, OrderHandle::Pending { .. })); } -} \ No newline at end of file +} diff --git a/src/providers/exchange.rs b/src/providers/exchange.rs index 29d61cd..cadc404 100644 --- a/src/providers/exchange.rs +++ b/src/providers/exchange.rs @@ -3,24 +3,24 @@ use std::{ time::{SystemTime, UNIX_EPOCH}, }; -use alloy::primitives::{Address, B256, keccak256}; +use alloy::primitives::{keccak256, Address, B256}; use http_body_util::{BodyExt, Full}; -use hyper::{Method, Request, body::Bytes}; +use hyper::{body::Bytes, Method, Request}; use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder}; -use hyper_util::client::legacy::{Client, connect::HttpConnector}; +use hyper_util::client::legacy::{connect::HttpConnector, Client}; use serde::Serialize; -use serde_json::{Value, json}; +use serde_json::{json, Value}; use uuid::Uuid; use crate::{ constants::*, errors::HyperliquidError, + providers::order_tracker::{OrderStatus, OrderTracker, TrackedOrder}, signers::{HyperliquidSignature, HyperliquidSigner}, types::{ actions::*, eip712::HyperliquidAction, requests::*, responses::ExchangeResponseStatus, Symbol, }, - providers::order_tracker::{OrderTracker, OrderStatus, TrackedOrder}, }; type Result = std::result::Result; @@ -269,23 +269,24 @@ impl RawExchangeProvider { // Auto-generate CLOID if tracking is enabled and order doesn't have one let mut order = order.clone(); let cloid = if let Some(tracker) = &self.order_tracker { - let cloid = order.cloid + let cloid = order + .cloid .as_ref() .and_then(|c| Uuid::parse_str(c).ok()) .unwrap_or_else(Uuid::new_v4); - + // Ensure the order has a cloid if order.cloid.is_none() { order = order.with_cloid(Some(cloid)); } - + // Track the order let timestamp = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs(); tracker.track_order(cloid, order.clone(), timestamp); - + Some(cloid) } else { order.cloid.as_ref().and_then(|c| Uuid::parse_str(c).ok()) @@ -301,7 +302,7 @@ impl RawExchangeProvider { }; let result = self.send_l1_action("order", &bulk_order).await; - + // Update tracking status based on result if let Some(tracker) = &self.order_tracker { if let Some(cloid) = cloid { @@ -310,20 +311,20 @@ impl RawExchangeProvider { tracker.update_order_status( &cloid, OrderStatus::Submitted, - Some(response.clone()) + Some(response.clone()), ); } Err(e) => { tracker.update_order_status( &cloid, OrderStatus::Failed(e.to_string()), - None + None, ); } } } } - + result } @@ -337,23 +338,24 @@ impl RawExchangeProvider { // Auto-generate CLOID if tracking is enabled and order doesn't have one let mut order = order.clone(); let cloid = if let Some(tracker) = &self.order_tracker { - let cloid = order.cloid + let cloid = order + .cloid .as_ref() .and_then(|c| Uuid::parse_str(c).ok()) .unwrap_or_else(Uuid::new_v4); - + // Ensure the order has a cloid if order.cloid.is_none() { order = order.with_cloid(Some(cloid)); } - + // Track the order let timestamp = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs(); tracker.track_order(cloid, order.clone(), timestamp); - + Some(cloid) } else { order.cloid.as_ref().and_then(|c| Uuid::parse_str(c).ok()) @@ -369,7 +371,7 @@ impl RawExchangeProvider { }; let result = self.send_l1_action("order", &bulk_order).await; - + // Update tracking status based on result if let Some(tracker) = &self.order_tracker { if let Some(cloid) = cloid { @@ -378,20 +380,20 @@ impl RawExchangeProvider { tracker.update_order_status( &cloid, OrderStatus::Submitted, - Some(response.clone()) + Some(response.clone()), ); } Err(e) => { tracker.update_order_status( &cloid, OrderStatus::Failed(e.to_string()), - None + None, ); } } } } - + result } @@ -662,25 +664,30 @@ impl RawExchangeProvider { self.send_user_action(&action).await } - + /// Approve a new agent, generating a random key like the original SDK /// Returns (private_key_hex, response) pub async fn approve_agent_new(&self) -> Result<(String, ExchangeResponseStatus)> { - use rand::Rng; - use alloy::signers::local::PrivateKeySigner; use alloy::primitives::B256; - + use alloy::signers::local::PrivateKeySigner; + use rand::Rng; + // Generate random key let mut rng = rand::thread_rng(); let mut key_bytes = [0u8; 32]; rng.fill(&mut key_bytes); let key_hex = hex::encode(key_bytes); - + // Create a signer from the key to get the address - let signer = PrivateKeySigner::from_bytes(&B256::from(key_bytes)) - .map_err(|e| HyperliquidError::InvalidRequest(format!("Failed to create signer: {}", e)))?; + let signer = + PrivateKeySigner::from_bytes(&B256::from(key_bytes)).map_err(|e| { + HyperliquidError::InvalidRequest(format!( + "Failed to create signer: {}", + e + )) + })?; let agent_address = signer.address(); - + // Get chain info let (_, _) = self.infer_network(); let chain = if self.endpoint.contains("testnet") { @@ -688,7 +695,7 @@ impl RawExchangeProvider { } else { "Mainnet" }; - + // Create the action with proper Address type let action = ApproveAgent { signature_chain_id: 421614, // Always use Arbitrum Sepolia chain ID @@ -697,10 +704,10 @@ impl RawExchangeProvider { agent_name: None, nonce: Self::current_nonce(), }; - + // Use send_user_action which handles EIP-712 signing let response = self.send_user_action(&action).await?; - + Ok((key_hex, response)) } @@ -814,7 +821,12 @@ impl RawExchangeProvider { "approveAgent" => ActionWrapper::ApproveAgent(action), "approveBuilderFee" => ActionWrapper::ApproveBuilderFee(action), "withdraw3" => ActionWrapper::Withdraw3(action), - _ => return Err(HyperliquidError::InvalidRequest(format!("Unknown action type: {}", action_type))), + _ => { + return Err(HyperliquidError::InvalidRequest(format!( + "Unknown action type: {}", + action_type + ))) + } }; // NOTE: Hyperliquid uses MessagePack (rmp_serde) for action serialization @@ -907,12 +919,12 @@ impl RawExchangeProvider { "ApproveBuilderFee" => "approveBuilderFee", _ => action_type, }; - + // Add type tag if let Value::Object(ref mut map) = action_value { map.insert("type".to_string(), json!(type_tag)); } - + // Send directly without L1 wrapping for user actions self.post(action_value, signature, nonce).await } @@ -923,7 +935,6 @@ impl RawExchangeProvider { signature: HyperliquidSignature, nonce: u64, ) -> Result { - // Hyperliquid expects signature as an object with r, s, v fields // not as a concatenated hex string let payload = json!({ @@ -961,7 +972,7 @@ impl RawExchangeProvider { // Always try to deserialize the response as ExchangeResponseStatus // The API returns this format even for error status codes serde_json::from_slice(&body_bytes).map_err(|e| { - // If deserialization fails and we have an error status, + // If deserialization fails and we have an error status, // return the HTTP error with the body if !status.is_success() { let body_text = String::from_utf8_lossy(&body_bytes); @@ -1087,13 +1098,15 @@ impl<'a, S: HyperliquidSigner> OrderBuilder<'a, S> { let sz = self.sz.ok_or(HyperliquidError::InvalidRequest( "sz must be specified".to_string(), ))?; - + // Parse and format the prices to match API expectations - let limit_px_f64 = limit_px.parse::() - .map_err(|_| HyperliquidError::InvalidRequest("Invalid limit_px format".to_string()))?; - let sz_f64 = sz.parse::() - .map_err(|_| HyperliquidError::InvalidRequest("Invalid sz format".to_string()))?; - + let limit_px_f64 = limit_px.parse::().map_err(|_| { + HyperliquidError::InvalidRequest("Invalid limit_px format".to_string()) + })?; + let sz_f64 = sz.parse::().map_err(|_| { + HyperliquidError::InvalidRequest("Invalid sz format".to_string()) + })?; + Ok(OrderRequest { asset: self.asset, is_buy: self.is_buy.ok_or(HyperliquidError::InvalidRequest( @@ -1124,12 +1137,12 @@ impl RawExchangeProvider { // ==================== Managed Exchange Provider ==================== -use tokio::sync::Mutex as TokioMutex; use crate::providers::{ - agent::{AgentManager, AgentConfig, AgentWallet}, + agent::{AgentConfig, AgentManager, AgentWallet}, + batcher::{BatchConfig, OrderBatcher, OrderHandle}, nonce::NonceManager, - batcher::{OrderBatcher, BatchConfig, OrderHandle}, }; +use tokio::sync::Mutex as TokioMutex; /// Configuration for managed exchange provider #[derive(Clone, Debug)] @@ -1138,15 +1151,15 @@ pub struct ManagedExchangeConfig { pub batch_orders: bool, /// Batch configuration pub batch_config: BatchConfig, - + /// Agent lifecycle management pub auto_rotate_agents: bool, /// Agent configuration pub agent_config: AgentConfig, - + /// Nonce isolation per subaccount pub isolate_subaccount_nonces: bool, - + /// Safety features pub prevent_agent_address_queries: bool, pub warn_on_high_nonce_velocity: bool, @@ -1170,17 +1183,17 @@ impl Default for ManagedExchangeConfig { pub struct ManagedExchangeProvider { /// Inner raw provider inner: Arc>, - + /// Agent manager for lifecycle agent_manager: Option>>, - + /// Nonce tracking nonce_manager: Arc, - + /// Order batching batcher: Option>, batcher_handle: Option>>>>, - + /// Configuration config: ManagedExchangeConfig, } @@ -1190,7 +1203,7 @@ impl ManagedExchangeProvider { pub fn builder(signer: S) -> ManagedExchangeProviderBuilder { ManagedExchangeProviderBuilder::new(signer) } - + /// Create with default configuration for mainnet pub async fn mainnet(signer: S) -> Result> { Self::builder(signer) @@ -1198,7 +1211,7 @@ impl ManagedExchangeProvider { .build() .await } - + /// Create with default configuration for testnet pub async fn testnet(signer: S) -> Result> { Self::builder(signer) @@ -1206,7 +1219,7 @@ impl ManagedExchangeProvider { .build() .await } - + /// Place an order with all managed features pub async fn place_order(&self, order: &OrderRequest) -> Result { // Get nonce based on configuration @@ -1229,18 +1242,18 @@ impl ManagedExchangeProvider { self.nonce_manager.next_nonce(None) } }; - + // Check nonce validity if !NonceManager::is_valid_nonce(nonce) { return Err(HyperliquidError::InvalidRequest( - "Generated nonce is outside valid time bounds".to_string() + "Generated nonce is outside valid time bounds".to_string(), )); } - + // For now, we always use the main provider // In a full implementation, we'd need to handle agent signing differently // This is a limitation of the current design where we can't easily swap signers - + // Batch or direct execution if self.config.batch_orders { if let Some(batcher) = &self.batcher { @@ -1256,17 +1269,20 @@ impl ManagedExchangeProvider { Ok(OrderHandle::Immediate(Ok(result))) } } - + /// Place order immediately, bypassing batch - pub async fn place_order_immediate(&self, order: &OrderRequest) -> Result { + pub async fn place_order_immediate( + &self, + order: &OrderRequest, + ) -> Result { self.inner.place_order(order).await } - + /// Access the raw provider for advanced usage pub fn raw(&self) -> &RawExchangeProvider { &self.inner } - + /// Get current agent status pub async fn get_agent_status(&self) -> Option> { if let Some(agent_mgr) = &self.agent_manager { @@ -1275,7 +1291,7 @@ impl ManagedExchangeProvider { None } } - + /// Shutdown the managed provider cleanly pub async fn shutdown(self: Arc) { // Stop batcher if running @@ -1308,52 +1324,52 @@ impl ManagedExchangeProviderBuilder { builder_address: None, } } - + /// Set network pub fn with_network(mut self, network: Network) -> Self { self.network = network; self } - + /// Enable automatic order batching pub fn with_auto_batching(mut self, interval: std::time::Duration) -> Self { self.config.batch_orders = true; self.config.batch_config.interval = interval; self } - + /// Configure agent rotation pub fn with_agent_rotation(mut self, ttl: std::time::Duration) -> Self { self.config.auto_rotate_agents = true; self.config.agent_config.ttl = ttl; self } - + /// Start with an agent pub fn with_agent(mut self, name: Option) -> Self { self.initial_agent = name; self.config.auto_rotate_agents = true; self } - + /// Set vault address pub fn with_vault(mut self, vault: Address) -> Self { self.vault_address = Some(vault); self } - + /// Set builder address pub fn with_builder(mut self, builder: Address) -> Self { self.builder_address = Some(builder); self } - + /// Disable agent rotation pub fn without_agent_rotation(mut self) -> Self { self.config.auto_rotate_agents = false; self } - + /// Build the provider pub async fn build(self) -> Result>> { // Create raw provider @@ -1377,85 +1393,107 @@ impl ManagedExchangeProviderBuilder { } } }; - + let inner = Arc::new(raw); - + // Create agent manager if needed let agent_manager = if self.config.auto_rotate_agents { Some(Arc::new(AgentManager::new( self.signer, self.config.agent_config.clone(), - self.network + self.network, ))) } else { None }; - + // Create nonce manager - let nonce_manager = Arc::new(NonceManager::new( - self.config.isolate_subaccount_nonces - )); - + let nonce_manager = + Arc::new(NonceManager::new(self.config.isolate_subaccount_nonces)); + // Create batcher if needed let (batcher, batcher_handle) = if self.config.batch_orders { let (batcher, handle) = OrderBatcher::new(self.config.batch_config.clone()); let batcher = Arc::new(batcher); - + // Spawn batch processing task let inner_clone = inner.clone(); let inner_clone2 = inner.clone(); let handle_future = tokio::spawn(async move { - handle.run( - move |orders| { - let inner = inner_clone.clone(); - Box::pin(async move { - // Execute batch - let order_requests: Vec = orders.iter() - .map(|o| o.order.clone()) - .collect(); - - match inner.bulk_orders(order_requests).await { - Ok(status) => { - // Return same status for all orders in batch - orders.iter().map(|_| Ok(status.clone())).collect() - } - Err(e) => { - // Return same error for all orders in batch - let err_str = e.to_string(); - orders.iter().map(|_| Err(HyperliquidError::InvalidResponse(err_str.clone()))).collect() + handle + .run( + move |orders| { + let inner = inner_clone.clone(); + Box::pin(async move { + // Execute batch + let order_requests: Vec = + orders.iter().map(|o| o.order.clone()).collect(); + + match inner.bulk_orders(order_requests).await { + Ok(status) => { + // Return same status for all orders in batch + orders + .iter() + .map(|_| Ok(status.clone())) + .collect() + } + Err(e) => { + // Return same error for all orders in batch + let err_str = e.to_string(); + orders + .iter() + .map(|_| { + Err(HyperliquidError::InvalidResponse( + err_str.clone(), + )) + }) + .collect() + } } - } - }) - }, - move |cancels| { - let inner = inner_clone2.clone(); - Box::pin(async move { - // Execute cancel batch - let cancel_requests: Vec = cancels.iter() - .map(|c| c.cancel.clone()) - .collect(); - - match inner.bulk_cancel(cancel_requests).await { - Ok(status) => { - // Return same status for all cancels in batch - cancels.iter().map(|_| Ok(status.clone())).collect() + }) + }, + move |cancels| { + let inner = inner_clone2.clone(); + Box::pin(async move { + // Execute cancel batch + let cancel_requests: Vec = + cancels.iter().map(|c| c.cancel.clone()).collect(); + + match inner.bulk_cancel(cancel_requests).await { + Ok(status) => { + // Return same status for all cancels in batch + cancels + .iter() + .map(|_| Ok(status.clone())) + .collect() + } + Err(e) => { + // Return same error for all cancels in batch + let err_str = e.to_string(); + cancels + .iter() + .map(|_| { + Err(HyperliquidError::InvalidResponse( + err_str.clone(), + )) + }) + .collect() + } } - Err(e) => { - // Return same error for all cancels in batch - let err_str = e.to_string(); - cancels.iter().map(|_| Err(HyperliquidError::InvalidResponse(err_str.clone()))).collect() - } - } - }) - } - ).await; + }) + }, + ) + .await; }); - - (Some(batcher), Some(Arc::new(TokioMutex::new(Some(handle_future))))) + + ( + Some(batcher), + Some(Arc::new(TokioMutex::new(Some(handle_future)))), + ) } else { (None, None) }; - + let provider = Arc::new(ManagedExchangeProvider { inner, agent_manager, @@ -1464,14 +1502,14 @@ impl ManagedExchangeProviderBuilder { batcher_handle, config: self.config, }); - + // Initialize agent if requested if let Some(agent_name) = self.initial_agent { if let Some(agent_mgr) = &provider.agent_manager { agent_mgr.get_or_rotate_agent(&agent_name).await?; } } - + Ok(provider) } } diff --git a/src/providers/info.rs b/src/providers/info.rs index 1de7b91..48cac78 100644 --- a/src/providers/info.rs +++ b/src/providers/info.rs @@ -7,7 +7,7 @@ use http::{Method, Request}; use http_body_util::{BodyExt, Full}; use hyper::body::Bytes; use hyper_rustls::{HttpsConnector, HttpsConnectorBuilder}; -use hyper_util::client::legacy::{Client, connect::HttpConnector}; +use hyper_util::client::legacy::{connect::HttpConnector, Client}; use hyper_util::rt::TokioExecutor; use serde_json::json; diff --git a/src/providers/mod.rs b/src/providers/mod.rs index dc70879..3208011 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -1,10 +1,10 @@ +pub mod agent; +pub mod batcher; pub mod exchange; pub mod info; -pub mod websocket; pub mod nonce; -pub mod agent; -pub mod batcher; pub mod order_tracker; +pub mod websocket; // Raw providers (backwards compatibility) pub use exchange::RawExchangeProvider as ExchangeProvider; @@ -16,11 +16,11 @@ pub use exchange::RawExchangeProvider; pub use websocket::RawWsProvider; // Managed providers -pub use exchange::{ManagedExchangeProvider, ManagedExchangeConfig}; +pub use exchange::{ManagedExchangeConfig, ManagedExchangeProvider}; pub use websocket::{ManagedWsProvider, WsConfig}; // Common types +pub use batcher::OrderHandle; pub use exchange::OrderBuilder; pub use info::RateLimiter; pub use websocket::SubscriptionId; -pub use batcher::OrderHandle; diff --git a/src/providers/nonce.rs b/src/providers/nonce.rs index ac1b448..4e96aac 100644 --- a/src/providers/nonce.rs +++ b/src/providers/nonce.rs @@ -1,12 +1,12 @@ //! Nonce management for Hyperliquid's sliding window system -use std::sync::atomic::{AtomicU64, Ordering}; -use std::time::{SystemTime, UNIX_EPOCH}; use alloy::primitives::Address; use dashmap::DashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{SystemTime, UNIX_EPOCH}; /// Manages nonces for Hyperliquid's sliding window system -/// +/// /// Hyperliquid stores the 100 highest nonces per address and requires: /// - New nonce > smallest in the set /// - Never reuse a nonce @@ -30,14 +30,14 @@ impl NonceManager { isolate_per_address, } } - + /// Get the next nonce for an optional address pub fn next_nonce(&self, address: Option
) -> u64 { let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; - + // Get counter increment let counter = if self.isolate_per_address && address.is_some() { let addr = address.unwrap(); @@ -48,19 +48,19 @@ impl NonceManager { } else { self.global_counter.fetch_add(1, Ordering::Relaxed) }; - + // Add sub-millisecond offset to ensure uniqueness // This handles rapid-fire orders within the same millisecond now.saturating_add(counter % 1000) } - + /// Reset counter for a specific address (useful after agent rotation) pub fn reset_address(&self, address: Address) { if let Some(counter) = self.counters.get_mut(&address) { counter.store(0, Ordering::Relaxed); } } - + /// Get current counter value for monitoring pub fn get_counter(&self, address: Option
) -> u64 { if let Some(addr) = address { @@ -76,18 +76,18 @@ impl NonceManager { self.global_counter.load(Ordering::Relaxed) } } - + /// Check if a nonce is within valid time bounds pub fn is_valid_nonce(nonce: u64) -> bool { let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; - + // Must be within (T - 2 days, T + 1 day) const TWO_DAYS_MS: u64 = 2 * 24 * 60 * 60 * 1000; const ONE_DAY_MS: u64 = 24 * 60 * 60 * 1000; - + nonce > now.saturating_sub(TWO_DAYS_MS) && nonce < now.saturating_add(ONE_DAY_MS) } } @@ -95,56 +95,56 @@ impl NonceManager { #[cfg(test)] mod tests { use super::*; - + #[test] fn test_nonce_uniqueness() { let manager = NonceManager::new(false); - + let nonce1 = manager.next_nonce(None); let nonce2 = manager.next_nonce(None); - + assert_ne!(nonce1, nonce2); assert!(nonce2 > nonce1); } - + #[test] fn test_address_isolation() { let manager = NonceManager::new(true); let addr1 = Address::new([1u8; 20]); let addr2 = Address::new([2u8; 20]); - + // Get nonces for different addresses let n1_1 = manager.next_nonce(Some(addr1)); let n2_1 = manager.next_nonce(Some(addr2)); let n1_2 = manager.next_nonce(Some(addr1)); let n2_2 = manager.next_nonce(Some(addr2)); - + // Each address should have independent counters assert!(n1_2 > n1_1); assert!(n2_2 > n2_1); - + // Counters should be independent assert_eq!(manager.get_counter(Some(addr1)), 2); assert_eq!(manager.get_counter(Some(addr2)), 2); } - + #[test] fn test_nonce_validity() { let now = SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_millis() as u64; - + // Valid: current time assert!(NonceManager::is_valid_nonce(now)); - + // Valid: 1 day ago assert!(NonceManager::is_valid_nonce(now - 24 * 60 * 60 * 1000)); - + // Invalid: 3 days ago assert!(!NonceManager::is_valid_nonce(now - 3 * 24 * 60 * 60 * 1000)); - + // Invalid: 2 days in future assert!(!NonceManager::is_valid_nonce(now + 2 * 24 * 60 * 60 * 1000)); } -} \ No newline at end of file +} diff --git a/src/providers/order_tracker.rs b/src/providers/order_tracker.rs index d8f719e..43427bf 100644 --- a/src/providers/order_tracker.rs +++ b/src/providers/order_tracker.rs @@ -42,7 +42,7 @@ impl OrderTracker { status: OrderStatus::Pending, response: None, }; - + let mut orders = self.orders.write().unwrap(); orders.insert(cloid, tracked); } @@ -126,4 +126,4 @@ impl Default for OrderTracker { fn default() -> Self { Self::new() } -} \ No newline at end of file +} diff --git a/src/providers/websocket.rs b/src/providers/websocket.rs index a18fb99..3025805 100644 --- a/src/providers/websocket.rs +++ b/src/providers/websocket.rs @@ -1,22 +1,22 @@ //! WebSocket provider for real-time market data and user events use std::sync::{ - Arc, atomic::{AtomicU32, Ordering}, + Arc, }; use dashmap::DashMap; -use fastwebsockets::{Frame, OpCode, Role, WebSocket, handshake}; +use fastwebsockets::{handshake, Frame, OpCode, Role, WebSocket}; use http_body_util::Empty; -use hyper::{Request, StatusCode, body::Bytes, header, upgrade::Upgraded}; +use hyper::{body::Bytes, header, upgrade::Upgraded, Request, StatusCode}; use hyper_util::rt::TokioIo; use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender}; use crate::{ - Network, errors::HyperliquidError, types::ws::{Message, Subscription, WsRequest}, types::Symbol, + Network, }; pub type SubscriptionId = u32; @@ -355,7 +355,7 @@ struct ManagedSubscription { subscription: Subscription, tx: UnboundedSender, #[allow(dead_code)] - created_at: Instant, // For future use: subscription age tracking + created_at: Instant, // For future use: subscription age tracking } /// Managed WebSocket provider with automatic keep-alive and reconnection @@ -375,10 +375,13 @@ pub struct ManagedWsProvider { impl ManagedWsProvider { /// Connect with custom configuration - pub async fn connect(network: Network, config: WsConfig) -> Result, HyperliquidError> { + pub async fn connect( + network: Network, + config: WsConfig, + ) -> Result, HyperliquidError> { // Create initial connection let raw_provider = RawWsProvider::connect(network).await?; - + let provider = Arc::new(Self { network, inner: Arc::new(Mutex::new(Some(raw_provider))), @@ -386,7 +389,7 @@ impl ManagedWsProvider { config, next_id: Arc::new(AtomicU32::new(1)), }); - + // Start keep-alive task if configured if provider.config.ping_interval > Duration::ZERO { let provider_clone = provider.clone(); @@ -394,7 +397,7 @@ impl ManagedWsProvider { provider_clone.keepalive_loop().await; }); } - + // Start reconnection task if configured if provider.config.auto_reconnect { let provider_clone = provider.clone(); @@ -402,26 +405,31 @@ impl ManagedWsProvider { provider_clone.reconnect_loop().await; }); } - + Ok(provider) } - + /// Connect with default configuration - pub async fn connect_with_defaults(network: Network) -> Result, HyperliquidError> { + pub async fn connect_with_defaults( + network: Network, + ) -> Result, HyperliquidError> { Self::connect(network, WsConfig::default()).await } - + /// Check if currently connected pub async fn is_connected(&self) -> bool { let inner = self.inner.lock().await; inner.as_ref().map(|p| p.is_connected()).unwrap_or(false) } - + /// Get mutable access to the raw provider - pub async fn raw(&self) -> Result>, HyperliquidError> { + pub async fn raw( + &self, + ) -> Result>, HyperliquidError> + { Ok(self.inner.lock().await) } - + /// Subscribe to L2 order book updates with automatic replay on reconnect pub async fn subscribe_l2_book( &self, @@ -433,7 +441,7 @@ impl ManagedWsProvider { }; self.subscribe(subscription).await } - + /// Subscribe to trades with automatic replay on reconnect pub async fn subscribe_trades( &self, @@ -445,33 +453,33 @@ impl ManagedWsProvider { }; self.subscribe(subscription).await } - + /// Subscribe to all mid prices with automatic replay on reconnect pub async fn subscribe_all_mids( &self, ) -> Result<(SubscriptionId, UnboundedReceiver), HyperliquidError> { self.subscribe(Subscription::AllMids).await } - + /// Generic subscription with automatic replay on reconnect pub async fn subscribe( &self, subscription: Subscription, ) -> Result<(SubscriptionId, UnboundedReceiver), HyperliquidError> { let mut inner = self.inner.lock().await; - let raw_provider = inner.as_mut().ok_or_else(|| { - HyperliquidError::WebSocket("Not connected".to_string()) - })?; - + let raw_provider = inner + .as_mut() + .ok_or_else(|| HyperliquidError::WebSocket("Not connected".to_string()))?; + // Subscribe using the raw provider let (_raw_id, rx) = raw_provider.subscribe(subscription.clone()).await?; - + // Generate our own ID for tracking let managed_id = self.next_id.fetch_add(1, Ordering::SeqCst); - + // Create channel for managed subscription let (tx, managed_rx) = mpsc::unbounded_channel(); - + // Store subscription for replay self.subscriptions.insert( managed_id, @@ -481,7 +489,7 @@ impl ManagedWsProvider { created_at: Instant::now(), }, ); - + // Forward messages from raw to managed let subscriptions = self.subscriptions.clone(); tokio::spawn(async move { @@ -494,38 +502,38 @@ impl ManagedWsProvider { // Clean up when channel closes subscriptions.remove(&managed_id); }); - + Ok((managed_id, managed_rx)) } - + /// Unsubscribe and stop automatic replay pub async fn unsubscribe(&self, id: SubscriptionId) -> Result<(), HyperliquidError> { // Remove from our tracking self.subscriptions.remove(&id); - + // Note: We can't unsubscribe from the raw provider because we don't // track the mapping between our IDs and raw IDs. This is fine since // the subscription will be cleaned up on reconnect anyway. - + Ok(()) } - + /// Start reading messages (must be called after connecting) pub async fn start_reading(&self) -> Result<(), HyperliquidError> { let mut inner = self.inner.lock().await; - let raw_provider = inner.as_mut().ok_or_else(|| { - HyperliquidError::WebSocket("Not connected".to_string()) - })?; + let raw_provider = inner + .as_mut() + .ok_or_else(|| HyperliquidError::WebSocket("Not connected".to_string()))?; raw_provider.start_reading().await } - + // Keep-alive loop async fn keepalive_loop(self: Arc) { let mut interval = tokio::time::interval(self.config.ping_interval); - + loop { interval.tick().await; - + let mut inner = self.inner.lock().await; if let Some(provider) = inner.as_mut() { if provider.ping().await.is_err() { @@ -536,16 +544,16 @@ impl ManagedWsProvider { } } } - + // Reconnection loop async fn reconnect_loop(self: Arc) { let mut reconnect_attempts = 0u32; let mut current_delay = self.config.reconnect_delay; - + loop { // Wait a bit before checking sleep(Duration::from_secs(1)).await; - + // Check if we need to reconnect if !self.is_connected().await { // Check max attempts @@ -555,9 +563,9 @@ impl ManagedWsProvider { break; } } - + println!("Attempting reconnection #{}", reconnect_attempts + 1); - + match RawWsProvider::connect(self.network).await { Ok(mut new_provider) => { // Start reading before replaying subscriptions @@ -565,31 +573,35 @@ impl ManagedWsProvider { eprintln!("Failed to start reading after reconnect: {}", e); continue; } - + // Replay all subscriptions let mut replay_errors = 0; for entry in self.subscriptions.iter() { - if let Err(e) = new_provider.subscribe(entry.subscription.clone()).await { + if let Err(e) = + new_provider.subscribe(entry.subscription.clone()).await + { eprintln!("Failed to replay subscription: {}", e); replay_errors += 1; } } - + if replay_errors == 0 { // Success! Reset counters *self.inner.lock().await = Some(new_provider); reconnect_attempts = 0; current_delay = self.config.reconnect_delay; - println!("Reconnection successful, {} subscriptions replayed", - self.subscriptions.len()); + println!( + "Reconnection successful, {} subscriptions replayed", + self.subscriptions.len() + ); } } Err(e) => { eprintln!("Reconnection failed: {}", e); - + // Wait before next attempt sleep(current_delay).await; - + // Update delay for next attempt reconnect_attempts += 1; if self.config.exponential_backoff { @@ -603,7 +615,7 @@ impl ManagedWsProvider { } } } - + // Handle disconnection async fn handle_disconnect(&self) { *self.inner.lock().await = None; diff --git a/src/signers/mod.rs b/src/signers/mod.rs index 6d7abfb..660aeed 100644 --- a/src/signers/mod.rs +++ b/src/signers/mod.rs @@ -1,5 +1,5 @@ -pub mod signer; pub mod privy; +pub mod signer; +pub use privy::{PrivyError, PrivySigner}; pub use signer::{AlloySigner, HyperliquidSignature, HyperliquidSigner, SignerError}; -pub use privy::{PrivySigner, PrivyError}; diff --git a/src/signers/privy.rs b/src/signers/privy.rs index deeafdf..26e0cdd 100644 --- a/src/signers/privy.rs +++ b/src/signers/privy.rs @@ -1,6 +1,4 @@ -use alloy::{ - primitives::{Address, B256}, -}; +use alloy::primitives::{Address, B256}; use async_trait::async_trait; use base64::{engine::general_purpose, Engine as _}; use reqwest::{Client, StatusCode}; @@ -75,9 +73,9 @@ impl PrivySigner { .map_err(|_| PrivyError::MissingEnvVar("PRIVY_APP_ID".to_string()))?; let secret = std::env::var("PRIVY_SECRET") .map_err(|_| PrivyError::MissingEnvVar("PRIVY_SECRET".to_string()))?; - + let creds = general_purpose::STANDARD.encode(format!("{app_id}:{secret}")); - + Ok(Self { client: Arc::new(Client::builder().build()?), wallet_id, @@ -95,7 +93,7 @@ impl PrivySigner { secret: String, ) -> Result { let creds = general_purpose::STANDARD.encode(format!("{app_id}:{secret}")); - + Ok(Self { client: Arc::new(Client::builder().build()?), wallet_id, @@ -126,7 +124,7 @@ impl PrivySigner { let txt = resp.text().await.unwrap_or_default(); return Err(PrivyError::Api(status, txt)); } - + Ok(resp.json::().await?) } } @@ -146,7 +144,7 @@ impl HyperliquidSigner for PrivySigner { async fn sign_hash(&self, hash: B256) -> Result { // Convert hash to hex string with 0x prefix let hash_hex = format!("0x{}", hex::encode(hash)); - + // Use secp256k1_sign for raw hash signing let body = json!({ "method": "secp256k1_sign", @@ -155,38 +153,39 @@ impl HyperliquidSigner for PrivySigner { } }); - let resp: SignResponse = self.rpc(body) + let resp: SignResponse = self + .rpc(body) .await .map_err(|e| SignerError::SigningFailed(e.to_string()))?; - + // Parse the signature string (0x-prefixed hex) - let sig_hex = resp.data.signature + let sig_hex = resp + .data + .signature .strip_prefix("0x") .unwrap_or(&resp.data.signature); - - let sig_bytes = hex::decode(sig_hex) - .map_err(|e| SignerError::SigningFailed(format!("Invalid hex signature: {}", e)))?; - + + let sig_bytes = hex::decode(sig_hex).map_err(|e| { + SignerError::SigningFailed(format!("Invalid hex signature: {}", e)) + })?; + if sig_bytes.len() != 65 { - return Err(SignerError::SigningFailed( - format!("Invalid signature length: expected 65, got {}", sig_bytes.len()) - )); + return Err(SignerError::SigningFailed(format!( + "Invalid signature length: expected 65, got {}", + sig_bytes.len() + ))); } - + // Extract r, s, v from the signature bytes let mut r_bytes = [0u8; 32]; let mut s_bytes = [0u8; 32]; r_bytes.copy_from_slice(&sig_bytes[0..32]); s_bytes.copy_from_slice(&sig_bytes[32..64]); let v = sig_bytes[64]; - + // Convert v to EIP-155 format if needed - let v = if v < 27 { - v + 27 - } else { - v - }; - + let v = if v < 27 { v + 27 } else { v }; + Ok(HyperliquidSignature { r: alloy::primitives::U256::from_be_bytes(r_bytes), s: alloy::primitives::U256::from_be_bytes(s_bytes), @@ -212,7 +211,7 @@ mod tests { "test-wallet-id".to_string(), address!("0000000000000000000000000000000000000000"), ); - + match result { Err(PrivyError::MissingEnvVar(var)) => { assert!(var == "PRIVY_APP_ID" || var == "PRIVY_SECRET"); @@ -220,4 +219,4 @@ mod tests { _ => panic!("Expected MissingEnvVar error"), } } -} \ No newline at end of file +} diff --git a/src/signers/signer.rs b/src/signers/signer.rs index fbbd144..c1d78ee 100644 --- a/src/signers/signer.rs +++ b/src/signers/signer.rs @@ -1,5 +1,5 @@ use alloy::{ - primitives::{Address, B256, Parity, U256}, + primitives::{Address, Parity, B256, U256}, signers::Signer, }; use async_trait::async_trait; diff --git a/src/types/actions.rs b/src/types/actions.rs index 0dabe0b..3ae2cdc 100644 --- a/src/types/actions.rs +++ b/src/types/actions.rs @@ -1,10 +1,10 @@ use alloy::primitives::B256; use serde; +use crate::l1_action; use crate::types::requests::{ BuilderInfo, CancelRequest, CancelRequestCloid, ModifyRequest, OrderRequest, }; -use crate::l1_action; // User Actions (with HyperliquidTransaction: prefix) @@ -21,7 +21,8 @@ pub struct UsdSend { } impl crate::types::eip712::HyperliquidAction for UsdSend { - const TYPE_STRING: &'static str = "UsdSend(string hyperliquidChain,string destination,string amount,uint64 time)"; + const TYPE_STRING: &'static str = + "UsdSend(string hyperliquidChain,string destination,string amount,uint64 time)"; const USE_PREFIX: bool = true; fn chain_id(&self) -> Option { @@ -53,7 +54,8 @@ pub struct Withdraw { } impl crate::types::eip712::HyperliquidAction for Withdraw { - const TYPE_STRING: &'static str = "Withdraw(string hyperliquidChain,string destination,string amount,uint64 time)"; + const TYPE_STRING: &'static str = + "Withdraw(string hyperliquidChain,string destination,string amount,uint64 time)"; const USE_PREFIX: bool = true; fn chain_id(&self) -> Option { @@ -119,14 +121,20 @@ pub struct ApproveAgent { pub nonce: u64, } -pub(crate) fn serialize_address(address: &alloy::primitives::Address, serializer: S) -> Result +pub(crate) fn serialize_address( + address: &alloy::primitives::Address, + serializer: S, +) -> Result where S: serde::Serializer, { serializer.serialize_str(&format!("{:#x}", address)) } -pub(crate) fn serialize_chain_id(chain_id: &u64, serializer: S) -> Result +pub(crate) fn serialize_chain_id( + chain_id: &u64, + serializer: S, +) -> Result where S: serde::Serializer, { diff --git a/src/types/eip712.rs b/src/types/eip712.rs index 8eb2f46..59f8db7 100644 --- a/src/types/eip712.rs +++ b/src/types/eip712.rs @@ -1,4 +1,4 @@ -use alloy::primitives::{Address, B256, U256, keccak256}; +use alloy::primitives::{keccak256, Address, B256, U256}; use alloy::sol_types::Eip712Domain; pub trait HyperliquidAction: Sized + serde::Serialize { @@ -52,13 +52,13 @@ pub trait HyperliquidAction: Sized + serde::Serialize { fn eip712_signing_hash(&self, domain: &Eip712Domain) -> B256 { let domain_separator = domain.separator(); let struct_hash = self.struct_hash(); - + let mut buf = Vec::with_capacity(66); buf.push(0x19); buf.push(0x01); buf.extend_from_slice(&domain_separator[..]); buf.extend_from_slice(&struct_hash[..]); - + keccak256(&buf) } } diff --git a/src/types/mod.rs b/src/types/mod.rs index 15c2d64..9a658e9 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -9,7 +9,7 @@ pub mod ws; // Re-export commonly used types pub use actions::*; -pub use eip712::{EncodeEip712, HyperliquidAction, encode_value}; +pub use eip712::{encode_value, EncodeEip712, HyperliquidAction}; pub use info_types::*; pub use requests::*; pub use responses::*; diff --git a/src/types/symbols.rs b/src/types/symbols.rs index 4ddbfa0..aa104b8 100644 --- a/src/types/symbols.rs +++ b/src/types/symbols.rs @@ -5,1168 +5,441 @@ use crate::types::symbol::Symbol; -// ==================== MAINNET ==================== - -// ==================== MAINNET PERPETUALS ==================== - -/// AAVE Perpetual (index: 28) -pub const AAVE: Symbol = Symbol::from_static("AAVE"); - -/// ACE Perpetual (index: 96) -pub const ACE: Symbol = Symbol::from_static("ACE"); - -/// ADA Perpetual (index: 65) -pub const ADA: Symbol = Symbol::from_static("ADA"); - -/// AI Perpetual (index: 115) -pub const AI: Symbol = Symbol::from_static("AI"); - -/// AI16Z Perpetual (index: 166) -pub const AI16Z: Symbol = Symbol::from_static("AI16Z"); - -/// AIXBT Perpetual (index: 167) -pub const AIXBT: Symbol = Symbol::from_static("AIXBT"); - -/// ALGO Perpetual (index: 158) -pub const ALGO: Symbol = Symbol::from_static("ALGO"); - -/// ALT Perpetual (index: 107) -pub const ALT: Symbol = Symbol::from_static("ALT"); - -/// ANIME Perpetual (index: 176) -pub const ANIME: Symbol = Symbol::from_static("ANIME"); - -/// APE Perpetual (index: 8) -pub const APE: Symbol = Symbol::from_static("APE"); - -/// APT Perpetual (index: 27) -pub const APT: Symbol = Symbol::from_static("APT"); - -/// AR Perpetual (index: 117) -pub const AR: Symbol = Symbol::from_static("AR"); - -/// ARB Perpetual (index: 11) -pub const ARB: Symbol = Symbol::from_static("ARB"); - -/// ARK Perpetual (index: 55) -pub const ARK: Symbol = Symbol::from_static("ARK"); - -/// ATOM Perpetual (index: 2) -pub const ATOM: Symbol = Symbol::from_static("ATOM"); - -/// AVAX Perpetual (index: 6) -pub const AVAX: Symbol = Symbol::from_static("AVAX"); - -/// BABY Perpetual (index: 189) -pub const BABY: Symbol = Symbol::from_static("BABY"); - -/// BADGER Perpetual (index: 77) -pub const BADGER: Symbol = Symbol::from_static("BADGER"); - -/// BANANA Perpetual (index: 49) -pub const BANANA: Symbol = Symbol::from_static("BANANA"); - -/// BCH Perpetual (index: 26) -pub const BCH: Symbol = Symbol::from_static("BCH"); - -/// BERA Perpetual (index: 180) -pub const BERA: Symbol = Symbol::from_static("BERA"); - -/// BIGTIME Perpetual (index: 59) -pub const BIGTIME: Symbol = Symbol::from_static("BIGTIME"); - -/// BIO Perpetual (index: 169) -pub const BIO: Symbol = Symbol::from_static("BIO"); - -/// BLAST Perpetual (index: 137) -pub const BLAST: Symbol = Symbol::from_static("BLAST"); - -/// BLUR Perpetual (index: 62) -pub const BLUR: Symbol = Symbol::from_static("BLUR"); - -/// BLZ Perpetual (index: 47) -pub const BLZ: Symbol = Symbol::from_static("BLZ"); - -/// BNB Perpetual (index: 7) -pub const BNB: Symbol = Symbol::from_static("BNB"); - -/// BNT Perpetual (index: 56) -pub const BNT: Symbol = Symbol::from_static("BNT"); - -/// BOME Perpetual (index: 120) -pub const BOME: Symbol = Symbol::from_static("BOME"); - -/// BRETT Perpetual (index: 134) -pub const BRETT: Symbol = Symbol::from_static("BRETT"); - -/// BSV Perpetual (index: 64) -pub const BSV: Symbol = Symbol::from_static("BSV"); - -/// BTC Perpetual (index: 0) -pub const BTC: Symbol = Symbol::from_static("BTC"); - -/// CAKE Perpetual (index: 99) -pub const CAKE: Symbol = Symbol::from_static("CAKE"); - -/// CANTO Perpetual (index: 57) -pub const CANTO: Symbol = Symbol::from_static("CANTO"); - -/// CATI Perpetual (index: 143) -pub const CATI: Symbol = Symbol::from_static("CATI"); - -/// CELO Perpetual (index: 144) -pub const CELO: Symbol = Symbol::from_static("CELO"); - -/// CFX Perpetual (index: 21) -pub const CFX: Symbol = Symbol::from_static("CFX"); - -/// CHILLGUY Perpetual (index: 155) -pub const CHILLGUY: Symbol = Symbol::from_static("CHILLGUY"); - -/// COMP Perpetual (index: 29) -pub const COMP: Symbol = Symbol::from_static("COMP"); - -/// CRV Perpetual (index: 16) -pub const CRV: Symbol = Symbol::from_static("CRV"); - -/// CYBER Perpetual (index: 45) -pub const CYBER: Symbol = Symbol::from_static("CYBER"); - -/// DOGE Perpetual (index: 12) -pub const DOGE: Symbol = Symbol::from_static("DOGE"); - -/// DOOD Perpetual (index: 194) -pub const DOOD: Symbol = Symbol::from_static("DOOD"); - -/// DOT Perpetual (index: 48) -pub const DOT: Symbol = Symbol::from_static("DOT"); - -/// DYDX Perpetual (index: 4) -pub const DYDX: Symbol = Symbol::from_static("DYDX"); - -/// DYM Perpetual (index: 109) -pub const DYM: Symbol = Symbol::from_static("DYM"); - -/// EIGEN Perpetual (index: 130) -pub const EIGEN: Symbol = Symbol::from_static("EIGEN"); - -/// ENA Perpetual (index: 122) -pub const ENA: Symbol = Symbol::from_static("ENA"); - -/// ENS Perpetual (index: 101) -pub const ENS: Symbol = Symbol::from_static("ENS"); - -/// ETC Perpetual (index: 102) -pub const ETC: Symbol = Symbol::from_static("ETC"); - -/// ETH Perpetual (index: 1) -pub const ETH: Symbol = Symbol::from_static("ETH"); - -/// ETHFI Perpetual (index: 121) -pub const ETHFI: Symbol = Symbol::from_static("ETHFI"); - -/// FARTCOIN Perpetual (index: 165) -pub const FARTCOIN: Symbol = Symbol::from_static("FARTCOIN"); - -/// FET Perpetual (index: 72) -pub const FET: Symbol = Symbol::from_static("FET"); - -/// FIL Perpetual (index: 80) -pub const FIL: Symbol = Symbol::from_static("FIL"); - -/// FRIEND Perpetual (index: 43) -pub const FRIEND: Symbol = Symbol::from_static("FRIEND"); - -/// FTM Perpetual (index: 22) -pub const FTM: Symbol = Symbol::from_static("FTM"); - -/// FTT Perpetual (index: 51) -pub const FTT: Symbol = Symbol::from_static("FTT"); - -/// FXS Perpetual (index: 32) -pub const FXS: Symbol = Symbol::from_static("FXS"); - -/// GALA Perpetual (index: 93) -pub const GALA: Symbol = Symbol::from_static("GALA"); - -/// GAS Perpetual (index: 69) -pub const GAS: Symbol = Symbol::from_static("GAS"); - -/// GMT Perpetual (index: 86) -pub const GMT: Symbol = Symbol::from_static("GMT"); - -/// GMX Perpetual (index: 23) -pub const GMX: Symbol = Symbol::from_static("GMX"); - -/// GOAT Perpetual (index: 149) -pub const GOAT: Symbol = Symbol::from_static("GOAT"); - -/// GRASS Perpetual (index: 151) -pub const GRASS: Symbol = Symbol::from_static("GRASS"); - -/// GRIFFAIN Perpetual (index: 170) -pub const GRIFFAIN: Symbol = Symbol::from_static("GRIFFAIN"); - -/// HBAR Perpetual (index: 127) -pub const HBAR: Symbol = Symbol::from_static("HBAR"); - -/// HMSTR Perpetual (index: 145) -pub const HMSTR: Symbol = Symbol::from_static("HMSTR"); - -/// HPOS Perpetual (index: 33) -pub const HPOS: Symbol = Symbol::from_static("HPOS"); - -/// HYPE Perpetual (index: 159) -pub const HYPE: Symbol = Symbol::from_static("HYPE"); - -/// HYPER Perpetual (index: 191) -pub const HYPER: Symbol = Symbol::from_static("HYPER"); - -/// ILV Perpetual (index: 83) -pub const ILV: Symbol = Symbol::from_static("ILV"); - -/// IMX Perpetual (index: 84) -pub const IMX: Symbol = Symbol::from_static("IMX"); - -/// INIT Perpetual (index: 193) -pub const INIT: Symbol = Symbol::from_static("INIT"); - -/// INJ Perpetual (index: 13) -pub const INJ: Symbol = Symbol::from_static("INJ"); - -/// IO Perpetual (index: 135) -pub const IO: Symbol = Symbol::from_static("IO"); - -/// IOTA Perpetual (index: 157) -pub const IOTA: Symbol = Symbol::from_static("IOTA"); - -/// IP Perpetual (index: 183) -pub const IP: Symbol = Symbol::from_static("IP"); - -/// JELLY Perpetual (index: 179) -pub const JELLY: Symbol = Symbol::from_static("JELLY"); - -/// JTO Perpetual (index: 94) -pub const JTO: Symbol = Symbol::from_static("JTO"); - -/// JUP Perpetual (index: 90) -pub const JUP: Symbol = Symbol::from_static("JUP"); - -/// KAITO Perpetual (index: 185) -pub const KAITO: Symbol = Symbol::from_static("KAITO"); - -/// KAS Perpetual (index: 60) -pub const KAS: Symbol = Symbol::from_static("KAS"); - -/// LAUNCHCOIN Perpetual (index: 195) -pub const LAUNCHCOIN: Symbol = Symbol::from_static("LAUNCHCOIN"); - -/// LAYER Perpetual (index: 182) -pub const LAYER: Symbol = Symbol::from_static("LAYER"); - -/// LDO Perpetual (index: 17) -pub const LDO: Symbol = Symbol::from_static("LDO"); - -/// LINK Perpetual (index: 18) -pub const LINK: Symbol = Symbol::from_static("LINK"); - -/// LISTA Perpetual (index: 138) -pub const LISTA: Symbol = Symbol::from_static("LISTA"); - -/// LOOM Perpetual (index: 52) -pub const LOOM: Symbol = Symbol::from_static("LOOM"); - -/// LTC Perpetual (index: 10) -pub const LTC: Symbol = Symbol::from_static("LTC"); - -/// MANTA Perpetual (index: 104) -pub const MANTA: Symbol = Symbol::from_static("MANTA"); - -/// MATIC Perpetual (index: 3) -pub const MATIC: Symbol = Symbol::from_static("MATIC"); - -/// MAV Perpetual (index: 97) -pub const MAV: Symbol = Symbol::from_static("MAV"); - -/// MAVIA Perpetual (index: 110) -pub const MAVIA: Symbol = Symbol::from_static("MAVIA"); - -/// ME Perpetual (index: 160) -pub const ME: Symbol = Symbol::from_static("ME"); - -/// MELANIA Perpetual (index: 175) -pub const MELANIA: Symbol = Symbol::from_static("MELANIA"); - -/// MEME Perpetual (index: 75) -pub const MEME: Symbol = Symbol::from_static("MEME"); - -/// MERL Perpetual (index: 126) -pub const MERL: Symbol = Symbol::from_static("MERL"); - -/// MEW Perpetual (index: 139) -pub const MEW: Symbol = Symbol::from_static("MEW"); - -/// MINA Perpetual (index: 67) -pub const MINA: Symbol = Symbol::from_static("MINA"); - -/// MKR Perpetual (index: 30) -pub const MKR: Symbol = Symbol::from_static("MKR"); - -/// MNT Perpetual (index: 123) -pub const MNT: Symbol = Symbol::from_static("MNT"); - -/// MOODENG Perpetual (index: 150) -pub const MOODENG: Symbol = Symbol::from_static("MOODENG"); - -/// MORPHO Perpetual (index: 173) -pub const MORPHO: Symbol = Symbol::from_static("MORPHO"); - -/// MOVE Perpetual (index: 161) -pub const MOVE: Symbol = Symbol::from_static("MOVE"); - -/// MYRO Perpetual (index: 118) -pub const MYRO: Symbol = Symbol::from_static("MYRO"); - -/// NEAR Perpetual (index: 74) -pub const NEAR: Symbol = Symbol::from_static("NEAR"); - -/// NEIROETH Perpetual (index: 147) -pub const NEIROETH: Symbol = Symbol::from_static("NEIROETH"); - -/// NEO Perpetual (index: 78) -pub const NEO: Symbol = Symbol::from_static("NEO"); - -/// NFTI Perpetual (index: 89) -pub const NFTI: Symbol = Symbol::from_static("NFTI"); - -/// NIL Perpetual (index: 186) -pub const NIL: Symbol = Symbol::from_static("NIL"); - -/// NOT Perpetual (index: 132) -pub const NOT: Symbol = Symbol::from_static("NOT"); - -/// NTRN Perpetual (index: 95) -pub const NTRN: Symbol = Symbol::from_static("NTRN"); - -/// NXPC Perpetual (index: 196) -pub const NXPC: Symbol = Symbol::from_static("NXPC"); - -/// OGN Perpetual (index: 53) -pub const OGN: Symbol = Symbol::from_static("OGN"); - -/// OM Perpetual (index: 184) -pub const OM: Symbol = Symbol::from_static("OM"); - -/// OMNI Perpetual (index: 129) -pub const OMNI: Symbol = Symbol::from_static("OMNI"); - -/// ONDO Perpetual (index: 106) -pub const ONDO: Symbol = Symbol::from_static("ONDO"); - -/// OP Perpetual (index: 9) -pub const OP: Symbol = Symbol::from_static("OP"); - -/// ORBS Perpetual (index: 61) -pub const ORBS: Symbol = Symbol::from_static("ORBS"); - -/// ORDI Perpetual (index: 76) -pub const ORDI: Symbol = Symbol::from_static("ORDI"); - -/// OX Perpetual (index: 42) -pub const OX: Symbol = Symbol::from_static("OX"); - -/// PANDORA Perpetual (index: 112) -pub const PANDORA: Symbol = Symbol::from_static("PANDORA"); - -/// PAXG Perpetual (index: 187) -pub const PAXG: Symbol = Symbol::from_static("PAXG"); - -/// PENDLE Perpetual (index: 70) -pub const PENDLE: Symbol = Symbol::from_static("PENDLE"); - -/// PENGU Perpetual (index: 163) -pub const PENGU: Symbol = Symbol::from_static("PENGU"); - -/// PEOPLE Perpetual (index: 100) -pub const PEOPLE: Symbol = Symbol::from_static("PEOPLE"); - -/// PIXEL Perpetual (index: 114) -pub const PIXEL: Symbol = Symbol::from_static("PIXEL"); - -/// PNUT Perpetual (index: 153) -pub const PNUT: Symbol = Symbol::from_static("PNUT"); - -/// POL Perpetual (index: 142) -pub const POL: Symbol = Symbol::from_static("POL"); - -/// POLYX Perpetual (index: 68) -pub const POLYX: Symbol = Symbol::from_static("POLYX"); - -/// POPCAT Perpetual (index: 128) -pub const POPCAT: Symbol = Symbol::from_static("POPCAT"); - -/// PROMPT Perpetual (index: 188) -pub const PROMPT: Symbol = Symbol::from_static("PROMPT"); - -/// PURR Perpetual (index: 152) -pub const PURR: Symbol = Symbol::from_static("PURR"); - -/// PYTH Perpetual (index: 81) -pub const PYTH: Symbol = Symbol::from_static("PYTH"); - -/// RDNT Perpetual (index: 54) -pub const RDNT: Symbol = Symbol::from_static("RDNT"); - -/// RENDER Perpetual (index: 140) -pub const RENDER: Symbol = Symbol::from_static("RENDER"); - -/// REQ Perpetual (index: 58) -pub const REQ: Symbol = Symbol::from_static("REQ"); - -/// REZ Perpetual (index: 131) -pub const REZ: Symbol = Symbol::from_static("REZ"); - -/// RLB Perpetual (index: 34) -pub const RLB: Symbol = Symbol::from_static("RLB"); - -/// RNDR Perpetual (index: 20) -pub const RNDR: Symbol = Symbol::from_static("RNDR"); - -/// RSR Perpetual (index: 92) -pub const RSR: Symbol = Symbol::from_static("RSR"); - -/// RUNE Perpetual (index: 41) -pub const RUNE: Symbol = Symbol::from_static("RUNE"); - -/// S Perpetual (index: 172) -pub const S: Symbol = Symbol::from_static("S"); - -/// SAGA Perpetual (index: 125) -pub const SAGA: Symbol = Symbol::from_static("SAGA"); - -/// SAND Perpetual (index: 156) -pub const SAND: Symbol = Symbol::from_static("SAND"); - -/// SCR Perpetual (index: 146) -pub const SCR: Symbol = Symbol::from_static("SCR"); - -/// SEI Perpetual (index: 40) -pub const SEI: Symbol = Symbol::from_static("SEI"); - -/// SHIA Perpetual (index: 44) -pub const SHIA: Symbol = Symbol::from_static("SHIA"); - -/// SNX Perpetual (index: 24) -pub const SNX: Symbol = Symbol::from_static("SNX"); - -/// SOL Perpetual (index: 5) -pub const SOL: Symbol = Symbol::from_static("SOL"); - -/// SOPH Perpetual (index: 197) -pub const SOPH: Symbol = Symbol::from_static("SOPH"); - -/// SPX Perpetual (index: 171) -pub const SPX: Symbol = Symbol::from_static("SPX"); - -/// STG Perpetual (index: 71) -pub const STG: Symbol = Symbol::from_static("STG"); - -/// STRAX Perpetual (index: 73) -pub const STRAX: Symbol = Symbol::from_static("STRAX"); - -/// STRK Perpetual (index: 113) -pub const STRK: Symbol = Symbol::from_static("STRK"); - -/// STX Perpetual (index: 19) -pub const STX: Symbol = Symbol::from_static("STX"); - -/// SUI Perpetual (index: 14) -pub const SUI: Symbol = Symbol::from_static("SUI"); - -/// SUPER Perpetual (index: 87) -pub const SUPER: Symbol = Symbol::from_static("SUPER"); - -/// SUSHI Perpetual (index: 82) -pub const SUSHI: Symbol = Symbol::from_static("SUSHI"); - -/// TAO Perpetual (index: 116) -pub const TAO: Symbol = Symbol::from_static("TAO"); - -/// TIA Perpetual (index: 63) -pub const TIA: Symbol = Symbol::from_static("TIA"); - -/// TNSR Perpetual (index: 124) -pub const TNSR: Symbol = Symbol::from_static("TNSR"); - -/// TON Perpetual (index: 66) -pub const TON: Symbol = Symbol::from_static("TON"); - -/// TRB Perpetual (index: 50) -pub const TRB: Symbol = Symbol::from_static("TRB"); - -/// TRUMP Perpetual (index: 174) -pub const TRUMP: Symbol = Symbol::from_static("TRUMP"); - -/// TRX Perpetual (index: 37) -pub const TRX: Symbol = Symbol::from_static("TRX"); - -/// TST Perpetual (index: 181) -pub const TST: Symbol = Symbol::from_static("TST"); - -/// TURBO Perpetual (index: 133) -pub const TURBO: Symbol = Symbol::from_static("TURBO"); - -/// UMA Perpetual (index: 105) -pub const UMA: Symbol = Symbol::from_static("UMA"); - -/// UNI Perpetual (index: 39) -pub const UNI: Symbol = Symbol::from_static("UNI"); - -/// UNIBOT Perpetual (index: 35) -pub const UNIBOT: Symbol = Symbol::from_static("UNIBOT"); - -/// USTC Perpetual (index: 88) -pub const USTC: Symbol = Symbol::from_static("USTC"); - -/// USUAL Perpetual (index: 164) -pub const USUAL: Symbol = Symbol::from_static("USUAL"); - -/// VINE Perpetual (index: 177) -pub const VINE: Symbol = Symbol::from_static("VINE"); - -/// VIRTUAL Perpetual (index: 162) -pub const VIRTUAL: Symbol = Symbol::from_static("VIRTUAL"); - -/// VVV Perpetual (index: 178) -pub const VVV: Symbol = Symbol::from_static("VVV"); - -/// W Perpetual (index: 111) -pub const W: Symbol = Symbol::from_static("W"); - -/// WCT Perpetual (index: 190) -pub const WCT: Symbol = Symbol::from_static("WCT"); - -/// WIF Perpetual (index: 98) -pub const WIF: Symbol = Symbol::from_static("WIF"); - -/// WLD Perpetual (index: 31) -pub const WLD: Symbol = Symbol::from_static("WLD"); - -/// XAI Perpetual (index: 103) -pub const XAI: Symbol = Symbol::from_static("XAI"); - -/// XLM Perpetual (index: 154) -pub const XLM: Symbol = Symbol::from_static("XLM"); - -/// XRP Perpetual (index: 25) -pub const XRP: Symbol = Symbol::from_static("XRP"); - -/// YGG Perpetual (index: 36) -pub const YGG: Symbol = Symbol::from_static("YGG"); - -/// ZEN Perpetual (index: 79) -pub const ZEN: Symbol = Symbol::from_static("ZEN"); - -/// ZEREBRO Perpetual (index: 168) -pub const ZEREBRO: Symbol = Symbol::from_static("ZEREBRO"); - -/// ZETA Perpetual (index: 108) -pub const ZETA: Symbol = Symbol::from_static("ZETA"); - -/// ZK Perpetual (index: 136) -pub const ZK: Symbol = Symbol::from_static("ZK"); - -/// ZORA Perpetual (index: 192) -pub const ZORA: Symbol = Symbol::from_static("ZORA"); - -/// ZRO Perpetual (index: 46) -pub const ZRO: Symbol = Symbol::from_static("ZRO"); - -/// kBONK Perpetual (index: 85) -pub const KBONK: Symbol = Symbol::from_static("kBONK"); - -/// kDOGS Perpetual (index: 141) -pub const KDOGS: Symbol = Symbol::from_static("kDOGS"); +// Define Perpetual Symbols +macro_rules! define_perp_symbols { + ($( ($name:ident, $index:expr) ),* $(,)?) => { + $( + #[doc = concat!(stringify!($name), " Perpetual (index: ", $index, ")")] + pub const $name: Symbol = Symbol::from_static(stringify!($name)); + )* + }; +} -/// kFLOKI Perpetual (index: 119) -pub const KFLOKI: Symbol = Symbol::from_static("kFLOKI"); +// Define Perpetual Symbols Literal +macro_rules! define_perp_symbols_literal { + ($( ($name:ident, $index:expr, $symbol:literal) ),* $(,)?) => { + $( + #[doc = concat!(stringify!($name), " Perpetual (index: ", $index, ")")] + pub const $name: Symbol = Symbol::from_static($symbol); + )* + }; +} -/// kLUNC Perpetual (index: 91) -pub const KLUNC: Symbol = Symbol::from_static("kLUNC"); +// Define Spot Symbols +macro_rules! define_spot_symbols { + ($( ($const_name:ident, $index:expr, $symbol:literal) ),* $(,)?) => { + $( + #[doc = concat!($symbol, " Spot (index: ", $index, ", @", $index, ")")] + pub const $const_name: Symbol = Symbol::from_static(concat!("@", $index)); + )* + }; +} -/// kNEIRO Perpetual (index: 148) -pub const KNEIRO: Symbol = Symbol::from_static("kNEIRO"); +// ==================== MAINNET ==================== -/// kPEPE Perpetual (index: 15) -pub const KPEPE: Symbol = Symbol::from_static("kPEPE"); +// ==================== MAINNET PERPETUALS ==================== -/// kSHIB Perpetual (index: 38) -pub const KSHIB: Symbol = Symbol::from_static("kSHIB"); +define_perp_symbols!( + (ACE, 96), + (ADA, 65), + (AI, 115), + (AI16Z, 166), + (AIXBT, 167), + (ALGO, 158), + (ALT, 107), + (ANIME, 176), + (APE, 8), + (APT, 27), + (AR, 117), + (ARB, 11), + (ARK, 55), + (ATOM, 2), + (AVAX, 6), + (BABY, 189), + (BADGER, 77), + (BANANA, 49), + (BCH, 26), + (BERA, 180), + (BIGTIME, 59), + (BIO, 169), + (BLAST, 137), + (BLUR, 62), + (BLZ, 47), + (BNB, 7), + (BNT, 56), + (BOME, 120), + (BRETT, 134), + (BSV, 64), + (BTC, 0), + (CAKE, 99), + (CANTO, 57), + (CATI, 143), + (CELO, 144), + (CFX, 21), + (CHILLGUY, 155), + (COMP, 29), + (CRV, 16), + (CYBER, 45), + (DOGE, 12), + (DOOD, 194), + (DOT, 48), + (DYDX, 4), + (DYM, 109), + (EIGEN, 130), + (ENA, 122), + (ENS, 101), + (ETC, 102), + (ETH, 1), + (ETHFI, 121), + (FARTCOIN, 165), + (FET, 72), + (FIL, 80), + (FRIEND, 43), + (FTM, 22), + (FTT, 51), + (FXS, 32), + (GALA, 93), + (GAS, 69), + (GMT, 86), + (GMX, 23), + (GOAT, 149), + (GRASS, 151), + (GRIFFAIN, 170), + (HBAR, 127), + (HMSTR, 145), + (HPOS, 33), + (HYPE, 159), + (HYPER, 191), + (ILV, 83), + (IMX, 84), + (INIT, 193), + (INJ, 13), + (IO, 135), + (IOTA, 157), + (IP, 183), + (JELLY, 179), + (JTO, 94), + (JUP, 90), + (KAITO, 185), + (KAS, 60), + (LAUNCHCOIN, 195), + (LAYER, 182), + (LDO, 17), + (LINK, 18), + (LISTA, 138), + (LOOM, 52), + (LTC, 10), + (MANTA, 104), + (MATIC, 3), + (MAV, 97), + (MAVIA, 110), + (ME, 160), + (MELANIA, 175), + (MEME, 75), + (MERL, 126), + (MEW, 139), + (MINA, 67), + (MKR, 30), + (MNT, 123), + (MOODENG, 150), + (MORPHO, 173), + (MOVE, 161), + (MYRO, 118), + (NEAR, 74), + (NEIROETH, 147), + (NEO, 78), + (NFTI, 89), + (NIL, 186), + (NOT, 132), + (NTRN, 95), + (NXPC, 196), + (OGN, 53), + (OM, 184), + (OMNI, 129), + (ONDO, 106), + (OP, 9), + (ORBS, 61), + (ORDI, 76), + (OX, 42), + (PANDORA, 112), + (PAXG, 187), + (PENDLE, 70), + (PENGU, 163), + (PEOPLE, 100), + (PIXEL, 114), + (PNUT, 153), + (POL, 142), + (POLYX, 68), + (POPCAT, 128), + (PROMPT, 188), + (PURR, 152), + (PYTH, 81), + (RDNT, 54), + (RENDER, 140), + (REQ, 58), + (REZ, 131), + (RLB, 34), + (RNDR, 20), + (RSR, 92), + (RUNE, 41), + (S, 172), + (SAGA, 125), + (SAND, 156), + (SCR, 146), + (SEI, 40), + (SHIA, 44), + (SNX, 24), + (SOL, 5), + (SOPH, 197), + (SPX, 171), + (STG, 71), + (STRAX, 73), + (STRK, 113), + (STX, 19), + (SUI, 14), + (SUPER, 87), + (SUSHI, 82), + (TAO, 116), + (TIA, 63), + (TNSR, 124), + (TON, 66), + (TRB, 50), + (TRUMP, 174), + (TRX, 37), + (TST, 181), + (TURBO, 133), + (UMA, 105), + (UNI, 39), + (UNIBOT, 35), + (USTC, 88), + (USUAL, 164), + (VINE, 177), + (VIRTUAL, 162), + (VVV, 178), + (W, 111), + (WCT, 190), + (WIF, 98), + (WLD, 31), + (XAI, 103), + (XLM, 154), + (XRP, 25), + (YGG, 36), + (ZEN, 79), + (ZEREBRO, 168), + (ZETA, 108), + (ZK, 136), + (ZORA, 192), + (ZRO, 46), +); + +define_perp_symbols_literal!( + (KBONK, 85, "kBONK"), + (KDOGS, 141, "kDOGS"), + (KFLOKI, 119, "kFLOKI"), + (KLUNC, 91, "kLUNC"), + (KNEIRO, 148, "kNEIRO"), + (KPEPE, 15, "kPEPE"), + (KSHIB, 38, "kSHIB"), +); // ==================== MAINNET SPOT PAIRS ==================== -/// ADHD/USDC Spot (index: 40, @40) -pub const ADHD_USDC: Symbol = Symbol::from_static("@40"); - -/// ANON/USDC Spot (index: 166, @166) -pub const ANON_USDC: Symbol = Symbol::from_static("@166"); - -/// ANSEM/USDC Spot (index: 18, @18) -pub const ANSEM_USDC: Symbol = Symbol::from_static("@18"); - -/// ANT/USDC Spot (index: 55, @55) -pub const ANT_USDC: Symbol = Symbol::from_static("@55"); - -/// ARI/USDC Spot (index: 53, @53) -pub const ARI_USDC: Symbol = Symbol::from_static("@53"); - -/// ASI/USDC Spot (index: 36, @36) -pub const ASI_USDC: Symbol = Symbol::from_static("@36"); - -/// ATEHUN/USDC Spot (index: 51, @51) -pub const ATEHUN_USDC: Symbol = Symbol::from_static("@51"); - -/// AUTIST/USDC Spot (index: 93, @93) -pub const AUTIST_USDC: Symbol = Symbol::from_static("@93"); - -/// BAGS/USDC Spot (index: 17, @17) -pub const BAGS_USDC: Symbol = Symbol::from_static("@17"); - -/// BEATS/USDC Spot (index: 128, @128) -pub const BEATS_USDC: Symbol = Symbol::from_static("@128"); - -/// BERA/USDC Spot (index: 115, @115) -pub const BERA_USDC: Symbol = Symbol::from_static("@115"); - -/// BID/USDC Spot (index: 33, @33) -pub const BID_USDC: Symbol = Symbol::from_static("@33"); - -/// BIGBEN/USDC Spot (index: 25, @25) -pub const BIGBEN_USDC: Symbol = Symbol::from_static("@25"); - -/// BOZO/USDC Spot (index: 76, @76) -pub const BOZO_USDC: Symbol = Symbol::from_static("@76"); - -/// BUBZ/USDC Spot (index: 117, @117) -pub const BUBZ_USDC: Symbol = Symbol::from_static("@117"); - -/// BUDDY/USDC Spot (index: 155, @155) -pub const BUDDY_USDC: Symbol = Symbol::from_static("@155"); - -/// BUSSY/USDC Spot (index: 81, @81) -pub const BUSSY_USDC: Symbol = Symbol::from_static("@81"); - -/// CAPPY/USDC Spot (index: 7, @7) -pub const CAPPY_USDC: Symbol = Symbol::from_static("@7"); - -/// CAT/USDC Spot (index: 124, @124) -pub const CAT_USDC: Symbol = Symbol::from_static("@124"); - -/// CATBAL/USDC Spot (index: 59, @59) -pub const CATBAL_USDC: Symbol = Symbol::from_static("@59"); - -/// CATNIP/USDC Spot (index: 26, @26) -pub const CATNIP_USDC: Symbol = Symbol::from_static("@26"); - -/// CHEF/USDC Spot (index: 106, @106) -pub const CHEF_USDC: Symbol = Symbol::from_static("@106"); - -/// CHINA/USDC Spot (index: 68, @68) -pub const CHINA_USDC: Symbol = Symbol::from_static("@68"); - -/// CINDY/USDC Spot (index: 67, @67) -pub const CINDY_USDC: Symbol = Symbol::from_static("@67"); - -/// COOK/USDC Spot (index: 164, @164) -pub const COOK_USDC: Symbol = Symbol::from_static("@164"); - -/// COPE/USDC Spot (index: 102, @102) -pub const COPE_USDC: Symbol = Symbol::from_static("@102"); - -/// COZY/USDC Spot (index: 52, @52) -pub const COZY_USDC: Symbol = Symbol::from_static("@52"); - -/// CZ/USDC Spot (index: 16, @16) -pub const CZ_USDC: Symbol = Symbol::from_static("@16"); - -/// DEFIN/USDC Spot (index: 143, @143) -pub const DEFIN_USDC: Symbol = Symbol::from_static("@143"); - -/// DEPIN/USDC Spot (index: 126, @126) -pub const DEPIN_USDC: Symbol = Symbol::from_static("@126"); - -/// DIABLO/USDC Spot (index: 159, @159) -pub const DIABLO_USDC: Symbol = Symbol::from_static("@159"); - -/// DROP/USDC Spot (index: 46, @46) -pub const DROP_USDC: Symbol = Symbol::from_static("@46"); - -/// EARTH/USDC Spot (index: 97, @97) -pub const EARTH_USDC: Symbol = Symbol::from_static("@97"); - -/// FARM/USDC Spot (index: 121, @121) -pub const FARM_USDC: Symbol = Symbol::from_static("@121"); - -/// FARMED/USDC Spot (index: 30, @30) -pub const FARMED_USDC: Symbol = Symbol::from_static("@30"); - -/// FATCAT/USDC Spot (index: 82, @82) -pub const FATCAT_USDC: Symbol = Symbol::from_static("@82"); - -/// FEIT/USDC Spot (index: 89, @89) -pub const FEIT_USDC: Symbol = Symbol::from_static("@89"); - -/// FEUSD/USDC Spot (index: 149, @149) -pub const FEUSD_USDC: Symbol = Symbol::from_static("@149"); - -/// FLASK/USDC Spot (index: 122, @122) -pub const FLASK_USDC: Symbol = Symbol::from_static("@122"); - -/// FLY/USDC Spot (index: 135, @135) -pub const FLY_USDC: Symbol = Symbol::from_static("@135"); - -/// FRAC/USDC Spot (index: 50, @50) -pub const FRAC_USDC: Symbol = Symbol::from_static("@50"); - -/// FRCT/USDC Spot (index: 167, @167) -pub const FRCT_USDC: Symbol = Symbol::from_static("@167"); - -/// FRIED/USDC Spot (index: 70, @70) -pub const FRIED_USDC: Symbol = Symbol::from_static("@70"); - -/// FRUDO/USDC Spot (index: 90, @90) -pub const FRUDO_USDC: Symbol = Symbol::from_static("@90"); - -/// FUCKY/USDC Spot (index: 15, @15) -pub const FUCKY_USDC: Symbol = Symbol::from_static("@15"); - -/// FUN/USDC Spot (index: 41, @41) -pub const FUN_USDC: Symbol = Symbol::from_static("@41"); - -/// FUND/USDC Spot (index: 158, @158) -pub const FUND_USDC: Symbol = Symbol::from_static("@158"); - -/// G/USDC Spot (index: 75, @75) -pub const G_USDC: Symbol = Symbol::from_static("@75"); - -/// GENESY/USDC Spot (index: 116, @116) -pub const GENESY_USDC: Symbol = Symbol::from_static("@116"); - -/// GMEOW/USDC Spot (index: 10, @10) -pub const GMEOW_USDC: Symbol = Symbol::from_static("@10"); - -/// GOD/USDC Spot (index: 139, @139) -pub const GOD_USDC: Symbol = Symbol::from_static("@139"); - -/// GPT/USDC Spot (index: 31, @31) -pub const GPT_USDC: Symbol = Symbol::from_static("@31"); - -/// GUESS/USDC Spot (index: 61, @61) -pub const GUESS_USDC: Symbol = Symbol::from_static("@61"); - -/// GUP/USDC Spot (index: 29, @29) -pub const GUP_USDC: Symbol = Symbol::from_static("@29"); - -/// H/USDC Spot (index: 131, @131) -pub const H_USDC: Symbol = Symbol::from_static("@131"); - -/// HAPPY/USDC Spot (index: 22, @22) -pub const HAPPY_USDC: Symbol = Symbol::from_static("@22"); - -/// HBOOST/USDC Spot (index: 27, @27) -pub const HBOOST_USDC: Symbol = Symbol::from_static("@27"); - -/// HEAD/USDC Spot (index: 141, @141) -pub const HEAD_USDC: Symbol = Symbol::from_static("@141"); - -/// HFUN/USDC Spot (index: 1, @1) -pub const HFUN_USDC: Symbol = Symbol::from_static("@1"); - -/// HGOD/USDC Spot (index: 95, @95) -pub const HGOD_USDC: Symbol = Symbol::from_static("@95"); - -/// HODL/USDC Spot (index: 34, @34) -pub const HODL_USDC: Symbol = Symbol::from_static("@34"); - -/// HOLD/USDC Spot (index: 113, @113) -pub const HOLD_USDC: Symbol = Symbol::from_static("@113"); - -/// HOP/USDC Spot (index: 100, @100) -pub const HOP_USDC: Symbol = Symbol::from_static("@100"); - -/// HOPE/USDC Spot (index: 80, @80) -pub const HOPE_USDC: Symbol = Symbol::from_static("@80"); - -/// HORSY/USDC Spot (index: 174, @174) -pub const HORSY_USDC: Symbol = Symbol::from_static("@174"); - -/// HPEPE/USDC Spot (index: 44, @44) -pub const HPEPE_USDC: Symbol = Symbol::from_static("@44"); - -/// HPUMP/USDC Spot (index: 64, @64) -pub const HPUMP_USDC: Symbol = Symbol::from_static("@64"); - -/// HPYH/USDC Spot (index: 103, @103) -pub const HPYH_USDC: Symbol = Symbol::from_static("@103"); - -/// HWTR/USDC Spot (index: 138, @138) -pub const HWTR_USDC: Symbol = Symbol::from_static("@138"); - -/// HYENA/USDC Spot (index: 125, @125) -pub const HYENA_USDC: Symbol = Symbol::from_static("@125"); - -/// HYPE/USDC Spot (index: 105, @105) -pub const HYPE_USDC: Symbol = Symbol::from_static("@105"); - -/// ILIENS/USDC Spot (index: 14, @14) -pub const ILIENS_USDC: Symbol = Symbol::from_static("@14"); - -/// JEET/USDC Spot (index: 45, @45) -pub const JEET_USDC: Symbol = Symbol::from_static("@45"); - -/// JEFF/USDC Spot (index: 4, @4) -pub const JEFF_USDC: Symbol = Symbol::from_static("@4"); - -/// JPEG/USDC Spot (index: 144, @144) -pub const JPEG_USDC: Symbol = Symbol::from_static("@144"); - -/// KOBE/USDC Spot (index: 21, @21) -pub const KOBE_USDC: Symbol = Symbol::from_static("@21"); - -/// LADY/USDC Spot (index: 42, @42) -pub const LADY_USDC: Symbol = Symbol::from_static("@42"); - -/// LAUNCH/USDC Spot (index: 120, @120) -pub const LAUNCH_USDC: Symbol = Symbol::from_static("@120"); - -/// LICK/USDC Spot (index: 2, @2) -pub const LICK_USDC: Symbol = Symbol::from_static("@2"); - -/// LIQD/USDC Spot (index: 130, @130) -pub const LIQD_USDC: Symbol = Symbol::from_static("@130"); - -/// LIQUID/USDC Spot (index: 96, @96) -pub const LIQUID_USDC: Symbol = Symbol::from_static("@96"); - -/// LORA/USDC Spot (index: 58, @58) -pub const LORA_USDC: Symbol = Symbol::from_static("@58"); - -/// LQNA/USDC Spot (index: 85, @85) -pub const LQNA_USDC: Symbol = Symbol::from_static("@85"); - -/// LUCKY/USDC Spot (index: 101, @101) -pub const LUCKY_USDC: Symbol = Symbol::from_static("@101"); - -/// MAGA/USDC Spot (index: 94, @94) -pub const MAGA_USDC: Symbol = Symbol::from_static("@94"); - -/// MANLET/USDC Spot (index: 3, @3) -pub const MANLET_USDC: Symbol = Symbol::from_static("@3"); - -/// MAXI/USDC Spot (index: 62, @62) -pub const MAXI_USDC: Symbol = Symbol::from_static("@62"); - -/// MBAPPE/USDC Spot (index: 47, @47) -pub const MBAPPE_USDC: Symbol = Symbol::from_static("@47"); - -/// MEOW/USDC Spot (index: 110, @110) -pub const MEOW_USDC: Symbol = Symbol::from_static("@110"); - -/// MOG/USDC Spot (index: 43, @43) -pub const MOG_USDC: Symbol = Symbol::from_static("@43"); - -/// MON/USDC Spot (index: 127, @127) -pub const MON_USDC: Symbol = Symbol::from_static("@127"); - -/// MONAD/USDC Spot (index: 79, @79) -pub const MONAD_USDC: Symbol = Symbol::from_static("@79"); - -/// MUNCH/USDC Spot (index: 114, @114) -pub const MUNCH_USDC: Symbol = Symbol::from_static("@114"); - -/// NASDAQ/USDC Spot (index: 86, @86) -pub const NASDAQ_USDC: Symbol = Symbol::from_static("@86"); - -/// NEIRO/USDC Spot (index: 111, @111) -pub const NEIRO_USDC: Symbol = Symbol::from_static("@111"); - -/// NFT/USDC Spot (index: 56, @56) -pub const NFT_USDC: Symbol = Symbol::from_static("@56"); - -/// NIGGO/USDC Spot (index: 99, @99) -pub const NIGGO_USDC: Symbol = Symbol::from_static("@99"); - -/// NMTD/USDC Spot (index: 63, @63) -pub const NMTD_USDC: Symbol = Symbol::from_static("@63"); - -/// NOCEX/USDC Spot (index: 71, @71) -pub const NOCEX_USDC: Symbol = Symbol::from_static("@71"); - -/// OMNIX/USDC Spot (index: 73, @73) -pub const OMNIX_USDC: Symbol = Symbol::from_static("@73"); - -/// ORA/USDC Spot (index: 129, @129) -pub const ORA_USDC: Symbol = Symbol::from_static("@129"); - -/// OTTI/USDC Spot (index: 171, @171) -pub const OTTI_USDC: Symbol = Symbol::from_static("@171"); - -/// PANDA/USDC Spot (index: 38, @38) -pub const PANDA_USDC: Symbol = Symbol::from_static("@38"); - -/// PEAR/USDC Spot (index: 112, @112) -pub const PEAR_USDC: Symbol = Symbol::from_static("@112"); - -/// PEG/USDC Spot (index: 162, @162) -pub const PEG_USDC: Symbol = Symbol::from_static("@162"); - -/// PENIS/USDC Spot (index: 160, @160) -pub const PENIS_USDC: Symbol = Symbol::from_static("@160"); - -/// PEPE/USDC Spot (index: 11, @11) -pub const PEPE_USDC: Symbol = Symbol::from_static("@11"); - -/// PERP/USDC Spot (index: 168, @168) -pub const PERP_USDC: Symbol = Symbol::from_static("@168"); - -/// PICKL/USDC Spot (index: 118, @118) -pub const PICKL_USDC: Symbol = Symbol::from_static("@118"); - -/// PIGEON/USDC Spot (index: 65, @65) -pub const PIGEON_USDC: Symbol = Symbol::from_static("@65"); - -/// PILL/USDC Spot (index: 39, @39) -pub const PILL_USDC: Symbol = Symbol::from_static("@39"); - -/// PIP/USDC Spot (index: 84, @84) -pub const PIP_USDC: Symbol = Symbol::from_static("@84"); - -/// POINTS/USDC Spot (index: 8, @8) -pub const POINTS_USDC: Symbol = Symbol::from_static("@8"); - -/// PRFI/USDC Spot (index: 156, @156) -pub const PRFI_USDC: Symbol = Symbol::from_static("@156"); - -/// PUMP/USDC Spot (index: 20, @20) -pub const PUMP_USDC: Symbol = Symbol::from_static("@20"); - -/// PURR/USDC Spot (index: 0, @0) -pub const PURR_USDC: Symbol = Symbol::from_static("@0"); - -/// PURRO/USDC Spot (index: 169, @169) -pub const PURRO_USDC: Symbol = Symbol::from_static("@169"); - -/// PURRPS/USDC Spot (index: 32, @32) -pub const PURRPS_USDC: Symbol = Symbol::from_static("@32"); - -/// QUANT/USDC Spot (index: 150, @150) -pub const QUANT_USDC: Symbol = Symbol::from_static("@150"); - -/// RAGE/USDC Spot (index: 49, @49) -pub const RAGE_USDC: Symbol = Symbol::from_static("@49"); - -/// RANK/USDC Spot (index: 72, @72) -pub const RANK_USDC: Symbol = Symbol::from_static("@72"); - -/// RAT/USDC Spot (index: 152, @152) -pub const RAT_USDC: Symbol = Symbol::from_static("@152"); - -/// RETARD/USDC Spot (index: 109, @109) -pub const RETARD_USDC: Symbol = Symbol::from_static("@109"); - -/// RICH/USDC Spot (index: 57, @57) -pub const RICH_USDC: Symbol = Symbol::from_static("@57"); - -/// RIP/USDC Spot (index: 74, @74) -pub const RIP_USDC: Symbol = Symbol::from_static("@74"); - -/// RISE/USDC Spot (index: 66, @66) -pub const RISE_USDC: Symbol = Symbol::from_static("@66"); - -/// RUB/USDC Spot (index: 165, @165) -pub const RUB_USDC: Symbol = Symbol::from_static("@165"); - -/// RUG/USDC Spot (index: 13, @13) -pub const RUG_USDC: Symbol = Symbol::from_static("@13"); - -/// SCHIZO/USDC Spot (index: 23, @23) -pub const SCHIZO_USDC: Symbol = Symbol::from_static("@23"); - -/// SELL/USDC Spot (index: 24, @24) -pub const SELL_USDC: Symbol = Symbol::from_static("@24"); - -/// SENT/USDC Spot (index: 133, @133) -pub const SENT_USDC: Symbol = Symbol::from_static("@133"); - -/// SHEEP/USDC Spot (index: 119, @119) -pub const SHEEP_USDC: Symbol = Symbol::from_static("@119"); - -/// SHOE/USDC Spot (index: 78, @78) -pub const SHOE_USDC: Symbol = Symbol::from_static("@78"); - -/// SHREK/USDC Spot (index: 83, @83) -pub const SHREK_USDC: Symbol = Symbol::from_static("@83"); - -/// SIX/USDC Spot (index: 5, @5) -pub const SIX_USDC: Symbol = Symbol::from_static("@5"); - -/// SOLV/USDC Spot (index: 134, @134) -pub const SOLV_USDC: Symbol = Symbol::from_static("@134"); - -/// SOVRN/USDC Spot (index: 137, @137) -pub const SOVRN_USDC: Symbol = Symbol::from_static("@137"); - -/// SPH/USDC Spot (index: 77, @77) -pub const SPH_USDC: Symbol = Symbol::from_static("@77"); - -/// STACK/USDC Spot (index: 69, @69) -pub const STACK_USDC: Symbol = Symbol::from_static("@69"); - -/// STAR/USDC Spot (index: 132, @132) -pub const STAR_USDC: Symbol = Symbol::from_static("@132"); - -/// STEEL/USDC Spot (index: 108, @108) -pub const STEEL_USDC: Symbol = Symbol::from_static("@108"); - -/// STRICT/USDC Spot (index: 92, @92) -pub const STRICT_USDC: Symbol = Symbol::from_static("@92"); - -/// SUCKY/USDC Spot (index: 28, @28) -pub const SUCKY_USDC: Symbol = Symbol::from_static("@28"); - -/// SYLVI/USDC Spot (index: 88, @88) -pub const SYLVI_USDC: Symbol = Symbol::from_static("@88"); - -/// TATE/USDC Spot (index: 19, @19) -pub const TATE_USDC: Symbol = Symbol::from_static("@19"); - -/// TEST/USDC Spot (index: 48, @48) -pub const TEST_USDC: Symbol = Symbol::from_static("@48"); - -/// TILT/USDC Spot (index: 153, @153) -pub const TILT_USDC: Symbol = Symbol::from_static("@153"); - -/// TIME/USDC Spot (index: 136, @136) -pub const TIME_USDC: Symbol = Symbol::from_static("@136"); - -/// TJIF/USDC Spot (index: 60, @60) -pub const TJIF_USDC: Symbol = Symbol::from_static("@60"); - -/// TREND/USDC Spot (index: 154, @154) -pub const TREND_USDC: Symbol = Symbol::from_static("@154"); - -/// TRUMP/USDC Spot (index: 9, @9) -pub const TRUMP_USDC: Symbol = Symbol::from_static("@9"); - -/// UBTC/USDC Spot (index: 140, @140) -pub const UBTC_USDC: Symbol = Symbol::from_static("@140"); - -/// UETH/USDC Spot (index: 147, @147) -pub const UETH_USDC: Symbol = Symbol::from_static("@147"); - -/// UFART/USDC Spot (index: 157, @157) -pub const UFART_USDC: Symbol = Symbol::from_static("@157"); - -/// UP/USDC Spot (index: 98, @98) -pub const UP_USDC: Symbol = Symbol::from_static("@98"); - -/// USDE/USDC Spot (index: 146, @146) -pub const USDE_USDC: Symbol = Symbol::from_static("@146"); - -/// USDHL/USDC Spot (index: 172, @172) -pub const USDHL_USDC: Symbol = Symbol::from_static("@172"); - -/// USDT0/USDC Spot (index: 161, @161) -pub const USDT0_USDC: Symbol = Symbol::from_static("@161"); - -/// USDXL/USDC Spot (index: 148, @148) -pub const USDXL_USDC: Symbol = Symbol::from_static("@148"); - -/// USH/USDC Spot (index: 163, @163) -pub const USH_USDC: Symbol = Symbol::from_static("@163"); - -/// USOL/USDC Spot (index: 151, @151) -pub const USOL_USDC: Symbol = Symbol::from_static("@151"); - -/// USR/USDC Spot (index: 170, @170) -pub const USR_USDC: Symbol = Symbol::from_static("@170"); - -/// VAPOR/USDC Spot (index: 37, @37) -pub const VAPOR_USDC: Symbol = Symbol::from_static("@37"); - -/// VAULT/USDC Spot (index: 123, @123) -pub const VAULT_USDC: Symbol = Symbol::from_static("@123"); - -/// VEGAS/USDC Spot (index: 35, @35) -pub const VEGAS_USDC: Symbol = Symbol::from_static("@35"); - -/// VIZN/USDC Spot (index: 91, @91) -pub const VIZN_USDC: Symbol = Symbol::from_static("@91"); - -/// VORTX/USDC Spot (index: 142, @142) -pub const VORTX_USDC: Symbol = Symbol::from_static("@142"); - -/// WAGMI/USDC Spot (index: 6, @6) -pub const WAGMI_USDC: Symbol = Symbol::from_static("@6"); - -/// WASH/USDC Spot (index: 54, @54) -pub const WASH_USDC: Symbol = Symbol::from_static("@54"); - -/// WHYPI/USDC Spot (index: 145, @145) -pub const WHYPI_USDC: Symbol = Symbol::from_static("@145"); - -/// WOW/USDC Spot (index: 107, @107) -pub const WOW_USDC: Symbol = Symbol::from_static("@107"); - -/// XAUT0/USDC Spot (index: 173, @173) -pub const XAUT0_USDC: Symbol = Symbol::from_static("@173"); - -/// XULIAN/USDC Spot (index: 12, @12) -pub const XULIAN_USDC: Symbol = Symbol::from_static("@12"); - -/// YAP/USDC Spot (index: 104, @104) -pub const YAP_USDC: Symbol = Symbol::from_static("@104"); - -/// YEETI/USDC Spot (index: 87, @87) -pub const YEETI_USDC: Symbol = Symbol::from_static("@87"); +define_spot_symbols!( + (ADHD_USDC, 40, "ADHD/USDC"), + (ANON_USDC, 166, "ANON/USDC"), + (ANSEM_USDC, 18, "ANSEM/USDC"), + (ANT_USDC, 55, "ANT/USDC"), + (ARI_USDC, 53, "ARI/USDC"), + (ASI_USDC, 36, "ASI/USDC"), + (ATEHUN_USDC, 51, "ATEHUN/USDC"), + (AUTIST_USDC, 93, "AUTIST/USDC"), + (BAGS_USDC, 17, "BAGS/USDC"), + (BEATS_USDC, 128, "BEATS/USDC"), + (BERA_USDC, 115, "BERA/USDC"), + (BID_USDC, 33, "BID/USDC"), + (BIGBEN_USDC, 25, "BIGBEN/USDC"), + (BOZO_USDC, 76, "BOZO/USDC"), + (BUBZ_USDC, 117, "BUBZ/USDC"), + (BUDDY_USDC, 155, "BUDDY/USDC"), + (BUSSY_USDC, 81, "BUSSY/USDC"), + (CAPPY_USDC, 7, "CAPPY/USDC"), + (CAT_USDC, 124, "CAT/USDC"), + (CATBAL_USDC, 59, "CATBAL/USDC"), + (CATNIP_USDC, 26, "CATNIP/USDC"), + (CHEF_USDC, 106, "CHEF/USDC"), + (CHINA_USDC, 68, "CHINA/USDC"), + (CINDY_USDC, 67, "CINDY/USDC"), + (COOK_USDC, 164, "COOK/USDC"), + (COPE_USDC, 102, "COPE/USDC"), + (COZY_USDC, 52, "COZY/USDC"), + (CZ_USDC, 16, "CZ/USDC"), + (DEFIN_USDC, 143, "DEFIN/USDC"), + (DEPIN_USDC, 126, "DEPIN/USDC"), + (DIABLO_USDC, 159, "DIABLO/USDC"), + (DROP_USDC, 46, "DROP/USDC"), + (EARTH_USDC, 97, "EARTH/USDC"), + (FARM_USDC, 121, "FARM/USDC"), + (FARMED_USDC, 30, "FARMED/USDC"), + (FATCAT_USDC, 82, "FATCAT/USDC"), + (FEIT_USDC, 89, "FEIT/USDC"), + (FEUSD_USDC, 149, "FEUSD/USDC"), + (FLASK_USDC, 122, "FLASK/USDC"), + (FLY_USDC, 135, "FLY/USDC"), + (FRAC_USDC, 50, "FRAC/USDC"), + (FRCT_USDC, 167, "FRCT/USDC"), + (FRIED_USDC, 70, "FRIED/USDC"), + (FRUDO_USDC, 90, "FRUDO/USDC"), + (FUCKY_USDC, 15, "FUCKY/USDC"), + (FUN_USDC, 41, "FUN/USDC"), + (FUND_USDC, 158, "FUND/USDC"), + (G_USDC, 75, "G/USDC"), + (GENESY_USDC, 116, "GENESY/USDC"), + (GMEOW_USDC, 10, "GMEOW/USDC"), + (GOD_USDC, 139, "GOD/USDC"), + (GPT_USDC, 31, "GPT/USDC"), + (GUESS_USDC, 61, "GUESS/USDC"), + (GUP_USDC, 29, "GUP/USDC"), + (H_USDC, 131, "H/USDC"), + (HAPPY_USDC, 22, "HAPPY/USDC"), + (HBOOST_USDC, 27, "HBOOST/USDC"), + (HEAD_USDC, 141, "HEAD/USDC"), + (HFUN_USDC, 1, "HFUN/USDC"), + (HGOD_USDC, 95, "HGOD/USDC"), + (HODL_USDC, 34, "HODL/USDC"), + (HOLD_USDC, 113, "HOLD/USDC"), + (HOP_USDC, 100, "HOP/USDC"), + (HOPE_USDC, 80, "HOPE/USDC"), + (HORSY_USDC, 174, "HORSY/USDC"), + (HPEPE_USDC, 44, "HPEPE/USDC"), + (HPUMP_USDC, 64, "HPUMP/USDC"), + (HPYH_USDC, 103, "HPYH/USDC"), + (HWTR_USDC, 138, "HWTR/USDC"), + (HYENA_USDC, 125, "HYENA/USDC"), + (HYPE_USDC, 105, "HYPE/USDC"), + (ILIENS_USDC, 14, "ILIENS/USDC"), + (JEET_USDC, 45, "JEET/USDC"), + (JEFF_USDC, 4, "JEFF/USDC"), + (JPEG_USDC, 144, "JPEG/USDC"), + (KOBE_USDC, 21, "KOBE/USDC"), + (LADY_USDC, 42, "LADY/USDC"), + (LAUNCH_USDC, 120, "LAUNCH/USDC"), + (LICK_USDC, 2, "LICK/USDC"), + (LIQD_USDC, 130, "LIQD/USDC"), + (LIQUID_USDC, 96, "LIQUID/USDC"), + (LORA_USDC, 58, "LORA/USDC"), + (LQNA_USDC, 85, "LQNA/USDC"), + (LUCKY_USDC, 101, "LUCKY/USDC"), + (MAGA_USDC, 94, "MAGA/USDC"), + (MANLET_USDC, 3, "MANLET/USDC"), + (MAXI_USDC, 62, "MAXI/USDC"), + (MBAPPE_USDC, 47, "MBAPPE/USDC"), + (MEOW_USDC, 110, "MEOW/USDC"), + (MOG_USDC, 43, "MOG/USDC"), + (MON_USDC, 127, "MON/USDC"), + (MONAD_USDC, 79, "MONAD/USDC"), + (MUNCH_USDC, 114, "MUNCH/USDC"), + (NASDAQ_USDC, 86, "NASDAQ/USDC"), + (NEIRO_USDC, 111, "NEIRO/USDC"), + (NFT_USDC, 56, "NFT/USDC"), + (NIGGO_USDC, 99, "NIGGO/USDC"), + (NMTD_USDC, 63, "NMTD/USDC"), + (NOCEX_USDC, 71, "NOCEX/USDC"), + (OMNIX_USDC, 73, "OMNIX/USDC"), + (ORA_USDC, 129, "ORA/USDC"), + (OTTI_USDC, 171, "OTTI/USDC"), + (PANDA_USDC, 38, "PANDA/USDC"), + (PEAR_USDC, 112, "PEAR/USDC"), + (PEG_USDC, 162, "PEG/USDC"), + (PENIS_USDC, 160, "PENIS/USDC"), + (PEPE_USDC, 11, "PEPE/USDC"), + (PERP_USDC, 168, "PERP/USDC"), + (PICKL_USDC, 118, "PICKL/USDC"), + (PIGEON_USDC, 65, "PIGEON/USDC"), + (PILL_USDC, 39, "PILL/USDC"), + (PIP_USDC, 84, "PIP/USDC"), + (POINTS_USDC, 8, "POINTS/USDC"), + (PRFI_USDC, 156, "PRFI/USDC"), + (PUMP_USDC, 20, "PUMP/USDC"), + (PURR_USDC, 0, "PURR/USDC"), + (PURRO_USDC, 169, "PURRO/USDC"), + (PURRPS_USDC, 32, "PURRPS/USDC"), + (QUANT_USDC, 150, "QUANT/USDC"), + (RAGE_USDC, 49, "RAGE/USDC"), + (RANK_USDC, 72, "RANK/USDC"), + (RAT_USDC, 152, "RAT/USDC"), + (RETARD_USDC, 109, "RETARD/USDC"), + (RICH_USDC, 57, "RICH/USDC"), + (RIP_USDC, 74, "RIP/USDC"), + (RISE_USDC, 66, "RISE/USDC"), + (RUB_USDC, 165, "RUB/USDC"), + (RUG_USDC, 13, "RUG/USDC"), + (SCHIZO_USDC, 23, "SCHIZO/USDC"), + (SELL_USDC, 24, "SELL/USDC"), + (SENT_USDC, 133, "SENT/USDC"), + (SHEEP_USDC, 119, "SHEEP/USDC"), + (SHOE_USDC, 78, "SHOE/USDC"), + (SHREK_USDC, 83, "SHREK/USDC"), + (SIX_USDC, 5, "SIX/USDC"), + (SOLV_USDC, 134, "SOLV/USDC"), + (SOVRN_USDC, 137, "SOVRN/USDC"), + (SPH_USDC, 77, "SPH/USDC"), + (STACK_USDC, 69, "STACK/USDC"), + (STAR_USDC, 132, "STAR/USDC"), + (STEEL_USDC, 108, "STEEL/USDC"), + (STRICT_USDC, 92, "STRICT/USDC"), + (SUCKY_USDC, 28, "SUCKY/USDC"), + (SYLVI_USDC, 88, "SYLVI/USDC"), + (TATE_USDC, 19, "TATE/USDC"), + (TEST_USDC, 48, "TEST/USDC"), + (TILT_USDC, 153, "TILT/USDC"), + (TIME_USDC, 136, "TIME/USDC"), + (TJIF_USDC, 60, "TJIF/USDC"), + (TREND_USDC, 154, "TREND/USDC"), + (TRUMP_USDC, 9, "TRUMP/USDC"), + (UBTC_USDC, 140, "UBTC/USDC"), + (UETH_USDC, 147, "UETH/USDC"), + (UFART_USDC, 157, "UFART/USDC"), + (UP_USDC, 98, "UP/USDC"), + (USDE_USDC, 146, "USDE/USDC"), + (USDHL_USDC, 172, "USDHL/USDC"), + (USDT0_USDC, 161, "USDT0/USDC"), + (USDXL_USDC, 148, "USDXL/USDC"), + (USH_USDC, 163, "USH/USDC"), + (USOL_USDC, 151, "USOL/USDC"), + (USR_USDC, 170, "USR/USDC"), + (VAPOR_USDC, 37, "VAPOR/USDC"), + (VAULT_USDC, 123, "VAULT/USDC"), + (VEGAS_USDC, 35, "VEGAS/USDC"), + (VIZN_USDC, 91, "VIZN/USDC"), + (VORTX_USDC, 142, "VORTX/USDC"), + (WAGMI_USDC, 6, "WAGMI/USDC"), + (WASH_USDC, 54, "WASH/USDC"), + (WHYPI_USDC, 145, "WHYPI/USDC"), + (WOW_USDC, 107, "WOW/USDC"), + (XAUT0_USDC, 173, "XAUT0/USDC"), + (XULIAN_USDC, 12, "XULIAN/USDC"), + (YAP_USDC, 104, "YAP/USDC"), + (YEETI_USDC, 87, "YEETI/USDC"), +); // ==================== TESTNET ==================== // Only major assets included for testnet development // ==================== TESTNET PERPETUALS ==================== -/// APT Perpetual (testnet, index: 1) -pub const TEST_APT: Symbol = Symbol::from_static("APT"); - -/// ARB Perpetual (testnet, index: 13) -pub const TEST_ARB: Symbol = Symbol::from_static("ARB"); - -/// ATOM Perpetual (testnet, index: 2) -pub const TEST_ATOM: Symbol = Symbol::from_static("ATOM"); - -/// AVAX Perpetual (testnet, index: 7) -pub const TEST_AVAX: Symbol = Symbol::from_static("AVAX"); - -/// BNB Perpetual (testnet, index: 6) -pub const TEST_BNB: Symbol = Symbol::from_static("BNB"); - -/// BTC Perpetual (testnet, index: 3) -pub const TEST_BTC: Symbol = Symbol::from_static("BTC"); - -/// ETH Perpetual (testnet, index: 4) -pub const TEST_ETH: Symbol = Symbol::from_static("ETH"); - -/// MATIC Perpetual (testnet, index: 5) -pub const TEST_MATIC: Symbol = Symbol::from_static("MATIC"); - -/// OP Perpetual (testnet, index: 11) -pub const TEST_OP: Symbol = Symbol::from_static("OP"); - -/// SOL Perpetual (testnet, index: 0) -pub const TEST_SOL: Symbol = Symbol::from_static("SOL"); - -/// SUI Perpetual (testnet, index: 25) -pub const TEST_SUI: Symbol = Symbol::from_static("SUI"); +define_perp_symbols_literal!( + (TEST_API, 1, "API"), + (TEST_ARB, 13, "ARB"), + (TEST_ATOM, 2, "ATOM"), + (TEST_AVAX, 7, "AVAX"), + (TEST_BNB, 6, "BNB"), + (TEST_BTC, 3, "BTC"), + (TEST_ETH, 4, "ETH"), + (TEST_MATIC, 5, "MATIC"), + (TEST_OP, 11, "OP"), + (TEST_SOL, 0, "SOL"), + (TEST_SUI, 25, "SUI"), +); // ==================== TESTNET SPOT PAIRS ==================== @@ -1210,6 +483,8 @@ pub fn symbol(s: impl Into) -> Symbol { /// ``` pub mod prelude { pub use super::{ + // Runtime symbol creation + symbol, // Popular alts APT, ARB, @@ -1246,8 +521,6 @@ pub mod prelude { USDC, WIF, - // Runtime symbol creation - symbol, }; // Re-export Symbol type for convenience pub use crate::types::symbol::Symbol; @@ -1255,10 +528,11 @@ pub mod prelude { #[cfg(test)] mod tests { - use super::*; #[test] fn test_predefined_symbols() { + use super::*; + assert_eq!(BTC.as_str(), "BTC"); assert!(BTC.is_perp()); @@ -1268,6 +542,8 @@ mod tests { #[test] fn test_runtime_symbol_creation() { + use super::*; + let new_perp = symbol("NEWCOIN"); assert_eq!(new_perp.as_str(), "NEWCOIN"); assert!(new_perp.is_perp()); diff --git a/tests/approve_agent_test.rs b/tests/approve_agent_test.rs index 7489c03..cf82c44 100644 --- a/tests/approve_agent_test.rs +++ b/tests/approve_agent_test.rs @@ -2,10 +2,10 @@ #[cfg(test)] mod tests { + use alloy::primitives::{address, keccak256}; use ferrofluid::types::actions::ApproveAgent; use ferrofluid::types::eip712::HyperliquidAction; - use alloy::primitives::{address, keccak256}; - + #[test] fn test_approve_agent_type_hash() { let expected = keccak256( @@ -13,7 +13,7 @@ mod tests { ); assert_eq!(ApproveAgent::type_hash(), expected); } - + #[test] fn test_approve_agent_serialization() { let action = ApproveAgent { @@ -23,11 +23,11 @@ mod tests { agent_name: Some("Test Agent".to_string()), nonce: 1234567890, }; - + // Serialize to JSON let json = serde_json::to_string(&action).unwrap(); let parsed: serde_json::Value = serde_json::from_str(&json).unwrap(); - + // Check that address is serialized as hex string assert_eq!( parsed["agentAddress"].as_str().unwrap(), @@ -37,7 +37,7 @@ mod tests { assert_eq!(parsed["agentName"].as_str().unwrap(), "Test Agent"); assert_eq!(parsed["nonce"].as_u64().unwrap(), 1234567890); } - + #[test] fn test_approve_agent_struct_hash() { let action = ApproveAgent { @@ -47,10 +47,10 @@ mod tests { agent_name: None, nonce: 1690393044548, }; - + // Test that struct hash is computed let struct_hash = action.struct_hash(); // Just verify it's not zero assert_ne!(struct_hash, alloy::primitives::B256::ZERO); } -} \ No newline at end of file +} diff --git a/tests/managed_exchange_test.rs b/tests/managed_exchange_test.rs index e5956e5..fe5eb53 100644 --- a/tests/managed_exchange_test.rs +++ b/tests/managed_exchange_test.rs @@ -1,29 +1,30 @@ //! Tests for ManagedExchangeProvider +use alloy::signers::local::PrivateKeySigner; use ferrofluid::{ - providers::{ManagedExchangeProvider, OrderHandle}, - types::requests::{OrderRequest, OrderType, Limit}, constants::*, + providers::{ManagedExchangeProvider, OrderHandle}, + types::requests::{Limit, OrderRequest, OrderType}, }; -use alloy::signers::local::PrivateKeySigner; use std::time::Duration; #[tokio::test] async fn test_managed_provider_creation() { // Initialize CryptoProvider for rustls rustls::crypto::CryptoProvider::install_default( - rustls::crypto::ring::default_provider() - ).ok(); - + rustls::crypto::ring::default_provider(), + ) + .ok(); + // Create a test signer let signer = PrivateKeySigner::random(); - + // Create managed provider with default config let exchange = ManagedExchangeProvider::builder(signer) .with_network(ferrofluid::Network::Testnet) .build() .await; - + assert!(exchange.is_ok()); } @@ -31,11 +32,12 @@ async fn test_managed_provider_creation() { async fn test_managed_provider_with_batching() { // Initialize CryptoProvider for rustls rustls::crypto::CryptoProvider::install_default( - rustls::crypto::ring::default_provider() - ).ok(); - + rustls::crypto::ring::default_provider(), + ) + .ok(); + let signer = PrivateKeySigner::random(); - + // Create with batching enabled let exchange = ManagedExchangeProvider::builder(signer) .with_network(ferrofluid::Network::Testnet) @@ -44,7 +46,7 @@ async fn test_managed_provider_with_batching() { .build() .await .unwrap(); - + // Create a test order let order = OrderRequest { asset: 0, @@ -52,13 +54,15 @@ async fn test_managed_provider_with_batching() { limit_px: "50000".to_string(), sz: "0.01".to_string(), reduce_only: false, - order_type: OrderType::Limit(Limit { tif: TIF_GTC.to_string() }), + order_type: OrderType::Limit(Limit { + tif: TIF_GTC.to_string(), + }), cloid: None, }; - + // Place order should return pending handle let handle = exchange.place_order(&order).await.unwrap(); - + match handle { OrderHandle::Pending { .. } => { // Expected for batched orders @@ -69,7 +73,7 @@ async fn test_managed_provider_with_batching() { } } -#[tokio::test] +#[tokio::test] async fn test_alo_order_detection() { let order = OrderRequest { asset: 0, @@ -77,34 +81,38 @@ async fn test_alo_order_detection() { limit_px: "50000".to_string(), sz: "0.01".to_string(), reduce_only: false, - order_type: OrderType::Limit(Limit { tif: "Alo".to_string() }), + order_type: OrderType::Limit(Limit { + tif: "Alo".to_string(), + }), cloid: None, }; - + assert!(order.is_alo()); - + let regular_order = OrderRequest { asset: 0, is_buy: true, limit_px: "50000".to_string(), sz: "0.01".to_string(), reduce_only: false, - order_type: OrderType::Limit(Limit { tif: "Gtc".to_string() }), + order_type: OrderType::Limit(Limit { + tif: "Gtc".to_string(), + }), cloid: None, }; - + assert!(!regular_order.is_alo()); } #[test] fn test_nonce_generation() { use ferrofluid::providers::nonce::NonceManager; - + let manager = NonceManager::new(false); - + let nonce1 = manager.next_nonce(None); let nonce2 = manager.next_nonce(None); - + assert!(nonce2 > nonce1); assert!(NonceManager::is_valid_nonce(nonce1)); assert!(NonceManager::is_valid_nonce(nonce2)); @@ -112,13 +120,13 @@ fn test_nonce_generation() { #[test] fn test_nonce_isolation() { - use ferrofluid::providers::nonce::NonceManager; use alloy::primitives::Address; - + use ferrofluid::providers::nonce::NonceManager; + let manager = NonceManager::new(true); let addr1 = Address::new([1u8; 20]); let addr2 = Address::new([2u8; 20]); - + // Get initial nonces - these should have different millisecond timestamps let n1_1 = manager.next_nonce(Some(addr1)); std::thread::sleep(std::time::Duration::from_millis(1)); @@ -127,16 +135,16 @@ fn test_nonce_isolation() { let n1_2 = manager.next_nonce(Some(addr1)); std::thread::sleep(std::time::Duration::from_millis(1)); let n2_2 = manager.next_nonce(Some(addr2)); - + // Each address should have independent, increasing nonces assert!(n1_2 > n1_1, "addr1 nonces should increase"); assert!(n2_2 > n2_1, "addr2 nonces should increase"); - + // Verify counter independence using the manager's get_counter method assert_eq!(manager.get_counter(Some(addr1)), 2); // addr1 has 2 nonces assert_eq!(manager.get_counter(Some(addr2)), 2); // addr2 has 2 nonces - + // The nonces themselves should be unique assert_ne!(n1_1, n2_1); assert_ne!(n1_2, n2_2); -} \ No newline at end of file +} diff --git a/tests/order_tracking_test.rs b/tests/order_tracking_test.rs index 6acf280..5c5abf6 100644 --- a/tests/order_tracking_test.rs +++ b/tests/order_tracking_test.rs @@ -2,12 +2,11 @@ mod tests { use alloy::signers::local::PrivateKeySigner; use ferrofluid::{ - constants::TIF_GTC, - types::requests::OrderRequest, - ExchangeProvider, signers::AlloySigner, + constants::TIF_GTC, signers::AlloySigner, types::requests::OrderRequest, + ExchangeProvider, }; - use uuid::Uuid; use std::sync::Once; + use uuid::Uuid; static INIT: Once = Once::new(); @@ -22,12 +21,12 @@ mod tests { fn create_test_exchange() -> ExchangeProvider> { init_crypto(); - let private_key = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; + let private_key = + "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; let signer = private_key.parse::().unwrap(); let alloy_signer = AlloySigner { inner: signer }; - - ExchangeProvider::testnet(alloy_signer) - .with_order_tracking() + + ExchangeProvider::testnet(alloy_signer).with_order_tracking() } #[test] @@ -40,13 +39,13 @@ mod tests { #[test] fn test_order_tracking_methods() { let exchange = create_test_exchange(); - + // Test empty state assert_eq!(exchange.get_all_tracked_orders().len(), 0); assert_eq!(exchange.get_pending_orders().len(), 0); assert_eq!(exchange.get_submitted_orders().len(), 0); assert_eq!(exchange.get_failed_orders().len(), 0); - + // Test get by non-existent cloid let fake_cloid = Uuid::new_v4(); assert!(exchange.get_tracked_order(&fake_cloid).is_none()); @@ -55,7 +54,7 @@ mod tests { #[test] fn test_clear_tracked_orders() { let exchange = create_test_exchange(); - + // Clear should work even when empty exchange.clear_tracked_orders(); assert_eq!(exchange.tracked_order_count(), 0); @@ -64,7 +63,7 @@ mod tests { #[test] fn test_order_builder_with_tracking() { let exchange = create_test_exchange(); - + // Create order using builder let _order_builder = exchange .order(0) @@ -72,7 +71,7 @@ mod tests { .limit_px("45000.0") .size("0.01") .cloid(Uuid::new_v4()); - + // Builder doesn't automatically track until order is placed assert_eq!(exchange.tracked_order_count(), 0); } @@ -80,18 +79,19 @@ mod tests { #[test] fn test_tracking_disabled_by_default() { init_crypto(); - let private_key = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; + let private_key = + "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; let signer = private_key.parse::().unwrap(); let alloy_signer = AlloySigner { inner: signer }; - + // Create exchange without tracking let exchange = ExchangeProvider::testnet(alloy_signer); - + // Methods should return empty results assert_eq!(exchange.tracked_order_count(), 0); assert_eq!(exchange.get_all_tracked_orders().len(), 0); assert_eq!(exchange.get_pending_orders().len(), 0); - + // Clear should be safe to call exchange.clear_tracked_orders(); } @@ -99,14 +99,14 @@ mod tests { #[tokio::test] async fn test_order_tracking_with_mock_placement() { let exchange = create_test_exchange(); - + // Create a test order let _order = OrderRequest::limit(0, true, "45000.0", "0.01", TIF_GTC); - + // Before placing, no orders tracked assert_eq!(exchange.tracked_order_count(), 0); - + // Note: Actually placing the order would require a valid connection // This test verifies the tracking infrastructure is in place } -} \ No newline at end of file +}