From 9fd9e170b2eb5e8835882789f5f5909cfdab2aa7 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 28 Feb 2024 15:17:13 +0800 Subject: [PATCH] [hermes] add /v2/price_feeds endpoint (#1277) * initial stab * fix comments * add filter feature * fix deprecated warnings * use cache * Update price_feeds API query * Update PriceFeedsQueryParams struct in price_feeds.rs * fix merge conflict * fix default value * add tracing info * fix comment * address comments * change var name * refactor * refactor * refactor * refactor * undo changes in cache.rs * undo changes in aggregate.rs * address comments * address comments * address comments and improve fetching data speed * address comments * address comments * bump * change chunk size * change function name * address comment * address comments * address comments * address comments * Remove debug print statement * address comments and add to openapi --- hermes/Cargo.lock | 1375 ++++++++++++----- hermes/Cargo.toml | 9 +- hermes/src/aggregate.rs | 5 +- hermes/src/api.rs | 4 + hermes/src/api/rest.rs | 5 + hermes/src/api/rest/index.rs | 1 + hermes/src/api/rest/v2/mod.rs | 1 + .../src/api/rest/v2/price_feeds_metadata.rs | 64 + hermes/src/api/types.rs | 54 +- hermes/src/config/pythnet.rs | 13 +- hermes/src/main.rs | 1 + hermes/src/network/pythnet.rs | 141 +- hermes/src/price_feeds_metadata.rs | 55 + hermes/src/state.rs | 5 + 14 files changed, 1364 insertions(+), 369 deletions(-) create mode 100644 hermes/src/api/rest/v2/price_feeds_metadata.rs create mode 100644 hermes/src/price_feeds_metadata.rs diff --git a/hermes/Cargo.lock b/hermes/Cargo.lock index cae4e0e859..bac69f3adc 100644 --- a/hermes/Cargo.lock +++ b/hermes/Cargo.lock @@ -43,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "opaque-debug", ] @@ -56,7 +56,7 @@ checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" dependencies = [ "aead", "aes", - "cipher 0.3.0", + "cipher", "ctr", "polyval", "subtle", @@ -74,6 +74,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +dependencies = [ + "cfg-if", + "getrandom 0.2.10", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.0.2" @@ -176,6 +189,129 @@ version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "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", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.3", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote 1.0.31", + "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 0.4.3", + "num-traits", + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.3", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 1.0.109", +] + +[[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 = "array-bytes" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ad284aeb45c13f2fb4f084de4a420ebf447423bdf9386c0540ce33cb3ef4b8c" + [[package]] name = "arrayref" version = "0.3.7" @@ -188,6 +324,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "asn1-rs" version = "0.5.2" @@ -233,6 +375,17 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-compression" version = "0.4.1" @@ -275,7 +428,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -286,7 +439,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -368,7 +521,7 @@ dependencies = [ "heck", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -625,9 +778,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" dependencies = [ "bytemuck_derive", ] @@ -640,7 +793,7 @@ checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -705,16 +858,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" version = "2.34.0" @@ -725,11 +868,27 @@ dependencies = [ "atty", "bitflags 1.3.2", "strsim 0.8.0", - "textwrap", + "textwrap 0.11.0", "unicode-width", "vec_map", ] +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex 0.2.4", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.0", +] + [[package]] name = "clap" version = "4.4.4" @@ -748,7 +907,7 @@ checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56" dependencies = [ "anstream", "anstyle", - "clap_lex", + "clap_lex 0.5.1", "strsim 0.10.0", ] @@ -761,7 +920,16 @@ dependencies = [ "heck", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", ] [[package]] @@ -776,6 +944,28 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.7" @@ -936,7 +1126,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "cipher 0.3.0", + "cipher", ] [[package]] @@ -953,6 +1143,41 @@ dependencies = [ "zeroize", ] +[[package]] +name = "darling" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.66", + "quote 1.0.31", + "strsim 0.10.0", + "syn 2.0.32", +] + +[[package]] +name = "darling_macro" +version = "0.20.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" +dependencies = [ + "darling_core", + "quote 1.0.31", + "syn 2.0.32", +] + [[package]] name = "dashmap" version = "5.5.0" @@ -1001,6 +1226,17 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1055,16 +1291,6 @@ dependencies = [ "dirs-sys", ] -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if", - "dirs-sys-next", -] - [[package]] name = "dirs-sys" version = "0.3.7" @@ -1076,17 +1302,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "displaydoc" version = "0.2.4" @@ -1095,7 +1310,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -1133,6 +1348,12 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + [[package]] name = "ed25519" version = "1.5.3" @@ -1191,34 +1412,22 @@ dependencies = [ [[package]] name = "enum-iterator" -version = "0.7.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" dependencies = [ "enum-iterator-derive", ] [[package]] name = "enum-iterator-derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" -dependencies = [ - "proc-macro2 1.0.66", - "quote 1.0.31", - "syn 1.0.109", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.12" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33313078bb8d4d05a2733a94ac4c2d8a0df9a2b84424ebf4f33bfc224a890e" +checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" dependencies = [ - "once_cell", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -1406,7 +1615,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -1445,15 +1654,6 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -1495,8 +1695,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1505,6 +1707,17 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "governor" version = "0.6.0" @@ -1542,13 +1755,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] @@ -1557,7 +1779,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.8", ] [[package]] @@ -1574,7 +1805,7 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermes" -version = "0.5.2" +version = "0.5.3" dependencies = [ "anyhow", "async-trait", @@ -1602,6 +1833,7 @@ dependencies = [ "prost", "prost-build", "pyth-sdk", + "pyth-sdk-solana", "pythnet-sdk", "rand 0.8.5", "reqwest", @@ -1818,6 +2050,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.4.0" @@ -1873,23 +2111,15 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.16.2" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" dependencies = [ "console", - "lazy_static", + "instant", "number_prefix", - "regex", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", + "portable-atomic", + "unicode-width", ] [[package]] @@ -1999,20 +2229,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] -name = "libloading" -version = "0.7.4" +name = "libsecp256k1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" dependencies = [ "arrayref", "base64 0.12.3", @@ -2056,12 +2276,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -2090,15 +2304,6 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" -[[package]] -name = "lru" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" -dependencies = [ - "hashbrown 0.12.3", -] - [[package]] name = "mach2" version = "0.4.1" @@ -2140,9 +2345,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] @@ -2245,15 +2450,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.23.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", - "cc", "cfg-if", "libc", - "memoffset 0.6.5", + "memoffset 0.7.1", + "pin-utils", ] [[package]] @@ -2368,6 +2573,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 2.0.32", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -2434,23 +2650,44 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.11" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.7.2", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 1.0.109", + "syn 2.0.32", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 2.0.32", ] [[package]] @@ -2512,7 +2749,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -2533,6 +2770,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + [[package]] name = "overload" version = "0.1.1" @@ -2562,6 +2805,12 @@ dependencies = [ "windows-targets 0.48.1", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pbkdf2" version = "0.4.0" @@ -2573,9 +2822,9 @@ dependencies = [ [[package]] name = "pbkdf2" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest 0.10.7", ] @@ -2631,7 +2880,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -2663,6 +2912,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "polyval" version = "0.5.3" @@ -2675,6 +2930,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2688,7 +2949,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2 1.0.66", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -2802,7 +3063,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.26", + "syn 2.0.32", "tempfile", "which", ] @@ -2817,7 +3078,7 @@ dependencies = [ "itertools", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -2843,6 +3104,23 @@ dependencies = [ "serde", ] +[[package]] +name = "pyth-sdk-solana" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875de47128e93a881ede3ad97aa5a4dc32397995277ff5e599eed8bba8d43334" +dependencies = [ + "borsh 0.10.3", + "borsh-derive 0.10.3", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "pyth-sdk", + "serde", + "solana-program", + "thiserror", +] + [[package]] name = "pythnet-sdk" version = "2.0.0" @@ -2888,16 +3166,15 @@ dependencies = [ [[package]] name = "quinn" -version = "0.8.5" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f" +checksum = "2e8b432585672228923edbbf64b8b12c14e1112f62e88737655b4a083dbcd78e" dependencies = [ "bytes", - "futures-channel", - "futures-util", - "fxhash", + "pin-project-lite", "quinn-proto", "quinn-udp", + "rustc-hash", "rustls 0.20.8", "thiserror", "tokio", @@ -2907,17 +3184,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.8.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce546b9688f767a57530652488420d419a8b1f44a478b451c3d1ab6d992a55" +checksum = "94b0b33c13a79f669c85defaf4c275dc86a0c0372807d0ca3d78e0bb87274863" dependencies = [ "bytes", - "fxhash", "rand 0.8.5", "ring", + "rustc-hash", "rustls 0.20.8", "rustls-native-certs", - "rustls-pemfile 0.2.1", "slab", "thiserror", "tinyvec", @@ -2927,16 +3203,15 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.1.4" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07946277141531aea269befd949ed16b2c85a780ba1043244eda0969e538e54" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" dependencies = [ - "futures-util", "libc", "quinn-proto", "socket2", - "tokio", "tracing", + "windows-sys 0.42.0", ] [[package]] @@ -3070,9 +3345,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", "ring", @@ -3180,7 +3455,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rustls 0.21.7", - "rustls-pemfile 1.0.3", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", @@ -3214,14 +3489,23 @@ dependencies = [ [[package]] name = "rpassword" -version = "6.0.1" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", - "serde", - "serde_json", - "winapi", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", ] [[package]] @@ -3245,7 +3529,7 @@ dependencies = [ "quote 1.0.31", "rust-embed-utils", "shellexpand", - "syn 2.0.26", + "syn 2.0.32", "walkdir", ] @@ -3347,20 +3631,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.3", + "rustls-pemfile", "schannel", "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" -dependencies = [ - "base64 0.13.1", -] - [[package]] name = "rustls-pemfile" version = "1.0.3" @@ -3440,6 +3715,26 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 2.0.32", +] + [[package]] name = "sct" version = "0.7.0" @@ -3525,7 +3820,7 @@ checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -3585,6 +3880,28 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 2.0.32", +] + [[package]] name = "serde_wormhole" version = "0.1.0" @@ -3597,18 +3914,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "serde_yaml" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" -dependencies = [ - "indexmap 1.9.3", - "ryu", - "serde", - "yaml-rust", -] - [[package]] name = "sha-1" version = "0.10.1" @@ -3762,12 +4067,12 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bf996a6f6063f8dc883b27c1b166de10461b3653d3213165174682855b7f1c" +checksum = "5d8ea963f393c09376f21f7f5217d5701a18d65c821a68337188b6cf9c1255db" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.4", "bincode", "bs58", "bv", @@ -3775,20 +4080,42 @@ dependencies = [ "serde", "serde_derive", "serde_json", + "solana-address-lookup-table-program", "solana-config-program", "solana-sdk", - "solana-vote-program", "spl-token", "spl-token-2022", + "spl-token-metadata-interface", "thiserror", "zstd", ] +[[package]] +name = "solana-address-lookup-table-program" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c284096b2d4595b13f61004142c6caff4f3dc40ba77dbd5f4071d67c256e15c" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive 0.3.3", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + [[package]] name = "solana-clap-utils" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76b0c923e89c64ed398964ec2a3ddecacb5a712664d19812ebbf65eefd599145" +checksum = "b4371b20d9dff6a0e769cd103385e7c257d511efec11efd94c65ab52a39255e2" dependencies = [ "chrono", "clap 2.34.0", @@ -3802,82 +4129,44 @@ dependencies = [ "url", ] -[[package]] -name = "solana-cli-config" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a11154a239590693f0d6b0b4d69193dc98ca21b3e8cc4d1d8d9b326311f520a" -dependencies = [ - "dirs-next", - "lazy_static", - "serde", - "serde_derive", - "serde_yaml", - "solana-clap-utils", - "solana-sdk", - "url", -] - [[package]] name = "solana-client" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aba6eeb10249c986b335dd1c684f7353c3e48eeec3259550fcd3b79685013f2" +checksum = "78ee4db75f979886731e603f7bd22eeb3386cd1477a7592931e21623326da83b" dependencies = [ - "async-mutex", "async-trait", - "base64 0.13.1", "bincode", - "bs58", - "bytes", - "clap 2.34.0", - "crossbeam-channel", - "enum_dispatch", "futures", "futures-util", "indexmap 1.9.3", "indicatif", - "itertools", - "jsonrpc-core", - "lazy_static", "log", - "lru", "quinn", - "quinn-proto", "rand 0.7.3", - "rand_chacha 0.2.2", "rayon", - "reqwest", - "rustls 0.20.8", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-faucet", + "solana-connection-cache", "solana-measure", "solana-metrics", - "solana-net-utils", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", "solana-sdk", "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "spl-token-2022", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", "thiserror", "tokio", - "tokio-stream", - "tokio-tungstenite 0.17.2", - "tungstenite 0.17.3", - "url", ] [[package]] name = "solana-config-program" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20f530aab2e7933539698196e9c2c41521355cdd72ee270e9ec4b3154556dc9e" +checksum = "ae9df684ad70f3e3cb716a085652b545a64dfbc9299c59f768112ec69d4f4392" dependencies = [ "bincode", "chrono", @@ -3888,68 +4177,76 @@ dependencies = [ ] [[package]] -name = "solana-faucet" -version = "1.13.3" +name = "solana-connection-cache" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9aae7a9b16c3e81b6532c3a5d886c58ee0cb518ee6b417f28ea0cfee972ac60" +checksum = "c58c2e8007f2fd5ae0302ccaa7df72bdb6b1b40fd9f4b6c67f5e928dc58d9f35" dependencies = [ + "async-trait", "bincode", - "byteorder", - "clap 2.34.0", - "crossbeam-channel", + "futures-util", + "indexmap 1.9.3", "log", - "serde", - "serde_derive", - "solana-clap-utils", - "solana-cli-config", - "solana-logger", + "rand 0.7.3", + "rayon", + "rcgen", + "solana-measure", "solana-metrics", "solana-sdk", - "solana-version", - "spl-memo", "thiserror", "tokio", ] [[package]] name = "solana-frozen-abi" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80650015acc4634f2bbb9a6c1a76c740a6f12854539103f3c13345b1e285b86" +checksum = "9ab680d7d65fcecdea832cadb063fc3898121bc56cab15aee54f2c5db71af535" dependencies = [ + "ahash 0.8.8", + "blake3", + "block-buffer 0.10.4", "bs58", "bv", + "byteorder", + "cc", + "either", "generic-array", + "getrandom 0.1.16", "im", "lazy_static", "log", "memmap2", + "once_cell", + "rand_core 0.6.4", "rustc_version", "serde", "serde_bytes", "serde_derive", + "serde_json", "sha2 0.10.7", "solana-frozen-abi-macro", + "subtle", "thiserror", ] [[package]] name = "solana-frozen-abi-macro" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439f7e3b931ff5ec531164f01c3eb8897c0ae72f7d537294e67b81029fa8e89f" +checksum = "b02411fefc004154edf3fe61cedb1dfb26ef82b659148b0a4b21ce3184d40ebc" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", "rustc_version", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] name = "solana-logger" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27888ef86f0e2ea9b55be9e94f08e785c4d810b89d9d6597c9f590fdf605cd7a" +checksum = "f9c7f0c4504c512f93aed16fb07449cafa5fa0c54ef7cfff6f377b2a5ed34553" dependencies = [ "env_logger 0.9.3", "lazy_static", @@ -3958,9 +4255,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66772934ed60505434586cf6e1b7133c266a36501c201aca1d26fff3b54e84ef" +checksum = "ceb54a32ad5125ed514c058639ac86508efcffc2412f713e3140eb70291d9843" dependencies = [ "log", "solana-sdk", @@ -3968,9 +4265,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef37aa2167fffa33c6c97f9aa804ba155b16cc6ae4aac89bf1a5aca00939bce5" +checksum = "ef674e1c16731541af6f58515ebdae519f68d374a3018675dc9ee3480b4a640e" dependencies = [ "crossbeam-channel", "gethostname", @@ -3982,12 +4279,12 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3093c7701cc7d3603a32aec204e5a2e4935f71b37eabd7302d5b67bdb4ea0a02" +checksum = "a39ab5b49d50c50411fe1990b097458dd3d23aee1753db9b13f69a2f946409f5" dependencies = [ "bincode", - "clap 2.34.0", + "clap 3.2.25", "crossbeam-channel", "log", "nix", @@ -4004,11 +4301,11 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f5821cb3d6b17319663d5344639a8ea5eba049fcf144b839ecb4673ad2d62" +checksum = "710431ce6bc8a070c3b54999f9602b8b4c94358836615e89e357114ea0ae1fe5" dependencies = [ - "ahash", + "ahash 0.8.8", "bincode", "bv", "caps", @@ -4031,75 +4328,145 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "792814be1ae8ea58a43ae3cd51578517ec0d9c42c6241c9c0dc71a83d7e0e314" +checksum = "aedf18ad0e74ce21123eb94c45d8b469d280a6a3e4f1bf6411fc4ca8fc7c2eac" dependencies = [ - "base64 0.13.1", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "array-bytes", + "base64 0.21.4", "bincode", "bitflags 1.3.2", "blake3", + "borsh 0.10.3", "borsh 0.9.3", - "borsh-derive 0.9.3", "bs58", "bv", "bytemuck", + "cc", "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.1.16", + "getrandom 0.2.10", "itertools", "js-sys", "lazy_static", + "libc", "libsecp256k1", "log", - "num-derive", + "memoffset 0.9.0", + "num-bigint 0.4.3", + "num-derive 0.3.3", "num-traits", "parking_lot", "rand 0.7.3", + "rand_chacha 0.2.2", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", + "serde_json", "sha2 0.10.7", "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-sdk-macro", "thiserror", + "tiny-bip39", "wasm-bindgen", + "zeroize", ] [[package]] name = "solana-program-runtime" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef724d482da6354e6f2519ae17847ad383ba1e55b525899503ab13e2c97bd740" +checksum = "d9e3ff03078645ddd91e2a3eb2d58a90a5a6c9d7e8c2b9c2b3511f24ea03b711" dependencies = [ - "base64 0.13.1", + "base64 0.21.4", "bincode", + "eager", "enum-iterator", "itertools", "libc", - "libloading", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", + "percentage", + "rand 0.7.3", "rustc_version", "serde", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-measure", + "solana-metrics", "solana-sdk", + "solana_rbpf", "thiserror", ] +[[package]] +name = "solana-pubsub-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c7d115473531dbc447989e3e6eb24a418bf3c0b7ffb86da17c4a1271d1ce553" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite 0.17.2", + "tungstenite 0.17.3", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bca1af43f5b44321e2a5f48798d07ade968c7d95c3191ef2f8e167a481ed4d37" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "quinn-udp", + "rcgen", + "rustls 0.20.8", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + [[package]] name = "solana-rayon-threadlimit" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b5e1e75dbbde7ac578bb8e712de8d0408e299a220b50c3316b08654f5fb628" +checksum = "cb5a290bb5b316654d165326c1ed22cf15a40559523824097308913cce2dcad7" dependencies = [ "lazy_static", "num_cpus", @@ -4107,14 +4474,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11989d097d9d47ee433a85714ff8a9ca940847b441dffdc78f3d0e17147da208" +checksum = "a082793597a5467271d35cbee5e3782e42a0b52849521f293b6bc07f9514d018" dependencies = [ "console", "dialoguer", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "parking_lot", "qstring", @@ -4124,17 +4491,78 @@ dependencies = [ "uriparse", ] +[[package]] +name = "solana-rpc-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6ed31f6dd0546a92daf7493c94b602e6c06e59b474d5a81559ff88d6d3e8afa" +dependencies = [ + "async-trait", + "base64 0.21.4", + "bincode", + "bs58", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e846fb99c6aa3d044cb556f40156a585dd3f4cb1e416b5b8319028d3f731b6a8" +dependencies = [ + "base64 0.21.4", + "bs58", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5ac3f71c723bf061e684c1bcf9be29b99d07fd6be54cf9e12f1cc1629d4f74" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + [[package]] name = "solana-sdk" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e54361f5faf0696f6f41a8f57e49ec9d99e80c333e2f5466f8501bc67313a0f" +checksum = "d6aea1e7067980ca1ef57a31c498413547b82aa392d9e7ec5539968f1a8dec1c" dependencies = [ "assert_matches", - "base64 0.13.1", + "base64 0.21.4", "bincode", "bitflags 1.3.2", - "borsh 0.9.3", + "borsh 0.10.3", "bs58", "bytemuck", "byteorder", @@ -4151,9 +4579,10 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.3.3", "num-traits", - "pbkdf2 0.10.1", + "num_enum 0.6.1", + "pbkdf2 0.11.0", "qstring", "rand 0.7.3", "rand_chacha 0.2.2", @@ -4163,6 +4592,7 @@ dependencies = [ "serde_bytes", "serde_derive", "serde_json", + "serde_with", "sha2 0.10.7", "sha3 0.10.8", "solana-frozen-abi", @@ -4177,23 +4607,25 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9ca4f24a272f09377a0b594e6cfa809247c8f8e6ab188928fa0072b6803543" +checksum = "dbca599523925e4c55e0326d93eef0a8e1918df5f93897811abf3f5972e21bec" dependencies = [ "bs58", "proc-macro2 1.0.66", "quote 1.0.31", "rustversion", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] name = "solana-streamer" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fdc52c3945a4d4fd9012e6c0c3d1a95f00ec51555e09ce6fef4806d7259c9ba" +checksum = "2147a8042ec522d31a5ec67ef06000d7c4d528d7ce49a2e5225687fb5ad08ea8" dependencies = [ + "async-channel", + "bytes", "crossbeam-channel", "futures-util", "histogram", @@ -4206,6 +4638,8 @@ dependencies = [ "percentage", "pkcs8", "quinn", + "quinn-proto", + "quinn-udp", "rand 0.7.3", "rcgen", "rustls 0.20.8", @@ -4217,16 +4651,56 @@ dependencies = [ "x509-parser", ] +[[package]] +name = "solana-thin-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8af1069859646695b53b88cf071ba3c2ce49f0fbe9b19014440676e1869704f5" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bc57c809b5ee98570bd0981c3ecce339d4053f8473ab2d57a9487ad3aea5af" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 1.9.3", + "indicatif", + "log", + "rand 0.7.3", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + [[package]] name = "solana-transaction-status" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9287c2199bd71b577641f00d1e4023e4908f59050a83fb14a1fd19327537d289" +checksum = "f225ca544e1005918608bfe67f97c1cfdfe43bb6ab41e0bd77491258a7e5e8f8" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.4", "bincode", - "borsh 0.9.3", + "borsh 0.10.3", "bs58", "lazy_static", "log", @@ -4234,10 +4708,8 @@ dependencies = [ "serde_derive", "serde_json", "solana-account-decoder", - "solana-measure", - "solana-metrics", + "solana-address-lookup-table-program", "solana-sdk", - "solana-vote-program", "spl-associated-token-account", "spl-memo", "spl-token", @@ -4245,11 +4717,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "solana-udp-client" +version = "1.16.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1dbf725b5e31863f34553c1333e8d8e098c6259bbed433630022aa59e9a175" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + [[package]] name = "solana-version" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0312c45b6b94e220c5cc9ec1de4fa0fedf21c33ccb17d932ff6191ac237f405" +checksum = "cc8ac5da4f0044a857cb35bf0a146e76400541fce72f0638b9377fd368cf2da0" dependencies = [ "log", "rustc_version", @@ -4263,13 +4750,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93db350f670ad166107e4a241a1e9f1deff65fc17402900b443275e2fd8834c" +checksum = "ee3c171647345a050eaf80846d99f888c55c2bcbdd0297dfae38597950ca6054" dependencies = [ "bincode", "log", - "num-derive", + "num-derive 0.3.3", "num-traits", "rustc_version", "serde", @@ -4277,6 +4764,7 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-metrics", + "solana-program", "solana-program-runtime", "solana-sdk", "thiserror", @@ -4284,22 +4772,21 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.13.3" +version = "1.16.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a148ec781994129fea0ede0628131a8f78bc1aaa28fd7d14d72aacdd065c1" +checksum = "b8d5a0aa72c38c45b134e6fc008569fe1b0882c7cff5fceb7e42c0406925d3e5" dependencies = [ "aes-gcm-siv", - "arrayref", - "base64 0.13.1", + "base64 0.21.4", "bincode", "bytemuck", "byteorder", - "cipher 0.4.4", "curve25519-dalek", "getrandom 0.1.16", + "itertools", "lazy_static", "merlin", - "num-derive", + "num-derive 0.3.3", "num-traits", "rand 0.7.3", "serde", @@ -4312,6 +4799,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "solana_rbpf" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17d4ba1e58947346e360fabde0697029d36ba83c42f669199b16a8931313cf29" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + [[package]] name = "spin" version = "0.5.2" @@ -4330,13 +4836,13 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "1.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16a33ecc83137583902c3e13c02f34151c8b2f2b74120f9c2b3ff841953e083d" +checksum = "385e31c29981488f2820b2022d8e731aae3b02e6e18e2fd854e4c9a94dc44fc3" dependencies = [ "assert_matches", - "borsh 0.9.3", - "num-derive", + "borsh 0.10.3", + "num-derive 0.4.2", "num-traits", "solana-program", "spl-token", @@ -4344,48 +4850,182 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote 1.0.31", + "spl-discriminator-syn", + "syn 2.0.32", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "sha2 0.10.7", + "syn 2.0.32", + "thiserror", +] + [[package]] name = "spl-memo" -version = "3.0.1" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ + "num-derive 0.4.2", + "num-traits", "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "sha2 0.10.7", + "syn 2.0.32", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] name = "spl-token" -version = "3.5.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", - "num_enum", + "num_enum 0.6.1", "solana-program", "thiserror", ] [[package]] name = "spl-token-2022" -version = "0.4.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a97cbf60b91b610c846ccf8eecca96d92a24a19ffbf9fe06cd0c84e76ec45e" +checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", - "num_enum", + "num_enum 0.7.2", "solana-program", "solana-zk-token-sdk", "spl-memo", + "spl-pod", "spl-token", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", "thiserror", ] +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + [[package]] name = "strsim" version = "0.8.0" @@ -4450,9 +5090,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.26" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c3457aacde3c65315de5031ec191ce46604304d2446e803d71ade03308d970" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", @@ -4509,6 +5149,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "textwrap" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" + [[package]] name = "thiserror" version = "1.0.43" @@ -4526,7 +5172,7 @@ checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -4649,7 +5295,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -4782,7 +5428,7 @@ dependencies = [ "pin-project", "prost", "rustls 0.21.7", - "rustls-pemfile 1.0.3", + "rustls-pemfile", "tokio", "tokio-rustls 0.24.1", "tokio-stream", @@ -4802,7 +5448,7 @@ dependencies = [ "proc-macro2 1.0.66", "prost-build", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -4876,7 +5522,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -5042,6 +5688,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "untrusted" version = "0.7.1" @@ -5103,7 +5758,7 @@ dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", "regex", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] @@ -5146,6 +5801,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "walkdir" version = "2.3.3" @@ -5204,7 +5865,7 @@ dependencies = [ "once_cell", "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", "wasm-bindgen-shared", ] @@ -5238,7 +5899,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5329,6 +5990,21 @@ dependencies = [ "windows-targets 0.48.1", ] +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -5512,21 +6188,32 @@ dependencies = [ ] [[package]] -name = "yaml-rust" -version = "0.4.5" +name = "yasna" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ - "linked-hash-map", + "time 0.3.23", ] [[package]] -name = "yasna" -version = "0.5.2" +name = "zerocopy" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ - "time 0.3.23", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2 1.0.66", + "quote 1.0.31", + "syn 2.0.32", ] [[package]] @@ -5546,7 +6233,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2 1.0.66", "quote 1.0.31", - "syn 2.0.26", + "syn 2.0.32", ] [[package]] diff --git a/hermes/Cargo.toml b/hermes/Cargo.toml index 13f7f864b6..18a3d9b270 100644 --- a/hermes/Cargo.toml +++ b/hermes/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hermes" -version = "0.5.2" +version = "0.5.3" description = "Hermes is an agent that provides Verified Prices from the Pythnet Pyth Oracle." edition = "2021" @@ -30,6 +30,7 @@ nonzero_ext = { version = "0.3.0" } prometheus-client = { version = "0.21.2" } prost = { version = "0.12.1" } pyth-sdk = { version = "0.8.0" } +pyth-sdk-solana = { version = "0.9.0" } pythnet-sdk = { path = "../pythnet/pythnet_sdk/", version = "2.0.0", features = ["strum"] } rand = { version = "0.8.5" } reqwest = { version = "0.11.14", features = ["blocking", "json"] } @@ -50,9 +51,9 @@ utoipa-swagger-ui = { version = "3.1.4", features = ["axum"] } wormhole-sdk = { git = "https://github.com/wormhole-foundation/wormhole", tag = "v2.17.1" } # We are bound to this Solana version in order to match pyth-oracle. -solana-client = { version = "=1.13.3" } -solana-sdk = { version = "=1.13.3" } -solana-account-decoder = { version = "=1.13.3" } +solana-client = { version = "=1.16.19" } +solana-sdk = { version = "=1.16.19" } +solana-account-decoder = { version = "=1.16.19" } [build-dependencies] diff --git a/hermes/src/aggregate.rs b/hermes/src/aggregate.rs index cd56b2e9bd..256bd73308 100644 --- a/hermes/src/aggregate.rs +++ b/hermes/src/aggregate.rs @@ -431,6 +431,7 @@ where pub async fn is_ready(state: &State) -> bool { let metadata = state.aggregate_state.read().await; + let price_feeds_metadata = state.price_feeds_metadata.read().await; let has_completed_recently = match metadata.latest_completed_update_at.as_ref() { Some(latest_completed_update_time) => { @@ -449,7 +450,9 @@ pub async fn is_ready(state: &State) -> bool { _ => false, }; - has_completed_recently && is_not_behind + let is_metadata_loaded = !price_feeds_metadata.is_empty(); + + has_completed_recently && is_not_behind && is_metadata_loaded } #[cfg(test)] diff --git a/hermes/src/api.rs b/hermes/src/api.rs index 27ff52a2c3..90cc6081bd 100644 --- a/hermes/src/api.rs +++ b/hermes/src/api.rs @@ -123,6 +123,7 @@ pub async fn run(opts: RunOptions, state: ApiState) -> Result<()> { rest::price_feed_ids, rest::latest_price_updates, rest::timestamp_price_updates, + rest::price_feeds_metadata, ), components( schemas( @@ -139,6 +140,8 @@ pub async fn run(opts: RunOptions, state: ApiState) -> Result<()> { types::BinaryPriceUpdate, types::ParsedPriceUpdate, types::RpcPriceFeedMetadataV2, + types::PriceFeedMetadata, + types::AssetType ) ), tags( @@ -164,6 +167,7 @@ pub async fn run(opts: RunOptions, state: ApiState) -> Result<()> { "/v2/updates/price/:publish_time", get(rest::timestamp_price_updates), ) + .route("/v2/price_feeds", get(rest::price_feeds_metadata)) .route("/live", get(rest::live)) .route("/ready", get(rest::ready)) .route("/ws", get(ws::ws_route_handler)) diff --git a/hermes/src/api/rest.rs b/hermes/src/api/rest.rs index def245bc31..38133ba991 100644 --- a/hermes/src/api/rest.rs +++ b/hermes/src/api/rest.rs @@ -33,6 +33,7 @@ pub use { ready::*, v2::{ latest_price_updates::*, + price_feeds_metadata::*, timestamp_price_updates::*, }, }; @@ -43,6 +44,7 @@ pub enum RestError { CcipUpdateDataNotFound, InvalidCCIPInput, PriceIdsNotFound { missing_ids: Vec }, + RpcConnectionError { message: String }, } impl IntoResponse for RestError { @@ -80,6 +82,9 @@ impl IntoResponse for RestError { ) .into_response() } + RestError::RpcConnectionError { message } => { + (StatusCode::INTERNAL_SERVER_ERROR, message).into_response() + } } } } diff --git a/hermes/src/api/rest/index.rs b/hermes/src/api/rest/index.rs index 8b985803ba..f9dcdf1bc7 100644 --- a/hermes/src/api/rest/index.rs +++ b/hermes/src/api/rest/index.rs @@ -18,5 +18,6 @@ pub async fn index() -> impl IntoResponse { "/api/get_vaa_ccip?data=<0x+>", "/v2/updates/price/latest?ids[]=&ids[]=&..(&encoding=hex|base64)(&parsed=false)", "/v2/updates/price/?ids[]=&ids[]=&..(&encoding=hex|base64)(&parsed=false)", + "/v2/price_feeds?(query=btc)(&asset_type=crypto|equity|fx|metal|rates)", ]) } diff --git a/hermes/src/api/rest/v2/mod.rs b/hermes/src/api/rest/v2/mod.rs index 24ef531e3f..b8102741fa 100644 --- a/hermes/src/api/rest/v2/mod.rs +++ b/hermes/src/api/rest/v2/mod.rs @@ -1,2 +1,3 @@ pub mod latest_price_updates; +pub mod price_feeds_metadata; pub mod timestamp_price_updates; diff --git a/hermes/src/api/rest/v2/price_feeds_metadata.rs b/hermes/src/api/rest/v2/price_feeds_metadata.rs new file mode 100644 index 0000000000..1a255f00af --- /dev/null +++ b/hermes/src/api/rest/v2/price_feeds_metadata.rs @@ -0,0 +1,64 @@ +use { + crate::{ + api::{ + rest::RestError, + types::{ + AssetType, + PriceFeedMetadata, + }, + }, + price_feeds_metadata::get_price_feeds_metadata, + }, + anyhow::Result, + axum::{ + extract::State, + Json, + }, + serde::Deserialize, + serde_qs::axum::QsQuery, + utoipa::IntoParams, +}; + + +#[derive(Debug, Deserialize, IntoParams)] +#[into_params(parameter_in=Query)] +pub struct PriceFeedsMetadataQueryParams { + /// Optional query parameter. If provided, the results will be filtered to all price feeds whose symbol contains the query string. Query string is case insensitive. + #[param(example = "bitcoin")] + query: Option, + + /// Optional query parameter. If provided, the results will be filtered by asset type. Possible values are crypto, equity, fx, metal, rates. Filter string is case insensitive. + #[param(example = "crypto")] + asset_type: Option, +} + +/// Get the set of price feeds. +/// +/// This endpoint fetches all price feeds from the Pyth network. It can be filtered by asset type +/// and query string. +#[utoipa::path( + get, + path = "/v2/price_feeds", + responses( + (status = 200, description = "Price feeds metadata retrieved successfully", body = Vec) + ), + params( + PriceFeedsMetadataQueryParams + ) +)] +pub async fn price_feeds_metadata( + State(state): State, + QsQuery(params): QsQuery, +) -> Result>, RestError> { + let price_feeds_metadata = + get_price_feeds_metadata(&*state.state, params.query, params.asset_type) + .await + .map_err(|e| { + tracing::warn!("RPC connection error: {}", e); + RestError::RpcConnectionError { + message: format!("RPC connection error: {}", e), + } + })?; + + Ok(Json(price_feeds_metadata)) +} diff --git a/hermes/src/api/types.rs b/hermes/src/api/types.rs index 6f86ed52b3..53a0d08543 100644 --- a/hermes/src/api/types.rs +++ b/hermes/src/api/types.rs @@ -28,6 +28,14 @@ use { Deserialize, Serialize, }, + std::{ + collections::BTreeMap, + fmt::{ + Display, + Formatter, + Result as FmtResult, + }, + }, utoipa::ToSchema, wormhole_sdk::Chain, }; @@ -52,7 +60,7 @@ impl From for PriceIdentifier { type Base64String = String; -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct RpcPriceFeedMetadata { #[schema(value_type = Option, example=85480034)] pub slot: Option, @@ -64,7 +72,7 @@ pub struct RpcPriceFeedMetadata { pub prev_publish_time: Option, } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct RpcPriceFeedMetadataV2 { #[schema(value_type = Option, example=85480034)] pub slot: Option, @@ -74,7 +82,7 @@ pub struct RpcPriceFeedMetadataV2 { pub prev_publish_time: Option, } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct RpcPriceFeed { pub id: RpcPriceIdentifier, pub price: RpcPrice, @@ -142,8 +150,8 @@ impl RpcPriceFeed { Eq, BorshSerialize, BorshDeserialize, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, ToSchema, )] pub struct RpcPrice { @@ -178,8 +186,8 @@ pub struct RpcPrice { Hash, BorshSerialize, BorshDeserialize, - serde::Serialize, - serde::Deserialize, + Serialize, + Deserialize, ToSchema, )] #[repr(C)] @@ -204,7 +212,7 @@ impl From for RpcPriceIdentifier { } } -#[derive(Clone, Copy, Debug, Default, serde::Deserialize, serde::Serialize, ToSchema)] +#[derive(Clone, Copy, Debug, Default, Deserialize, Serialize, ToSchema)] pub enum EncodingType { #[default] #[serde(rename = "hex")] @@ -222,13 +230,13 @@ impl EncodingType { } } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct BinaryPriceUpdate { pub encoding: EncodingType, pub data: Vec, } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct ParsedPriceUpdate { pub id: RpcPriceIdentifier, pub price: RpcPrice, @@ -263,7 +271,7 @@ impl From for ParsedPriceUpdate { } } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct PriceUpdate { pub binary: BinaryPriceUpdate, #[serde(skip_serializing_if = "Option::is_none")] @@ -316,3 +324,27 @@ impl TryFrom for PriceFeedsWithUpdateData { }) } } + +#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] +pub struct PriceFeedMetadata { + pub id: PriceIdentifier, + // BTreeMap is used to automatically sort the keys to ensure consistent ordering of attributes in the JSON response. + // This enhances user experience by providing a predictable structure, avoiding confusion from varying orders in different responses. + pub attributes: BTreeMap, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, ToSchema)] +#[serde(rename_all = "lowercase")] +pub enum AssetType { + Crypto, + FX, + Equity, + Metals, + Rates, +} + +impl Display for AssetType { + fn fmt(&self, f: &mut Formatter) -> FmtResult { + write!(f, "{:?}", self) + } +} diff --git a/hermes/src/config/pythnet.rs b/hermes/src/config/pythnet.rs index 0519093de1..5e5a0d50a5 100644 --- a/hermes/src/config/pythnet.rs +++ b/hermes/src/config/pythnet.rs @@ -1,4 +1,9 @@ -use clap::Args; +use { + clap::Args, + solana_sdk::pubkey::Pubkey, +}; + +const DEFAULT_PYTHNET_MAPPING_ADDR: &str = "AHtgzX45WTKfkPG53L6WYhGEXwQkN1BVknET3sVsLL8J"; #[derive(Args, Clone, Debug)] #[command(next_help_heading = "Pythnet Options")] @@ -13,4 +18,10 @@ pub struct Options { #[arg(long = "pythnet-http-addr")] #[arg(env = "PYTHNET_HTTP_ADDR")] pub http_addr: String, + + /// Pyth mapping account address. + #[arg(long = "mapping-address")] + #[arg(default_value = DEFAULT_PYTHNET_MAPPING_ADDR)] + #[arg(env = "MAPPING_ADDRESS")] + pub mapping_addr: Pubkey, } diff --git a/hermes/src/main.rs b/hermes/src/main.rs index 5add32264d..20ad446af4 100644 --- a/hermes/src/main.rs +++ b/hermes/src/main.rs @@ -21,6 +21,7 @@ mod api; mod config; mod metrics_server; mod network; +mod price_feeds_metadata; mod serde; mod state; diff --git a/hermes/src/network/pythnet.rs b/hermes/src/network/pythnet.rs index 005a2c7c9c..c1012933e3 100644 --- a/hermes/src/network/pythnet.rs +++ b/hermes/src/network/pythnet.rs @@ -1,6 +1,6 @@ //! This module connects to the Pythnet RPC server and listens for accumulator //! updates. It then sends the updates to the store module for processing and -//! storage. +//! storage. It also periodically fetches and stores the latest price feeds metadata. use { crate::{ @@ -8,6 +8,7 @@ use { AccumulatorMessages, Update, }, + api::types::PriceFeedMetadata, config::RunOptions, network::wormhole::{ update_guardian_set, @@ -15,6 +16,10 @@ use { GuardianSet, GuardianSetData, }, + price_feeds_metadata::{ + store_price_feeds_metadata, + DEFAULT_PRICE_FEEDS_CACHE_UPDATE_INTERVAL, + }, state::State, }, anyhow::{ @@ -23,6 +28,11 @@ use { }, borsh::BorshDeserialize, futures::stream::StreamExt, + pyth_sdk::PriceIdentifier, + pyth_sdk_solana::state::{ + load_mapping_account, + load_product_account, + }, solana_account_decoder::UiAccountEncoding, solana_client::{ nonblocking::{ @@ -41,11 +51,13 @@ use { }, solana_sdk::{ account::Account, + bs58, commitment_config::CommitmentConfig, pubkey::Pubkey, system_program, }, std::{ + collections::BTreeMap, sync::{ atomic::Ordering, Arc, @@ -136,11 +148,10 @@ pub async fn run(store: Arc, pythnet_ws_endpoint: String) -> Result<()> { encoding: Some(UiAccountEncoding::Base64Zstd), ..Default::default() }, - filters: Some(vec![RpcFilterType::Memcmp(Memcmp { - offset: 0, - bytes: MemcmpEncodedBytes::Bytes(b"PAS1".to_vec()), - encoding: None, - })]), + filters: Some(vec![RpcFilterType::Memcmp(Memcmp::new( + 0, // offset + MemcmpEncodedBytes::Bytes(b"PAS1".to_vec()), // bytes + ))]), with_context: Some(true), }; @@ -257,6 +268,9 @@ async fn fetch_existing_guardian_sets( pub async fn spawn(opts: RunOptions, state: Arc) -> Result<()> { tracing::info!(endpoint = opts.pythnet.ws_addr, "Started Pythnet Listener."); + // Create RpcClient instance here + let rpc_client = RpcClient::new(opts.pythnet.http_addr.clone()); + fetch_existing_guardian_sets( state.clone(), opts.pythnet.http_addr.clone(), @@ -284,7 +298,7 @@ pub async fn spawn(opts: RunOptions, state: Arc) -> Result<()> { }) }; - let task_guadian_watcher = { + let task_guardian_watcher = { let store = state.clone(); let pythnet_http_endpoint = opts.pythnet.http_addr.clone(); tokio::spawn(async move { @@ -317,6 +331,117 @@ pub async fn spawn(opts: RunOptions, state: Arc) -> Result<()> { }) }; - let _ = tokio::join!(task_listener, task_guadian_watcher); + + let task_price_feeds_metadata_updater = { + let price_feeds_state = state.clone(); + tokio::spawn(async move { + while !crate::SHOULD_EXIT.load(Ordering::Acquire) { + if let Err(e) = fetch_and_store_price_feeds_metadata( + price_feeds_state.as_ref(), + &opts.pythnet.mapping_addr, + &rpc_client, + ) + .await + { + tracing::error!("Error in fetching and storing price feeds metadata: {}", e); + } + // This loop with a sleep interval of 1 second allows the task to check for an exit signal at a + // fine-grained interval. Instead of sleeping directly for the entire `price_feeds_update_interval`, + // which could delay the response to an exit signal, this approach ensures the task can exit promptly + // if `crate::SHOULD_EXIT` is set, enhancing the responsiveness of the service to shutdown requests. + for _ in 0..DEFAULT_PRICE_FEEDS_CACHE_UPDATE_INTERVAL { + if crate::SHOULD_EXIT.load(Ordering::Acquire) { + break; + } + tokio::time::sleep(Duration::from_secs(1)).await; + } + } + }) + }; + + let _ = tokio::join!( + task_listener, + task_guardian_watcher, + task_price_feeds_metadata_updater + ); Ok(()) } + + +pub async fn fetch_and_store_price_feeds_metadata( + state: &State, + mapping_address: &Pubkey, + rpc_client: &RpcClient, +) -> Result> { + let price_feeds_metadata = fetch_price_feeds_metadata(&mapping_address, &rpc_client).await?; + store_price_feeds_metadata(&state, &price_feeds_metadata).await?; + Ok(price_feeds_metadata) +} + +async fn fetch_price_feeds_metadata( + mapping_address: &Pubkey, + rpc_client: &RpcClient, +) -> Result> { + let mut price_feeds_metadata = Vec::::new(); + let mapping_data = rpc_client.get_account_data(mapping_address).await?; + let mapping_acct = load_mapping_account(&mapping_data)?; + + // Split product keys into chunks of 150 to avoid too many open files error (error trying to connect: tcp open error: Too many open files (os error 24)) + for product_keys_chunk in mapping_acct + .products + .iter() + .filter(|&prod_pkey| *prod_pkey != Pubkey::default()) + .collect::>() + .chunks(150) + { + // Prepare a list of futures for fetching product account data for each chunk + let fetch_product_data_futures = product_keys_chunk + .iter() + .map(|prod_pkey| rpc_client.get_account_data(prod_pkey)) + .collect::>(); + + // Await all futures concurrently within the chunk + let products_data_results = futures::future::join_all(fetch_product_data_futures).await; + + for prod_data_result in products_data_results { + match prod_data_result { + Ok(prod_data) => { + let prod_acct = match load_product_account(&prod_data) { + Ok(prod_acct) => prod_acct, + Err(e) => { + println!("Error loading product account: {}", e); + continue; + } + }; + + // TODO: Add stricter type checking for attributes + let attributes = prod_acct + .iter() + .filter(|(key, _)| !key.is_empty()) + .map(|(key, val)| (key.to_string(), val.to_string())) + .collect::>(); + + if prod_acct.px_acc != Pubkey::default() { + let px_pkey = prod_acct.px_acc; + let px_pkey_bytes = bs58::decode(&px_pkey.to_string()).into_vec()?; + let px_pkey_array: [u8; 32] = px_pkey_bytes + .try_into() + .expect("Invalid length for PriceIdentifier"); + + let price_feed_metadata = PriceFeedMetadata { + id: PriceIdentifier::new(px_pkey_array), + attributes, + }; + + price_feeds_metadata.push(price_feed_metadata); + } + } + Err(e) => { + println!("Error loading product account: {}", e); + continue; + } + } + } + } + Ok(price_feeds_metadata) +} diff --git a/hermes/src/price_feeds_metadata.rs b/hermes/src/price_feeds_metadata.rs new file mode 100644 index 0000000000..6ba95b7ae0 --- /dev/null +++ b/hermes/src/price_feeds_metadata.rs @@ -0,0 +1,55 @@ +use { + crate::{ + api::types::{ + AssetType, + PriceFeedMetadata, + }, + state::State, + }, + anyhow::Result, +}; + +pub const DEFAULT_PRICE_FEEDS_CACHE_UPDATE_INTERVAL: u16 = 600; + +pub async fn retrieve_price_feeds_metadata(state: &State) -> Result> { + let price_feeds_metadata = state.price_feeds_metadata.read().await; + Ok(price_feeds_metadata.clone()) +} + +pub async fn store_price_feeds_metadata( + state: &State, + price_feeds_metadata: &[PriceFeedMetadata], +) -> Result<()> { + let mut price_feeds_metadata_write_guard = state.price_feeds_metadata.write().await; + *price_feeds_metadata_write_guard = price_feeds_metadata.to_vec(); + Ok(()) +} + + +pub async fn get_price_feeds_metadata( + state: &State, + query: Option, + asset_type: Option, +) -> Result> { + let mut price_feeds_metadata = retrieve_price_feeds_metadata(state).await?; + + // Filter by query if provided + if let Some(query_str) = &query { + price_feeds_metadata.retain(|feed| { + feed.attributes.get("symbol").map_or(false, |symbol| { + symbol.to_lowercase().contains(&query_str.to_lowercase()) + }) + }); + } + + // Filter by asset_type if provided + if let Some(asset_type) = &asset_type { + price_feeds_metadata.retain(|feed| { + feed.attributes.get("asset_type").map_or(false, |type_str| { + type_str.to_lowercase() == asset_type.to_string().to_lowercase() + }) + }); + } + + Ok(price_feeds_metadata) +} diff --git a/hermes/src/state.rs b/hermes/src/state.rs index 0b35c5a54e..b117279e24 100644 --- a/hermes/src/state.rs +++ b/hermes/src/state.rs @@ -7,6 +7,7 @@ use { AggregateState, AggregationEvent, }, + api::types::PriceFeedMetadata, network::wormhole::GuardianSet, }, prometheus_client::registry::Registry, @@ -50,6 +51,9 @@ pub struct State { /// Metrics registry pub metrics_registry: RwLock, + + /// Price feeds metadata + pub price_feeds_metadata: RwLock>, } impl State { @@ -67,6 +71,7 @@ impl State { aggregate_state: RwLock::new(AggregateState::new(&mut metrics_registry)), benchmarks_endpoint, metrics_registry: RwLock::new(metrics_registry), + price_feeds_metadata: RwLock::new(Default::default()), }) } }