From d3cf289d912b27b858f1f73c818ed8868520555c Mon Sep 17 00:00:00 2001 From: swimricky Date: Sat, 29 Apr 2023 16:31:53 -0700 Subject: [PATCH 01/12] test(message-buffer): add rust integration tests add rust-toolchain.toml to pin rust version, add integration tests, update cpi caller auth seeds --- .pre-commit-config.yaml | 2 +- pythnet/message_buffer/Cargo.lock | 7032 +++++++++++++++-- .../src/instructions/resize_buffer.rs | 13 +- .../programs/message_buffer/src/lib.rs | 88 +- .../message_buffer/src/state/whitelist.rs | 2 + .../programs/mock-cpi-caller/Cargo.toml | 9 + .../src/instructions/add_price.rs | 16 +- .../src/instructions/cpi_max_test.rs | 2 +- .../mock-cpi-caller/src/instructions/mod.rs | 2 +- .../src/instructions/update_price.rs | 32 +- .../mock-cpi-caller/src/message/price.rs | 4 +- .../mock-cpi-caller/tests/program_test/mod.rs | 552 ++ .../mock-cpi-caller/tests/test_all.rs | 582 ++ pythnet/message_buffer/rust-toolchain.toml | 2 + .../message_buffer/tests/message_buffer.ts | 71 +- 15 files changed, 7690 insertions(+), 719 deletions(-) create mode 100644 pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs create mode 100644 pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs create mode 100644 pythnet/message_buffer/rust-toolchain.toml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ec14b2009a..b5ce1ea624 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -75,7 +75,7 @@ repos: - id: cargo-clippy-message-buffer name: Cargo clippy for message buffer contract language: "rust" - entry: cargo +nightly clippy --manifest-path ./pythnet/message_buffer/Cargo.toml --tests --fix --allow-dirty --allow-staged -- -D warnings + entry: cargo +nightly clippy --manifest-path ./pythnet/message_buffer/Cargo.toml --tests --fix --allow-dirty --allow-staged --features test-bpf -- -D warnings pass_filenames: false files: message_buffer # Hooks for solana receiver contract diff --git a/pythnet/message_buffer/Cargo.lock b/pythnet/message_buffer/Cargo.lock index e8804e3ef3..66b80c2abe 100644 --- a/pythnet/message_buffer/Cargo.lock +++ b/pythnet/message_buffer/Cargo.lock @@ -2,6 +2,58 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if 1.0.0", + "cipher 0.3.0", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +dependencies = [ + "aead", + "aes", + "cipher 0.3.0", + "ctr", + "polyval", + "subtle", + "zeroize", +] + [[package]] name = "ahash" version = "0.7.6" @@ -22,6 +74,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "anchor-attribute-access-control" version = "0.27.0" @@ -30,8 +103,8 @@ checksum = "2d5e1a413b311b039d29b61d0dbb401c9dbf04f792497ceca87593454bf6d7dd" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "regex", "syn 1.0.109", ] @@ -45,8 +118,8 @@ dependencies = [ "anchor-syn", "anyhow", "bs58 0.4.0", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "rustversion", "syn 1.0.109", ] @@ -58,7 +131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "788e44f9e8501dabeb6f9229da0f3268fb2ae3208912608ffaa056a72031296f" dependencies = [ "anchor-syn", - "proc-macro2", + "proc-macro2 1.0.52", "syn 1.0.109", ] @@ -69,8 +142,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea0c4d8c7e4a2605ede6fcdced9690288b2f74e24768619a85229d57e597bc97" dependencies = [ "anchor-syn", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -82,8 +155,8 @@ checksum = "7a3b07d5c5d87b5edc72428b447b8e9ee1143b83dd1afc6a6b1d352c6a6164d8" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -95,8 +168,8 @@ checksum = "b22ad0445115dbea5869b1d062da49ae125abed9132fc20c33227f25e42dfa6b" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -108,8 +181,8 @@ checksum = "48daeff6781ba2f02961b0ad211feb9a2de75af345d42c62b1a252fd4dfb0724" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -119,8 +192,8 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4fe2886f92c4f33ec1b2b8b2b43ca1b9070cf4929e63c7eaaa09a9f2c0d5123" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -155,9 +228,9 @@ checksum = "11cb31fe143aedb36fc41409ea072aa0b840cbea727e62eb2ff6e7b6cea036ff" dependencies = [ "anyhow", "bs58 0.3.1", - "heck", - "proc-macro2", - "quote", + "heck 0.3.3", + "proc-macro2 1.0.52", + "quote 1.0.26", "serde", "serde_json", "sha2 0.9.9", @@ -165,12 +238,36 @@ dependencies = [ "thiserror", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "anyhow" version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "ark-bn254" version = "0.3.0" @@ -207,7 +304,7 @@ dependencies = [ "ark-serialize", "ark-std", "derivative", - "num-bigint", + "num-bigint 0.4.3", "num-traits", "paste", "rustc_version 0.3.3", @@ -220,7 +317,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" dependencies = [ - "quote", + "quote 1.0.26", "syn 1.0.109", ] @@ -230,9 +327,9 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.3", "num-traits", - "quote", + "quote 1.0.26", "syn 1.0.109", ] @@ -274,12 +371,198 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.20", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "async-compression" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +dependencies = [ + "brotli", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "async-mutex" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +dependencies = [ + "event-listener", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "async-trait" +version = "0.1.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi 0.3.9", +] + [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "autotools" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8da1805e028a172334c3b680f93e71126f2327622faef2ec3d893c0a4ad77" +dependencies = [ + "cc", +] + +[[package]] +name = "axum" +version = "0.6.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b70caf9f1b0c045f7da350636435b775a9733adf2df56e8aa2a29210fbc335d4" +dependencies = [ + "async-trait", + "axum-core", + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding 2.2.0", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.8", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + [[package]] name = "base64" version = "0.12.3" @@ -292,6 +575,18 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bincode" version = "1.3.3" @@ -301,6 +596,26 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2 1.0.52", + "quote 1.0.26", + "regex", + "rustc-hash", + "shlex", + "syn 1.0.109", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -325,7 +640,7 @@ dependencies = [ "arrayref", "arrayvec", "cc", - "cfg-if", + "cfg-if 1.0.0", "constant_time_eq", "digest 0.10.6", ] @@ -373,8 +688,8 @@ checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", - "proc-macro-crate", - "proc-macro2", + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.52", "syn 1.0.109", ] @@ -384,8 +699,8 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -395,11 +710,32 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bs58" version = "0.3.1" @@ -412,6 +748,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bstr" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d4260bcc2e8fc9df1eac4919a720effeb63a3f0952f5bf4944adfa18897f09" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -443,8 +789,8 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", ] @@ -454,6 +800,43 @@ version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + [[package]] name = "cc" version = "1.0.79" @@ -463,6 +846,21 @@ dependencies = [ "jobserver", ] +[[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 = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -470,1126 +868,6157 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "console_error_panic_hook" -version = "0.1.7" +name = "chrono" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ - "cfg-if", + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "serde", + "time 0.1.45", "wasm-bindgen", + "winapi 0.3.9", ] [[package]] -name = "console_log" +name = "chrono-humanize" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +checksum = "32dce1ea1988dbdf9f9815ff11425828523bd2a134ec0805d2ac8af26ee6096e" dependencies = [ - "log", - "web-sys", + "chrono", ] [[package]] -name = "constant_time_eq" -version = "0.2.5" +name = "cipher" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] [[package]] -name = "cpufeatures" -version = "0.2.5" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "libc", + "crypto-common", + "inout", ] [[package]] -name = "crossbeam-channel" -version = "0.5.7" +name = "clang-sys" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" +checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ - "cfg-if", - "crossbeam-utils", + "glob", + "libc", + "libloading", ] [[package]] -name = "crossbeam-deque" -version = "0.8.3" +name = "clap" +version = "2.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", + "ansi_term", + "atty", + "bitflags", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.14" +name = "clap" +version = "3.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +checksum = "eef2b3ded6a26dfaec672a742c93c8cf6b689220324da509ec5caa20de55dc83" dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", + "atty", + "bitflags", + "clap_lex", + "indexmap", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.0", ] [[package]] -name = "crossbeam-utils" -version = "0.8.15" +name = "clap_lex" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" dependencies = [ - "cfg-if", + "os_str_bytes", ] [[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-common" -version = "0.1.6" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "generic-array", - "typenum", + "termcolor", + "unicode-width", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "combine" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" dependencies = [ - "generic-array", - "subtle", + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", ] [[package]] -name = "curve25519-dalek" -version = "3.2.1" +name = "console" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.42.0", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "console_error_panic_hook" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "cfg-if 1.0.0", + "wasm-bindgen", ] [[package]] -name = "digest" -version = "0.9.0" +name = "console_log" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" dependencies = [ - "generic-array", + "log", + "web-sys", ] [[package]] -name = "digest" -version = "0.10.6" +name = "const-oid" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common", - "subtle", -] +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] -name = "either" -version = "1.8.1" +name = "constant_time_eq" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" [[package]] -name = "feature-probe" -version = "0.1.1" +name = "convert_case" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] -name = "generic-array" -version = "0.14.6" +name = "core-foundation" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ - "serde", - "typenum", - "version_check", + "core-foundation-sys", + "libc", ] [[package]] -name = "getrandom" -version = "0.1.16" +name = "core-foundation-sys" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "core_affinity" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8a03115cc34fb0d7c321dd154a3914b3ca082ccc5c11d91bf7117dbbe7171f" dependencies = [ - "cfg-if", - "js-sys", + "kernel32-sys", "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", + "num_cpus", + "winapi 0.2.8", ] [[package]] -name = "getrandom" -version = "0.2.8" +name = "cpufeatures" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ - "cfg-if", - "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] -name = "hashbrown" -version = "0.11.2" +name = "crc32fast" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ - "ahash", + "cfg-if 1.0.0", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "crossbeam-channel" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c" dependencies = [ - "ahash", + "cfg-if 1.0.0", + "crossbeam-utils", ] [[package]] -name = "heck" -version = "0.3.3" +name = "crossbeam-deque" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ - "unicode-segmentation", + "cfg-if 1.0.0", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] -name = "hermit-abi" -version = "0.2.6" +name = "crossbeam-epoch" +version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ - "libc", + "autocfg", + "cfg-if 1.0.0", + "crossbeam-utils", + "memoffset 0.8.0", + "scopeguard", ] [[package]] -name = "hmac" -version = "0.8.1" +name = "crossbeam-utils" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ - "crypto-mac", - "digest 0.9.0", + "cfg-if 1.0.0", ] [[package]] -name = "hmac-drbg" -version = "0.3.0" +name = "crunchy" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac", -] +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] -name = "im" -version = "15.1.0" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "rayon", - "serde", - "sized-chunks", + "generic-array", "typenum", - "version_check", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "crypto-mac" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "either", + "generic-array", + "subtle", ] [[package]] -name = "itoa" -version = "1.0.6" +name = "ctr" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher 0.3.0", +] [[package]] -name = "jobserver" -version = "0.1.26" +name = "curve25519-dalek" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" dependencies = [ - "libc", + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", ] [[package]] -name = "js-sys" -version = "0.3.61" +name = "cxx" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" dependencies = [ - "wasm-bindgen", + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", ] [[package]] -name = "keccak" -version = "0.1.3" +name = "cxx-build" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" dependencies = [ - "cpufeatures", + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2 1.0.52", + "quote 1.0.26", + "scratch", + "syn 2.0.12", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "cxxbridge-flags" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" [[package]] -name = "libc" -version = "0.2.140" +name = "cxxbridge-macro" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] [[package]] -name = "libsecp256k1" -version = "0.6.0" +name = "darling" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "typenum", + "darling_core", + "darling_macro", ] [[package]] -name = "libsecp256k1-core" -version = "0.2.2" +name = "darling_core" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", + "fnv", + "ident_case", + "proc-macro2 1.0.52", + "quote 1.0.26", + "strsim 0.10.0", + "syn 1.0.109", ] [[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" +name = "darling_macro" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" dependencies = [ - "libsecp256k1-core", + "darling_core", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" +name = "dashmap" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" dependencies = [ - "libsecp256k1-core", + "cfg-if 1.0.0", + "num_cpus", + "rayon", ] [[package]] -name = "lock_api" -version = "0.4.9" +name = "data-encoding" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" dependencies = [ - "autocfg", - "scopeguard", + "const-oid", ] [[package]] -name = "log" -version = "0.4.17" +name = "der-parser" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "cfg-if", + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.3", + "num-traits", + "rusticata-macros", ] [[package]] -name = "memchr" -version = "2.5.0" +name = "derivation-path" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" [[package]] -name = "memmap2" -version = "0.5.10" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "libc", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "memoffset" -version = "0.8.0" +name = "derive_more" +version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "autocfg", + "convert_case", + "proc-macro2 1.0.52", + "quote 1.0.26", + "rustc_version 0.4.0", + "syn 1.0.109", ] [[package]] -name = "message_buffer" -version = "0.1.0" +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" dependencies = [ - "anchor-lang", - "bytemuck", - "byteorder", + "console", + "shell-words", + "tempfile", + "zeroize", ] [[package]] -name = "mock-cpi-caller" -version = "0.1.0" +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "anchor-lang", - "bytemuck", - "message_buffer", + "generic-array", ] [[package]] -name = "num-bigint" -version = "0.4.3" +name = "digest" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "block-buffer 0.10.4", + "crypto-common", + "subtle", ] [[package]] -name = "num-derive" -version = "0.3.3" +name = "dir-diff" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +checksum = "2860407d7d7e2e004bb2128510ad9e8d669e76fa005ccf567977b5d71b8b4a0b" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "walkdir", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "dirs-next" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" dependencies = [ - "autocfg", - "num-traits", + "cfg-if 1.0.0", + "dirs-sys-next", ] [[package]] -name = "num-traits" -version = "0.2.15" +name = "dirs-sys-next" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ - "autocfg", + "libc", + "redox_users", + "winapi 0.3.9", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "displaydoc" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "dlopen" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" dependencies = [ - "hermit-abi", + "dlopen_derive", + "lazy_static", "libc", + "winapi 0.3.9", ] [[package]] -name = "once_cell" -version = "1.17.1" +name = "dlopen_derive" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +dependencies = [ + "libc", + "quote 0.6.13", + "syn 0.15.44", +] [[package]] -name = "opaque-debug" -version = "0.3.0" +name = "eager" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" [[package]] -name = "parking_lot" -version = "0.12.1" +name = "ed25519" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "lock_api", - "parking_lot_core", + "signature", ] [[package]] -name = "parking_lot_core" -version = "0.9.7" +name = "ed25519-dalek" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-sys", + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", ] [[package]] -name = "paste" -version = "1.0.12" +name = "ed25519-dalek-bip32" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.6", +] [[package]] -name = "pbkdf2" -version = "0.4.0" +name = "educe" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +checksum = "4af7804abe0786a9b69375115821fedc9995f21ab63ae285184b96b01ec50b1a" dependencies = [ - "crypto-mac", + "enum-ordinalize", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "pest" -version = "2.5.6" +name = "either" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cbd939b234e95d72bc393d51788aec68aeeb5d51e748ca08ff3aad58cb722f7" -dependencies = [ - "thiserror", - "ucd-trie", -] +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "encode_unicode" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] -name = "proc-macro-crate" -version = "0.1.5" +name = "encoding_rs" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ - "toml", + "cfg-if 1.0.0", ] [[package]] -name = "proc-macro2" -version = "1.0.52" +name = "enum-iterator" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +checksum = "706d9e7cf1c7664859d79cd524e4e53ea2b67ea03c98cc2870c5e539695d597e" dependencies = [ - "unicode-ident", + "enum-iterator-derive", ] [[package]] -name = "quote" -version = "1.0.26" +name = "enum-iterator-derive" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "355f93763ef7b0ae1c43c4d8eccc9d5848d84ad1a1d8ce61c421d1ac85a19d05" dependencies = [ - "proc-macro2", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "rand" -version = "0.7.3" +name = "enum-ordinalize" +version = "3.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "a62bb1df8b45ecb7ffa78dca1c17a438fb193eb083db0b1b494d2a61bcb5096a" dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", + "num-bigint 0.4.3", + "num-traits", + "proc-macro2 1.0.52", + "quote 1.0.26", + "rustc_version 0.4.0", + "syn 1.0.109", ] [[package]] -name = "rand" -version = "0.8.5" +name = "enum_dispatch" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" dependencies = [ - "rand_chacha 0.3.1", - "rand_core 0.6.4", + "once_cell", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "rand_chacha" -version = "0.2.2" +name = "env_logger" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", + "atty", + "humantime", + "log", + "regex", + "termcolor", ] [[package]] -name = "rand_chacha" +name = "errno" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", ] [[package]] -name = "rand_core" -version = "0.5.1" +name = "errno-dragonfly" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" dependencies = [ - "getrandom 0.1.16", + "cc", + "libc", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "etcd-client" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "c3bfae4cb9cd8c3c2a552d45e155cafd079f385a3b9421b9a010878f44531f1e" dependencies = [ - "getrandom 0.2.8", + "http", + "prost 0.9.0", + "tokio", + "tokio-stream", + "tonic 0.6.2", + "tonic-build 0.6.2", + "tower-service", ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "event-listener" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] -name = "rand_xoshiro" -version = "0.6.0" +name = "fast-math" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" dependencies = [ - "rand_core 0.6.4", + "ieee754", ] [[package]] -name = "rayon" -version = "1.7.0" +name = "fastrand" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ - "either", - "rayon-core", + "instant", ] [[package]] -name = "rayon-core" -version = "1.11.0" +name = "fd-lock" +version = "3.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "39ae6b3d9530211fb3b12a95374b8b0823be812f53d09e18c5675c0146b09642" dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", + "cfg-if 1.0.0", + "rustix", + "windows-sys 0.48.0", ] [[package]] -name = "redox_syscall" -version = "0.2.16" +name = "feature-probe" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags", -] +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" [[package]] -name = "regex" -version = "1.7.1" +name = "filetime" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.16", + "windows-sys 0.48.0", ] [[package]] -name = "regex-syntax" -version = "0.6.28" +name = "fixedbitset" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] -name = "rustc-hash" -version = "1.1.0" +name = "flate2" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +dependencies = [ + "crc32fast", + "miniz_oxide", +] [[package]] -name = "rustc_version" -version = "0.3.3" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "semver 0.11.0", + "foreign-types-shared", ] [[package]] -name = "rustc_version" -version = "0.4.0" +name = "foreign-types-shared" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "semver 1.0.17", + "percent-encoding 2.2.0", ] [[package]] -name = "rustversion" -version = "1.0.12" +name = "fs_extra" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" [[package]] -name = "ryu" -version = "1.0.13" +name = "futures" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-executor" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", + "num_cpus", +] + +[[package]] +name = "futures-io" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" + +[[package]] +name = "futures-macro" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures 0.1.31", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "goauth" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8af59a261bcf42f45d1b261232847b9b850ba0a1419d6100698246fb66e9240" +dependencies = [ + "arc-swap", + "futures 0.3.28", + "log", + "reqwest", + "serde", + "serde_derive", + "serde_json", + "simpl", + "smpl_jwt", + "time 0.3.20", + "tokio", +] + +[[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 = "h2" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util 0.7.2", + "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", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] + +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64 0.13.1", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "histogram" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-proxy" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca815a891b24fdfb243fa3239c86154392b0953ee584aa1a2a1f66d20cbe75cc" +dependencies = [ + "bytes", + "futures 0.3.28", + "headers", + "http", + "hyper", + "hyper-tls", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +dependencies = [ + "http", + "hyper", + "rustls 0.20.8", + "tokio", + "tokio-rustls 0.23.4", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + +[[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.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ieee754" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "index_list" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9d968042a4902e08810946fc7cd5851eb75e80301342305af755ca06cb82ce" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "rayon", +] + +[[package]] +name = "indicatif" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef509aa9bc73864d6756f0d34d35504af3cf0844373afe9b8669a5b8005a729" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + +[[package]] +name = "jsonrpc-client-transports" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b99d4207e2a04fb4581746903c2bb7eb376f88de9c699d0f3e10feeac0cd3a" +dependencies = [ + "derive_more", + "futures 0.3.28", + "jsonrpc-core", + "jsonrpc-pubsub", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "serde", + "serde_json", + "tokio", + "url 1.7.2", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures 0.3.28", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "jsonrpc-core-client" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51da17abecbdab3e3d4f26b01c5ec075e88d3abe3ab3b05dc9aa69392764ec0" +dependencies = [ + "futures 0.3.28", + "jsonrpc-client-transports", +] + +[[package]] +name = "jsonrpc-derive" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" +dependencies = [ + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "jsonrpc-http-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1dea6e07251d9ce6a552abfb5d7ad6bc290a4596c8dcc3d795fae2bbdc1f3ff" +dependencies = [ + "futures 0.3.28", + "hyper", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "net2", + "parking_lot 0.11.2", + "unicase", +] + +[[package]] +name = "jsonrpc-ipc-server" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382bb0206323ca7cda3dcd7e245cea86d37d02457a02a975e3378fb149a48845" +dependencies = [ + "futures 0.3.28", + "jsonrpc-core", + "jsonrpc-server-utils", + "log", + "parity-tokio-ipc", + "parking_lot 0.11.2", + "tower-service", +] + +[[package]] +name = "jsonrpc-pubsub" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240f87695e6c6f62fb37f05c02c04953cf68d6408b8c1c89de85c7a0125b1011" +dependencies = [ + "futures 0.3.28", + "jsonrpc-core", + "lazy_static", + "log", + "parking_lot 0.11.2", + "rand 0.7.3", + "serde", +] + +[[package]] +name = "jsonrpc-server-utils" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4fdea130485b572c39a460d50888beb00afb3e35de23ccd7fad8ff19f0e0d4" +dependencies = [ + "bytes", + "futures 0.3.28", + "globset", + "jsonrpc-core", + "lazy_static", + "log", + "tokio", + "tokio-stream", + "tokio-util 0.6.10", + "unicase", +] + +[[package]] +name = "keccak" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + +[[package]] +name = "libm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + +[[package]] +name = "librocksdb-sys" +version = "0.8.3+7.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "557b255ff04123fcc176162f56ed0c9cd42d8f357cf55b3fabeb60f7413741b3" +dependencies = [ + "bindgen", + "bzip2-sys", + "cc", + "glob", + "libc", + "libz-sys", +] + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libz-sys" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if 1.0.0", +] + +[[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 = "lz4" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "message_buffer" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "bytemuck", + "byteorder", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "min-max-heap" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2687e6cf9c00f48e9284cf9fd15f2ef341d03cc7743abf9df4c5f07fdee50b18" + +[[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.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi 0.3.9", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "mock-cpi-caller" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "assert_matches", + "bytemuck", + "byteorder", + "message_buffer", + "solana-logger", + "solana-program-test", + "solana-sdk", + "solana-validator", +] + +[[package]] +name = "modular-bitfield" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a53d79ba8304ac1c4f9eb3b9d281f21f7be9d4626f72ce7df4ad8fbde4f38a74" +dependencies = [ + "modular-bitfield-impl", + "static_assertions", +] + +[[package]] +name = "modular-bitfield-impl" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags", + "cfg-if 1.0.0", + "libc", + "memoffset 0.6.5", + "pin-utils", +] + +[[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 = "ntapi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "oid-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" +dependencies = [ + "asn1-rs", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "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 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "111.25.3+1.1.1t" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924757a6a226bf60da5f7dd0311a34d2b52283dd82ddeb103208ddc66362f80c" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "js-sys", + "lazy_static", + "percent-encoding 2.2.0", + "pin-project", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "os_str_bytes" +version = "6.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267" + +[[package]] +name = "ouroboros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1358bd1558bd2a083fed428ffeda486fbfb323e698cdda7794259d592ca72db" +dependencies = [ + "aliasable", + "ouroboros_macro", +] + +[[package]] +name = "ouroboros_macro" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" +dependencies = [ + "Inflector", + "proc-macro-error", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "parity-tokio-ipc" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9981e32fb75e004cc148f5fb70342f393830e0a4aa62e3cc93b50976218d42b6" +dependencies = [ + "futures 0.3.28", + "libc", + "log", + "rand 0.7.3", + "tokio", + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.7", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if 1.0.0", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pest" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "pest_meta" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.6", +] + +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cabda3fb821068a9a4fab19a683eac3af12edf0f34b94a8be53c4972b8149d0" +dependencies = [ + "der", + "spki", + "zeroize", +] + +[[package]] +name = "pkg-config" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2 1.0.52", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "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 1.0.52", + "quote 1.0.26", + "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 1.0.52", + "quote 1.0.26", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" +dependencies = [ + "unicode-xid 0.1.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001" +dependencies = [ + "bytes", + "prost-derive 0.9.0", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost-build" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5" +dependencies = [ + "bytes", + "heck 0.3.3", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prost 0.9.0", + "prost-types 0.9.0", + "regex", + "tempfile", + "which", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost 0.11.9", + "prost-types 0.11.9", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a" +dependencies = [ + "bytes", + "prost 0.9.0", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + +[[package]] +name = "protobuf-src" +version = "1.1.0+21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" +dependencies = [ + "autotools", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding 2.2.0", +] + +[[package]] +name = "quinn" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445cbfe2382fa023c4f2f3c7e1c95c03dcc1df2bf23cebcb2b13e1402c4394d1" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.20.8", + "thiserror", + "tokio", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quinn-proto" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls 0.20.8", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki 0.22.0", +] + +[[package]] +name = "quinn-udp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" +dependencies = [ + "libc", + "quinn-proto", + "socket2", + "tracing", + "windows-sys 0.42.0", +] + +[[package]] +name = "quote" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" +dependencies = [ + "proc-macro2 0.4.30", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2 1.0.52", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[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_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[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_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.8", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time 0.3.20", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom 0.2.8", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "reed-solomon-erasure" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7263373d500d4d4f505d43a2a662d475a894aa94503a1ee28e9188b5f3960d4f" +dependencies = [ + "cc", + "libc", + "libm", + "lru", + "parking_lot 0.11.2", + "smallvec", + "spin 0.9.8", +] + +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "reqwest" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +dependencies = [ + "async-compression", + "base64 0.21.0", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding 2.2.0", + "pin-project-lite", + "rustls 0.20.8", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.23.4", + "tokio-util 0.7.2", + "tower-service", + "url 2.3.1", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi 0.3.9", +] + +[[package]] +name = "rocksdb" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e9562ea1d70c0cc63a34a22d977753b50cca91cc6b6527750463bd5dd8697bc" +dependencies = [ + "libc", + "librocksdb-sys", +] + +[[package]] +name = "rolling-file" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8395b4f860856b740f20a296ea2cd4d823e81a2658cf05ef61be22916026a906" +dependencies = [ + "chrono", +] + +[[package]] +name = "rpassword" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678cf63ab3491898c0d021b493c94c9b221d91295294a2a5746eacbe5928322" +dependencies = [ + "libc", + "rtoolbox", + "winapi 0.3.9", +] + +[[package]] +name = "rtoolbox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "034e22c514f5c0cb8a10ff341b9b048b5ceb21591f31c8f44c43b960f9b3524a" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.17", +] + +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + +[[package]] +name = "rustix" +version = "0.37.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64 0.13.1", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "log", + "ring", + "sct 0.7.0", + "webpki 0.22.0", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64 0.21.0", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[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.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "serde" +version = "1.0.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.158" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "serde_json" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +dependencies = [ + "itoa", + "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 = "serde_with" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331bb8c3bf9b92457ab7abecf07078c13f7d270ba490103e84e8b014490cd0b0" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859011bddcc11f289f07f467cc1fe01c7a941daa4d8f6c40d4d1c92eb6d9319c" +dependencies = [ + "darling", + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "serde_yaml" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d684e3ec7de3bf5466b32bd75303ac16f0736426e5a4e0d6e489559ce1249c" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +dependencies = [ + "digest 0.10.6", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "signal-hook" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "simpl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a30f10c911c0355f80f1c2faa8096efc4a58cdf8590b954d5b395efa071c711" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "smpl_jwt" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b6ff8c21c74ce7744643a7cddbb02579a44f1f77e4316bff1ddb741aca8ac9" +dependencies = [ + "base64 0.13.1", + "log", + "openssl", + "serde", + "serde_derive", + "serde_json", + "simpl", + "time 0.3.20", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes", + "futures 0.3.28", + "httparse", + "log", + "rand 0.8.5", + "sha-1 0.9.8", +] + +[[package]] +name = "solana-account-decoder" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e4ac2e5e6474d17f19341df43c62b62ee1e362bae9b06bc30223252dd4a362" +dependencies = [ + "Inflector", + "base64 0.13.1", + "bincode", + "bs58 0.4.0", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-address-lookup-table-program", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-address-lookup-table-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baac6a0dfc38f64e5e5e178e9eeade05ef1a2c644c95062523c6bc21f19f8866" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive", + "num-traits", + "rustc_version 0.4.0", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-banks-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f74f3e13256c24442a969679a0e33f1e0790a6d5aa803967c72867d34ae6c784" +dependencies = [ + "borsh", + "futures 0.3.28", + "solana-banks-interface", + "solana-program", + "solana-sdk", + "tarpc", + "thiserror", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "217b88550e6d26e197451bfed0f37e4bd58753e8f3d1ba54f859c0d4285368a3" +dependencies = [ + "serde", + "solana-sdk", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c5d40baa3bbcc8702ca33f23457b93ed9a185124337b078ad07bb22314b435" +dependencies = [ + "bincode", + "crossbeam-channel", + "futures 0.3.28", + "solana-banks-interface", + "solana-client", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "tarpc", + "tokio", + "tokio-serde", + "tokio-stream", +] + +[[package]] +name = "solana-bloom" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e5d0033ba3e3f598f88964f0a0a87d3a143f9995fc4b326d21d689e4fa74ad" +dependencies = [ + "bv", + "fnv", + "log", + "rand 0.7.3", + "rayon", + "rustc_version 0.4.0", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d6438ef9cec10d4c563e916a612bb06f50be13524bbd250de461633bde87e7a" +dependencies = [ + "bincode", + "byteorder", + "libsecp256k1", + "log", + "rand 0.7.3", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-bucket-map" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd2f6926a9f443f8c62f883f7348fc04ee1aa48246748c8193c161752e822b92" +dependencies = [ + "log", + "memmap2", + "modular-bitfield", + "rand 0.7.3", + "solana-measure", + "solana-sdk", + "tempfile", +] + +[[package]] +name = "solana-clap-utils" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f0a43f9bcf2405e50190cf3943046663caae557db9eb71a628f359e3f4f3eea" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-perf", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url 2.3.1", +] + +[[package]] +name = "solana-cli-config" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c79aa0d4d3cef702ca522c1b8dca170eb7137254b6d608f46bcb3a26d6fffd3" +dependencies = [ + "dirs-next", + "lazy_static", + "serde", + "serde_derive", + "serde_yaml", + "solana-clap-utils", + "solana-sdk", + "url 2.3.1", +] + +[[package]] +name = "solana-cli-output" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4fc5a23798a7c3882e9d9b583a82b76ca9b08d37e22898627a513ec18cf45bf" +dependencies = [ + "Inflector", + "base64 0.13.1", + "chrono", + "clap 2.34.0", + "console", + "humantime", + "indicatif", + "pretty-hex", + "semver 1.0.17", + "serde", + "serde_json", + "solana-account-decoder", + "solana-clap-utils", + "solana-cli-config", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-vote-program", + "spl-memo", +] + +[[package]] +name = "solana-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fe890559c3d8e29123ed0bfba47d5d714acb1db2e4a9a981c9171960ae01425" +dependencies = [ + "async-trait", + "bincode", + "enum_dispatch", + "futures 0.3.28", + "futures-util", + "indexmap", + "indicatif", + "log", + "quinn", + "rand 0.7.3", + "rayon", + "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-thin-client", + "solana-tpu-client", + "solana-udp-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-compute-budget-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372ab0d248283e6c1b51317bd9a40bc0a6ef076ad29c237e7336cef1934a34f7" +dependencies = [ + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebb520c573b28060cadd8ae0fa6ae116cf74dac01078bc437d8b3e3ab00efd22" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c913dfcaf847cecd8866e4aeaa440b34c8a5dae6c1c90b7a8cb3265ff9fc775" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap", + "log", + "rand 0.7.3", + "rayon", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-core" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61542ae24415097bb6b202f4b058f5db0973dd8e629c6de062b12c022cf5152" +dependencies = [ + "ahash", + "base64 0.13.1", + "bincode", + "bs58 0.4.0", + "chrono", + "crossbeam-channel", + "dashmap", + "eager", + "etcd-client", + "fs_extra", + "histogram", + "itertools", + "lazy_static", + "log", + "lru", + "min-max-heap", + "num_enum", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rayon", + "rolling-file", + "rustc_version 0.4.0", + "serde", + "serde_derive", + "solana-address-lookup-table-program", + "solana-bloom", + "solana-client", + "solana-entry", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-geyser-plugin-manager", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-poh", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-rpc", + "solana-rpc-client-api", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "solana-streamer", + "solana-tpu-client", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "sys-info", + "sysctl", + "tempfile", + "thiserror", + "tokio", + "trees", +] + +[[package]] +name = "solana-download-utils" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99df7485fdf28b89c3dbd850e781d782959661a0f9b2bc8ffd31556e5f2d942f" +dependencies = [ + "console", + "indicatif", + "log", + "reqwest", + "solana-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-entry" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d36e528b958d01d41fc482cf794aed4360a90200192b702428eaa82d4925f05" +dependencies = [ + "bincode", + "crossbeam-channel", + "dlopen", + "dlopen_derive", + "lazy_static", + "log", + "rand 0.7.3", + "rayon", + "serde", + "solana-measure", + "solana-merkle-tree", + "solana-metrics", + "solana-perf", + "solana-rayon-threadlimit", + "solana-sdk", +] + +[[package]] +name = "solana-faucet" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d90180632e0528cd46e0ebfaf98977b24fc4593422be9b200e0dfaf97ee09cc7" +dependencies = [ + "bincode", + "byteorder", + "clap 2.34.0", + "crossbeam-channel", + "log", + "serde", + "serde_derive", + "solana-clap-utils", + "solana-cli-config", + "solana-logger", + "solana-metrics", + "solana-sdk", + "solana-version", + "spl-memo", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f7051cccdf891ac2603cdd295eb651529fe2b678b6b3af60b82dec9a9b3b06" +dependencies = [ + "ahash", + "blake3", + "block-buffer 0.9.0", + "bs58 0.4.0", + "bv", + "byteorder", + "cc", + "either", + "generic-array", + "getrandom 0.1.16", + "hashbrown 0.12.3", + "im", + "lazy_static", + "log", + "memmap2", + "once_cell", + "rand_core 0.6.4", + "rustc_version 0.4.0", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.6", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06395428329810ade1d2518a7e75d8a6f02d01fe548aabb60ff1ba6a2eaebbe5" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "rustc_version 0.4.0", + "syn 1.0.109", +] + +[[package]] +name = "solana-genesis-utils" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c6556b9acf88abd29ceaad82eb3de8722b7a43c5e2afce7b84f303cb83a2b79" +dependencies = [ + "solana-download-utils", + "solana-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-geyser-plugin-interface" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713bc7a232a8c1e939983994d531c7e2ca9953a76d5d96a476f7462744b16f07" +dependencies = [ + "log", + "solana-sdk", + "solana-transaction-status", + "thiserror", +] + +[[package]] +name = "solana-geyser-plugin-manager" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6406088ba11bbd56f5fafa7326e9010ee951d76653f8e323c01254112e6a2ed2" +dependencies = [ + "bs58 0.4.0", + "crossbeam-channel", + "json5", + "libloading", + "log", + "serde_json", + "solana-geyser-plugin-interface", + "solana-measure", + "solana-metrics", + "solana-rpc", + "solana-runtime", + "solana-sdk", + "solana-transaction-status", + "thiserror", +] + +[[package]] +name = "solana-gossip" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c99fdfc75fbe40aae6d60543786eb9c24fa1a633fb1566f75ca8a0471545115" +dependencies = [ + "bincode", + "bv", + "clap 2.34.0", + "crossbeam-channel", + "flate2", + "indexmap", + "itertools", + "log", + "lru", + "matches", + "num-traits", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rayon", + "rustc_version 0.4.0", + "serde", + "serde_bytes", + "serde_derive", + "solana-bloom", + "solana-clap-utils", + "solana-client", + "solana-entry", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-ledger", + "solana-logger", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-rayon-threadlimit", + "solana-runtime", + "solana-sdk", + "solana-streamer", + "solana-thin-client", + "solana-tpu-client", + "solana-version", + "solana-vote-program", + "static_assertions", + "thiserror", +] + +[[package]] +name = "solana-ledger" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84b4dcfe6aaabc5676ac35bba142d598e350b2f70315c94a46179d40e4d41bc" +dependencies = [ + "assert_matches", + "bincode", + "bitflags", + "byteorder", + "chrono", + "chrono-humanize", + "crossbeam-channel", + "dashmap", + "fs_extra", + "futures 0.3.28", + "itertools", + "lazy_static", + "libc", + "log", + "lru", + "num_cpus", + "num_enum", + "prost 0.11.9", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rayon", + "reed-solomon-erasure", + "rocksdb", + "rustc_version 0.4.0", + "serde", + "serde_bytes", + "sha2 0.10.6", + "solana-account-decoder", + "solana-bpf-loader-program", + "solana-entry", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-runtime", + "solana-sdk", + "solana-stake-program", + "solana-storage-bigtable", + "solana-storage-proto", + "solana-transaction-status", + "solana-vote-program", + "spl-token", + "spl-token-2022", + "static_assertions", + "tempfile", + "thiserror", + "tokio", + "tokio-stream", + "trees", +] + +[[package]] +name = "solana-logger" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170714ca3612e4df75f57c2c14c8ab74654b3b66f668986aeed456cedcf24446" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b03528be5a0fbbe4c06a4e1758d155363b51f7c782435b1eb1d4804ab124e3" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-merkle-tree" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7466b876e55c17ddb3359dd9ccf3bcd9fbe4e8858b26c4affe9a760fbce0ab34" +dependencies = [ + "fast-math", + "matches", + "solana-program", +] + +[[package]] +name = "solana-metrics" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc5ff9cbbe50e9918576ff46b4e38d9a946c33fc442982ce7ff397a3b851922a" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", +] + +[[package]] +name = "solana-net-utils" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f35dff5b963ec471514e89bd99c7ac43545756221c99b63c2229cf5f37ebb2" +dependencies = [ + "bincode", + "clap 3.2.24", + "crossbeam-channel", + "log", + "nix", + "rand 0.7.3", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url 2.3.1", +] + +[[package]] +name = "solana-perf" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d630964a18fb466d79c3f5e191f37083b52b584a3f596e17f4bd41a145254d" +dependencies = [ + "ahash", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen", + "dlopen_derive", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.7.3", + "rayon", + "serde", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-poh" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45548be47dab7dfbf6e549d16f2b23369db66f110474af1d97333b7de0012866" +dependencies = [ + "core_affinity", + "crossbeam-channel", + "log", + "solana-entry", + "solana-ledger", + "solana-measure", + "solana-metrics", + "solana-runtime", + "solana-sdk", + "solana-sys-tuner", + "thiserror", +] + +[[package]] +name = "solana-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae9f0fa7db3a4e90fa0df2723ac8cbc042e579cf109cd0380bc5a8c88bed924" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "array-bytes", + "base64 0.13.1", + "bincode", + "bitflags", + "blake3", + "borsh", + "borsh-derive", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.8", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "log", + "memoffset 0.8.0", + "num-bigint 0.4.3", + "num-derive", + "num-traits", + "parking_lot 0.12.1", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rustc_version 0.4.0", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.6", + "sha3 0.10.6", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb3250dc9a0abc87693437ae0bb3eb02603396dcf7698c06f77c33b2c0291ca" +dependencies = [ + "base64 0.13.1", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "libloading", + "log", + "num-derive", + "num-traits", + "rand 0.7.3", + "rustc_version 0.4.0", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-program-test" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cb1db553b414268fa1163005cd3a9cc2f7339b33dc11e86ab40c706751d95df" +dependencies = [ + "assert_matches", + "async-trait", + "base64 0.13.1", + "bincode", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-banks-client", + "solana-banks-interface", + "solana-banks-server", + "solana-bpf-loader-program", + "solana-logger", + "solana-program-runtime", + "solana-runtime", + "solana-sdk", + "solana-vote-program", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e441892b9a00fdceebb0e7eee3226f2f5985a15d081aab1924a298f24cdadb2" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver 1.0.17", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url 2.3.1", +] + +[[package]] +name = "solana-quic-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d19f3bd22bd8cef3bd7007e878f8ee1e9534a2b2ad99abc1ac05ed3d9f9bed" +dependencies = [ + "async-mutex", + "async-trait", + "futures 0.3.28", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "quinn-udp", + "rustls 0.20.8", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "solana-tpu-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30893a53deeb0a3e32451f4f7cb063484e1504a06b127c4b40c223ea90093d7b" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970f142fbf6bda164847f60977ad56adde32cafb7c798d2e005110410754aa85" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive", + "num-traits", + "parking_lot 0.12.1", + "qstring", + "semver 1.0.17", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaccbc49d51f02e1ab0c05c84a64d77d301ccc81ef4f89b290996993b58b0c3" +dependencies = [ + "base64 0.13.1", + "bincode", + "bs58 0.4.0", + "crossbeam-channel", + "dashmap", + "itertools", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-http-server", + "jsonrpc-pubsub", + "libc", + "log", + "rayon", + "regex", + "serde", + "serde_derive", + "serde_json", + "soketto", + "solana-account-decoder", + "solana-client", + "solana-entry", + "solana-faucet", + "solana-gossip", + "solana-ledger", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-poh", + "solana-rayon-threadlimit", + "solana-rpc-client-api", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "solana-stake-program", + "solana-storage-bigtable", + "solana-streamer", + "solana-tpu-client", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "spl-token", + "spl-token-2022", + "stream-cancel", + "thiserror", + "tokio", + "tokio-util 0.6.10", +] + +[[package]] +name = "solana-rpc-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "075485c8ce9300df10b67f01bb9e9ecb79c4c96c58e4b8aacac20e63c6144149" +dependencies = [ + "async-trait", + "base64 0.13.1", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver 1.0.17", + "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.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0623112b87c9e65ef00538e27203b6129518d40376a4aa2ddc4fae5bf78a8a2c" +dependencies = [ + "base64 0.13.1", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver 1.0.17", + "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.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70673c11ff5d831c4e569b41aeb86c0e9c68dba79515b7c6f42b8f842be76fe" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-runtime" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f2a24d899d5c2a339ed0887b0ef321d9ffb22849923dbedcdc23dba32682ec4" +dependencies = [ + "arrayref", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "dir-diff", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lru", + "lz4", + "memmap2", + "num-derive", + "num-traits", + "num_cpus", + "once_cell", + "ouroboros", + "rand 0.7.3", + "rayon", + "regex", + "rustc_version 0.4.0", + "serde", + "serde_derive", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget-program", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-vote-program", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-sdk" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbefda9f9bda78fd9d91ae21c38d9693e94d5979838fb69b70c6addb8dab953f" +dependencies = [ + "assert_matches", + "base64 0.13.1", + "bincode", + "bitflags", + "borsh", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.6", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive", + "num-traits", + "num_enum", + "pbkdf2 0.11.0", + "qstring", + "rand 0.7.3", + "rand_chacha 0.2.2", + "rustc_version 0.4.0", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.6", + "sha3 0.10.6", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f809319358d5da7c3a0ac08ebf4d87b21170d928dbb7260254e8f3061f7f9e0e" +dependencies = [ + "bs58 0.4.0", + "proc-macro2 1.0.52", + "quote 1.0.26", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "solana-send-transaction-service" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a9997fdab12ca016e2d44ba83ac4d1624a7883a9b123e085a2cd3ea13ce9d68" +dependencies = [ + "crossbeam-channel", + "log", + "solana-client", + "solana-measure", + "solana-metrics", + "solana-runtime", + "solana-sdk", + "solana-tpu-client", +] + +[[package]] +name = "solana-stake-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eace3b30e9b6a58864c6ffe76726880a60e1feddefdfe0cbaffbddedf7a90d30" +dependencies = [ + "bincode", + "log", + "rustc_version 0.4.0", + "solana-config-program", + "solana-program-runtime", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-storage-bigtable" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37be265389aa18237e2589ad9051144cd923c3cd2ea16f39ef34057aea61cb1a" +dependencies = [ + "backoff", + "bincode", + "bytes", + "bzip2", + "enum-iterator", + "flate2", + "futures 0.3.28", + "goauth", + "http", + "hyper", + "hyper-proxy", + "log", + "openssl", + "prost 0.11.9", + "prost-types 0.11.9", + "serde", + "serde_derive", + "smpl_jwt", + "solana-metrics", + "solana-sdk", + "solana-storage-proto", + "solana-transaction-status", + "thiserror", + "tokio", + "tonic 0.8.3", + "zstd", +] + +[[package]] +name = "solana-storage-proto" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "764664a1fce92fbcc6ba0b593f0c11e1d5ca961fcaa16d0f10e9fe85a4d88c4f" +dependencies = [ + "bincode", + "bs58 0.4.0", + "prost 0.11.9", + "protobuf-src", + "serde", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "tonic-build 0.8.4", +] + +[[package]] +name = "solana-streamer" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd5b3dad02879b083b7218b9f9596d97cee8deda2b625bff67db95d8920f5f7" +dependencies = [ + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "quinn-udp", + "rand 0.7.3", + "rcgen", + "rustls 0.20.8", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-sys-tuner" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dfa7798c748c73a9e68c28ade656698ab6fff82fe5e3ad867b3e1c6c49bf9ec" +dependencies = [ + "clap 2.34.0", + "libc", + "log", + "nix", + "solana-logger", + "solana-version", + "sysctl", + "unix_socket2", + "users", +] + +[[package]] +name = "solana-test-validator" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6fbd17ef69af0af524fef59d9e261fc74310abc81b5c584c0cb17a204b9c45e" +dependencies = [ + "base64 0.13.1", + "log", + "serde_derive", + "serde_json", + "solana-cli-output", + "solana-client", + "solana-core", + "solana-gossip", + "solana-ledger", + "solana-logger", + "solana-net-utils", + "solana-program-runtime", + "solana-program-test", + "solana-rpc", + "solana-rpc-client", + "solana-runtime", + "solana-sdk", + "solana-streamer", + "solana-tpu-client", + "tokio", +] + +[[package]] +name = "solana-thin-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bdd6347caf841a007952c748cd35c3ec8395aa3816ac59b4a9b4c102237de" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "solana-tpu-client", +] + +[[package]] +name = "solana-tpu-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50a7dfa7a85ba000656d91c8847b61f8fa9b8067443449fab8e4c35fe01dee5c" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap", + "indicatif", + "log", + "rand 0.7.3", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b803e356fc2de0074866a6da007e721c950e754747e761a263b7f9e4c17edefa" +dependencies = [ + "Inflector", + "base64 0.13.1", + "bincode", + "borsh", + "bs58 0.4.0", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-address-lookup-table-program", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1b0d7efeb2cb7dafbf3b085c895e440b8947fe5def6bdad17ebae9badfdecb0" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "solana-tpu-client", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-validator" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aebda13fc7f6a5c592cc2c596602257bff68f9d5e7f511a7d11819bae65a1e4" +dependencies = [ + "chrono", + "clap 2.34.0", + "console", + "core_affinity", + "crossbeam-channel", + "fd-lock", + "indicatif", + "jsonrpc-core", + "jsonrpc-core-client", + "jsonrpc-derive", + "jsonrpc-ipc-server", + "jsonrpc-server-utils", + "lazy_static", + "libc", + "log", + "num_cpus", + "rand 0.7.3", + "rayon", + "serde", + "serde_json", + "serde_yaml", + "signal-hook", + "solana-clap-utils", + "solana-cli-config", + "solana-core", + "solana-download-utils", + "solana-entry", + "solana-faucet", + "solana-genesis-utils", + "solana-gossip", + "solana-ledger", + "solana-logger", + "solana-metrics", + "solana-net-utils", + "solana-perf", + "solana-poh", + "solana-rpc", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "solana-storage-bigtable", + "solana-streamer", + "solana-test-validator", + "solana-tpu-client", + "solana-version", + "solana-vote-program", + "symlink", + "tikv-jemallocator", +] + +[[package]] +name = "solana-version" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3df7b4a4dc0a39da78d790845089a8d112fcd6d2d003ae93830387a564cfc5" +dependencies = [ + "log", + "rustc_version 0.4.0", + "semver 1.0.17", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2439b8c68f000f8c3713eceabb5cabc8528d276e5bc971c694d4103d4be958ff" +dependencies = [ + "bincode", + "log", + "num-derive", + "num-traits", + "rustc_version 0.4.0", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-zk-token-proof-program" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed4b22ad82dee705d0eec53283b4b6871a7b7b5231f023c18bf103f0cb62bc3" +dependencies = [ + "bytemuck", + "getrandom 0.1.16", + "num-derive", + "num-traits", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a290aa32014e007b03f952d5b784433d95636c65a3fb08d19dc5658a450941c" +dependencies = [ + "aes-gcm-siv", + "arrayref", + "base64 0.13.1", + "bincode", + "bytemuck", + "byteorder", + "cipher 0.4.4", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "solana_rbpf" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e9e5085099858adba23d0a0b5298da8803f89999cb567ecafab9c916cdf53d" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi 0.3.9", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d01ac02a6ccf3e07db148d2be087da624fea0221a16152ed01f0496a6b0a27" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc000f0fdf1f12f99d77d398137c1751345b18c88258ce0f99b7872cf6c9bd6" +dependencies = [ + "assert_matches", + "borsh", + "num-derive", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-token" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edb869dbe159b018f17fb9bfa67118c30f232d7f54a73742bc96794dff77ed8" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "solana-zk-token-sdk", + "spl-memo", + "spl-token", + "thiserror", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stream-cancel" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0a9eb2715209fb8cc0d942fcdff45674bfc9f0090a0d897e85a22955ad159b" +dependencies = [ + "futures-core", + "pin-project", + "tokio", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck 0.4.1", + "proc-macro2 1.0.52", + "quote 1.0.26", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + +[[package]] +name = "syn" +version = "0.15.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +dependencies = [ + "proc-macro2 0.4.30", + "quote 0.6.13", + "unicode-xid 0.1.0", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79d9531f94112cfc3e4c8f5f02cb2b58f72c97b7efd85f70203cc6d8efda5927" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", + "unicode-xid 0.2.4", +] + +[[package]] +name = "sys-info" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "sysctl" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225e483f02d0ad107168dc57381a8a40c3aeea6abe47f37506931f861643cfa8" +dependencies = [ + "bitflags", + "byteorder", + "libc", + "thiserror", + "walkdir", +] + +[[package]] +name = "tar" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "tarpc" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38a012bed6fb9681d3bf71ffaa4f88f3b4b9ed3198cda6e4c8462d24d4bb80" +dependencies = [ + "anyhow", + "fnv", + "futures 0.3.28", + "humantime", + "opentelemetry", + "pin-project", + "rand 0.8.5", + "serde", + "static_assertions", + "tarpc-plugins", + "thiserror", + "tokio", + "tokio-serde", + "tokio-util 0.6.10", + "tracing", + "tracing-opentelemetry", +] + +[[package]] +name = "tarpc-plugins" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.4.3+5.2.1-patched.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1792ccb507d955b46af42c123ea8863668fae24d03721e40cad6a41773dbb49" +dependencies = [ + "cc", + "fs_extra", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b7bcecfafe4998587d636f9ae9d55eb9d0499877b88757767c346875067098" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d0183f6f6001549ab68f8c7585093bb732beefbcf6d23a10b9b95c73a1dd49" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot 0.11.2", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi 0.3.9", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 1.0.109", +] + +[[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 = "semver" -version = "0.11.0" +name = "tokio-rustls" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ - "semver-parser", + "rustls 0.19.1", + "tokio", + "webpki 0.21.4", ] [[package]] -name = "semver" -version = "1.0.17" +name = "tokio-rustls" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +dependencies = [ + "rustls 0.20.8", + "tokio", + "webpki 0.22.0", +] [[package]] -name = "semver-parser" -version = "0.10.2" +name = "tokio-serde" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" dependencies = [ - "pest", + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", ] [[package]] -name = "serde" -version = "1.0.158" +name = "tokio-stream" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9" +checksum = "8fb52b74f05dbf495a8fba459fdc331812b96aa086d9eb78101fa0d4569c3313" dependencies = [ - "serde_derive", + "futures-core", + "pin-project-lite", + "tokio", ] [[package]] -name = "serde_bytes" -version = "0.11.9" +name = "tokio-tungstenite" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" dependencies = [ - "serde", + "futures-util", + "log", + "rustls 0.20.8", + "tokio", + "tokio-rustls 0.23.4", + "tungstenite", + "webpki 0.22.0", + "webpki-roots", ] [[package]] -name = "serde_derive" -version = "1.0.158" +name = "tokio-util" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.3", + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", ] [[package]] -name = "serde_json" -version = "1.0.94" +name = "tokio-util" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea" +checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ - "itoa", - "ryu", "serde", ] [[package]] -name = "sha2" -version = "0.9.9" +name = "toml_datetime" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622" + +[[package]] +name = "toml_edit" +version = "0.19.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13" dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "indexmap", + "toml_datetime", + "winnow", ] [[package]] -name = "sha2" -version = "0.10.6" +name = "tonic" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.6", + "async-stream", + "async-trait", + "base64 0.13.1", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding 2.2.0", + "pin-project", + "prost 0.9.0", + "prost-derive 0.9.0", + "tokio", + "tokio-rustls 0.22.0", + "tokio-stream", + "tokio-util 0.6.10", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", ] [[package]] -name = "sha3" -version = "0.10.6" +name = "tonic" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" dependencies = [ - "digest 0.10.6", - "keccak", + "async-stream", + "async-trait", + "axum", + "base64 0.13.1", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding 2.2.0", + "pin-project", + "prost 0.11.9", + "prost-derive 0.11.9", + "rustls-pemfile", + "tokio", + "tokio-rustls 0.23.4", + "tokio-stream", + "tokio-util 0.7.2", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", ] [[package]] -name = "sized-chunks" -version = "0.6.5" +name = "tonic-build" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" dependencies = [ - "bitmaps", - "typenum", + "proc-macro2 1.0.52", + "prost-build 0.9.0", + "quote 1.0.26", + "syn 1.0.109", ] [[package]] -name = "smallvec" -version = "1.10.0" +name = "tonic-build" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +dependencies = [ + "prettyplease", + "proc-macro2 1.0.52", + "prost-build 0.11.9", + "quote 1.0.26", + "syn 1.0.109", +] [[package]] -name = "solana-frozen-abi" -version = "1.15.2" +name = "tower" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f7051cccdf891ac2603cdd295eb651529fe2b678b6b3af60b82dec9a9b3b06" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util 0.7.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d" dependencies = [ - "ahash", - "blake3", - "block-buffer 0.9.0", - "bs58 0.4.0", - "bv", - "byteorder", - "cc", - "either", - "generic-array", - "getrandom 0.1.16", - "hashbrown 0.12.3", - "im", - "lazy_static", "log", - "memmap2", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2 1.0.52", + "quote 1.0.26", + "syn 2.0.12", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ "once_cell", - "rand_core 0.6.4", - "rustc_version 0.4.0", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "sha2 0.10.6", - "solana-frozen-abi-macro", - "subtle", - "thiserror", + "valuable", ] [[package]] -name = "solana-frozen-abi-macro" -version = "1.15.2" +name = "tracing-futures" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06395428329810ade1d2518a7e75d8a6f02d01fe548aabb60ff1ba6a2eaebbe5" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "proc-macro2", - "quote", - "rustc_version 0.4.0", - "syn 1.0.109", + "pin-project", + "tracing", ] [[package]] -name = "solana-program" -version = "1.15.2" +name = "tracing-opentelemetry" +version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ae9f0fa7db3a4e90fa0df2723ac8cbc042e579cf109cd0380bc5a8c88bed924" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "trees" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de5f738ceab88e2491a94ddc33c3feeadfa95fedc60363ef110845df12f3878" + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "tungstenite" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "array-bytes", "base64 0.13.1", - "bincode", - "bitflags", - "blake3", - "borsh", - "borsh-derive", - "bs58 0.4.0", - "bv", - "bytemuck", - "cc", - "console_error_panic_hook", - "console_log", - "curve25519-dalek", - "getrandom 0.2.8", - "itertools", - "js-sys", - "lazy_static", - "libc", - "libsecp256k1", + "byteorder", + "bytes", + "http", + "httparse", "log", - "memoffset", - "num-bigint", - "num-derive", - "num-traits", - "parking_lot", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rustc_version 0.4.0", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "sha2 0.10.6", - "sha3", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-sdk-macro", + "rand 0.8.5", + "rustls 0.20.8", + "sha-1 0.10.1", "thiserror", - "tiny-bip39", - "wasm-bindgen", - "zeroize", + "url 2.3.1", + "utf-8", + "webpki 0.22.0", + "webpki-roots", ] [[package]] -name = "solana-sdk-macro" -version = "1.15.2" +name = "typenum" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f809319358d5da7c3a0ac08ebf4d87b21170d928dbb7260254e8f3061f7f9e0e" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ - "bs58 0.4.0", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", + "version_check", ] [[package]] -name = "subtle" -version = "2.4.1" +name = "unicode-bidi" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "unicode-xid" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] -name = "syn" -version = "1.0.109" +name = "universal-hash" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "generic-array", + "subtle", ] [[package]] -name = "syn" -version = "2.0.3" +name = "unix_socket2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8234ae35e70582bfa0f1fedffa6daa248e41dd045310b19800c4a36382c8f60" +checksum = "b57c6eace16c00eccb98a28e85db3370eab0685bdd5e13831d59e2bcb49a1d8a" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "libc", ] [[package]] -name = "synstructure" -version = "0.12.6" +name = "unreachable" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", + "void", ] [[package]] -name = "thiserror" -version = "1.0.40" +name = "unsafe-libyaml" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" -dependencies = [ - "thiserror-impl", -] +checksum = "1865806a559042e51ab5414598446a5871b561d21b6764f2eabb0dd481d880a6" [[package]] -name = "thiserror-impl" -version = "1.0.40" +name = "untrusted" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.3", -] +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "tiny-bip39" -version = "0.8.2" +name = "uriparse" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" dependencies = [ - "anyhow", - "hmac", - "once_cell", - "pbkdf2", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", + "fnv", + "lazy_static", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "url" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" dependencies = [ - "tinyvec_macros", + "idna 0.1.5", + "matches", + "percent-encoding 1.0.1", ] [[package]] -name = "tinyvec_macros" -version = "0.1.1" +name = "url" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna 0.3.0", + "percent-encoding 2.2.0", +] [[package]] -name = "toml" -version = "0.5.11" +name = "users" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +checksum = "aa4227e95324a443c9fcb06e03d4d85e91aabe9a5a02aa818688b6918b6af486" dependencies = [ - "serde", + "libc", + "log", ] [[package]] -name = "typenum" -version = "1.16.0" +name = "utf-8" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "ucd-trie" -version = "0.1.5" +name = "valuable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] -name = "unicode-ident" -version = "1.0.8" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "unicode-normalization" -version = "0.1.22" +name = "vec_map" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] -name = "unicode-segmentation" -version = "1.10.1" +name = "version_check" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] -name = "unicode-xid" -version = "0.2.4" +name = "void" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] -name = "version_check" -version = "0.9.4" +name = "walkdir" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] [[package]] name = "wasi" @@ -1597,6 +7026,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -1609,7 +7044,7 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -1622,19 +7057,31 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ - "quote", + "quote 1.0.26", "wasm-bindgen-macro-support", ] @@ -1644,8 +7091,8 @@ version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", @@ -1667,13 +7114,129 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki 0.22.0", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[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-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + +[[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" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + +[[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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", ] [[package]] @@ -1682,13 +7245,28 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] [[package]] @@ -1697,42 +7275,138 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winnow" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64 0.13.1", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time 0.3.20", +] + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time 0.3.20", +] + [[package]] name = "zeroize" version = "1.3.0" @@ -1748,8 +7422,38 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2", - "quote", + "proc-macro2 1.0.52", + "quote 1.0.26", "syn 1.0.109", "synstructure", ] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.8+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" +dependencies = [ + "cc", + "libc", + "pkg-config", +] diff --git a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs index cd34a102c9..527144cb68 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs @@ -14,6 +14,10 @@ use { }, }; +//TODO: make sure this works regardless if the msg_buffer is initialized already or not +// we could be in a sitaution where we have a new price account & new msg_buffer acount +// and we know we need more than 10KB to fit all the messages. In this situation +// we would call create_buffer(10240) then resize_buffer(target_size) pub fn resize_buffer<'info>( ctx: Context<'_, '_, '_, 'info, ResizeBuffer<'info>>, allowed_program_auth: Pubkey, @@ -36,8 +40,11 @@ pub fn resize_buffer<'info>( MessageBuffer::HEADER_LEN as u32, MessageBufferError::MessageBufferTooSmall ); + let target_size = target_size as usize; - let target_size_delta = target_size.saturating_sub(message_buffer_account_info.data_len()); + + let current_account_size = message_buffer_account_info.data_len(); + let target_size_delta = target_size.saturating_sub(current_account_size); require_gte!( MAX_PERMITTED_DATA_INCREASE, target_size_delta, @@ -61,10 +68,10 @@ pub fn resize_buffer<'info>( MessageBufferError::InvalidPDA ); - // allow for delta == 0 in case Rent requirements have changed + // allow for target_size == account_size in case Rent requirements have changed // and additional lamports need to be transferred. // the realloc step will be a no-op in this case. - if target_size_delta >= 0 { + if target_size >= current_account_size { let target_rent = Rent::get()?.minimum_balance(target_size); if message_buffer_account_info.lamports() < target_rent { system_program::transfer( diff --git a/pythnet/message_buffer/programs/message_buffer/src/lib.rs b/pythnet/message_buffer/programs/message_buffer/src/lib.rs index b2107ea59d..0501072544 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/lib.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/lib.rs @@ -1,4 +1,4 @@ -mod instructions; +pub mod instructions; mod macros; mod state; @@ -15,13 +15,62 @@ declare_id!("Vbmv1jt4vyuqBZcpYPpnVhrqVe5e6ZPb6JxDcffRHUM"); pub mod message_buffer { use super::*; + pub fn test(ctx: Context, admin: Pubkey) -> Result<()> { + use anchor_lang::{ + prelude::*, + system_program::{ + self, + Transfer, + }, + }; + msg!("in test"); + let (whitelist_pda, whitelist_bump) = + Pubkey::find_program_address(&[b"message", b"whitelist"], &crate::ID); + msg!("crate_id: {:?}", crate::ID); + let payer_pk = ctx.accounts.payer.key(); + msg!("payer_pk: {:?}", payer_pk); + msg!("admin: {:?}", admin); + msg!( + "whitelist_pda: {:?}, whitelist_bump: {:?}", + whitelist_pda, + whitelist_bump + ); + let whitelist_acct_pk = ctx.accounts.whitelist.key(); + msg!("whitelist_acct_pk: {:?}", whitelist_acct_pk); + + // let whitelist = &mut ctx.accounts.whitelist; + // whitelist.bump = w_bump; + + // let whitelist_bump = *ctx.bumps.get("whitelist").unwrap(); + // msg!("whitelist_bump: {:?}", whitelist_bump); + // whitelist.admin = Pubkey::default(); + // let init = &mut ctx.accounts.init; + // init.bump = *ctx.bumps.get("init").unwrap(); + // msg!("[test]: initialized init"); + let system_prog = ctx.accounts.system_program.key(); + msg!("system_prog: {:?}", system_prog); + system_program::transfer( + CpiContext::new( + ctx.accounts.system_program.to_account_info(), + Transfer { + from: ctx.accounts.payer.to_account_info(), + to: ctx.accounts.whitelist.to_account_info(), + }, + ), + Rent::get()?.minimum_balance(0), + )?; + msg!("transferred to payer"); + Ok(()) + } /// Initializes the whitelist and sets it's admin to the provided pubkey /// Once initialized, the authority must sign all further changes to the whitelist. pub fn initialize(ctx: Context, admin: Pubkey) -> Result<()> { require_keys_neq!(admin, Pubkey::default()); + msg!("in initialize"); let whitelist = &mut ctx.accounts.whitelist; whitelist.bump = *ctx.bumps.get("whitelist").unwrap(); + // whitelist.bump = bump; whitelist.admin = admin; Ok(()) } @@ -149,6 +198,41 @@ pub mod message_buffer { } } +#[derive(Accounts)] +pub struct Test<'info> { + #[account(mut)] + pub payer: Signer<'info>, + + // #[account( + // init, + // payer = payer, + // seeds = [b"message".as_ref(), b"whitelist".as_ref()], + // bump, + // space = 8 + Whitelist::INIT_SPACE, + // )] + // pub whitelist: Account<'info, Whitelist>, + #[account( + seeds = [b"message".as_ref(), b"whitelist".as_ref()], + bump, + )] + /// CHECK: test + pub whitelist: UncheckedAccount<'info>, + pub system_program: Program<'info, System>, + // #[account( + // init, + // payer = payer, + // seeds = [b"message".as_ref(), b"init".as_ref()], + // bump, + // space = 8, + // )] + // pub init: Account<'info, Init>, +} + +#[account] +pub struct Init { + pub bump: u8, +} + #[derive(Accounts)] pub struct Initialize<'info> { #[account(mut)] @@ -158,7 +242,7 @@ pub struct Initialize<'info> { payer = payer, seeds = [b"message".as_ref(), b"whitelist".as_ref()], bump, - space = 8 + Whitelist::INIT_SPACE + space = 8 + Whitelist::INIT_SPACE, )] pub whitelist: Account<'info, Whitelist>, pub system_program: Program<'info, System>, diff --git a/pythnet/message_buffer/programs/message_buffer/src/state/whitelist.rs b/pythnet/message_buffer/programs/message_buffer/src/state/whitelist.rs index db40cab9a9..cfdc35c544 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/state/whitelist.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/state/whitelist.rs @@ -11,6 +11,8 @@ use { pub struct Whitelist { pub bump: u8, pub admin: Pubkey, + // This is used by the `#[derive(InitSpace)]` + // to determine initial account size #[max_len(32)] pub allowed_programs: Vec, } diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/Cargo.toml b/pythnet/message_buffer/programs/mock-cpi-caller/Cargo.toml index a21b32c173..877b77a6a1 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/Cargo.toml +++ b/pythnet/message_buffer/programs/mock-cpi-caller/Cargo.toml @@ -14,9 +14,18 @@ no-idl = [] no-log-ix-name = [] cpi = ["no-entrypoint"] default = [] +test-bpf = [] [dependencies] anchor-lang = "0.27.0" message_buffer = { path = "../message_buffer", features = ["cpi"] } # needed for the new #[account(zero_copy)] in anchor 0.27.0 bytemuck = { version = "1.4.0", features = ["derive", "min_const_generics"]} + +[dev-dependencies] +solana-sdk = "1.14.16" +solana-program-test = "1.14.16" +solana-validator = "1.14.16" +assert_matches = "1.4.0" +solana-logger = "1.14.16" +byteorder = "1.4.3" diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs index 78b118c714..17911a53b5 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs @@ -3,7 +3,7 @@ use { instructions::{ sighash, ACCUMULATOR_UPDATER_IX_NAME, - CPI, + UPD_PRICE_WRITE, }, message::{ get_schemas, @@ -51,13 +51,13 @@ pub fn add_price<'info>( // Note: normally pyth oracle add_price wouldn't call emit_accumulator_inputs // since add_price doesn't actually add/update any price data we would // want included in the accumulator anyways. This is just for testing - AddPrice::emit_accumulator_inputs(ctx, inputs) + AddPrice::emit_messages(ctx, inputs) } impl<'info> AddPrice<'info> { - /// Invoke accumulator-updater emit-inputs ix cpi call using solana - pub fn emit_accumulator_inputs( + /// Invoke message_buffer::put_all ix cpi call using solana + pub fn emit_messages( ctx: Context<'_, '_, '_, 'info, AddPrice<'info>>, inputs: Vec>, ) -> anchor_lang::Result<()> { @@ -89,8 +89,8 @@ impl<'info> AddPrice<'info> { // that won't be available in the oracle program let (_, bump) = Pubkey::find_program_address( &[ + UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - CPI.as_bytes(), ], &crate::ID, ); @@ -98,8 +98,10 @@ impl<'info> AddPrice<'info> { &create_inputs_ix, account_infos, &[&[ + UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - CPI.as_bytes(), + // ctx.accounts.message_buffer_program.key().as_ref(), + // UPD_PRICE_WRITE.as_bytes(), &[bump], ]], )?; @@ -136,7 +138,7 @@ pub struct AddPrice<'info> { /// PDA representing this program's authority /// to call the accumulator program #[account( - seeds = [message_buffer_program.key().as_ref(), b"cpi".as_ref()], + seeds = [b"upd_price_write".as_ref(), message_buffer_program.key().as_ref()], owner = system_program::System::id(), bump, )] diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/cpi_max_test.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/cpi_max_test.rs index bf3d223d72..ccea8f0b16 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/cpi_max_test.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/cpi_max_test.rs @@ -33,5 +33,5 @@ pub fn cpi_max_test<'info>( msg!("input_len: {}", input_len); - UpdatePrice::emit_accumulator_inputs(ctx, inputs) + UpdatePrice::emit_messages(ctx, inputs) } diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/mod.rs index 097e2e1e38..fdc26fff63 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/mod.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/mod.rs @@ -24,4 +24,4 @@ pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { } pub const ACCUMULATOR_UPDATER_IX_NAME: &str = "put_all"; -pub const CPI: &str = "cpi"; +pub const UPD_PRICE_WRITE: &str = "upd_price_write"; diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs index 35a1ab9695..e6e0968823 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs @@ -3,7 +3,7 @@ use { instructions::{ sighash, ACCUMULATOR_UPDATER_IX_NAME, - CPI, + UPD_PRICE_WRITE, }, message::{ price::{ @@ -45,7 +45,7 @@ pub struct UpdatePrice<'info> { /// CHECK: whitelist pub accumulator_whitelist: UncheckedAccount<'info>, #[account( - seeds = [message_buffer_program.key().as_ref(), b"cpi".as_ref()], + seeds = [b"upd_price_write".as_ref(), message_buffer_program.key().as_ref()], owner = system_program::System::id(), bump, )] @@ -76,12 +76,12 @@ pub fn update_price<'info>( } - UpdatePrice::emit_accumulator_inputs(ctx, inputs) + UpdatePrice::emit_messages(ctx, inputs) } impl<'info> UpdatePrice<'info> { - /// Invoke accumulator-updater emit-inputs ix cpi call - pub fn emit_accumulator_inputs( + /// Invoke message_buffer::put_all ix cpi call + pub fn emit_messages( ctx: Context<'_, '_, '_, 'info, UpdatePrice<'info>>, values: Vec>, ) -> anchor_lang::Result<()> { @@ -113,8 +113,8 @@ impl<'info> UpdatePrice<'info> { // that won't be available in the oracle program let (_, bump) = Pubkey::find_program_address( &[ + UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - CPI.as_bytes(), ], &crate::ID, ); @@ -122,11 +122,29 @@ impl<'info> UpdatePrice<'info> { &update_inputs_ix, account_infos, &[&[ + UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - CPI.as_bytes(), + // ctx.accounts.message_buffer_program.key().as_ref(), + // UPD_PRICE_WRITE.as_bytes(), &[bump], ]], )?; + // let (_, bump) = Pubkey::find_program_address( + // &[ + // ctx.accounts.message_buffer_program.key().as_ref(), + // UPD_PRICE_WRITE.as_bytes(), + // ], + // &crate::ID, + // ); + // anchor_lang::solana_program::program::invoke_signed( + // &update_inputs_ix, + // account_infos, + // &[&[ + // ctx.accounts.message_buffer_program.key().as_ref(), + // UPD_PRICE_WRITE.as_bytes(), + // &[bump], + // ]], + // )?; Ok(()) } } diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/message/price.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/message/price.rs index 2115c68cfd..3c42f0370a 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/message/price.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/message/price.rs @@ -35,9 +35,9 @@ impl MessageHeader { #[derive(Clone, Default, Debug, Eq, PartialEq)] pub struct CompactPriceMessage { pub header: MessageHeader, - pub price_expo: u64, - pub price: u64, pub id: u64, + pub price: u64, + pub price_expo: u64, } diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs new file mode 100644 index 0000000000..150730cf0e --- /dev/null +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs @@ -0,0 +1,552 @@ +use { + anchor_lang::{ + prelude::*, + solana_program::{ + hash::hashv, + instruction::Instruction, + }, + Id, + }, + byteorder::{ + BigEndian, + LittleEndian, + ReadBytesExt, + }, + solana_program_test::{ + BanksClient, + ProgramTest, + ProgramTestContext, + }, + solana_sdk::{ + account::ReadableAccount, + signature::{ + Keypair, + Signer, + }, + transaction::Transaction, + }, + std::{ + io::{ + Cursor, + Read, + }, + str::FromStr, + }, +}; + +pub async fn setup_program_test(disable_loosen_cpi_limit: bool) -> ProgramTestContext { + let log_filter = "solana_rbpf=trace,\ + solana_runtime::message_processor=trace,\ + solana_runtime::system_instruction_processor=trace,\ + solana_program_test=debug"; + solana_logger::setup_with(log_filter); + + + let mut pt = ProgramTest::new("message_buffer", ::message_buffer::id(), None); + pt.add_program("mock_cpi_caller", ::mock_cpi_caller::id(), None); + if disable_loosen_cpi_limit { + pt.deactivate_feature( + Pubkey::from_str("GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm").unwrap(), + ); + } + + pt.start_with_context().await +} + +fn initialize_ix( + admin: Pubkey, + payer: Pubkey, + whitelist_pda: Pubkey, +) -> anchor_lang::Result { + let init_ix_discriminator = sighash("global", "initialize"); + + let init_message_buffer_ix = Instruction::new_with_borsh( + ::message_buffer::id(), + &(init_ix_discriminator, admin), + vec![ + AccountMeta::new(payer, true), + AccountMeta::new(whitelist_pda, false), + AccountMeta::new_readonly(System::id(), false), + ], + ); + Ok(init_message_buffer_ix) +} + +pub async fn send_initialize_whitelist( + banks_client: &mut BanksClient, + admin: Pubkey, + payer: &Keypair, +) -> anchor_lang::Result<(Pubkey, u8)> { + let (whitelist_pda, whitelist_bump) = Pubkey::find_program_address( + &[b"message".as_ref(), b"whitelist".as_ref()], + &::message_buffer::id(), + ); + + let init_message_buffer_ix = initialize_ix(admin, payer.pubkey(), whitelist_pda)?; + + send_transaction( + banks_client, + &[init_message_buffer_ix], + payer.pubkey(), + vec![payer], + ) + .await + .unwrap(); + + Ok((whitelist_pda, whitelist_bump)) +} + +fn set_allowed_programs_ix( + admin: Pubkey, + payer: Pubkey, + whitelist: Pubkey, + allowed_programs: &Vec, +) -> anchor_lang::Result { + let ix_discriminator = sighash("global", "set_allowed_programs"); + + let set_allowed_programs_ix = Instruction::new_with_borsh( + ::message_buffer::id(), + &(ix_discriminator, allowed_programs), + vec![ + AccountMeta::new(admin, true), + AccountMeta::new(payer, true), + AccountMeta::new(whitelist, false), + ], + ); + Ok(set_allowed_programs_ix) +} + +pub async fn send_set_allowed_programs( + banks_client: &mut BanksClient, + payer: &Keypair, + whitelist: &Pubkey, + allowed_programs: &Vec, +) -> anchor_lang::Result<()> { + let _recent_blockhash = banks_client.get_latest_blockhash().await.unwrap(); + + let set_allowed_programs_ix = + set_allowed_programs_ix(payer.pubkey(), payer.pubkey(), *whitelist, allowed_programs)?; + + send_transaction( + banks_client, + &[set_allowed_programs_ix], + payer.pubkey(), + vec![payer], + ) + .await + .unwrap(); + + Ok(()) +} + +async fn create_msg_buffer_ix( + admin: Pubkey, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + target_size: u32, +) -> anchor_lang::Result<(Pubkey, u8, Instruction)> { + let (msg_buffer_pda, msg_buffer_bump) = Pubkey::find_program_address( + &[ + cpi_caller_auth.as_ref(), + b"message".as_ref(), + pyth_price_acct.as_ref(), + ], + &::message_buffer::id(), + ); + + + let create_ix_discriminator = sighash("global", "create_buffer"); + + let create_msg_buffer_ix = Instruction::new_with_borsh( + ::message_buffer::id(), + &( + create_ix_discriminator, + cpi_caller_auth, + pyth_price_acct, + target_size, + ), + vec![ + AccountMeta::new_readonly(whitelist, false), + AccountMeta::new(admin, true), + AccountMeta::new_readonly(System::id(), false), + AccountMeta::new(msg_buffer_pda, false), + ], + ); + Ok((msg_buffer_pda, msg_buffer_bump, create_msg_buffer_ix)) +} + +pub async fn send_create_msg_buffer( + banks_client: &mut BanksClient, + admin: &Keypair, + payer: &Keypair, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + target_size: u32, +) -> anchor_lang::Result<(Pubkey, u8)> { + let (msg_buffer_pda, msg_buffer_bump, create_msg_buffer_ix) = create_msg_buffer_ix( + admin.pubkey(), + whitelist, + cpi_caller_auth, + pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + send_transaction( + banks_client, + &[create_msg_buffer_ix], + payer.pubkey(), + vec![admin, payer], + ) + .await + .unwrap(); + + Ok((msg_buffer_pda, msg_buffer_bump)) +} + + +pub async fn resize_msg_buffer_ix( + admin: Pubkey, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + msg_buffer_bump: u8, + target_size: u32, +) -> anchor_lang::Result { + let msg_buffer_pda = Pubkey::create_program_address( + &[ + cpi_caller_auth.as_ref(), + b"message".as_ref(), + pyth_price_acct.as_ref(), + &[msg_buffer_bump], + ], + &::message_buffer::id(), + ) + .unwrap(); + + + let resize_ix_disc = sighash("global", "resize_buffer"); + + let resize_ix = Instruction::new_with_borsh( + ::message_buffer::id(), + &( + resize_ix_disc, + cpi_caller_auth, + pyth_price_acct, + msg_buffer_bump, + target_size, + ), + vec![ + AccountMeta::new_readonly(whitelist, false), + AccountMeta::new(admin, true), + AccountMeta::new_readonly(System::id(), false), + AccountMeta::new(msg_buffer_pda, false), + ], + ); + Ok(resize_ix) +} + +pub async fn send_resize_msg_buffer( + banks_client: &mut BanksClient, + admin: &Keypair, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + msg_buffer_bump: u8, + target_size: u32, +) -> anchor_lang::Result<()> { + let resize_ix = resize_msg_buffer_ix( + admin.pubkey(), + whitelist, + cpi_caller_auth, + pyth_price_acct, + msg_buffer_bump, + target_size, + ) + .await + .unwrap(); + + send_transaction(banks_client, &[resize_ix], admin.pubkey(), vec![admin]) + .await + .unwrap(); + Ok(()) +} + +fn add_price_ix( + id: u64, + price: u64, + price_expo: u64, + ema: u64, + ema_expo: u64, + pyth_price_account: Pubkey, + payer: Pubkey, + whitelist: Pubkey, + cpi_auth: Pubkey, + msg_buffer_pda: Pubkey, +) -> Result { + let add_price_disc = sighash("global", "add_price"); + + let add_price_ix = Instruction::new_with_borsh( + ::mock_cpi_caller::id(), + &(add_price_disc, id, price, price_expo, ema, ema_expo), + vec![ + AccountMeta::new(pyth_price_account, false), + AccountMeta::new(payer, true), + AccountMeta::new_readonly(System::id(), false), + AccountMeta::new_readonly(whitelist, false), + AccountMeta::new_readonly(cpi_auth, false), + AccountMeta::new_readonly(::message_buffer::id(), false), + AccountMeta::new(msg_buffer_pda, false), + ], + ); + Ok(add_price_ix) +} + +pub async fn send_add_price_ix( + banks_client: &mut BanksClient, + id: u64, + price: u64, + price_expo: u64, + ema: u64, + ema_expo: u64, + payer: &Keypair, + whitelist: Pubkey, + cpi_auth: Pubkey, + pyth_price_account: Pubkey, + msg_buffer_pda: Pubkey, +) -> Result<()> { + let add_price_ix = add_price_ix( + id, + price, + price_expo, + ema, + ema_expo, + pyth_price_account, + payer.pubkey(), + whitelist, + cpi_auth, + msg_buffer_pda, + )?; + + send_transaction(banks_client, &[add_price_ix], payer.pubkey(), vec![payer]) + .await + .unwrap(); + + // Ok((msg_buffer_pda, msg_buffer_bump)) + Ok(()) +} + + +pub async fn send_transaction( + banks_client: &mut BanksClient, + instructions: &[Instruction], + payer: Pubkey, + signers: Vec<&Keypair>, +) -> anchor_lang::Result<()> { + let recent_blockhash = banks_client.get_latest_blockhash().await.unwrap(); + + let transaction = + Transaction::new_signed_with_payer(instructions, Some(&payer), &signers, recent_blockhash); + banks_client.process_transaction(transaction).await.unwrap(); + Ok(()) +} + + +pub async fn fetch_whitelist( + banks_client: &mut BanksClient, + whitelist: &Pubkey, +) -> (u8, Pubkey, u32, Vec) { + let whitelist_account = banks_client.get_account(*whitelist).await.unwrap(); + assert!(whitelist_account.is_some()); + let whitelist_account = whitelist_account.unwrap(); + let account_data = whitelist_account.data(); + + let mut cursor = Cursor::new(account_data); + let discriminator = &mut vec![0u8; 8]; + cursor.read_exact(discriminator).unwrap(); + assert_eq!(discriminator, &sighash("account", "Whitelist")); + + + let whitelist_acct_bump = cursor.read_u8().unwrap(); + + let admin_bytes = &mut vec![0u8; 32]; + cursor.read_exact(admin_bytes).unwrap(); + let admin_pubkey = Pubkey::try_from_slice(admin_bytes).unwrap(); + + let allowed_programs_len = cursor.read_u32::().unwrap(); + + let mut allowed_programs = vec![]; + for _ in 0..allowed_programs_len { + let allowed_program_bytes = &mut vec![0u8; 32]; + cursor.read_exact(allowed_program_bytes).unwrap(); + let allowed_program_pubkey = Pubkey::try_from_slice(allowed_program_bytes).unwrap(); + allowed_programs.push(allowed_program_pubkey); + } + ( + whitelist_acct_bump, + admin_pubkey, + allowed_programs_len, + allowed_programs, + ) +} + +type Bump = u8; +type Version = u8; +type HeaderLen = u16; +type EndOffsets = [u16; 255]; + +pub async fn fetch_msg_buffer_account( + banks_client: &mut BanksClient, + msg_buffer: &Pubkey, +) -> Vec { + let msg_buffer_account = banks_client.get_account(*msg_buffer).await.unwrap(); + assert!(msg_buffer_account.is_some()); + let msg_buffer_account = msg_buffer_account.unwrap(); + msg_buffer_account.data +} + +pub async fn parse_msg_buffer_header( + account_data: &[u8], +) -> (Bump, Version, HeaderLen, EndOffsets) { + let mut cursor = Cursor::new(account_data); + let discriminator = &mut vec![0u8; 8]; + cursor.read_exact(discriminator).unwrap(); + assert_eq!(discriminator, &sighash("account", "MessageBuffer")); + + + let msg_buffer_acct_bump = cursor.read_u8().unwrap(); + let version = cursor.read_u8().unwrap(); + let header_len = cursor.read_u16::().unwrap(); + let mut end_offsets = [0u16; 255]; + for i in 0..255 { + let cur_end_offset = cursor.read_u16::().unwrap(); + end_offsets[i] = cur_end_offset; + } + + let mut messages = vec![]; + cursor.read_to_end(&mut messages).unwrap(); + + (msg_buffer_acct_bump, version, header_len, end_offsets) +} + +pub fn extract_msg_buffer_messages( + header_len: u16, + end_offsets: EndOffsets, + account_data: &[u8], +) -> Vec> { + let mut msgs = vec![]; + let mut msg_begin = header_len; + for end_offset in end_offsets { + if end_offset == 0 { + break; + } + let msg_end = header_len + end_offset; + msgs.push(account_data[(msg_begin as usize)..(msg_end as usize)].to_vec()); + msg_begin = msg_end; + } + msgs +} + +pub fn sighash(namespace: &str, name: &str) -> [u8; 8] { + let preimage = format!("{namespace}:{name}"); + + let mut sighash = [0u8; 8]; + sighash.copy_from_slice(&hashv(&[preimage.as_bytes()]).to_bytes()[..8]); + sighash +} + +// price::MessageHeader +type PriceMsgSchema = u8; +type PriceMsgVersion = u16; +type PriceMsgSize = u32; + +//price::FullPriceMessage & price::CompactPriceMessage +type PriceMsgId = u64; +type PriceMsgPrice = u64; +type PriceMsgPriceExpo = u64; +type PriceMsgEma = u64; +type PriceMsgEmaExpo = u64; + + +pub fn validate_price_msgs( + id: u64, + price: u64, + price_expo: u64, + ema: u64, + ema_expo: u64, + msgs: &Vec>, +) -> Result<()> { + for msg in msgs { + let (schema, _, _) = deserialize_price_msg_header(msg); + match schema { + 0 => verify_full_price_msg(id, price, price_expo, ema, ema_expo, msg)?, + 1 => verify_compact_price_msg(id, price, price_expo, msg)?, + _ => panic!(), + } + } + Ok(()) +} + +pub fn verify_full_price_msg( + id: u64, + price: u64, + price_expo: u64, + ema: u64, + ema_expo: u64, + msg: &[u8], +) -> Result<()> { + let mut cursor = Cursor::new(&msg[7..]); + let msg_id = cursor.read_u64::().unwrap(); + assert_eq!(id, msg_id); + let msg_price = cursor.read_u64::().unwrap(); + assert_eq!(price, msg_price); + let msg_price_expo = cursor.read_u64::().unwrap(); + assert_eq!(price_expo, msg_price_expo); + let msg_ema = cursor.read_u64::().unwrap(); + assert_eq!(ema, msg_ema); + let msg_ema_expo = cursor.read_u64::().unwrap(); + assert_eq!(ema_expo, msg_ema_expo); + Ok(()) +} + +pub fn verify_compact_price_msg(id: u64, price: u64, price_expo: u64, msg: &[u8]) -> Result<()> { + let mut cursor = Cursor::new(&msg[7..]); + let msg_id = cursor.read_u64::().unwrap(); + assert_eq!(id, msg_id); + let msg_price = cursor.read_u64::().unwrap(); + assert_eq!(price, msg_price); + let msg_price_expo = cursor.read_u64::().unwrap(); + assert_eq!(price_expo, msg_price_expo); + Ok(()) +} + +pub fn validate_dummy_price_msgs(_msgs: &[&[u8]], _msg_sizes: &Vec) -> Result<()> { + Ok(()) +} + +pub fn deserialize_price_msg_header(msg: &[u8]) -> (PriceMsgSchema, PriceMsgVersion, PriceMsgSize) { + let mut cursor = Cursor::new(msg); + let schema = cursor.read_u8().unwrap(); + let version = cursor.read_u16::().unwrap(); + let size = cursor.read_u32::().unwrap(); + (schema, version, size) +} + +// hacky way to deserialize all price messsage types +// pub fn deserialize_price_msg(msg: &[u8]) -> Vec { +// let (schema, _, _) = deserialize_price_msg_header(msg); +// match schema { +// 0 => deserialize_full_price_msg(msg), +// 1 => deserialize_compact_price_msg(msg), +// 3 => deserialize_dummy_msg(msg), +// _ => panic!(), +// } +// } +// +// pub fn deserialize_full_price_msg(msg: &[u8]) -> Vec { +// let mut cus; +// vec![] +// } diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs new file mode 100644 index 0000000000..72328dce78 --- /dev/null +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs @@ -0,0 +1,582 @@ +#![cfg(feature = "test-bpf")] + +use { + crate::program_test::*, + solana_program_test::tokio, + solana_sdk::{ + pubkey::Pubkey, + signature::{ + Keypair, + Signer, + }, + }, +}; + +pub mod program_test; + +#[tokio::test] +async fn test_msg_buffer_setup() { + let pt_ctxt = &mut setup_program_test(false).await; + + // Initialize whitelist + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, whitelist_bump) = + send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = + fetch_whitelist(banks_client, &whitelist_pda).await; + + assert_eq!(whitelist_bump, whitelist_acct_bump); + assert_eq!(payer.pubkey(), admin_pubkey); + + assert_eq!(0, allowed_programs_len); + assert_eq!(allowed_programs, vec![]); + + // Add MockCpiProgram auth pda to allowed programs + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + + let (_, _, allowed_programs_len, updated_allowed_programs) = + fetch_whitelist(banks_client, &whitelist_pda).await; + + assert_eq!(1, allowed_programs_len); + assert_eq!(allowed_programs, updated_allowed_programs); +} + +#[tokio::test] +async fn test_create_msg_buffer() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let space = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, _header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + assert_eq!(end_offsets, [0u16; 255]); +} + +#[tokio::test] +#[should_panic] +async fn fail_create_msg_buffer_with_invalid_admin() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let space = 1024; + let invalid_admin = Keypair::new(); + send_create_msg_buffer( + banks_client, + &invalid_admin, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_create_msg_buffer_with_invalid_size() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let space = 1; + send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_resize_buffer() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // increase buffer size + let mut new_target_size = target_size + 10240; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); + + // decrease buffer size to less than original + new_target_size -= 10240 + 100; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); +} + +#[tokio::test] +async fn test_multiple_resize_buffer_ixs() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // increase buffer size + let mut new_target_size = target_size + 10240; + let admin = payer; + let resize_ix_1 = resize_msg_buffer_ix( + admin.pubkey(), + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + new_target_size += 10240; + + let resize_ix_2 = resize_msg_buffer_ix( + admin.pubkey(), + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + send_transaction( + banks_client, + &[resize_ix_1, resize_ix_2], + payer.pubkey(), + vec![admin, payer], + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); +} + +#[tokio::test] +#[should_panic] +async fn fail_resize_buffer_invalid_increase() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + assert_eq!(msg_buffer_account_data.len(), target_size as usize); + + // max increase is +10240 + let new_target_size = target_size + 10240 + 100; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_resize_buffer_invalid_decrease() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let target_size = 1024; + let (_, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // decrease buffer size to invalid size + let new_target_size = 1; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_put_all() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[ + b"pyth".as_ref(), + b"price".as_ref(), + &pyth_price_acct_id.to_le_bytes(), + ], + &::mock_cpi_caller::id(), + ); + let space = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, _header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + assert_eq!(end_offsets, [0u16; 255]); + + let (id, price, price_expo, ema, ema_expo) = (pyth_price_acct_id, 2u64, 3u64, 4u64, 5u64); + send_add_price_ix( + banks_client, + id, + price, + price_expo, + ema, + ema_expo, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_pda, + ) + .await + .unwrap(); + + let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + // size_of(price::MessageHeader) + FullPriceMessage::SIZE + let msg_size_0 = 7 + 40; + // size_of(price::MessageHeader) + CompactPriceMessage::SIZE + let msg_size_1 = 7 + 24; + assert_eq!(&end_offsets[0..2], &[msg_size_0, msg_size_0 + msg_size_1]); + + assert_eq!(&end_offsets[2..], &[0u16; 253]); + + let msgs = extract_msg_buffer_messages(header_len, end_offsets, &msg_buffer_account_data); + + validate_price_msgs(id, price, price_expo, ema, ema_expo, &msgs).unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_put_all_invalid_auth() { + panic!() +} + +#[tokio::test] +async fn test_delete_buffer() { +} + +#[tokio::test] +#[should_panic] +async fn fail_delete_buffer_invalid_admin() { + panic!() +} + +#[tokio::test] +#[should_panic] +async fn fail_delete_buffer_invalid_account() { + panic!() +} diff --git a/pythnet/message_buffer/rust-toolchain.toml b/pythnet/message_buffer/rust-toolchain.toml new file mode 100644 index 0000000000..f701aa5354 --- /dev/null +++ b/pythnet/message_buffer/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "1.66.1" diff --git a/pythnet/message_buffer/tests/message_buffer.ts b/pythnet/message_buffer/tests/message_buffer.ts index 4828e30165..ed833d38bc 100644 --- a/pythnet/message_buffer/tests/message_buffer.ts +++ b/pythnet/message_buffer/tests/message_buffer.ts @@ -22,7 +22,8 @@ const mockCpiProg = anchor.workspace.MockCpiCaller as Program; let whitelistAdmin = anchor.web3.Keypair.generate(); const [mockCpiCallerAuth] = anchor.web3.PublicKey.findProgramAddressSync( - [messageBufferProgram.programId.toBuffer(), Buffer.from("cpi")], + // [messageBufferProgram.programId.toBuffer(), Buffer.from("cpi")], + [Buffer.from("upd_price_write"), messageBufferProgram.programId.toBuffer()], mockCpiProg.programId ); @@ -43,7 +44,7 @@ const [pythPriceAccountPk] = anchor.web3.PublicKey.findProgramAddressSync( mockCpiProg.programId ); const MESSAGE = Buffer.from("message"); -const [accumulatorPdaKey, accumulatorPdaBump] = +const [messageBufferPda, messageBufferBump] = anchor.web3.PublicKey.findProgramAddressSync( [mockCpiCallerAuth.toBuffer(), MESSAGE, pythPriceAccountPk.toBuffer()], messageBufferProgram.programId @@ -59,14 +60,14 @@ const [pythPriceAccountPk2] = anchor.web3.PublicKey.findProgramAddressSync( mockCpiProg.programId ); -const [accumulatorPdaKey2, accumulatorPdaBump2] = +const [messageBufferPda2, messageBufferBump2] = anchor.web3.PublicKey.findProgramAddressSync( [mockCpiCallerAuth.toBuffer(), MESSAGE, pythPriceAccountPk2.toBuffer()], messageBufferProgram.programId ); const accumulatorPdaMeta2 = { - pubkey: accumulatorPdaKey2, + pubkey: messageBufferPda2, isSigner: false, isWritable: true, }; @@ -107,6 +108,14 @@ describe("accumulator_updater", () => { it("Is initialized!", async () => { // Add your test here. + // const initTxn = await messageBufferProgram.methods + // .initialize(whitelistAdmin.publicKey) + // .accounts({}).transaction(); + // console.log(`initTxn: ${JSON.stringify(initTxn)}`); + // const tx = await provider.sendAndConfirm(initTxn); + // + // const compiled = initTxn.compileMessage() + // console.log(`compiled: ${JSON.stringify(compiled)}`); const tx = await messageBufferProgram.methods .initialize(whitelistAdmin.publicKey) .accounts({}) @@ -146,7 +155,7 @@ describe("accumulator_updater", () => { it("Creates a buffer", async () => { const accumulatorPdaMetas = [ { - pubkey: accumulatorPdaKey, + pubkey: messageBufferPda, isSigner: false, isWritable: true, }, @@ -165,14 +174,14 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey + messageBufferPda ); const messageBufferHeader = deserializeMessageBufferHeader( messageBufferProgram, messageBufferAccountData ); assert.equal(messageBufferHeader.version, 1); - assert.equal(messageBufferHeader.bump, accumulatorPdaBump); + assert.equal(messageBufferHeader.bump, messageBufferBump); }); it("Creates a buffer even if the account already has lamports", async () => { @@ -184,7 +193,7 @@ describe("accumulator_updater", () => { tx.add( anchor.web3.SystemProgram.transfer({ fromPubkey: provider.wallet.publicKey, - toPubkey: accumulatorPdaKey2, + toPubkey: messageBufferPda2, lamports: minimumEmptyRent, }) ); @@ -193,7 +202,7 @@ describe("accumulator_updater", () => { ); const accumulatorPdaBalance = await provider.connection.getBalance( - accumulatorPdaKey2 + messageBufferPda2 ); console.log(`accumulatorPdaBalance: ${accumulatorPdaBalance}`); assert.isTrue(accumulatorPdaBalance === minimumEmptyRent); @@ -211,7 +220,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); const minimumMessageBufferRent = @@ -219,7 +228,7 @@ describe("accumulator_updater", () => { messageBufferAccountData.length ); const accumulatorPdaBalanceAfter = await provider.connection.getBalance( - accumulatorPdaKey2 + messageBufferPda2 ); assert.isTrue(accumulatorPdaBalanceAfter === minimumMessageBufferRent); const messageBufferHeader = deserializeMessageBufferHeader( @@ -228,8 +237,8 @@ describe("accumulator_updater", () => { ); console.log(`header: ${JSON.stringify(messageBufferHeader)}`); - assert.equal(messageBufferHeader.bump, accumulatorPdaBump2); - assert.equal(messageBufferAccountData[8], accumulatorPdaBump2); + assert.equal(messageBufferHeader.bump, messageBufferBump2); + assert.equal(messageBufferAccountData[8], messageBufferBump2); assert.equal(messageBufferHeader.version, 1); }); @@ -277,7 +286,7 @@ describe("accumulator_updater", () => { const accumulatorPdaMetas = [ { - pubkey: accumulatorPdaKey, + pubkey: messageBufferPda, isSigner: false, isWritable: true, }, @@ -329,7 +338,7 @@ describe("accumulator_updater", () => { ); const messageBufferAccount = await provider.connection.getAccountInfo( - accumulatorPdaKey + messageBufferPda ); const accumulatorPriceMessages = parseMessageBuffer( @@ -363,7 +372,7 @@ describe("accumulator_updater", () => { ); assert.isTrue(messageBufferAccounts.length === 2); - msgBufferAcctKeys.includes(accumulatorPdaKey.toString()); + msgBufferAcctKeys.includes(messageBufferPda.toString()); }); it("Mock CPI Program - UpdatePrice", async () => { @@ -404,7 +413,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey + messageBufferPda ); const updatedAccumulatorPriceMessages = parseMessageBuffer( @@ -471,7 +480,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey + messageBufferPda ); const messageBufferHeader = deserializeMessageBufferHeader( @@ -542,7 +551,7 @@ describe("accumulator_updater", () => { it("Resizes a buffer to a valid larger size", async () => { const messageBufferAccountDataBefore = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); const messageBufferAccountDataLenBefore = messageBufferAccountDataBefore.length; @@ -563,7 +572,7 @@ describe("accumulator_updater", () => { .resizeBuffer( mockCpiCallerAuth, pythPriceAccountPk2, - accumulatorPdaBump2, + messageBufferBump2, targetSize ) .accounts({ @@ -584,7 +593,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); assert.equal(messageBufferAccountData.length, targetSize); @@ -609,7 +618,7 @@ describe("accumulator_updater", () => { .resizeBuffer( mockCpiCallerAuth, pythPriceAccountPk2, - accumulatorPdaBump2, + messageBufferBump2, targetSize ) .accounts({ @@ -623,7 +632,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); assert.equal(messageBufferAccountData.length, targetSize); }); @@ -638,7 +647,7 @@ describe("accumulator_updater", () => { .resizeBuffer( mockCpiCallerAuth, pythPriceAccountPk2, - accumulatorPdaBump2, + messageBufferBump2, testCase ) .accounts({ @@ -658,7 +667,7 @@ describe("accumulator_updater", () => { it("Deletes a buffer", async () => { await messageBufferProgram.methods - .deleteBuffer(mockCpiCallerAuth, pythPriceAccountPk2, accumulatorPdaBump2) + .deleteBuffer(mockCpiCallerAuth, pythPriceAccountPk2, messageBufferBump2) .accounts({ whitelist: whitelistPubkey, admin: whitelistAdmin.publicKey, @@ -669,7 +678,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); if (messageBufferAccountData != null) { @@ -684,7 +693,7 @@ describe("accumulator_updater", () => { assert.isFalse( messageBufferAccounts .map((a) => a.pubkey.toString()) - .includes(accumulatorPdaKey2.toString()) + .includes(messageBufferPda2.toString()) ); }); @@ -702,7 +711,7 @@ describe("accumulator_updater", () => { const messageBufferAccountData = await getMessageBuffer( provider.connection, - accumulatorPdaKey2 + messageBufferPda2 ); const minimumMessageBufferRent = @@ -710,7 +719,7 @@ describe("accumulator_updater", () => { messageBufferAccountData.length ); const accumulatorPdaBalanceAfter = await provider.connection.getBalance( - accumulatorPdaKey2 + messageBufferPda2 ); assert.isTrue(accumulatorPdaBalanceAfter === minimumMessageBufferRent); const messageBufferHeader = deserializeMessageBufferHeader( @@ -719,8 +728,8 @@ describe("accumulator_updater", () => { ); console.log(`header: ${JSON.stringify(messageBufferHeader)}`); - assert.equal(messageBufferHeader.bump, accumulatorPdaBump2); - assert.equal(messageBufferAccountData[8], accumulatorPdaBump2); + assert.equal(messageBufferHeader.bump, messageBufferBump2); + assert.equal(messageBufferAccountData[8], messageBufferBump2); assert.equal(messageBufferHeader.version, 1); }); From 709b2c38fdd8a2584d01ba22f7efc49eac451b97 Mon Sep 17 00:00:00 2001 From: swimricky Date: Tue, 2 May 2023 15:34:23 -0400 Subject: [PATCH 02/12] refactor(message-buffer): remove unused test ix --- .../programs/message_buffer/src/lib.rs | 79 ------------------- 1 file changed, 79 deletions(-) diff --git a/pythnet/message_buffer/programs/message_buffer/src/lib.rs b/pythnet/message_buffer/programs/message_buffer/src/lib.rs index 0501072544..8c7f294d3e 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/lib.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/lib.rs @@ -15,62 +15,13 @@ declare_id!("Vbmv1jt4vyuqBZcpYPpnVhrqVe5e6ZPb6JxDcffRHUM"); pub mod message_buffer { use super::*; - pub fn test(ctx: Context, admin: Pubkey) -> Result<()> { - use anchor_lang::{ - prelude::*, - system_program::{ - self, - Transfer, - }, - }; - msg!("in test"); - let (whitelist_pda, whitelist_bump) = - Pubkey::find_program_address(&[b"message", b"whitelist"], &crate::ID); - msg!("crate_id: {:?}", crate::ID); - let payer_pk = ctx.accounts.payer.key(); - msg!("payer_pk: {:?}", payer_pk); - msg!("admin: {:?}", admin); - msg!( - "whitelist_pda: {:?}, whitelist_bump: {:?}", - whitelist_pda, - whitelist_bump - ); - let whitelist_acct_pk = ctx.accounts.whitelist.key(); - msg!("whitelist_acct_pk: {:?}", whitelist_acct_pk); - - // let whitelist = &mut ctx.accounts.whitelist; - // whitelist.bump = w_bump; - - // let whitelist_bump = *ctx.bumps.get("whitelist").unwrap(); - // msg!("whitelist_bump: {:?}", whitelist_bump); - // whitelist.admin = Pubkey::default(); - // let init = &mut ctx.accounts.init; - // init.bump = *ctx.bumps.get("init").unwrap(); - // msg!("[test]: initialized init"); - let system_prog = ctx.accounts.system_program.key(); - msg!("system_prog: {:?}", system_prog); - system_program::transfer( - CpiContext::new( - ctx.accounts.system_program.to_account_info(), - Transfer { - from: ctx.accounts.payer.to_account_info(), - to: ctx.accounts.whitelist.to_account_info(), - }, - ), - Rent::get()?.minimum_balance(0), - )?; - msg!("transferred to payer"); - Ok(()) - } /// Initializes the whitelist and sets it's admin to the provided pubkey /// Once initialized, the authority must sign all further changes to the whitelist. pub fn initialize(ctx: Context, admin: Pubkey) -> Result<()> { require_keys_neq!(admin, Pubkey::default()); - msg!("in initialize"); let whitelist = &mut ctx.accounts.whitelist; whitelist.bump = *ctx.bumps.get("whitelist").unwrap(); - // whitelist.bump = bump; whitelist.admin = admin; Ok(()) } @@ -198,36 +149,6 @@ pub mod message_buffer { } } -#[derive(Accounts)] -pub struct Test<'info> { - #[account(mut)] - pub payer: Signer<'info>, - - // #[account( - // init, - // payer = payer, - // seeds = [b"message".as_ref(), b"whitelist".as_ref()], - // bump, - // space = 8 + Whitelist::INIT_SPACE, - // )] - // pub whitelist: Account<'info, Whitelist>, - #[account( - seeds = [b"message".as_ref(), b"whitelist".as_ref()], - bump, - )] - /// CHECK: test - pub whitelist: UncheckedAccount<'info>, - pub system_program: Program<'info, System>, - // #[account( - // init, - // payer = payer, - // seeds = [b"message".as_ref(), b"init".as_ref()], - // bump, - // space = 8, - // )] - // pub init: Account<'info, Init>, -} - #[account] pub struct Init { pub bump: u8, From 71b9065dd182b15408f0957f66a17c5c03987cbb Mon Sep 17 00:00:00 2001 From: swimricky Date: Tue, 2 May 2023 15:38:13 -0400 Subject: [PATCH 03/12] chore(message-buffer): clean up --- .../programs/message_buffer/src/lib.rs | 5 ----- .../src/instructions/update_price.rs | 18 ------------------ pythnet/message_buffer/tests/message_buffer.ts | 9 --------- 3 files changed, 32 deletions(-) diff --git a/pythnet/message_buffer/programs/message_buffer/src/lib.rs b/pythnet/message_buffer/programs/message_buffer/src/lib.rs index 8c7f294d3e..619db99574 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/lib.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/lib.rs @@ -149,11 +149,6 @@ pub mod message_buffer { } } -#[account] -pub struct Init { - pub bump: u8, -} - #[derive(Accounts)] pub struct Initialize<'info> { #[account(mut)] diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs index e6e0968823..814b76bed4 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/update_price.rs @@ -124,27 +124,9 @@ impl<'info> UpdatePrice<'info> { &[&[ UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - // ctx.accounts.message_buffer_program.key().as_ref(), - // UPD_PRICE_WRITE.as_bytes(), &[bump], ]], )?; - // let (_, bump) = Pubkey::find_program_address( - // &[ - // ctx.accounts.message_buffer_program.key().as_ref(), - // UPD_PRICE_WRITE.as_bytes(), - // ], - // &crate::ID, - // ); - // anchor_lang::solana_program::program::invoke_signed( - // &update_inputs_ix, - // account_infos, - // &[&[ - // ctx.accounts.message_buffer_program.key().as_ref(), - // UPD_PRICE_WRITE.as_bytes(), - // &[bump], - // ]], - // )?; Ok(()) } } diff --git a/pythnet/message_buffer/tests/message_buffer.ts b/pythnet/message_buffer/tests/message_buffer.ts index ed833d38bc..c1a71ffd2c 100644 --- a/pythnet/message_buffer/tests/message_buffer.ts +++ b/pythnet/message_buffer/tests/message_buffer.ts @@ -22,7 +22,6 @@ const mockCpiProg = anchor.workspace.MockCpiCaller as Program; let whitelistAdmin = anchor.web3.Keypair.generate(); const [mockCpiCallerAuth] = anchor.web3.PublicKey.findProgramAddressSync( - // [messageBufferProgram.programId.toBuffer(), Buffer.from("cpi")], [Buffer.from("upd_price_write"), messageBufferProgram.programId.toBuffer()], mockCpiProg.programId ); @@ -108,14 +107,6 @@ describe("accumulator_updater", () => { it("Is initialized!", async () => { // Add your test here. - // const initTxn = await messageBufferProgram.methods - // .initialize(whitelistAdmin.publicKey) - // .accounts({}).transaction(); - // console.log(`initTxn: ${JSON.stringify(initTxn)}`); - // const tx = await provider.sendAndConfirm(initTxn); - // - // const compiled = initTxn.compileMessage() - // console.log(`compiled: ${JSON.stringify(compiled)}`); const tx = await messageBufferProgram.methods .initialize(whitelistAdmin.publicKey) .accounts({}) From 3231c47688359196296d87c3eb5a0dd3a9ce8d4d Mon Sep 17 00:00:00 2001 From: swimricky Date: Tue, 2 May 2023 15:48:40 -0400 Subject: [PATCH 04/12] refactor(message-buffer): simple refactor --- .../mock-cpi-caller/tests/program_test/mod.rs | 23 ++---- .../mock-cpi-caller/tests/test_all.rs | 76 +++---------------- 2 files changed, 20 insertions(+), 79 deletions(-) diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs index 150730cf0e..89cc270fea 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs @@ -535,18 +535,11 @@ pub fn deserialize_price_msg_header(msg: &[u8]) -> (PriceMsgSchema, PriceMsgVers (schema, version, size) } -// hacky way to deserialize all price messsage types -// pub fn deserialize_price_msg(msg: &[u8]) -> Vec { -// let (schema, _, _) = deserialize_price_msg_header(msg); -// match schema { -// 0 => deserialize_full_price_msg(msg), -// 1 => deserialize_compact_price_msg(msg), -// 3 => deserialize_dummy_msg(msg), -// _ => panic!(), -// } -// } -// -// pub fn deserialize_full_price_msg(msg: &[u8]) -> Vec { -// let mut cus; -// vec![] -// } + +pub fn get_mock_pyth_price_account(id: u64) -> Pubkey { + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[b"pyth".as_ref(), b"price".as_ref(), &id.to_le_bytes()], + &::mock_cpi_caller::id(), + ); + mock_pyth_price_acct +} diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs index 72328dce78..1a56e44338 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs @@ -74,14 +74,7 @@ async fn test_create_msg_buffer() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let space = 1024; let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -127,14 +120,7 @@ async fn fail_create_msg_buffer_with_invalid_admin() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let space = 1024; let invalid_admin = Keypair::new(); send_create_msg_buffer( @@ -171,14 +157,7 @@ async fn fail_create_msg_buffer_with_invalid_size() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let space = 1; send_create_msg_buffer( banks_client, @@ -213,14 +192,7 @@ async fn test_resize_buffer() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let target_size = 1024; let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -291,14 +263,7 @@ async fn test_multiple_resize_buffer_ixs() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let target_size = 1024; let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -374,14 +339,7 @@ async fn fail_resize_buffer_invalid_increase() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let target_size = 1024; let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -434,14 +392,7 @@ async fn fail_resize_buffer_invalid_decrease() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let target_size = 1024; let (_, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -490,14 +441,7 @@ async fn test_put_all() { .await .unwrap(); let pyth_price_acct_id = 0u64; - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[ - b"pyth".as_ref(), - b"price".as_ref(), - &pyth_price_acct_id.to_le_bytes(), - ], - &::mock_cpi_caller::id(), - ); + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); let space = 1024; let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( banks_client, @@ -565,6 +509,10 @@ async fn fail_put_all_invalid_auth() { panic!() } +#[tokio::test] +async fn test_resize_initialized_buffer() { +} + #[tokio::test] async fn test_delete_buffer() { } From bfa51060e12f579748f2a2121b336260208215a9 Mon Sep 17 00:00:00 2001 From: swimricky Date: Wed, 3 May 2023 08:45:47 -0400 Subject: [PATCH 05/12] test(message-buffer): refactor integration test structure --- .../mock-cpi-caller/tests/cases/mod.rs | 23 + .../tests/cases/test_create_msg_buffer.rs | 113 ++++ .../tests/cases/test_delete_buffer.rs | 63 +++ .../tests/cases/test_initialize.rs | 24 + .../tests/cases/test_put_all.rs | 89 +++ .../tests/cases/test_resize_buffer.rs | 249 +++++++++ .../tests/cases/test_set_allowed_programs.rs | 39 ++ .../mock-cpi-caller/tests/program_test/mod.rs | 72 ++- .../mock-cpi-caller/tests/test_all.rs | 528 +----------------- 9 files changed, 672 insertions(+), 528 deletions(-) create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs new file mode 100644 index 0000000000..ba9206a19b --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs @@ -0,0 +1,23 @@ +// use test_all::program_test::{ +// fetch_whitelist, +// send_initialize_whitelist, +// setup_program_test, +// }; +pub use { + super::program_test::*, + solana_program_test::*, + solana_sdk::{ + pubkey::Pubkey, + signature::{ + Keypair, + Signer, + }, + }, +}; + +mod test_create_msg_buffer; +mod test_delete_buffer; +mod test_initialize; +mod test_put_all; +mod test_resize_buffer; +mod test_set_allowed_programs; diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs new file mode 100644 index 0000000000..6d8860669b --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs @@ -0,0 +1,113 @@ +use super::*; + +#[tokio::test] +async fn test_create_msg_buffer() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let space = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, _header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + assert_eq!(end_offsets, [0u16; 255]); +} + +#[tokio::test] +#[should_panic] +async fn fail_create_msg_buffer_with_invalid_admin() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let space = 1024; + let invalid_admin = Keypair::new(); + send_create_msg_buffer( + banks_client, + &invalid_admin, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_create_msg_buffer_with_invalid_size() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let space = 1; + send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs new file mode 100644 index 0000000000..4430178ba1 --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs @@ -0,0 +1,63 @@ +use super::*; + +#[tokio::test] +async fn test_delete_buffer() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + let payer_lamports_before = banks_client.get_balance(payer.pubkey()).await.unwrap(); + + send_delete_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + ) + .await + .unwrap(); + + let msg_buffer_account = banks_client.get_account(msg_buffer_pda).await.unwrap(); + assert!(msg_buffer_account.is_none()); + let payer_lamports_after = banks_client.get_balance(payer.pubkey()).await.unwrap(); + assert!(payer_lamports_before < payer_lamports_after); +} + +#[tokio::test] +#[should_panic] +async fn fail_delete_buffer_invalid_admin() { + panic!() +} + +#[tokio::test] +#[should_panic] +async fn fail_delete_buffer_invalid_account() { + panic!() +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs new file mode 100644 index 0000000000..399b45f5ec --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs @@ -0,0 +1,24 @@ +use super::*; + +#[tokio::test] +async fn test_initialize() { + let pt_ctxt = &mut setup_program_test(false).await; + + // Initialize whitelist + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, whitelist_bump) = + send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = + fetch_whitelist(banks_client, &whitelist_pda).await; + + assert_eq!(whitelist_bump, whitelist_acct_bump); + assert_eq!(payer.pubkey(), admin_pubkey); + + assert_eq!(0, allowed_programs_len); + assert_eq!(allowed_programs, vec![]); +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs new file mode 100644 index 0000000000..a506a897c8 --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs @@ -0,0 +1,89 @@ +use super::*; + +#[tokio::test] +async fn test_put_all() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let space = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + space, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, _header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + assert_eq!(end_offsets, [0u16; 255]); + + let (id, price, price_expo, ema, ema_expo) = (pyth_price_acct_id, 2u64, 3u64, 4u64, 5u64); + send_add_price_ix( + banks_client, + id, + price, + price_expo, + ema, + ema_expo, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_pda, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, header_len, end_offsets) = + parse_msg_buffer_header(&msg_buffer_account_data).await; + + assert_eq!(bump, msg_buffer_bump); + // size_of(price::MessageHeader) + FullPriceMessage::SIZE + let msg_size_0 = 7 + 40; + // size_of(price::MessageHeader) + CompactPriceMessage::SIZE + let msg_size_1 = 7 + 24; + assert_eq!(&end_offsets[0..2], &[msg_size_0, msg_size_0 + msg_size_1]); + + assert_eq!(&end_offsets[2..], &[0u16; 253]); + + let msgs = extract_msg_buffer_messages(header_len, end_offsets, &msg_buffer_account_data); + + validate_price_msgs(id, price, price_expo, ema, ema_expo, &msgs).unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_put_all_invalid_auth() { + panic!() +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs new file mode 100644 index 0000000000..cccab266e2 --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs @@ -0,0 +1,249 @@ +use super::*; + +#[tokio::test] +async fn test_resize_buffer() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // increase buffer size + let mut new_target_size = target_size + 10240; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); + + // decrease buffer size to less than original + new_target_size -= 10240 + 100; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); +} + +#[tokio::test] +async fn test_multiple_resize_buffer_ixs() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // increase buffer size + let mut new_target_size = target_size + 10240; + let admin = payer; + let resize_ix_1 = resize_msg_buffer_ix( + admin.pubkey(), + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + new_target_size += 10240; + + let resize_ix_2 = resize_msg_buffer_ix( + admin.pubkey(), + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); + + send_transaction( + banks_client, + &[resize_ix_1, resize_ix_2], + payer.pubkey(), + vec![admin, payer], + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + + assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); +} + +#[tokio::test] +#[should_panic] +async fn fail_resize_buffer_invalid_increase() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let target_size = 1024; + let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + let msg_buffer_account_data = + fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + assert_eq!(msg_buffer_account_data.len(), target_size as usize); + + // max increase is +10240 + let new_target_size = target_size + 10240 + 100; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); +} + +#[tokio::test] +#[should_panic] +async fn fail_resize_buffer_invalid_decrease() { + let pt_ctxt = &mut setup_program_test(false).await; + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + let pyth_price_acct_id = 0u64; + let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); + let target_size = 1024; + let (_, msg_buffer_bump) = send_create_msg_buffer( + banks_client, + payer, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + target_size, + ) + .await + .unwrap(); + + // decrease buffer size to invalid size + let new_target_size = 1; + send_resize_msg_buffer( + banks_client, + payer, + whitelist_pda, + mock_cpi_caller_auth, + mock_pyth_price_acct, + msg_buffer_bump, + new_target_size, + ) + .await + .unwrap(); +} + +#[tokio::test] +async fn test_resize_initialized_buffer() { +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs new file mode 100644 index 0000000000..edc39b74c5 --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs @@ -0,0 +1,39 @@ +use super::*; + +#[tokio::test] +async fn test_set_allowed_programs() { + let pt_ctxt = &mut setup_program_test(false).await; + + // Initialize whitelist + + let banks_client = &mut pt_ctxt.banks_client; + let payer = &pt_ctxt.payer; + let (whitelist_pda, whitelist_bump) = + send_initialize_whitelist(banks_client, payer.pubkey(), payer) + .await + .unwrap(); + + let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = + fetch_whitelist(banks_client, &whitelist_pda).await; + + assert_eq!(whitelist_bump, whitelist_acct_bump); + assert_eq!(payer.pubkey(), admin_pubkey); + + assert_eq!(0, allowed_programs_len); + assert_eq!(allowed_programs, vec![]); + + // Add MockCpiProgram auth pda to allowed programs + let mock_cpi_caller_auth = get_mock_cpi_auth(); + + + let allowed_programs = vec![mock_cpi_caller_auth]; + send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + .await + .unwrap(); + + let (_, _, allowed_programs_len, updated_allowed_programs) = + fetch_whitelist(banks_client, &whitelist_pda).await; + + assert_eq!(1, allowed_programs_len); + assert_eq!(allowed_programs, updated_allowed_programs); +} diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs index 89cc270fea..96b9d4ccb6 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs @@ -275,6 +275,68 @@ pub async fn send_resize_msg_buffer( Ok(()) } +pub async fn delete_msg_buffer_ix( + admin: Pubkey, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + msg_buffer_bump: u8, +) -> anchor_lang::Result { + let msg_buffer_pda = Pubkey::create_program_address( + &[ + cpi_caller_auth.as_ref(), + b"message".as_ref(), + pyth_price_acct.as_ref(), + &[msg_buffer_bump], + ], + &::message_buffer::id(), + ) + .unwrap(); + + + let delete_ix_disc = sighash("global", "delete_buffer"); + + let delete_ix = Instruction::new_with_borsh( + ::message_buffer::id(), + &( + delete_ix_disc, + cpi_caller_auth, + pyth_price_acct, + msg_buffer_bump, + ), + vec![ + AccountMeta::new_readonly(whitelist, false), + AccountMeta::new(admin, true), + AccountMeta::new(msg_buffer_pda, false), + ], + ); + Ok(delete_ix) +} + +pub async fn send_delete_msg_buffer( + banks_client: &mut BanksClient, + admin: &Keypair, + whitelist: Pubkey, + cpi_caller_auth: Pubkey, + pyth_price_acct: Pubkey, + msg_buffer_bump: u8, +) -> anchor_lang::Result<()> { + let delete_ix = delete_msg_buffer_ix( + admin.pubkey(), + whitelist, + cpi_caller_auth, + pyth_price_acct, + msg_buffer_bump, + ) + .await + .unwrap(); + + send_transaction(banks_client, &[delete_ix], admin.pubkey(), vec![admin]) + .await + .unwrap(); + Ok(()) +} + fn add_price_ix( id: u64, price: u64, @@ -398,7 +460,7 @@ type Version = u8; type HeaderLen = u16; type EndOffsets = [u16; 255]; -pub async fn fetch_msg_buffer_account( +pub async fn fetch_msg_buffer_account_data( banks_client: &mut BanksClient, msg_buffer: &Pubkey, ) -> Vec { @@ -543,3 +605,11 @@ pub fn get_mock_pyth_price_account(id: u64) -> Pubkey { ); mock_pyth_price_acct } + +pub fn get_mock_cpi_auth() -> Pubkey { + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + mock_cpi_caller_auth +} diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs index 1a56e44338..1e9bdcecfe 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/test_all.rs @@ -1,530 +1,4 @@ #![cfg(feature = "test-bpf")] -use { - crate::program_test::*, - solana_program_test::tokio, - solana_sdk::{ - pubkey::Pubkey, - signature::{ - Keypair, - Signer, - }, - }, -}; - +mod cases; pub mod program_test; - -#[tokio::test] -async fn test_msg_buffer_setup() { - let pt_ctxt = &mut setup_program_test(false).await; - - // Initialize whitelist - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, whitelist_bump) = - send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = - fetch_whitelist(banks_client, &whitelist_pda).await; - - assert_eq!(whitelist_bump, whitelist_acct_bump); - assert_eq!(payer.pubkey(), admin_pubkey); - - assert_eq!(0, allowed_programs_len); - assert_eq!(allowed_programs, vec![]); - - // Add MockCpiProgram auth pda to allowed programs - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - - let (_, _, allowed_programs_len, updated_allowed_programs) = - fetch_whitelist(banks_client, &whitelist_pda).await; - - assert_eq!(1, allowed_programs_len); - assert_eq!(allowed_programs, updated_allowed_programs); -} - -#[tokio::test] -async fn test_create_msg_buffer() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), space as usize); - - let (bump, _version, _header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; - - assert_eq!(bump, msg_buffer_bump); - assert_eq!(end_offsets, [0u16; 255]); -} - -#[tokio::test] -#[should_panic] -async fn fail_create_msg_buffer_with_invalid_admin() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let invalid_admin = Keypair::new(); - send_create_msg_buffer( - banks_client, - &invalid_admin, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); -} - -#[tokio::test] -#[should_panic] -async fn fail_create_msg_buffer_with_invalid_size() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1; - send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); -} - -#[tokio::test] -async fn test_resize_buffer() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - - // increase buffer size - let mut new_target_size = target_size + 10240; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); - - // decrease buffer size to less than original - new_target_size -= 10240 + 100; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); -} - -#[tokio::test] -async fn test_multiple_resize_buffer_ixs() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - - // increase buffer size - let mut new_target_size = target_size + 10240; - let admin = payer; - let resize_ix_1 = resize_msg_buffer_ix( - admin.pubkey(), - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - - new_target_size += 10240; - - let resize_ix_2 = resize_msg_buffer_ix( - admin.pubkey(), - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - - send_transaction( - banks_client, - &[resize_ix_1, resize_ix_2], - payer.pubkey(), - vec![admin, payer], - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); -} - -#[tokio::test] -#[should_panic] -async fn fail_resize_buffer_invalid_increase() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - assert_eq!(msg_buffer_account_data.len(), target_size as usize); - - // max increase is +10240 - let new_target_size = target_size + 10240 + 100; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); -} - -#[tokio::test] -#[should_panic] -async fn fail_resize_buffer_invalid_decrease() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (_, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - - // decrease buffer size to invalid size - let new_target_size = 1; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); -} - -#[tokio::test] -async fn test_put_all() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), space as usize); - - let (bump, _version, _header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; - - assert_eq!(bump, msg_buffer_bump); - assert_eq!(end_offsets, [0u16; 255]); - - let (id, price, price_expo, ema, ema_expo) = (pyth_price_acct_id, 2u64, 3u64, 4u64, 5u64); - send_add_price_ix( - banks_client, - id, - price, - price_expo, - ema, - ema_expo, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_pda, - ) - .await - .unwrap(); - - let msg_buffer_account_data = fetch_msg_buffer_account(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), space as usize); - - let (bump, _version, header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; - - assert_eq!(bump, msg_buffer_bump); - // size_of(price::MessageHeader) + FullPriceMessage::SIZE - let msg_size_0 = 7 + 40; - // size_of(price::MessageHeader) + CompactPriceMessage::SIZE - let msg_size_1 = 7 + 24; - assert_eq!(&end_offsets[0..2], &[msg_size_0, msg_size_0 + msg_size_1]); - - assert_eq!(&end_offsets[2..], &[0u16; 253]); - - let msgs = extract_msg_buffer_messages(header_len, end_offsets, &msg_buffer_account_data); - - validate_price_msgs(id, price, price_expo, ema, ema_expo, &msgs).unwrap(); -} - -#[tokio::test] -#[should_panic] -async fn fail_put_all_invalid_auth() { - panic!() -} - -#[tokio::test] -async fn test_resize_initialized_buffer() { -} - -#[tokio::test] -async fn test_delete_buffer() { -} - -#[tokio::test] -#[should_panic] -async fn fail_delete_buffer_invalid_admin() { - panic!() -} - -#[tokio::test] -#[should_panic] -async fn fail_delete_buffer_invalid_account() { - panic!() -} From c4fbe3f85d361f38c99c3bdc35370805fe022b4c Mon Sep 17 00:00:00 2001 From: swimricky Date: Wed, 3 May 2023 08:47:37 -0400 Subject: [PATCH 06/12] refactor(message-buffer): rename --- pythnet/message_buffer/tests/message_buffer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythnet/message_buffer/tests/message_buffer.ts b/pythnet/message_buffer/tests/message_buffer.ts index c1a71ffd2c..ae3005612e 100644 --- a/pythnet/message_buffer/tests/message_buffer.ts +++ b/pythnet/message_buffer/tests/message_buffer.ts @@ -78,7 +78,7 @@ let fundBalance = 100 * anchor.web3.LAMPORTS_PER_SOL; const discriminator = BorshAccountsCoder.accountDiscriminator("MessageBuffer"); const messageBufferDiscriminator = bs58.encode(discriminator); -describe("accumulator_updater", () => { +describe("message_buffer", () => { // Configure the client to use the local cluster. let provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); From 3152f0f6a5953ef44d5dcbf59c660598e542e087 Mon Sep 17 00:00:00 2001 From: swimricky Date: Wed, 3 May 2023 09:16:02 -0400 Subject: [PATCH 07/12] fix(message-buffer): fix min size check when shrinking msg buffer --- .../src/instructions/delete_buffer.rs | 5 +--- .../src/instructions/resize_buffer.rs | 23 +++++++++++-------- .../programs/message_buffer/src/lib.rs | 2 +- .../src/state/message_buffer.rs | 1 - 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/pythnet/message_buffer/programs/message_buffer/src/instructions/delete_buffer.rs b/pythnet/message_buffer/programs/message_buffer/src/instructions/delete_buffer.rs index e873a7812f..e36fb4f2ac 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/instructions/delete_buffer.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/instructions/delete_buffer.rs @@ -40,10 +40,7 @@ pub fn delete_buffer<'info>( expected_key, MessageBufferError::InvalidPDA ); - let loader = AccountLoader::::try_from_unchecked( - &crate::ID, - message_buffer_account_info, - )?; + let loader = AccountLoader::::try_from(message_buffer_account_info)?; loader.close(ctx.accounts.admin.to_account_info())?; Ok(()) } diff --git a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs index 527144cb68..0dc860995a 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs @@ -14,10 +14,6 @@ use { }, }; -//TODO: make sure this works regardless if the msg_buffer is initialized already or not -// we could be in a sitaution where we have a new price account & new msg_buffer acount -// and we know we need more than 10KB to fit all the messages. In this situation -// we would call create_buffer(10240) then resize_buffer(target_size) pub fn resize_buffer<'info>( ctx: Context<'_, '_, '_, 'info, ResizeBuffer<'info>>, allowed_program_auth: Pubkey, @@ -35,11 +31,6 @@ pub fn resize_buffer<'info>( .is_allowed_program_auth(&allowed_program_auth)?; MessageBuffer::check_discriminator(message_buffer_account_info)?; - require_gte!( - target_size, - MessageBuffer::HEADER_LEN as u32, - MessageBufferError::MessageBufferTooSmall - ); let target_size = target_size as usize; @@ -89,6 +80,20 @@ pub fn resize_buffer<'info>( .realloc(target_size, false) .map_err(|_| MessageBufferError::ReallocFailed)?; } else { + // Check that account doesn't get resized to smaller than the amount of + // data it is currently holding (if any) + let account_data = &mut message_buffer_account_info.try_borrow_data()?; + let header_end_index = std::mem::size_of::() + 8; + let (header_bytes, _) = account_data.split_at(header_end_index); + let message_buffer: &MessageBuffer = bytemuck::from_bytes(&header_bytes[8..]); + let max_end_offset = message_buffer.end_offsets.iter().max().unwrap(); + let minimum_size = max_end_offset + message_buffer.header_len; + require_gte!( + target_size, + minimum_size as usize, + MessageBufferError::MessageBufferTooSmall + ); + // Not transferring excess lamports back to admin. // Account will retain more lamports than necessary. message_buffer_account_info.realloc(target_size, false)?; diff --git a/pythnet/message_buffer/programs/message_buffer/src/lib.rs b/pythnet/message_buffer/programs/message_buffer/src/lib.rs index 619db99574..92f7819d18 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/lib.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/lib.rs @@ -203,7 +203,7 @@ pub enum MessageBufferError { CurrentDataLengthExceeded, #[msg("Message Buffer not provided")] MessageBufferNotProvided, - #[msg("Message Buffer is not sufficiently large")] + #[msg("Message Buffer target size is not sufficiently large")] MessageBufferTooSmall, #[msg("Fund Bump not found")] FundBumpNotFound, diff --git a/pythnet/message_buffer/programs/message_buffer/src/state/message_buffer.rs b/pythnet/message_buffer/programs/message_buffer/src/state/message_buffer.rs index 652a51ca76..75a7e6226c 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/state/message_buffer.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/state/message_buffer.rs @@ -100,7 +100,6 @@ impl MessageBuffer { let start = offset; let len = u16::try_from(v.len()); if len.is_err() { - msg!("len err"); return (i, start); } let end = offset.checked_add(len.unwrap()); From 245c0b2bf7167f31db9fe154e9ff2af58b57f57d Mon Sep 17 00:00:00 2001 From: swimricky Date: Wed, 3 May 2023 09:20:38 -0400 Subject: [PATCH 08/12] chore(message-buffer): cleanup --- message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs | 5 ----- .../programs/mock-cpi-caller/tests/program_test/mod.rs | 1 - 2 files changed, 6 deletions(-) diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs index ba9206a19b..f87ccd16ab 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs @@ -1,8 +1,3 @@ -// use test_all::program_test::{ -// fetch_whitelist, -// send_initialize_whitelist, -// setup_program_test, -// }; pub use { super::program_test::*, solana_program_test::*, diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs index 96b9d4ccb6..e3abaa3327 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs @@ -397,7 +397,6 @@ pub async fn send_add_price_ix( .await .unwrap(); - // Ok((msg_buffer_pda, msg_buffer_bump)) Ok(()) } From e47d67bf3cdb600fde51e82cd98ea6cc66d276af Mon Sep 17 00:00:00 2001 From: swimricky Date: Wed, 3 May 2023 09:32:16 -0400 Subject: [PATCH 09/12] fix(message-buffer): resize borrow bug fix --- .../src/instructions/resize_buffer.rs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs index 0dc860995a..5cac9584e7 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs @@ -82,17 +82,20 @@ pub fn resize_buffer<'info>( } else { // Check that account doesn't get resized to smaller than the amount of // data it is currently holding (if any) - let account_data = &mut message_buffer_account_info.try_borrow_data()?; - let header_end_index = std::mem::size_of::() + 8; - let (header_bytes, _) = account_data.split_at(header_end_index); - let message_buffer: &MessageBuffer = bytemuck::from_bytes(&header_bytes[8..]); - let max_end_offset = message_buffer.end_offsets.iter().max().unwrap(); - let minimum_size = max_end_offset + message_buffer.header_len; - require_gte!( - target_size, - minimum_size as usize, - MessageBufferError::MessageBufferTooSmall - ); + { + let account_data = &message_buffer_account_info.try_borrow_data()?; + let header_end_index = std::mem::size_of::() + 8; + let (header_bytes, _) = account_data.split_at(header_end_index); + let message_buffer: &MessageBuffer = bytemuck::from_bytes(&header_bytes[8..]); + let max_end_offset = message_buffer.end_offsets.iter().max().unwrap(); + let minimum_size = max_end_offset + message_buffer.header_len; + require_gte!( + target_size, + minimum_size as usize, + MessageBufferError::MessageBufferTooSmall + ); + } + // Not transferring excess lamports back to admin. // Account will retain more lamports than necessary. From 454dc492b13124afd4e43453b3749cfc4dcea8d7 Mon Sep 17 00:00:00 2001 From: swimricky Date: Fri, 5 May 2023 17:22:54 -0400 Subject: [PATCH 10/12] test(message-buffer): refactor test util methods into MessageBufferTestContext for less duplication --- .../mock-cpi-caller/tests/cases/mod.rs | 4 +- .../tests/cases/test_create_buffer.rs | 106 +++ .../tests/cases/test_create_msg_buffer.rs | 113 --- .../tests/cases/test_delete_buffer.rs | 52 +- .../tests/cases/test_initialize.rs | 17 +- .../tests/cases/test_put_all.rs | 77 +- .../tests/cases/test_resize_buffer.rs | 297 +++----- .../tests/cases/test_set_allowed_programs.rs | 31 +- .../src/instructions/put_all.rs | 3 +- .../mock-cpi-caller/tests/program_test/mod.rs | 713 ++++++++++-------- 10 files changed, 649 insertions(+), 764 deletions(-) create mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs delete mode 100644 message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs index f87ccd16ab..93361e14a4 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs @@ -1,5 +1,7 @@ pub use { super::program_test::*, + anchor_lang::prelude::ProgramError, + message_buffer::MessageBufferError, solana_program_test::*, solana_sdk::{ pubkey::Pubkey, @@ -10,7 +12,7 @@ pub use { }, }; -mod test_create_msg_buffer; +mod test_create_buffer; mod test_delete_buffer; mod test_initialize; mod test_put_all; diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs new file mode 100644 index 0000000000..fa8ff0eb93 --- /dev/null +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs @@ -0,0 +1,106 @@ +use super::*; + +#[tokio::test] +async fn test_create_buffer() { + let mut context = + MessageBufferTestContext::initialize_with_default_test_allowed_programs(false) + .await + .unwrap(); + + let space = 1024; + + let (msg_buffer_pda, msg_buffer_bump) = context + .create_buffer(MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, space) + .await + .unwrap(); + + + let msg_buffer_account_data = context + .fetch_msg_buffer_account_data(&msg_buffer_pda) + .await + .unwrap(); + + + assert_eq!(msg_buffer_account_data.len(), space as usize); + + let (bump, _version, _header_len, end_offsets) = + deserialize_msg_buffer_header(&msg_buffer_account_data); + + assert_eq!(bump, msg_buffer_bump); + assert_eq!(end_offsets, [0u16; 255]); +} + +#[tokio::test] +async fn create_buffer_with_invalid_admin_should_fail() { + let mut context = + MessageBufferTestContext::initialize_with_default_test_allowed_programs(false) + .await + .unwrap(); + + let pyth_price_acct = MessageBufferTestContext::get_mock_pyth_price_account( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + ); + let cpi_caller_auth = MessageBufferTestContext::get_mock_cpi_auth(); + let space = 1024; + let invalid_admin = Keypair::new(); + let (msg_buffer_pda, _) = find_msg_buffer_pda(cpi_caller_auth, pyth_price_acct); + let invalid_create_buffer_ix = create_msg_buffer_ix( + cpi_caller_auth, + pyth_price_acct, + space, + context.whitelist(), + invalid_admin.pubkey(), + msg_buffer_pda, + ); + + let res = context + .process_ixs(&[invalid_create_buffer_ix], vec![&invalid_admin]) + .await; + + assert!(res.is_err()); + + let err: ProgramError = res.unwrap_err().into(); + // violates the whitelist has_one = admin constraint + assert_eq!( + err, + ProgramError::Custom(anchor_lang::error::ErrorCode::ConstraintHasOne.into()) + ) +} + +#[tokio::test] +async fn create_buffer_with_invalid_size_should_fail() { + let mut context = + MessageBufferTestContext::initialize_with_default_test_allowed_programs(false) + .await + .unwrap(); + + + let pyth_price_acct = MessageBufferTestContext::get_mock_pyth_price_account( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + ); + let cpi_caller_auth = MessageBufferTestContext::get_mock_cpi_auth(); + let _whitelist = context.whitelist(); + let admin = context.default_admin(); + + let (msg_buffer_pda, _) = find_msg_buffer_pda(cpi_caller_auth, pyth_price_acct); + let invalid_create_buffer_ix = create_msg_buffer_ix( + cpi_caller_auth, + pyth_price_acct, + 1, + context.whitelist(), + admin.pubkey(), + msg_buffer_pda, + ); + + let res = context + .process_ixs(&[invalid_create_buffer_ix], vec![&admin]) + .await; + + assert!(res.is_err()); + + let err: ProgramError = res.unwrap_err().into(); + assert_eq!( + err, + ProgramError::Custom(MessageBufferError::MessageBufferTooSmall.into()) + ); +} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs deleted file mode 100644 index 6d8860669b..0000000000 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_msg_buffer.rs +++ /dev/null @@ -1,113 +0,0 @@ -use super::*; - -#[tokio::test] -async fn test_create_msg_buffer() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); - - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; - - assert_eq!(msg_buffer_account_data.len(), space as usize); - - let (bump, _version, _header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; - - assert_eq!(bump, msg_buffer_bump); - assert_eq!(end_offsets, [0u16; 255]); -} - -#[tokio::test] -#[should_panic] -async fn fail_create_msg_buffer_with_invalid_admin() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let invalid_admin = Keypair::new(); - send_create_msg_buffer( - banks_client, - &invalid_admin, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); -} - -#[tokio::test] -#[should_panic] -async fn fail_create_msg_buffer_with_invalid_size() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1; - send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, - ) - .await - .unwrap(); -} diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs index 4430178ba1..36dc74ce0f 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs @@ -2,51 +2,27 @@ use super::*; #[tokio::test] async fn test_delete_buffer() { - let pt_ctxt = &mut setup_program_test(false).await; + let mut context = MessageBufferTestContext::initialize_with_default_test_buffer( + false, + MessageBufferTestContext::DEFAULT_TARGET_SIZE, + ) + .await + .unwrap(); - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); + let payer = context.payer.pubkey(); + let (msg_buffer_pda, _) = MessageBufferTestContext::default_msg_buffer(); - let mock_cpi_caller_auth = get_mock_cpi_auth(); + let payer_lamports_before = context.get_balance(payer).await; - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + context + .delete_buffer(MessageBufferTestContext::DEFAULT_TEST_PRICE_ID) .await .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - - let payer_lamports_before = banks_client.get_balance(payer.pubkey()).await.unwrap(); - send_delete_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - ) - .await - .unwrap(); + let msg_buffer_account_data = context.fetch_msg_buffer_account_data(&msg_buffer_pda).await; + assert!(msg_buffer_account_data.is_none()); - let msg_buffer_account = banks_client.get_account(msg_buffer_pda).await.unwrap(); - assert!(msg_buffer_account.is_none()); - let payer_lamports_after = banks_client.get_balance(payer.pubkey()).await.unwrap(); + let payer_lamports_after = context.get_balance(payer).await; assert!(payer_lamports_before < payer_lamports_after); } diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs index 399b45f5ec..54d6e56fb6 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs @@ -2,22 +2,15 @@ use super::*; #[tokio::test] async fn test_initialize() { - let pt_ctxt = &mut setup_program_test(false).await; - - // Initialize whitelist - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, whitelist_bump) = - send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); + let context = &mut MessageBufferTestContext::initialize_context(false).await; + let admin = context.payer.insecure_clone(); + let (_, whitelist_bump) = context.initialize(admin).await.unwrap(); let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = - fetch_whitelist(banks_client, &whitelist_pda).await; + context.fetch_whitelist().await.unwrap(); assert_eq!(whitelist_bump, whitelist_acct_bump); - assert_eq!(payer.pubkey(), admin_pubkey); + assert_eq!(context.payer.pubkey(), admin_pubkey); assert_eq!(0, allowed_programs_len); assert_eq!(allowed_programs, vec![]); diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs index a506a897c8..face68b1ff 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs @@ -2,83 +2,48 @@ use super::*; #[tokio::test] async fn test_put_all() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let space = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - space, + let mut context = MessageBufferTestContext::initialize_with_default_test_buffer( + false, + MessageBufferTestContext::DEFAULT_TARGET_SIZE, ) .await .unwrap(); - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + let payer = context.payer.pubkey(); - assert_eq!(msg_buffer_account_data.len(), space as usize); + let whitelist = context.whitelist(); + let cpi_caller_auth = MessageBufferTestContext::get_mock_cpi_auth(); + let (msg_buffer_pda, msg_buffer_bump) = MessageBufferTestContext::default_msg_buffer(); - let (bump, _version, _header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; - - assert_eq!(bump, msg_buffer_bump); - assert_eq!(end_offsets, [0u16; 255]); + let add_price_params = MessageBufferTestContext::DEFAULT_ADD_PRICE_PARAMS; + context + .add_price(add_price_params, payer, whitelist, cpi_caller_auth) + .await + .unwrap(); - let (id, price, price_expo, ema, ema_expo) = (pyth_price_acct_id, 2u64, 3u64, 4u64, 5u64); - send_add_price_ix( - banks_client, - id, - price, - price_expo, - ema, - ema_expo, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_pda, - ) - .await - .unwrap(); + let (id, price, price_expo, ema, ema_expo) = add_price_params; - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + let msg_buffer_account_data = context + .fetch_msg_buffer_account_data(&msg_buffer_pda) + .await + .unwrap(); - assert_eq!(msg_buffer_account_data.len(), space as usize); let (bump, _version, header_len, end_offsets) = - parse_msg_buffer_header(&msg_buffer_account_data).await; + deserialize_msg_buffer_header(&msg_buffer_account_data); assert_eq!(bump, msg_buffer_bump); // size_of(price::MessageHeader) + FullPriceMessage::SIZE let msg_size_0 = 7 + 40; + assert_eq!(&end_offsets[0], &msg_size_0); + // size_of(price::MessageHeader) + CompactPriceMessage::SIZE let msg_size_1 = 7 + 24; - assert_eq!(&end_offsets[0..2], &[msg_size_0, msg_size_0 + msg_size_1]); + assert_eq!(&end_offsets[1], &(msg_size_0 + msg_size_1)); assert_eq!(&end_offsets[2..], &[0u16; 253]); let msgs = extract_msg_buffer_messages(header_len, end_offsets, &msg_buffer_account_data); - validate_price_msgs(id, price, price_expo, ema, ema_expo, &msgs).unwrap(); } diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs index cccab266e2..ee4c4f7e5c 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs @@ -2,246 +2,153 @@ use super::*; #[tokio::test] async fn test_resize_buffer() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, + let mut context = MessageBufferTestContext::initialize_with_default_test_buffer( + false, + MessageBufferTestContext::DEFAULT_TARGET_SIZE, ) .await .unwrap(); - // increase buffer size - let mut new_target_size = target_size + 10240; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); + let (msg_buffer_pda, _) = MessageBufferTestContext::default_msg_buffer(); - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); + // increase buffer size + let mut target_size = MessageBufferTestContext::DEFAULT_TARGET_SIZE + 10240; + let target_sizes = vec![target_size]; + context + .resize_msg_buffer( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + target_sizes, + ) + .await + .unwrap(); - // decrease buffer size to less than original - new_target_size -= 10240 + 100; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + let msg_buffer_account_data = context + .fetch_msg_buffer_account_data(&msg_buffer_pda) + .await + .unwrap(); - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); -} -#[tokio::test] -async fn test_multiple_resize_buffer_ixs() { - let pt_ctxt = &mut setup_program_test(false).await; + assert_eq!(msg_buffer_account_data.len(), target_size as usize); - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + // decrease buffer size to less than original + target_size -= 10340; + let target_sizes = vec![target_size]; + context + .resize_msg_buffer( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + target_sizes, + ) .await .unwrap(); - let mock_cpi_caller_auth = get_mock_cpi_auth(); - - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + let msg_buffer_account_data = context + .fetch_msg_buffer_account_data(&msg_buffer_pda) .await .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - // increase buffer size - let mut new_target_size = target_size + 10240; - let admin = payer; - let resize_ix_1 = resize_msg_buffer_ix( - admin.pubkey(), - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); - - new_target_size += 10240; - let resize_ix_2 = resize_msg_buffer_ix( - admin.pubkey(), - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); + assert_eq!(msg_buffer_account_data.len(), target_size as usize); +} - send_transaction( - banks_client, - &[resize_ix_1, resize_ix_2], - payer.pubkey(), - vec![admin, payer], +#[tokio::test] +async fn test_multiple_resize_buffer_ixs_in_same_txn() { + let mut context = MessageBufferTestContext::initialize_with_default_test_buffer( + false, + MessageBufferTestContext::DEFAULT_TARGET_SIZE, ) .await .unwrap(); - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + let (msg_buffer_pda, _) = MessageBufferTestContext::default_msg_buffer(); - assert_eq!(msg_buffer_account_data.len(), new_target_size as usize); -} -#[tokio::test] -#[should_panic] -async fn fail_resize_buffer_invalid_increase() { - let pt_ctxt = &mut setup_program_test(false).await; - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) + // increase buffer size + let mut target_size = MessageBufferTestContext::DEFAULT_TARGET_SIZE + 10240; + let mut target_sizes = vec![]; + target_sizes.push(target_size); + target_size += 10240; + target_sizes.push(target_size); + context + .resize_msg_buffer( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + target_sizes, + ) .await .unwrap(); - let mock_cpi_caller_auth = get_mock_cpi_auth(); - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + let msg_buffer_account_data = context + .fetch_msg_buffer_account_data(&msg_buffer_pda) .await .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (msg_buffer_pda, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - target_size, - ) - .await - .unwrap(); - let msg_buffer_account_data = - fetch_msg_buffer_account_data(banks_client, &msg_buffer_pda).await; + assert_eq!(msg_buffer_account_data.len(), target_size as usize); +} - // max increase is +10240 - let new_target_size = target_size + 10240 + 100; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, - msg_buffer_bump, - new_target_size, +#[tokio::test] +async fn fail_resize_buffer_invalid_increase() { + let mut context = MessageBufferTestContext::initialize_with_default_test_buffer( + false, + MessageBufferTestContext::DEFAULT_TARGET_SIZE, ) .await .unwrap(); -} - -#[tokio::test] -#[should_panic] -async fn fail_resize_buffer_invalid_decrease() { - let pt_ctxt = &mut setup_program_test(false).await; - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, _) = send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); + let whitelist = context.whitelist(); + let admin = context.default_admin(); + let cpi_caller_auth = MessageBufferTestContext::get_mock_cpi_auth(); + let pyth_price_acct = MessageBufferTestContext::default_pyth_price_account(); + let (msg_buffer_pda, msg_buffer_bump) = MessageBufferTestContext::default_msg_buffer(); - let mock_cpi_caller_auth = get_mock_cpi_auth(); + // increase buffer size beyond maximum allowed + let target_size = MessageBufferTestContext::DEFAULT_TARGET_SIZE + 10240 + 100; - let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) - .await - .unwrap(); - let pyth_price_acct_id = 0u64; - let mock_pyth_price_acct = get_mock_pyth_price_account(pyth_price_acct_id); - let target_size = 1024; - let (_, msg_buffer_bump) = send_create_msg_buffer( - banks_client, - payer, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, + let resize_ix = resize_msg_buffer_ix( + cpi_caller_auth, + pyth_price_acct, + msg_buffer_bump, target_size, - ) - .await - .unwrap(); + whitelist, + admin.pubkey(), + msg_buffer_pda, + ); + + let res = context.process_ixs(&[resize_ix], vec![&admin]).await; - // decrease buffer size to invalid size - let new_target_size = 1; - send_resize_msg_buffer( - banks_client, - payer, - whitelist_pda, - mock_cpi_caller_auth, - mock_pyth_price_acct, + assert!(res.is_err()); + + let err: ProgramError = res.unwrap_err().into(); + assert_eq!( + err, + ProgramError::Custom(MessageBufferError::TargetSizeDeltaExceeded.into()) + ); + + + // shrink buffer size to less than minimum allowed + let target_size = 1; + let resize_ix = resize_msg_buffer_ix( + cpi_caller_auth, + pyth_price_acct, msg_buffer_bump, - new_target_size, - ) - .await - .unwrap(); + target_size, + whitelist, + admin.pubkey(), + msg_buffer_pda, + ); + + let res = context.process_ixs(&[resize_ix], vec![&admin]).await; + + assert!(res.is_err()); + let err: ProgramError = res.unwrap_err().into(); + assert_eq!( + err, + ProgramError::Custom(MessageBufferError::MessageBufferTooSmall.into()) + ); } #[tokio::test] diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs b/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs index edc39b74c5..b58c53066e 100644 --- a/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs +++ b/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs @@ -2,37 +2,20 @@ use super::*; #[tokio::test] async fn test_set_allowed_programs() { - let pt_ctxt = &mut setup_program_test(false).await; - - // Initialize whitelist - - let banks_client = &mut pt_ctxt.banks_client; - let payer = &pt_ctxt.payer; - let (whitelist_pda, whitelist_bump) = - send_initialize_whitelist(banks_client, payer.pubkey(), payer) - .await - .unwrap(); - - let (whitelist_acct_bump, admin_pubkey, allowed_programs_len, allowed_programs) = - fetch_whitelist(banks_client, &whitelist_pda).await; - - assert_eq!(whitelist_bump, whitelist_acct_bump); - assert_eq!(payer.pubkey(), admin_pubkey); - - assert_eq!(0, allowed_programs_len); - assert_eq!(allowed_programs, vec![]); - - // Add MockCpiProgram auth pda to allowed programs - let mock_cpi_caller_auth = get_mock_cpi_auth(); + let context = &mut MessageBufferTestContext::initialize_context(false).await; + let admin = context.default_admin(); + context.initialize(admin).await.unwrap(); + let mock_cpi_caller_auth = MessageBufferTestContext::get_mock_cpi_auth(); let allowed_programs = vec![mock_cpi_caller_auth]; - send_set_allowed_programs(banks_client, payer, &whitelist_pda, &allowed_programs) + context + .set_allowed_programs(&allowed_programs) .await .unwrap(); let (_, _, allowed_programs_len, updated_allowed_programs) = - fetch_whitelist(banks_client, &whitelist_pda).await; + context.fetch_whitelist().await.unwrap(); assert_eq!(1, allowed_programs_len); assert_eq!(allowed_programs, updated_allowed_programs); diff --git a/pythnet/message_buffer/programs/message_buffer/src/instructions/put_all.rs b/pythnet/message_buffer/programs/message_buffer/src/instructions/put_all.rs index 1ea70af834..bd481feeb7 100644 --- a/pythnet/message_buffer/programs/message_buffer/src/instructions/put_all.rs +++ b/pythnet/message_buffer/programs/message_buffer/src/instructions/put_all.rs @@ -39,8 +39,7 @@ pub fn put_all<'info>( let (num_msgs, num_bytes) = message_buffer.put_all_in_buffer(body_bytes, &messages); if num_msgs != messages.len() { - // FIXME: make this into an emit! event - msg!("unable to fit all messages in accumulator input account. Wrote {}/{} messages and {} bytes", num_msgs, messages.len(), num_bytes); + msg!("unable to fit all messages in MessageBuffer account. Wrote {}/{} messages and {} bytes", num_msgs, messages.len(), num_bytes); } Ok(()) diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs index e3abaa3327..2eba684474 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/tests/program_test/mod.rs @@ -1,9 +1,15 @@ use { anchor_lang::{ - prelude::*, + prelude::{ + ProgramError::Custom, + *, + }, solana_program::{ hash::hashv, - instruction::Instruction, + instruction::{ + Instruction, + InstructionError, + }, }, Id, }, @@ -13,7 +19,7 @@ use { ReadBytesExt, }, solana_program_test::{ - BanksClient, + BanksClientError, ProgramTest, ProgramTestContext, }, @@ -23,7 +29,10 @@ use { Keypair, Signer, }, - transaction::Transaction, + transaction::{ + Transaction, + TransactionError, + }, }, std::{ io::{ @@ -34,33 +43,333 @@ use { }, }; -pub async fn setup_program_test(disable_loosen_cpi_limit: bool) -> ProgramTestContext { - let log_filter = "solana_rbpf=trace,\ +pub struct MessageBufferTestContext { + context: ProgramTestContext, + pub payer: Keypair, + admin: Option, + whitelist: Option, +} + +impl MessageBufferTestContext { + pub const DEFAULT_TEST_PRICE_ID: u64 = 0u64; + pub const DEFAULT_TARGET_SIZE: u32 = 1024; + pub const DEFAULT_ADD_PRICE_PARAMS: AddPriceParams = ( + MessageBufferTestContext::DEFAULT_TEST_PRICE_ID, + 2u64, + 3u64, + 4u64, + 5u64, + ); + + pub async fn initialize_context(disable_loosen_cpi_limit: bool) -> Self { + let log_filter = "solana_rbpf=trace,\ solana_runtime::message_processor=trace,\ solana_runtime::system_instruction_processor=trace,\ solana_program_test=debug"; - solana_logger::setup_with(log_filter); + solana_logger::setup_with(log_filter); + + + let mut pt = ProgramTest::new("message_buffer", ::message_buffer::id(), None); + pt.add_program("mock_cpi_caller", ::mock_cpi_caller::id(), None); + if disable_loosen_cpi_limit { + pt.deactivate_feature( + Pubkey::from_str("GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm").unwrap(), + ); + } + + let context = pt.start_with_context().await; + + let payer = context.payer.insecure_clone(); + + Self { + context, + payer, + admin: None, + whitelist: None, + } + } + + // Initialize with test default helper functions // + pub async fn initialize_with_default_test_allowed_programs( + disable_loosen_cpi_limit: bool, + ) -> Result { + let mut context = Self::initialize_context(disable_loosen_cpi_limit).await; + context.initialize(context.default_admin()).await.unwrap(); + context + .set_allowed_programs(&Self::default_allowed_programs()) + .await + .unwrap(); + Ok(context) + } + + + pub async fn initialize_with_default_test_buffer( + disable_loosen_cpi_limit: bool, + target_size: u32, + ) -> Result { + let mut context = + Self::initialize_with_default_test_allowed_programs(disable_loosen_cpi_limit) + .await + .unwrap(); + context + .create_buffer(Self::DEFAULT_TEST_PRICE_ID, target_size) + .await + .unwrap(); + Ok(context) + } + + + pub async fn get_balance(&mut self, pubkey: Pubkey) -> u64 { + self.context.banks_client.get_balance(pubkey).await.unwrap() + } + + pub fn default_admin(&self) -> Keypair { + self.payer.insecure_clone() + } + + fn admin_pubkey(&self) -> Pubkey { + self.admin.as_ref().unwrap().pubkey() + } + + pub fn whitelist(&self) -> Pubkey { + self.whitelist.unwrap() + } + + pub fn get_mock_cpi_auth() -> Pubkey { + let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( + &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], + &::mock_cpi_caller::id(), + ); + mock_cpi_caller_auth + } + + pub fn default_allowed_programs() -> Vec { + vec![MessageBufferTestContext::get_mock_cpi_auth()] + } + + pub fn default_pyth_price_account() -> Pubkey { + Self::get_mock_pyth_price_account(Self::DEFAULT_TEST_PRICE_ID) + } + + pub fn get_mock_pyth_price_account(id: u64) -> Pubkey { + let (mock_pyth_price_acct, _) = Pubkey::find_program_address( + &[b"pyth".as_ref(), b"price".as_ref(), &id.to_le_bytes()], + &::mock_cpi_caller::id(), + ); + mock_pyth_price_acct + } + + pub fn default_msg_buffer() -> (Pubkey, u8) { + find_msg_buffer_pda( + Self::get_mock_cpi_auth(), + Self::default_pyth_price_account(), + ) + } + + + pub async fn process_ixs( + &mut self, + instructions: &[Instruction], + signers: Vec<&Keypair>, + ) -> anchor_lang::Result<()> { + let recent_blockhash = self.context.get_new_latest_blockhash().await.unwrap(); + + let mut transaction = Transaction::new_with_payer(instructions, Some(&self.payer.pubkey())); + transaction.partial_sign(&[&self.payer], recent_blockhash); + transaction.partial_sign(&signers, recent_blockhash); + + let res = self + .context + .banks_client + .process_transaction(transaction) + .await; + match res { + Err(BanksClientError::TransactionError(TransactionError::InstructionError( + _, + InstructionError::Custom(error_code), + ))) => { + let e = Custom(error_code); + Err(e.into()) + } + Err(_) => panic!("Unexpected error"), + Ok(_) => Ok(()), + } + } + + pub async fn initialize(&mut self, admin: Keypair) -> Result<(Pubkey, u8)> { + let (whitelist_pda, whitelist_bump) = Pubkey::find_program_address( + &[b"message".as_ref(), b"whitelist".as_ref()], + &::message_buffer::id(), + ); + + self.admin = Some(admin.insecure_clone()); + self.whitelist = Some(whitelist_pda); + + let init_message_buffer_ix = + initialize_ix(admin.pubkey(), self.payer.pubkey(), whitelist_pda); + + self.process_ixs( + &[init_message_buffer_ix], + vec![&self.admin.as_ref().unwrap().insecure_clone()], + ) + .await + .unwrap(); - let mut pt = ProgramTest::new("message_buffer", ::message_buffer::id(), None); - pt.add_program("mock_cpi_caller", ::mock_cpi_caller::id(), None); - if disable_loosen_cpi_limit { - pt.deactivate_feature( - Pubkey::from_str("GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm").unwrap(), + Ok((whitelist_pda, whitelist_bump)) + } + + pub async fn fetch_whitelist(&mut self) -> Result<(u8, Pubkey, u32, Vec)> { + let whitelist_account = self + .context + .banks_client + .get_account(self.whitelist()) + .await + .unwrap(); + assert!(whitelist_account.is_some()); + let whitelist_account = whitelist_account.unwrap(); + let account_data = whitelist_account.data(); + + deserialize_whitelist(account_data) + } + + + pub async fn set_allowed_programs(&mut self, allowed_programs: &Vec) -> Result<()> { + let set_allowed_programs_ix = set_allowed_programs_ix( + self.admin_pubkey(), + self.payer.pubkey(), + self.whitelist(), + allowed_programs, ); + + self.process_ixs( + &[set_allowed_programs_ix], + vec![&self.admin.as_ref().unwrap().insecure_clone()], + ) + .await + .unwrap(); + Ok(()) } - pt.start_with_context().await + + pub async fn create_buffer(&mut self, id: u64, target_size: u32) -> Result<(Pubkey, u8)> { + let pyth_price_account = Self::get_mock_pyth_price_account(id); + let (msg_buffer_pda, msg_buffer_bump) = + find_msg_buffer_pda(Self::get_mock_cpi_auth(), pyth_price_account); + + let admin = self.admin.as_ref().unwrap().insecure_clone(); + let create_msg_buffer_ix = create_msg_buffer_ix( + Self::get_mock_cpi_auth(), + pyth_price_account, + target_size, + self.whitelist(), + admin.pubkey(), + msg_buffer_pda, + ); + self.process_ixs(&[create_msg_buffer_ix], vec![&admin]) + .await?; + + + Ok((msg_buffer_pda, msg_buffer_bump)) + } + + pub async fn fetch_msg_buffer_account_data(&mut self, msg_buffer: &Pubkey) -> Option> { + let msg_buffer_account = self + .context + .banks_client + .get_account(*msg_buffer) + .await + .unwrap(); + + msg_buffer_account.map(|a| a.data) + } + + pub async fn delete_buffer(&mut self, id: u64) -> anchor_lang::Result<()> { + let pyth_price_account = Self::get_mock_pyth_price_account(id); + + let (msg_buffer_pda, msg_buffer_bump) = + find_msg_buffer_pda(Self::get_mock_cpi_auth(), pyth_price_account); + let admin = self.admin.as_ref().unwrap().insecure_clone(); + + let delete_ix = delete_msg_buffer_ix( + Self::get_mock_cpi_auth(), + pyth_price_account, + msg_buffer_bump, + self.whitelist(), + admin.pubkey(), + msg_buffer_pda, + ); + + self.process_ixs(&[delete_ix], vec![&admin]).await?; + Ok(()) + } + + pub async fn resize_msg_buffer( + &mut self, + id: u64, + target_sizes: Vec, + ) -> anchor_lang::Result<()> { + let pyth_price_account = Self::get_mock_pyth_price_account(id); + let (msg_buffer_pda, msg_buffer_bump) = + find_msg_buffer_pda(Self::get_mock_cpi_auth(), pyth_price_account); + + let resize_ixs = &mut vec![]; + + let admin = self.admin.as_ref().unwrap().insecure_clone(); + + + for target_size in target_sizes { + let resize_ix = resize_msg_buffer_ix( + Self::get_mock_cpi_auth(), + pyth_price_account, + msg_buffer_bump, + target_size, + self.whitelist(), + admin.pubkey(), + msg_buffer_pda, + ); + resize_ixs.push(resize_ix); + } + + self.process_ixs(resize_ixs, vec![&admin]).await?; + Ok(()) + } + + pub async fn add_price( + &mut self, + add_price_params: AddPriceParams, + payer: Pubkey, + whitelist: Pubkey, + cpi_auth: Pubkey, + ) -> Result<()> { + let (id, price, price_expo, ema, ema_expo) = add_price_params; + let pyth_price_account = Self::get_mock_pyth_price_account(id); + let (msg_buffer_pda, _) = find_msg_buffer_pda(cpi_auth, pyth_price_account); + + let add_price_ix = add_price_ix( + id, + price, + price_expo, + ema, + ema_expo, + pyth_price_account, + payer, + whitelist, + cpi_auth, + msg_buffer_pda, + ); + + self.process_ixs(&[add_price_ix], vec![]).await?; + Ok(()) + } } -fn initialize_ix( - admin: Pubkey, - payer: Pubkey, - whitelist_pda: Pubkey, -) -> anchor_lang::Result { +pub type AddPriceParams = (u64, u64, u64, u64, u64); + +fn initialize_ix(admin: Pubkey, payer: Pubkey, whitelist_pda: Pubkey) -> Instruction { let init_ix_discriminator = sighash("global", "initialize"); - let init_message_buffer_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::message_buffer::id(), &(init_ix_discriminator, admin), vec![ @@ -68,32 +377,7 @@ fn initialize_ix( AccountMeta::new(whitelist_pda, false), AccountMeta::new_readonly(System::id(), false), ], - ); - Ok(init_message_buffer_ix) -} - -pub async fn send_initialize_whitelist( - banks_client: &mut BanksClient, - admin: Pubkey, - payer: &Keypair, -) -> anchor_lang::Result<(Pubkey, u8)> { - let (whitelist_pda, whitelist_bump) = Pubkey::find_program_address( - &[b"message".as_ref(), b"whitelist".as_ref()], - &::message_buffer::id(), - ); - - let init_message_buffer_ix = initialize_ix(admin, payer.pubkey(), whitelist_pda)?; - - send_transaction( - banks_client, - &[init_message_buffer_ix], - payer.pubkey(), - vec![payer], ) - .await - .unwrap(); - - Ok((whitelist_pda, whitelist_bump)) } fn set_allowed_programs_ix( @@ -101,10 +385,10 @@ fn set_allowed_programs_ix( payer: Pubkey, whitelist: Pubkey, allowed_programs: &Vec, -) -> anchor_lang::Result { +) -> Instruction { let ix_discriminator = sighash("global", "set_allowed_programs"); - let set_allowed_programs_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::message_buffer::id(), &(ix_discriminator, allowed_programs), vec![ @@ -112,53 +396,20 @@ fn set_allowed_programs_ix( AccountMeta::new(payer, true), AccountMeta::new(whitelist, false), ], - ); - Ok(set_allowed_programs_ix) -} - -pub async fn send_set_allowed_programs( - banks_client: &mut BanksClient, - payer: &Keypair, - whitelist: &Pubkey, - allowed_programs: &Vec, -) -> anchor_lang::Result<()> { - let _recent_blockhash = banks_client.get_latest_blockhash().await.unwrap(); - - let set_allowed_programs_ix = - set_allowed_programs_ix(payer.pubkey(), payer.pubkey(), *whitelist, allowed_programs)?; - - send_transaction( - banks_client, - &[set_allowed_programs_ix], - payer.pubkey(), - vec![payer], ) - .await - .unwrap(); - - Ok(()) } -async fn create_msg_buffer_ix( - admin: Pubkey, - whitelist: Pubkey, +pub fn create_msg_buffer_ix( cpi_caller_auth: Pubkey, pyth_price_acct: Pubkey, target_size: u32, -) -> anchor_lang::Result<(Pubkey, u8, Instruction)> { - let (msg_buffer_pda, msg_buffer_bump) = Pubkey::find_program_address( - &[ - cpi_caller_auth.as_ref(), - b"message".as_ref(), - pyth_price_acct.as_ref(), - ], - &::message_buffer::id(), - ); - - + whitelist: Pubkey, + admin: Pubkey, + msg_buffer_pda: Pubkey, +) -> Instruction { let create_ix_discriminator = sighash("global", "create_buffer"); - let create_msg_buffer_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::message_buffer::id(), &( create_ix_discriminator, @@ -172,65 +423,22 @@ async fn create_msg_buffer_ix( AccountMeta::new_readonly(System::id(), false), AccountMeta::new(msg_buffer_pda, false), ], - ); - Ok((msg_buffer_pda, msg_buffer_bump, create_msg_buffer_ix)) -} - -pub async fn send_create_msg_buffer( - banks_client: &mut BanksClient, - admin: &Keypair, - payer: &Keypair, - whitelist: Pubkey, - cpi_caller_auth: Pubkey, - pyth_price_acct: Pubkey, - target_size: u32, -) -> anchor_lang::Result<(Pubkey, u8)> { - let (msg_buffer_pda, msg_buffer_bump, create_msg_buffer_ix) = create_msg_buffer_ix( - admin.pubkey(), - whitelist, - cpi_caller_auth, - pyth_price_acct, - target_size, ) - .await - .unwrap(); - - send_transaction( - banks_client, - &[create_msg_buffer_ix], - payer.pubkey(), - vec![admin, payer], - ) - .await - .unwrap(); - - Ok((msg_buffer_pda, msg_buffer_bump)) } -pub async fn resize_msg_buffer_ix( - admin: Pubkey, - whitelist: Pubkey, +pub fn resize_msg_buffer_ix( cpi_caller_auth: Pubkey, pyth_price_acct: Pubkey, msg_buffer_bump: u8, target_size: u32, -) -> anchor_lang::Result { - let msg_buffer_pda = Pubkey::create_program_address( - &[ - cpi_caller_auth.as_ref(), - b"message".as_ref(), - pyth_price_acct.as_ref(), - &[msg_buffer_bump], - ], - &::message_buffer::id(), - ) - .unwrap(); - - + whitelist: Pubkey, + admin: Pubkey, + msg_buffer_pda: Pubkey, +) -> Instruction { let resize_ix_disc = sighash("global", "resize_buffer"); - let resize_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::message_buffer::id(), &( resize_ix_disc, @@ -245,58 +453,21 @@ pub async fn resize_msg_buffer_ix( AccountMeta::new_readonly(System::id(), false), AccountMeta::new(msg_buffer_pda, false), ], - ); - Ok(resize_ix) -} - -pub async fn send_resize_msg_buffer( - banks_client: &mut BanksClient, - admin: &Keypair, - whitelist: Pubkey, - cpi_caller_auth: Pubkey, - pyth_price_acct: Pubkey, - msg_buffer_bump: u8, - target_size: u32, -) -> anchor_lang::Result<()> { - let resize_ix = resize_msg_buffer_ix( - admin.pubkey(), - whitelist, - cpi_caller_auth, - pyth_price_acct, - msg_buffer_bump, - target_size, ) - .await - .unwrap(); - - send_transaction(banks_client, &[resize_ix], admin.pubkey(), vec![admin]) - .await - .unwrap(); - Ok(()) } -pub async fn delete_msg_buffer_ix( - admin: Pubkey, - whitelist: Pubkey, + +pub fn delete_msg_buffer_ix( cpi_caller_auth: Pubkey, pyth_price_acct: Pubkey, msg_buffer_bump: u8, -) -> anchor_lang::Result { - let msg_buffer_pda = Pubkey::create_program_address( - &[ - cpi_caller_auth.as_ref(), - b"message".as_ref(), - pyth_price_acct.as_ref(), - &[msg_buffer_bump], - ], - &::message_buffer::id(), - ) - .unwrap(); - - + whitelist: Pubkey, + admin: Pubkey, + msg_buffer_pda: Pubkey, +) -> Instruction { let delete_ix_disc = sighash("global", "delete_buffer"); - let delete_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::message_buffer::id(), &( delete_ix_disc, @@ -309,32 +480,7 @@ pub async fn delete_msg_buffer_ix( AccountMeta::new(admin, true), AccountMeta::new(msg_buffer_pda, false), ], - ); - Ok(delete_ix) -} - -pub async fn send_delete_msg_buffer( - banks_client: &mut BanksClient, - admin: &Keypair, - whitelist: Pubkey, - cpi_caller_auth: Pubkey, - pyth_price_acct: Pubkey, - msg_buffer_bump: u8, -) -> anchor_lang::Result<()> { - let delete_ix = delete_msg_buffer_ix( - admin.pubkey(), - whitelist, - cpi_caller_auth, - pyth_price_acct, - msg_buffer_bump, ) - .await - .unwrap(); - - send_transaction(banks_client, &[delete_ix], admin.pubkey(), vec![admin]) - .await - .unwrap(); - Ok(()) } fn add_price_ix( @@ -348,10 +494,9 @@ fn add_price_ix( whitelist: Pubkey, cpi_auth: Pubkey, msg_buffer_pda: Pubkey, -) -> Result { +) -> Instruction { let add_price_disc = sighash("global", "add_price"); - - let add_price_ix = Instruction::new_with_borsh( + Instruction::new_with_borsh( ::mock_cpi_caller::id(), &(add_price_disc, id, price, price_expo, ema, ema_expo), vec![ @@ -363,94 +508,6 @@ fn add_price_ix( AccountMeta::new_readonly(::message_buffer::id(), false), AccountMeta::new(msg_buffer_pda, false), ], - ); - Ok(add_price_ix) -} - -pub async fn send_add_price_ix( - banks_client: &mut BanksClient, - id: u64, - price: u64, - price_expo: u64, - ema: u64, - ema_expo: u64, - payer: &Keypair, - whitelist: Pubkey, - cpi_auth: Pubkey, - pyth_price_account: Pubkey, - msg_buffer_pda: Pubkey, -) -> Result<()> { - let add_price_ix = add_price_ix( - id, - price, - price_expo, - ema, - ema_expo, - pyth_price_account, - payer.pubkey(), - whitelist, - cpi_auth, - msg_buffer_pda, - )?; - - send_transaction(banks_client, &[add_price_ix], payer.pubkey(), vec![payer]) - .await - .unwrap(); - - Ok(()) -} - - -pub async fn send_transaction( - banks_client: &mut BanksClient, - instructions: &[Instruction], - payer: Pubkey, - signers: Vec<&Keypair>, -) -> anchor_lang::Result<()> { - let recent_blockhash = banks_client.get_latest_blockhash().await.unwrap(); - - let transaction = - Transaction::new_signed_with_payer(instructions, Some(&payer), &signers, recent_blockhash); - banks_client.process_transaction(transaction).await.unwrap(); - Ok(()) -} - - -pub async fn fetch_whitelist( - banks_client: &mut BanksClient, - whitelist: &Pubkey, -) -> (u8, Pubkey, u32, Vec) { - let whitelist_account = banks_client.get_account(*whitelist).await.unwrap(); - assert!(whitelist_account.is_some()); - let whitelist_account = whitelist_account.unwrap(); - let account_data = whitelist_account.data(); - - let mut cursor = Cursor::new(account_data); - let discriminator = &mut vec![0u8; 8]; - cursor.read_exact(discriminator).unwrap(); - assert_eq!(discriminator, &sighash("account", "Whitelist")); - - - let whitelist_acct_bump = cursor.read_u8().unwrap(); - - let admin_bytes = &mut vec![0u8; 32]; - cursor.read_exact(admin_bytes).unwrap(); - let admin_pubkey = Pubkey::try_from_slice(admin_bytes).unwrap(); - - let allowed_programs_len = cursor.read_u32::().unwrap(); - - let mut allowed_programs = vec![]; - for _ in 0..allowed_programs_len { - let allowed_program_bytes = &mut vec![0u8; 32]; - cursor.read_exact(allowed_program_bytes).unwrap(); - let allowed_program_pubkey = Pubkey::try_from_slice(allowed_program_bytes).unwrap(); - allowed_programs.push(allowed_program_pubkey); - } - ( - whitelist_acct_bump, - admin_pubkey, - allowed_programs_len, - allowed_programs, ) } @@ -459,17 +516,8 @@ type Version = u8; type HeaderLen = u16; type EndOffsets = [u16; 255]; -pub async fn fetch_msg_buffer_account_data( - banks_client: &mut BanksClient, - msg_buffer: &Pubkey, -) -> Vec { - let msg_buffer_account = banks_client.get_account(*msg_buffer).await.unwrap(); - assert!(msg_buffer_account.is_some()); - let msg_buffer_account = msg_buffer_account.unwrap(); - msg_buffer_account.data -} -pub async fn parse_msg_buffer_header( +pub fn deserialize_msg_buffer_header( account_data: &[u8], ) -> (Bump, Version, HeaderLen, EndOffsets) { let mut cursor = Cursor::new(account_data); @@ -524,13 +572,6 @@ type PriceMsgSchema = u8; type PriceMsgVersion = u16; type PriceMsgSize = u32; -//price::FullPriceMessage & price::CompactPriceMessage -type PriceMsgId = u64; -type PriceMsgPrice = u64; -type PriceMsgPriceExpo = u64; -type PriceMsgEma = u64; -type PriceMsgEmaExpo = u64; - pub fn validate_price_msgs( id: u64, @@ -597,18 +638,44 @@ pub fn deserialize_price_msg_header(msg: &[u8]) -> (PriceMsgSchema, PriceMsgVers } -pub fn get_mock_pyth_price_account(id: u64) -> Pubkey { - let (mock_pyth_price_acct, _) = Pubkey::find_program_address( - &[b"pyth".as_ref(), b"price".as_ref(), &id.to_le_bytes()], - &::mock_cpi_caller::id(), - ); - mock_pyth_price_acct +pub fn find_msg_buffer_pda(cpi_caller_auth: Pubkey, pyth_price_acct: Pubkey) -> (Pubkey, u8) { + Pubkey::find_program_address( + &[ + cpi_caller_auth.as_ref(), + b"message".as_ref(), + pyth_price_acct.as_ref(), + ], + &::message_buffer::id(), + ) } -pub fn get_mock_cpi_auth() -> Pubkey { - let (mock_cpi_caller_auth, _) = Pubkey::find_program_address( - &[b"upd_price_write".as_ref(), ::message_buffer::id().as_ref()], - &::mock_cpi_caller::id(), - ); - mock_cpi_caller_auth + +pub fn deserialize_whitelist(account_data: &[u8]) -> Result<(u8, Pubkey, u32, Vec)> { + let mut cursor = Cursor::new(account_data); + let discriminator = &mut vec![0u8; 8]; + cursor.read_exact(discriminator).unwrap(); + assert_eq!(discriminator, &sighash("account", "Whitelist")); + + + let whitelist_acct_bump = cursor.read_u8().unwrap(); + + let admin_bytes = &mut vec![0u8; 32]; + cursor.read_exact(admin_bytes).unwrap(); + let admin_pubkey = Pubkey::try_from_slice(admin_bytes).unwrap(); + + let allowed_programs_len = cursor.read_u32::().unwrap(); + + let mut allowed_programs = vec![]; + for _ in 0..allowed_programs_len { + let allowed_program_bytes = &mut vec![0u8; 32]; + cursor.read_exact(allowed_program_bytes).unwrap(); + let allowed_program_pubkey = Pubkey::try_from_slice(allowed_program_bytes).unwrap(); + allowed_programs.push(allowed_program_pubkey); + } + Ok(( + whitelist_acct_bump, + admin_pubkey, + allowed_programs_len, + allowed_programs, + )) } From bacdc1bc3e7da8b202548b97e2f24defd3aec803 Mon Sep 17 00:00:00 2001 From: swimricky Date: Mon, 8 May 2023 14:05:58 -0400 Subject: [PATCH 11/12] test(message-buffer): resolve merge conflicts from repo restructure --- .../message_buffer}/programs/mock-cpi-caller/tests/cases/mod.rs | 0 .../programs/mock-cpi-caller/tests/cases/test_create_buffer.rs | 0 .../programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs | 0 .../programs/mock-cpi-caller/tests/cases/test_initialize.rs | 0 .../programs/mock-cpi-caller/tests/cases/test_put_all.rs | 0 .../programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs | 0 .../mock-cpi-caller/tests/cases/test_set_allowed_programs.rs | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/mod.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_initialize.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_put_all.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs (100%) rename {message_buffer => pythnet/message_buffer}/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs (100%) diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/mod.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_create_buffer.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_delete_buffer.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_initialize.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_put_all.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_resize_buffer.rs diff --git a/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs b/pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs similarity index 100% rename from message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs rename to pythnet/message_buffer/programs/mock-cpi-caller/tests/cases/test_set_allowed_programs.rs From ff290ce274776b1119e056f463a30506cce72356 Mon Sep 17 00:00:00 2001 From: swimricky Date: Mon, 8 May 2023 14:08:14 -0400 Subject: [PATCH 12/12] chore(message-buffer): delete commented out code --- .../programs/mock-cpi-caller/src/instructions/add_price.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs index 17911a53b5..57ea5bb81f 100644 --- a/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs +++ b/pythnet/message_buffer/programs/mock-cpi-caller/src/instructions/add_price.rs @@ -100,8 +100,6 @@ impl<'info> AddPrice<'info> { &[&[ UPD_PRICE_WRITE.as_bytes(), ctx.accounts.message_buffer_program.key().as_ref(), - // ctx.accounts.message_buffer_program.key().as_ref(), - // UPD_PRICE_WRITE.as_bytes(), &[bump], ]], )?;