diff --git a/.github/actions/setup-honggfuzz/action.yml b/.github/actions/setup-honggfuzz/action.yml new file mode 100644 index 00000000..7f05fb66 --- /dev/null +++ b/.github/actions/setup-honggfuzz/action.yml @@ -0,0 +1,23 @@ +name: "Setup Honggfuzz" +description: "Setup Honggfuzz" + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + name: Cache Honggfuzz + id: cache-honggfuzz + with: + path: | + ~/.cache/honggfuzz/ + ~/.local/share/honggfuzz/ + key: honggfuzz-${{ runner.os }}-v0000-${{ env.HONGGFUZZ_VERSION }} + - name: Install honggfuzz + run: cargo install honggfuzz --version ${{ env.HONGGFUZZ_VERSION }} + shell: bash + - name: Install binutils-dev + run: sudo apt-get install binutils-dev + shell: bash + - name: Install libunwind-dev + run: sudo apt-get install libunwind-dev + shell: bash diff --git a/.github/actions/setup-trident/action.yml b/.github/actions/setup-trident/action.yml new file mode 100644 index 00000000..0186f657 --- /dev/null +++ b/.github/actions/setup-trident/action.yml @@ -0,0 +1,17 @@ +name: "Setup Trident" +description: "Setup Trident" + +runs: + using: "composite" + steps: + - uses: actions/cache@v3 + name: Cache Trident + id: cache-trident + with: + path: | + ~/.cache/trident/ + ~/.local/share/trident/ + key: trident-${{ runner.os }}-v0000 + - name: Install Trident + run: cargo install --path crates/cli + shell: bash diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index efa72d86..d29e2f02 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,33 +10,11 @@ jobs: checks: runs-on: ubuntu-20.04 needs: - - explorer - cli - client - test steps: - run: echo "Done" - - explorer: - runs-on: ubuntu-20.04 - defaults: - run: - working-directory: crates/explorer - steps: - - uses: actions/checkout@v3 - - uses: ./.github/actions/setup-rust/ - id: rust-setup - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages - - name: Cargo build - run: cargo build - - name: Cargo fmt - run: cargo fmt -- --check - - name: Cargo clippy - run: cargo clippy -- -D warnings - - name: Cargo test - run: cargo test - cli: runs-on: ubuntu-20.04 defaults: diff --git a/.github/workflows/run_examples.yml b/.github/workflows/run_examples.yml index b48defd2..7a5eb634 100644 --- a/.github/workflows/run_examples.yml +++ b/.github/workflows/run_examples.yml @@ -4,7 +4,7 @@ on: push: branches: [master] -name: Test Escrow and Turnstile +name: Test Escrow env: SOLANA_CLI_VERSION: 1.18.12 @@ -27,19 +27,3 @@ jobs: - name: Test Escrow working-directory: examples/integration-tests/escrow run: cargo run --manifest-path ../../../Cargo.toml test - test_turnstile: - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - - uses: ./.github/actions/setup-rust/ - - uses: ./.github/actions/setup-solana/ - - uses: ./.github/actions/setup-anchor/ - id: rust-setup - - uses: Swatinem/rust-cache@v2 - name: Cache Rust and it's packages - - name: Build Turnstile - working-directory: examples/integration-tests/turnstile - run: anchor build - - name: Test Turnstile - working-directory: examples/integration-tests/turnstile - run: cargo run --manifest-path ../../../Cargo.toml test diff --git a/.github/workflows/run_fuzz_example.yml b/.github/workflows/run_fuzz_example.yml new file mode 100644 index 00000000..64c82a52 --- /dev/null +++ b/.github/workflows/run_fuzz_example.yml @@ -0,0 +1,57 @@ +name: Test Fuzz Tests + +on: + workflow_dispatch: + pull_request: + +env: + SOLANA_CLI_VERSION: 1.18.18 + HONGGFUZZ_VERSION: 0.5.56 + +jobs: + simple-cpi-6: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Set Anchor Version + run: echo "ANCHOR_VERSION=0.30.1" >> $GITHUB_ENV + + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + + - uses: ./.github/actions/setup-rust/ + + - uses: ./.github/actions/setup-solana/ + + - uses: ./.github/actions/setup-trident/ + + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + + - name: Test Fuzz + working-directory: examples/fuzz-tests/simple-cpi-6 + run: trident fuzz run fuzz_0 + arbitrary-limit-inputs-5: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Set Anchor Version + run: echo "ANCHOR_VERSION=0.30.1" >> $GITHUB_ENV + + - uses: Swatinem/rust-cache@v2 + name: Cache Rust and it's packages + + - uses: ./.github/actions/setup-rust/ + + - uses: ./.github/actions/setup-solana/ + + - uses: ./.github/actions/setup-trident/ + + - uses: ./.github/actions/setup-honggfuzz/ + id: rust-setup + + - name: Test Fuzz + working-directory: examples/fuzz-tests/arbitrary-limit-inputs-5 + run: trident fuzz run fuzz_0 diff --git a/.vscode/settings.json b/.vscode/settings.json index 8083b162..4baf4fc8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,7 +3,6 @@ // autodiscovery is disabled, must list all crates "crates/cli/Cargo.toml", "crates/client/Cargo.toml", - "crates/explorer/Cargo.toml", "crates/test/Cargo.toml", ], "rust-analyzer.diagnostics.disabled": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index c7c0f080..f1de3bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,26 @@ incremented upon a breaking change and the patch version will be incremented for ## [dev] - Unreleased + +## [0.7.0] - 2024-08-14 +### Added +- impr/ add feature flag to the AccountsSnapshots macro ([183](https://github.com/Ackee-Blockchain/trident/pull/183)) +- feat/ add Support for CPI ([182](https://github.com/Ackee-Blockchain/trident/pull/182)) +- feat/ add option to initialize Trident with Macro/File (for Snapshots) option based on preference ([179](https://github.com/Ackee-Blockchain/trident/pull/179)) +- feat/create AccountsSnapshots derive macro for Snapshots creation ([#177](https://github.com/Ackee-Blockchain/trident/pull/177)) +- feat/fuzzing moved to separate crate trident-fuzz ([#175](https://github.com/Ackee-Blockchain/trident/pull/175)) +- feat/unify dependencies provided by the Trident ([#172](https://github.com/Ackee-Blockchain/trident/pull/172)) +- feat/fuzzer-stats-logging, an optional statistics output for fuzzing session ([#144](https://github.com/Ackee-Blockchain/trident/pull/144)) + +### Fixed +- fix/in case of fuzzing failure throw error instead of only printing message ([#167](https://github.com/Ackee-Blockchain/trident/pull/167)) +- fix/snapshot's zeroed account as optional ([#170](https://github.com/Ackee-Blockchain/trident/pull/170)) + +### Removed +- del/remove localnet subcommand ([178](https://github.com/Ackee-Blockchain/trident/pull/178)) +- del/remove unnecessary fuzzing feature as trident is mainly fuzzer ([#176](https://github.com/Ackee-Blockchain/trident/pull/176)) +- del/remove Trident explorer ([#171](https://github.com/Ackee-Blockchain/trident/pull/171)) + ## [0.6.0] - 2024-05-20 ### Added - feat/anchor 0.30.0 support ([#148](https://github.com/Ackee-Blockchain/trident/pull/148)) diff --git a/Cargo.lock b/Cargo.lock index ea513a80..7dc015f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -69,19 +69,19 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.4" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72832d73be48bac96a5d7944568f305d829ed55b0ce3b483647089dfaf6cf704" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.12", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -119,9 +119,9 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" +checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn", "proc-macro2", @@ -131,12 +131,12 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" +checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn", - "bs58 0.5.0", + "bs58 0.5.1", "proc-macro2", "quote", "syn 1.0.109", @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" +checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn", "quote", @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" +checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn", "quote", @@ -166,9 +166,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" +checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn", "proc-macro2", @@ -178,20 +178,26 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" +checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" dependencies = [ + "anchor-lang-idl", "anchor-syn", + "anyhow", + "bs58 0.5.1", + "heck 0.3.3", + "proc-macro2", "quote", + "serde_json", "syn 1.0.109", ] [[package]] name = "anchor-client" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb48c4a7911038da546dc752655a29fa49f6bd50ebc1edca218bac8da1012acd" +checksum = "95b4397af9b7d6919df3342210d897c0ffda1a31d052abc8eee3e6035ee71567" dependencies = [ "anchor-lang", "anyhow", @@ -208,9 +214,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" +checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn", "quote", @@ -219,9 +225,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" +checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn", "borsh-derive-internal 0.10.3", @@ -232,9 +238,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" +checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ "proc-macro2", "quote", @@ -243,9 +249,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" +checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -256,38 +262,48 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", - "base64 0.13.1", + "base64 0.21.7", "bincode", "borsh 0.10.3", "bytemuck", - "getrandom 0.2.12", + "getrandom 0.2.15", "solana-program", "thiserror", ] [[package]] -name = "anchor-spl" -version = "0.29.0" +name = "anchor-lang-idl" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" +checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", + "anchor-lang-idl-spec", + "anyhow", + "heck 0.3.3", + "serde", + "serde_json", + "sha2 0.10.8", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", ] [[package]] name = "anchor-syn" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" +checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" dependencies = [ "anyhow", - "bs58 0.5.0", + "bs58 0.5.1", "heck 0.3.3", "proc-macro2", "quote", @@ -339,24 +355,24 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -373,9 +389,23 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.80" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "aquamarine" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" +dependencies = [ + "include_dir", + "itertools", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] [[package]] name = "arbitrary" @@ -427,7 +457,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -450,7 +480,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", @@ -479,7 +509,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -579,9 +609,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.6" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a116f46a969224200a0a97f29cfd4c50e7534e4b4826bd23ea2c3c533039c82c" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "brotli", "flate2", @@ -602,13 +632,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.77" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -624,15 +654,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -667,6 +697,15 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "basic-toml" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" +dependencies = [ + "serde", +] + [[package]] name = "bincode" version = "1.3.3" @@ -684,9 +723,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -702,9 +741,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", @@ -759,6 +798,16 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + [[package]] name = "borsh-derive" version = "0.9.3" @@ -785,6 +834,20 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.70", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" @@ -831,9 +894,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.4.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -842,9 +905,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -858,18 +921,18 @@ checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" [[package]] name = "bs58" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" dependencies = [ "tinyvec", ] [[package]] name = "bumpalo" -version = "3.15.2" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3b1be7772ee4501dba05acbe66bb1e8760f6a6c474a36035631638e4415f130" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bv" @@ -883,22 +946,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.14.3" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -909,9 +972,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" [[package]] name = "bzip2" @@ -936,9 +999,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] @@ -955,9 +1018,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -978,12 +1041,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -992,11 +1056,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" -version = "0.4.34" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1004,7 +1074,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -1088,7 +1158,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1108,9 +1178,9 @@ checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "combine" @@ -1127,9 +1197,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ "crossbeam-utils", ] @@ -1140,7 +1210,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1179,6 +1249,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1206,18 +1285,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1243,9 +1322,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1273,6 +1352,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1308,12 +1408,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.6", - "darling_macro 0.20.6", + "darling_core 0.20.10", + "darling_macro 0.20.10", ] [[package]] @@ -1332,16 +1432,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.50", + "strsim 0.11.1", + "syn 2.0.70", ] [[package]] @@ -1357,24 +1457,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.6" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.6", + "darling_core 0.20.10", "quote", - "syn 2.0.50", -] - -[[package]] -name = "dashmap" -version = "4.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77a43b28d0668df09411cb0bc9a8c2adc40f9a048afe863e05fd43251e8e39c" -dependencies = [ - "cfg-if", - "num_cpus", - "rayon", + "syn 2.0.70", ] [[package]] @@ -1384,17 +1473,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.3", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", + "rayon", ] [[package]] name = "data-encoding" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "der" @@ -1414,7 +1504,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1453,7 +1543,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1474,6 +1564,12 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.9.0" @@ -1547,13 +1643,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1576,9 +1672,15 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + [[package]] name = "eager" version = "0.1.0" @@ -1634,9 +1736,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1644,11 +1746,17 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -1664,13 +1772,13 @@ dependencies = [ [[package]] name = "enum-iterator-derive" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cdc46ec28bd728e67540c528013c6a10eb69a02eb31078a1bda695438cbfb8" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1679,11 +1787,11 @@ version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1707,9 +1815,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1723,9 +1831,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "feature-probe" @@ -1761,20 +1869,29 @@ checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.4.1", "windows-sys 0.52.0", ] [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1791,13 +1908,10 @@ dependencies = [ ] [[package]] -name = "fs-err" -version = "2.11.0" +name = "fragile" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" -dependencies = [ - "autocfg", -] +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" [[package]] name = "futures" @@ -1855,7 +1969,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -1872,9 +1986,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" @@ -1930,9 +2044,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1943,9 +2057,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1966,9 +2080,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.24" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1976,10 +2090,10 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.2.3", + "indexmap 2.2.6", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tracing", ] @@ -2016,14 +2130,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.11", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" @@ -2051,9 +2165,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "histogram" @@ -2093,21 +2207,21 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] [[package]] name = "http" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", @@ -2127,9 +2241,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -2145,9 +2259,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -2236,11 +2350,30 @@ dependencies = [ "version_check", ] +[[package]] +name = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "index_list" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70891286cb8e844fdfcf1178b47569699f9e20b5ecc4b45a6240a64771444638" +checksum = "2cb725b6505e51229de32027e0cfcd9db29da4d89156f9747b0a5195643fa3e1" [[package]] name = "indexmap" @@ -2254,12 +2387,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.3" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.14.5", ] [[package]] @@ -2277,9 +2410,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2296,7 +2429,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", "windows-sys 0.52.0", ] @@ -2312,24 +2445,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -2360,25 +2493,24 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" -version = "0.0.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "libc", - "redox_syscall", ] [[package]] @@ -2437,21 +2569,21 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254", "ark-ff", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "thiserror", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -2459,9 +2591,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" @@ -2474,9 +2606,9 @@ dependencies = [ [[package]] name = "lz4" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91" dependencies = [ "libc", "lz4-sys", @@ -2484,9 +2616,9 @@ dependencies = [ [[package]] name = "lz4-sys" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3" dependencies = [ "cc", "libc", @@ -2494,24 +2626,25 @@ dependencies = [ [[package]] name = "macrotest" -version = "1.0.9" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7489ae0986ce45414b7b3122c2e316661343ecf396b206e3e15f07c846616f10" +checksum = "4e2035deb453578ff1cd2da2761ac78abbffffd1d06a0f59261c082ea713fdad" dependencies = [ + "basic-toml", "diff", "glob", "prettyplease", "serde", + "serde_derive", "serde_json", - "syn 1.0.109", - "toml", + "syn 2.0.70", ] [[package]] name = "memchr" -version = "2.7.1" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2522,6 +2655,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -2533,9 +2675,9 @@ dependencies = [ [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -2566,24 +2708,51 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "modular-bitfield" version = "0.11.2" @@ -2628,6 +2797,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "num" version = "0.2.1" @@ -2655,11 +2830,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2699,7 +2873,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2713,9 +2887,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2736,9 +2910,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -2749,7 +2923,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.6", + "hermit-abi 0.3.9", "libc", ] @@ -2780,7 +2954,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2792,7 +2966,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -2803,9 +2977,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -2827,9 +3001,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl-probe" @@ -2893,9 +3067,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2903,22 +3077,22 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -2968,73 +3142,31 @@ dependencies = [ "num", ] -[[package]] -name = "phf" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" -dependencies = [ - "phf_macros", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" -dependencies = [ - "phf_shared", - "rand 0.8.5", -] - -[[package]] -name = "phf_macros" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.50", -] - -[[package]] -name = "phf_shared" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" -dependencies = [ - "siphasher", -] - [[package]] name = "pin-project" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -3087,13 +3219,43 @@ checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" [[package]] -name = "ppv-lite86" -version = "0.2.17" +name = "predicates-tree" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] [[package]] name = "pretty-hex" @@ -3113,12 +3275,26 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.1.25" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 1.0.109", + "syn 2.0.70", +] + +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", ] [[package]] @@ -3175,9 +3351,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3199,7 +3375,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3253,9 +3429,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -3319,7 +3495,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", ] [[package]] @@ -3342,9 +3518,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.8.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3381,22 +3557,31 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom 0.2.12", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.3" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -3406,9 +3591,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -3417,21 +3602,21 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "relative-path" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.11.24" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "async-compression", "base64 0.21.7", @@ -3460,7 +3645,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3493,7 +3678,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.12", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3536,7 +3721,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", "unicode-ident", ] @@ -3552,9 +3737,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3582,11 +3767,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.31" +version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.4.2", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3595,9 +3780,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", "ring 0.17.8", @@ -3638,15 +3823,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3689,7 +3874,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3704,11 +3889,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3717,9 +3902,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3727,47 +3912,56 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] +[[package]] +name = "seqlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c67b6f14ecc5b86c66fa63d76b5092352678545a8a3cdae80aef5128371910" +dependencies = [ + "parking_lot", +] + [[package]] name = "serde" -version = "1.0.197" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "serde_json" -version = "1.0.114" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", @@ -3802,19 +3996,19 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ - "darling 0.20.6", + "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "serde_yaml" -version = "0.9.32" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "itoa", "ryu", "serde", @@ -3827,7 +4021,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.5.3", + "dashmap", "futures", "lazy_static", "log", @@ -3843,7 +4037,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -3929,9 +4123,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ "libc", ] @@ -3969,25 +4163,25 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "solana-account-decoder" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bc7bb65888ae7e13180dcd6a74d3233fcc57b627e138e34f2ac01601e92e6a2" +checksum = "4973213a11c2e1b924b36e0c6688682b5aa4623f8d4eeaa1204c32cee524e6d6" dependencies = [ "Inflector", "base64 0.21.7", @@ -4001,7 +4195,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4010,9 +4204,9 @@ dependencies = [ [[package]] name = "solana-accounts-db" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8a6960b763f5608a5373c3623e14b8c5d6afc98513637bc80f6a132a7c3436" +checksum = "74c06263320e399af20d46c8cebea7a1d5dc1bc56f31f8dfaacf7119576c48a7" dependencies = [ "arrayref", "bincode", @@ -4022,22 +4216,21 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "num_cpus", - "num_enum 0.6.1", + "num_enum 0.7.2", "ouroboros", "percentage", "qualifier_attr", @@ -4045,14 +4238,17 @@ dependencies = [ "rayon", "regex", "rustc_version", + "seqlock", "serde", "serde_derive", + "smallvec", "solana-bucket-map", "solana-config-program", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-measure", "solana-metrics", + "solana-nohash-hasher", "solana-program-runtime", "solana-rayon-threadlimit", "solana-sdk", @@ -4069,14 +4265,14 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc7af1bec07573459641f5f3731adfe8804480ee5f3d6ff3396613999e20373" +checksum = "f4e57cb8f2e90361280b246f70bb7f5f86f4e4ff1ad5bbdfe18a81bea141f03a" dependencies = [ "bincode", "bytemuck", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -4090,11 +4286,11 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06a81d32f3e655c48feb0c7f9e35e978cbd8cff1e8ab2628a5e4c6db4acf59d9" +checksum = "7c65a9540370523f3ade7190526309337cc50f1d742b3341dfa7357da3f59a56" dependencies = [ - "borsh 0.10.3", + "borsh 1.5.1", "futures", "solana-banks-interface", "solana-program", @@ -4107,9 +4303,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46351e3e3fcc299b5f601053aee4ef02041ff485dddccf67003c9a0da8f56321" +checksum = "62b1dc20a7a71cf37bcbc2a3a5dfd73d7410a13850aa68d954a9c09e6a77e652" dependencies = [ "serde", "solana-sdk", @@ -4118,9 +4314,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904fcca7a6dd533eadc30b3aa690d3a78d95c0a49f36578a483539a3fcf709c8" +checksum = "d449d55d3c5c3fe4c9f0c9f790a9feabe294f8ff0b4c6b771a20b2313ad8974a" dependencies = [ "bincode", "crossbeam-channel", @@ -4138,9 +4334,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10fff6fa164f4cfe66731b574b56c0883e56228a64f03b4e66634e09187219a" +checksum = "6b1a55b8533f2dc716602e7c1b2bd555d5ac598ef6e80d28a517e6f31baf042e" dependencies = [ "bincode", "byteorder", @@ -4157,16 +4353,16 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b90122f6272c05baf8bbf88431be6feaf381aafd3d38e68b5ebd8c0a447f05f6" +checksum = "fda213af7ae26ce249120f211060d2a85d87fe367c6490ee19b70845cbd320fc" dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", - "num_enum 0.6.1", + "num_enum 0.7.2", "rand 0.8.5", "solana-measure", "solana-sdk", @@ -4175,9 +4371,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29a50c8ac6cb7cdefa3da425bad3122d14a7b9f5e1a6e1e4e64eb53c778c1ff" +checksum = "909f4553d0b31bb5b97533a6b64cc321a4eace9112d6efbabcf4408ea1b3f1db" dependencies = [ "chrono", "clap 2.34.0", @@ -4192,9 +4388,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c88fefb22ac1f9f8e0f2d33da1b3f6ebc7411e112a26d6490f03d50254c493" +checksum = "2242c4a0776cdaec1358d0ffc61b32131985a7b2210c491fa465d28c313eb880" dependencies = [ "dirs-next", "lazy_static", @@ -4208,9 +4404,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f28330bfd12bc0a502b2bed7b0360f0fca62128744a824143b2a6dfbaf89fd" +checksum = "bada4ba96ef2f351363ba64ce4f592bc584ac48bb7d9da4e41303416b0a21026" dependencies = [ "Inflector", "base64 0.21.7", @@ -4235,16 +4431,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93b28ec883a4bb22289ef31851abe5f2c9247748cf79580aef954ec9759b84ca" +checksum = "c5cc431df6cc1dd964134fa4ec7df765d3af3fae9c2148f96a3c4fb500290633" dependencies = [ "async-trait", "bincode", - "dashmap 4.0.2", + "dashmap", "futures", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "quinn", @@ -4268,9 +4464,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60e708bc0f1cb7807ee7ac81a73c72dfd90347cd906d918101de7e91f0b4407" +checksum = "9eb36ef3c3a1f38515c1ae0d255c4d6e5e635a856ac2aa1cd5f892b3db58e857" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4278,9 +4474,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5fa041dc7ebb8079fb15a4691b2822d8a67a615f90a838e43aa556eaab6178" +checksum = "e38b040d3a42e8f7d80c4a86bb0d49d7aed663b56b0fe0ae135d2d145fb7ae3a" dependencies = [ "bincode", "chrono", @@ -4292,15 +4488,15 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f933d76a147dc6bb37daff4314c7b63a8a4778be259d8cbe8126294d97b328d" +checksum = "ae02622c63943485f0af3d0896626eaf6478e734f0b6bc61c7cc5320963c6e75" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "log", "rand 0.8.5", "rayon", @@ -4314,9 +4510,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "506d373966c1118111c3d72ba88172e907d9699a2d6792210f31ed7423e654d9" +checksum = "838532d8437d00958621d2589d6033e9c69ea95cd0936efa8964146e49dcff53" dependencies = [ "lazy_static", "log", @@ -4338,28 +4534,23 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a64bc1df0fcda5884f6cf6eb50f8aa283dbf767e984fcbbb53e344859b597f" +checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" dependencies = [ - "ahash 0.8.4", - "blake3", "block-buffer 0.10.4", "bs58 0.4.0", "bv", - "byteorder", - "cc", "either", "generic-array", "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", "serde_derive", - "serde_json", "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", @@ -4368,21 +4559,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8e0e27e6639f23a7d23e0ae7b92b8ab5d848bb649e962f6528a795988ca161" +checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] name = "solana-loader-v4-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5918fbb8bfc74dc48d97e09bfd7c94772e63c8e252875f5834de7d56b4afe" +checksum = "98c426482234b7c267a5e0dfa8198442e1ffad2ad6c521f6b810949bc2719215" dependencies = [ "log", "solana-measure", @@ -4393,9 +4584,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b868a3b8148d7ab3e44a6b40530843903bedaaf8c6a2aa3d797eb01b3435538d" +checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" dependencies = [ "env_logger", "lazy_static", @@ -4404,9 +4595,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5a243ef9e5f0364a3625a74ac701ff15d28d57f997cfcfc5b27badb0f0f36d" +checksum = "be55a3df105431d25f86f2a7da0cbbde5f54c1f0782ca59367ea4a8037bc6797" dependencies = [ "log", "solana-sdk", @@ -4414,9 +4605,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b007b5f98cf2f3760fd28b3e9131e68ba9e55a9b164be966fc108e859999c1f8" +checksum = "ddec097ed7572804389195128dbd57958b427829153c6cd8ec3343c86fe3cd22" dependencies = [ "crossbeam-channel", "gethostname", @@ -4429,9 +4620,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6de74b7158359b85c773436284cd0bf68f925434888d2681d3db68dc1a1e4460" +checksum = "258fa7c29fb7605b8d2ed89aa0d43c640d14f4147ad1f5b3fdad19a1ac145ca5" dependencies = [ "bincode", "clap 3.2.25", @@ -4449,13 +4640,19 @@ dependencies = [ "url", ] +[[package]] +name = "solana-nohash-hasher" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" + [[package]] name = "solana-perf" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a837e4272603ec6b73e72db330f3b1b3b03174b6f2f57d28daf8d702adaa35" +checksum = "ca422edcf16a6e64003ca118575ea641f7b750f14a0ad28c71dd84f33dcb912a" dependencies = [ - "ahash 0.8.4", + "ahash 0.8.11", "bincode", "bv", "caps", @@ -4480,9 +4677,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ec090add6d789cd498291fbbcbc4207ec5d8f4df4e93cf9bd30feed14474a1" +checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" dependencies = [ "ark-bn254", "ark-ec", @@ -4490,10 +4687,11 @@ dependencies = [ "ark-serialize", "base64 0.21.7", "bincode", - "bitflags 2.4.2", + "bitflags 2.6.0", "blake3", "borsh 0.10.3", "borsh 0.9.3", + "borsh 1.5.1", "bs58 0.4.0", "bv", "bytemuck", @@ -4501,7 +4699,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.12", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", @@ -4509,9 +4707,9 @@ dependencies = [ "libsecp256k1", "light-poseidon", "log", - "memoffset 0.9.0", - "num-bigint 0.4.4", - "num-derive 0.3.3", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", "num-traits", "parking_lot", "rand 0.8.5", @@ -4534,9 +4732,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b0b2035bff6725d6792c2709871b3df58517e5b064fe8ae9a00aa9ec7c2804" +checksum = "bf373c3da0387f47fee4c5ed2465a9628b9db026a62211a692a9285aa9251544" dependencies = [ "base64 0.21.7", "bincode", @@ -4545,7 +4743,7 @@ dependencies = [ "itertools", "libc", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "percentage", "rand 0.8.5", @@ -4562,9 +4760,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "509de66ffda8fb3fc951d531a06320b2bc9a9c88792a408f79157a7123a25e17" +checksum = "9194b8744c5b135401ab4a2923a1072d3a67697bd50f7450a4ed5302f36a6999" dependencies = [ "assert_matches", "async-trait", @@ -4592,9 +4790,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb2e34874dc723285d1eedeb5d6c9b51e4b19e0b71434b5121019d21d4e5553" +checksum = "97b9abc76168d19927561db6a3685b98752bd0961b4ce4f8b7f85ee12238c017" dependencies = [ "crossbeam-channel", "futures-util", @@ -4617,9 +4815,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0a48caf146b1f226b0a049053ae77034df28818413c20528834b11d61e3c6a" +checksum = "7952c5306a0be5f5276448cd20246b31265bfa884f29a077a24303c6a16aeb34" dependencies = [ "async-mutex", "async-trait", @@ -4644,9 +4842,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b9aa7bb42651394ac4f087df364bfcf801d8d9f249e94721e1ef15240c5887" +checksum = "a4fa0cc66f8e73d769bca2ede3012ba2ef8ab67963e832808665369f2cf81743" dependencies = [ "lazy_static", "num_cpus", @@ -4654,14 +4852,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68904b56c0457dd688300069f825c169d30acfa4eddfd5662b0ca700437c5d78" +checksum = "289803796d4ff7b4699504d3ab9e9d9c5205ea3892b2ebe397b377494dbd75d4" dependencies = [ "console", "dialoguer", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", @@ -4673,9 +4871,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48b323271070ea8e2902c101d808d54c7d910d573b02a646e0c462aa6de2dc" +checksum = "6cb55a08018776a62ecff52139fbcdab1a7baa4e8f077202be58156e8dde4d5f" dependencies = [ "async-trait", "base64 0.21.7", @@ -4699,9 +4897,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa40fc52832e790c53e27baf771926542b5b9a370c5dad59cbc31055b1e52a2b" +checksum = "72a8403038f4d6ab65bc7e7afb3afe8d9824c592232553c5cef55cf3de36025d" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4715,15 +4913,15 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd6be836c589018ad607193ccf27677ac8e97125c40642ab2183f23deb95a5f" +checksum = "4caca735caf76d51c074c3bacbfe38094bf7f92cfbe7b5b13f3bc4946e64f889" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4734,10 +4932,11 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db3f3cf470ed0ec22b606f27fcaabad538486f15318abb7938e7225ca760401" +checksum = "b699943045665038bfa4e76dd2582b4c390f1aec6ab5edef36da43afe3469f1d" dependencies = [ + "aquamarine", "arrayref", "base64 0.21.7", "bincode", @@ -4747,11 +4946,10 @@ dependencies = [ "byteorder", "bzip2", "crossbeam-channel", - "dashmap 4.0.2", + "dashmap", "dir-diff", "flate2", "fnv", - "fs-err", "im", "index_list", "itertools", @@ -4759,12 +4957,13 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", + "mockall", "modular-bitfield", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "num_cpus", - "num_enum 0.6.1", + "num_enum 0.7.2", "ouroboros", "percentage", "qualifier_attr", @@ -4775,7 +4974,6 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "siphasher", "solana-accounts-db", "solana-address-lookup-table-program", "solana-bpf-loader-program", @@ -4811,15 +5009,15 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2817e4e1190e3539c989b3b350ee306b91e63959e19638e2632cc92ac9041527" +checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", - "bitflags 2.4.2", - "borsh 0.10.3", + "bitflags 2.6.0", + "borsh 1.5.1", "bs58 0.4.0", "bytemuck", "byteorder", @@ -4835,10 +5033,10 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", - "num-derive 0.3.3", + "memmap2 0.5.10", + "num-derive 0.4.2", "num-traits", - "num_enum 0.6.1", + "num_enum 0.7.2", "pbkdf2 0.11.0", "qstring", "qualifier_attr", @@ -4853,6 +5051,7 @@ dependencies = [ "serde_with", "sha2 0.10.8", "sha3 0.10.8", + "siphasher", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -4865,15 +5064,15 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04051488f4275df58be7abf34dc0583f4d38df72000a047c85a549c6a996acc0" +checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" dependencies = [ "bs58 0.4.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -4884,9 +5083,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3654be11d71a8751014b4ff07dbdaf5b513fe4876089011f96fc3cdb898e8a" +checksum = "e056d865d22548bb7228121e118aa632486fc1a33a100961e5e98b5663371384" dependencies = [ "crossbeam-channel", "log", @@ -4900,9 +5099,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e8c6ada46e6116fd58cafbb4cd65eb1129f75d4c9e1531d3d265131bf0455bc" +checksum = "c5dd1bc07beb75da5df5e07301d3d0d6104872c9afade22b910af9061fb4bc15" dependencies = [ "bincode", "log", @@ -4915,16 +5114,16 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4a9a97a9e559d4b1eaeb6a5700c9c9c109a15fdac1f7253af529677a69b39c" +checksum = "fad1bdb955ec6d23a1dbf87e403ff3e610d68616275693125a893d7ed4b2d323" dependencies = [ "async-channel", "bytes", "crossbeam-channel", "futures-util", "histogram", - "indexmap 2.2.3", + "indexmap 2.2.6", "itertools", "libc", "log", @@ -4937,6 +5136,7 @@ dependencies = [ "rand 0.8.5", "rcgen", "rustls", + "smallvec", "solana-metrics", "solana-perf", "solana-sdk", @@ -4947,9 +5147,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b15c250192f85b386f65a4c392645a979673e0e2315f0628e6791707ca01d3" +checksum = "78733745268c96d5a29c09cde9f0a6c9d662abba43e661b75dd858da8e3d0b2e" dependencies = [ "bincode", "log", @@ -4961,9 +5161,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "603ed51b04bbe7645c2f8a532adc1cf30e74b92d321171fc381caf29836f6fe0" +checksum = "bc301310ba0755c449a8800136f67f8ad14419b366404629894cd10021495360" dependencies = [ "bincode", "log", @@ -4976,14 +5176,14 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd9242b9df608c1e4d8ed0a22e68e864313678aa2d6f78e3a6bb75b42859a08" +checksum = "fb887bd5078ff015e103e9ee54a6713380590efa8ff1804b3a653f07188928c6" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.2.3", + "indexmap 2.2.6", "indicatif", "log", "rayon", @@ -5000,9 +5200,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53ebc2543fe6066cc3b530fce572d1a204a207fa801b258682efcf1955da683" +checksum = "4a0cdfdf63192fb60de094fae8e81159e4e3e9aac9659fe3f9ef0e707023fb32" dependencies = [ "Inflector", "base64 0.21.7", @@ -5019,15 +5219,15 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] [[package]] name = "solana-udp-client" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e49d8462ebedc0524d5c287dd7feea3ac13622b424deba4459813fff1748a9bb" +checksum = "3ea0d6d8d66e36371577f51c4d1d6192a66f1fa4efe7161a36d94677640dcadb" dependencies = [ "async-trait", "solana-connection-cache", @@ -5040,9 +5240,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ac486deb05a0c4164e892091c6c817c9f9a54d658721e316f49040ab2f2df9" +checksum = "6f4c2f531c22ce806b211118be8928a791425f97de4592371fb57b246ed33e34" dependencies = [ "log", "rustc_version", @@ -5056,9 +5256,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d9ceea1905d41065b73d763c7d816a271d0ba9e43df6834759ec61d1560974" +checksum = "28ab95a5d19ff0464def1777adaae5a74e1edc9e6818103064c18fdc2643f6cb" dependencies = [ "crossbeam-channel", "itertools", @@ -5075,13 +5275,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b87fe95b52594e21a410ec5ab00c3266ebf41997c8c28ca6765b123eaf5a475" +checksum = "6d8a6486017e71a3714a8e1a635e17209135cc20535ba9808ccf106d80ff6e8b" dependencies = [ "bincode", "log", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -5097,12 +5297,12 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68964dbd32b6119a1eafcb871dbc4225e91a74f90450d6edf0c7ccc3111082fe" +checksum = "f1e3dfb2deb449f7eb1dbd0c7e66dd95ec7b1303a5788673f9fbc9b5a5ea59f2" dependencies = [ "bytemuck", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "solana-program-runtime", "solana-sdk", @@ -5111,9 +5311,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.17.16" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d860992705578848d2a04e8a2a5b2b2d380b0be5db8cf9d0744a166e269c0ceb" +checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5125,7 +5325,7 @@ dependencies = [ "itertools", "lazy_static", "merlin", - "num-derive 0.3.3", + "num-derive 0.4.2", "num-traits", "rand 0.7.3", "serde", @@ -5191,7 +5391,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5214,7 +5414,7 @@ checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", "spl-discriminator-syn", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5226,7 +5426,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", + "syn 2.0.70", "thiserror", ] @@ -5274,21 +5474,7 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.50", -] - -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "syn 2.0.70", ] [[package]] @@ -5320,28 +5506,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5361,7 +5525,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5393,22 +5557,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5421,7 +5569,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.1", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5456,6 +5604,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.24.1" @@ -5503,15 +5657,27 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.70", +] + [[package]] name = "sync_wrapper" version = "0.1.2" @@ -5553,9 +5719,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -5599,9 +5765,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -5609,6 +5775,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5618,6 +5795,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + [[package]] name = "test-case" version = "3.3.1" @@ -5636,7 +5819,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5647,7 +5830,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "test-case-core", ] @@ -5668,22 +5851,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.57" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.57" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5698,9 +5881,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.34" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -5719,9 +5902,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -5748,9 +5931,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -5763,9 +5946,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.36.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -5782,13 +5965,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5819,9 +6002,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", @@ -5860,16 +6043,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5884,9 +6066,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" [[package]] name = "toml_edit" @@ -5894,7 +6076,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -5905,7 +6087,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.3", + "indexmap 2.2.6", "toml_datetime", "winnow", ] @@ -5936,7 +6118,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -5975,7 +6157,7 @@ dependencies = [ [[package]] name = "trident-cli" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "clap 4.3.19", @@ -5983,16 +6165,14 @@ dependencies = [ "solana-sdk", "tokio", "trident-client", - "trident-explorer", ] [[package]] name = "trident-client" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -6005,15 +6185,12 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", - "macrotest", "pathdiff", "pretty_assertions", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6021,15 +6198,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6037,15 +6208,27 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] [[package]] -name = "trident-derive-displayix" +name = "trident-derive-accounts-snapshots" version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-displayix" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6054,7 +6237,7 @@ dependencies = [ [[package]] name = "trident-derive-fuzz-deserialize" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6063,7 +6246,7 @@ dependencies = [ [[package]] name = "trident-derive-fuzz-test-executor" -version = "0.0.1" +version = "0.0.2" dependencies = [ "proc-macro2", "quote", @@ -6071,41 +6254,36 @@ dependencies = [ ] [[package]] -name = "trident-explorer" -version = "0.3.2" +name = "trident-fuzz" +version = "0.1.0" dependencies = [ - "base64 0.13.1", - "bincode", - "bs58 0.5.0", - "chrono", - "console", - "num-derive 0.4.2", - "num-traits", - "phf", - "pretty-hex", + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", "serde", "serde_json", - "solana-account-decoder", - "solana-cli-config", - "solana-client", - "solana-logger", - "solana-program", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", "solana-sdk", - "solana-transaction-status", - "solana-vote-program", - "spl-associated-token-account", - "spl-memo", "spl-token", + "syn 1.0.109", "thiserror", + "tokio", ] [[package]] name = "trident-test" -version = "0.3.2" +version = "0.3.3" dependencies = [ "darling 0.13.4", "macrotest", - "proc-macro2", "quote", "syn 1.0.109", ] @@ -6172,9 +6350,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -6203,9 +6381,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" [[package]] name = "untrusted" @@ -6231,9 +6409,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -6248,9 +6426,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" @@ -6278,9 +6456,9 @@ checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -6309,9 +6487,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -6319,24 +6497,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ "cfg-if", "js-sys", @@ -6346,9 +6524,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6356,28 +6534,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.91" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" dependencies = [ "js-sys", "wasm-bindgen", @@ -6416,11 +6594,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -6435,7 +6613,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -6453,7 +6631,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -6473,17 +6651,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -6494,9 +6673,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6506,9 +6685,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6518,9 +6697,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6530,9 +6715,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6542,9 +6727,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6554,9 +6739,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6566,9 +6751,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -6635,22 +6820,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6670,7 +6855,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.70", ] [[package]] @@ -6694,9 +6879,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.12+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index b13b50cb..72e56de1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,55 +1,24 @@ [workspace] -members = ["crates/cli", "crates/client", "crates/explorer", "crates/test"] +members = ["crates/cli", "crates/client", "crates/test", "crates/fuzz"] exclude = ["examples/"] resolver = "1" [workspace.dependencies] -trident-test = { path = "./crates/test", version = "0.3.2" } -trident-client = { path = "./crates/client", version = "0.6.0" } -trident-explorer = { path = "./crates/explorer", version = "0.3.2" } -anchor-client = { version=">=0.29.0", features = ["async"]} -solana-sdk = "1.16" -solana-cli-output = "1.16" -solana-transaction-status = "1.16" -solana-account-decoder = "1.16" -solana-cli-config = "1.16" -solana-client = "1.16" -solana-program = "1.16" -solana-logger = "1.16" -solana-vote-program = "1.16" -spl-token = "4.0.0" -spl-memo = "4.0.0" -spl-associated-token-account = "2.0.0" -tokio = { version = "1", default-features = false } -rand = "0.8.5" -serde_json = "1.0.72" -serde = { version = "1.0.136", default-features = false } -bincode = "1.3.3" -borsh = "0.10.3" -futures = "0.3.18" -fehler = { version = "1.0.0", default-features = false } -thiserror = "1.0.30" -ed25519-dalek = "1.0.1" -serial_test = "2.0.0" -anyhow = { version = "1.0.45", features = ["std"], default-features = false } -cargo_metadata = "0.17.0" -syn = { version = "1.0.109", default-features = false } -quote = "1.0.14" -heck = { version = "0.4.0", default-features = false } -toml = { version = "0.5.8", features = ["preserve_order"] } -log = "0.4" -rstest = "0.18.1" -lazy_static = "1.4.0" -bs58 = "0.5.0" -base64 = "0.13.0" -pretty-hex = "0.3.0" -console = "0.15.0" -chrono = "0.4.19" -phf = { version = "0.11.2", features = ["macros"] } -num-derive = "0.4.0" -num-traits = "0.2.14" -proc-macro2 = { version = "1.0.66", default-features = false } -darling = "0.13.1" -clap = { version = "=4.3.19", features = ["derive"] } -shellexpand = "3.1.0" +# ANCHOR +anchor-client = ">=0.29.0" +anchor-syn = ">=0.29.0" +anchor-lang = ">=0.29.0" + + +# SOLANA +solana-sdk = "1.17.4" +solana-cli-output = "1.17.4" +solana-transaction-status = "1.17.4" +solana-account-decoder = "1.17.4" +solana-program = "1.17.4" +solana-banks-client = "1.17.4" +solana-program-runtime = "1.17.4" +solana-program-test = "1.17.4" +spl-associated-token-account = { version = "2", features = ["no-entrypoint"] } +spl-token = { version = "4", features = ["no-entrypoint"] } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 353c32e3..98792dbb 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-cli" -version = "0.6.0" +version = "0.7.0" edition = "2021" repository = "https://github.com/Ackee-Blockchain/trident" license-file = "../../LICENSE" @@ -8,10 +8,14 @@ readme = "../../README.md" description = "Trident is Rust based testing framework providing several convenient developer tools for testing Solana programs written in Anchor." [dependencies] -clap = { workspace = true } -tokio = { workspace = true } -anyhow = { workspace = true } -fehler = { workspace = true } -solana-sdk = { workspace = true } -trident-client = { workspace = true } -trident-explorer = { workspace = true } +# TRIDENT +trident-client = { path = "../client", version = "0.7.0" } + +# SOLANA +solana-sdk = { workspace = true } + +# MISC +clap = { version = "=4.3.19", features = ["derive"] } +tokio = { version = "1" } +anyhow = { version = "1.0.45" } +fehler = { version = "1.0.0" } diff --git a/crates/cli/src/command.rs b/crates/cli/src/command.rs index f21c1392..3dadbe8b 100644 --- a/crates/cli/src/command.rs +++ b/crates/cli/src/command.rs @@ -10,14 +10,8 @@ pub use fuzz::{fuzz, FuzzCommand}; mod test; pub use test::test; -mod localnet; -pub use localnet::localnet; - -mod explorer; -pub use explorer::{explorer, ExplorerCommand}; - mod init; -pub use init::{init, TestsType}; +pub use init::{init, SnapshotsType, TestsType}; mod clean; pub use clean::clean; diff --git a/crates/cli/src/command/build.rs b/crates/cli/src/command/build.rs index c71d4e43..d005301b 100644 --- a/crates/cli/src/command/build.rs +++ b/crates/cli/src/command/build.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Error}; use fehler::throws; -use trident_client::*; +use trident_client::___private::TestGenerator; use crate::_discover; @@ -22,6 +22,6 @@ pub async fn build(root: Option) { } } }; - let mut generator: TestGenerator = TestGenerator::new_with_root(root); + let mut generator: TestGenerator = TestGenerator::new_with_root(root, false); generator.build().await?; } diff --git a/crates/cli/src/command/clean.rs b/crates/cli/src/command/clean.rs index f66ebb86..27597878 100644 --- a/crates/cli/src/command/clean.rs +++ b/crates/cli/src/command/clean.rs @@ -1,6 +1,6 @@ use anyhow::Error; use fehler::throws; -use trident_client::Cleaner; +use trident_client::___private::Cleaner; #[throws] pub async fn clean() { diff --git a/crates/cli/src/command/explorer.rs b/crates/cli/src/command/explorer.rs deleted file mode 100644 index 1cb53a42..00000000 --- a/crates/cli/src/command/explorer.rs +++ /dev/null @@ -1,204 +0,0 @@ -use anyhow::Error; -use clap::Subcommand; -use fehler::throws; -use solana_sdk::{pubkey::Pubkey, signature::Signature}; -use trident_explorer::display::DisplayFormat; - -mod account; -mod program; -mod transaction; - -#[derive(Subcommand)] -pub enum ExplorerCommand { - /// Show the contents of an account - Account { - /// Ed25519 pubkey, PDA or hash of a pubkey - pubkey: Pubkey, - /// Pretty-printed JSON output - #[clap(long = "json-pretty", conflicts_with = "json")] - jsonpretty: bool, - /// JSON output - #[clap(long, conflicts_with = "jsonpretty")] - json: bool, - #[clap(long = "hide-lamports")] - /// Hide lamports in the output - hidelamports: bool, - /// Hide data in the output - #[clap(long = "hide-data")] - hidedata: bool, - #[clap(long = "hide-owner")] - /// Hide owner in the output - hideowner: bool, - #[clap(long = "hide-executable")] - /// Hide executable in the output - hideexecutable: bool, - /// Hide rent epoch in the output - #[clap(long = "hide-rent-epoch")] - hiderentepoch: bool, - }, - /// Show the details of a program - Program { - /// Address of a program to show - pubkey: Pubkey, - /// Pretty-printed JSON output - #[clap(long = "json-pretty", conflicts_with = "json")] - jsonpretty: bool, - /// JSON output - #[clap(long, conflicts_with = "jsonpretty")] - json: bool, - /// Hide program account in the output - #[clap(long = "hide-program-account")] - hideprogramaccount: bool, - /// Hide programdata account in the output - #[clap(long = "hide-programdata-account")] - hideprogramdataaccount: bool, - }, - /// Show the contents of a transaction - Transaction { - /// Signature of a transaction - signature: Signature, - /// Raw transaction without interpretation - #[clap(short, long)] - raw: bool, - /// Pretty-printed JSON output - #[clap(long = "json-pretty", conflicts_with = "json")] - jsonpretty: bool, - /// JSON output - #[clap(long, conflicts_with = "jsonpretty")] - json: bool, - /// Hide overview in the output - #[clap(long = "hide-overview")] - hideoverview: bool, - /// Hide transaction content in the output - #[clap(long = "hide-transaction")] - hidetransaction: bool, - /// Hide log messages in the output - #[clap(long = "hide-log-messages", conflicts_with = "raw")] - hidelogmessages: bool, - }, -} - -#[throws] -pub async fn explorer(subcmd: ExplorerCommand) { - match subcmd { - ExplorerCommand::Account { - pubkey, - jsonpretty, - json, - hidelamports, - hidedata, - hideowner, - hideexecutable, - hiderentepoch, - } => { - if jsonpretty { - account::view( - pubkey, - hidelamports, - hidedata, - hideowner, - hideexecutable, - hiderentepoch, - DisplayFormat::JSONPretty, - ) - .await? - } else if json { - account::view( - pubkey, - hidelamports, - hidedata, - hideowner, - hideexecutable, - hiderentepoch, - DisplayFormat::JSON, - ) - .await? - } else { - account::view( - pubkey, - hidelamports, - hidedata, - hideowner, - hideexecutable, - hiderentepoch, - DisplayFormat::Cli, - ) - .await? - } - } - ExplorerCommand::Program { - pubkey, - jsonpretty, - json, - hideprogramaccount, - hideprogramdataaccount, - } => { - if jsonpretty { - program::view( - pubkey, - hideprogramaccount, - hideprogramdataaccount, - DisplayFormat::JSONPretty, - ) - .await? - } else if json { - program::view( - pubkey, - hideprogramaccount, - hideprogramdataaccount, - DisplayFormat::JSON, - ) - .await? - } else { - program::view( - pubkey, - hideprogramaccount, - hideprogramdataaccount, - DisplayFormat::Cli, - ) - .await? - } - } - ExplorerCommand::Transaction { - signature, - raw, - jsonpretty, - json, - hideoverview, - hidetransaction, - hidelogmessages, - } => { - if jsonpretty { - transaction::view( - signature, - raw, - hideoverview, - hidetransaction, - hidelogmessages, - DisplayFormat::JSONPretty, - ) - .await? - } else if json { - transaction::view( - signature, - raw, - hideoverview, - hidetransaction, - hidelogmessages, - DisplayFormat::JSON, - ) - .await? - } else { - transaction::view( - signature, - raw, - hideoverview, - hidetransaction, - hidelogmessages, - DisplayFormat::Cli, - ) - .await? - } - } - } -} diff --git a/crates/cli/src/command/explorer/account.rs b/crates/cli/src/command/explorer/account.rs deleted file mode 100644 index 92726605..00000000 --- a/crates/cli/src/command/explorer/account.rs +++ /dev/null @@ -1,37 +0,0 @@ -use anyhow::Error; -use fehler::throws; -use solana_sdk::pubkey::Pubkey; -use trident_explorer::{ - account::AccountFieldVisibility, config::ExplorerConfig, display::DisplayFormat, - output::print_account, -}; - -#[throws] -pub async fn view( - pubkey: Pubkey, - hidelamports: bool, - hidedata: bool, - hideowner: bool, - hideexecutable: bool, - hiderentepoch: bool, - format: DisplayFormat, -) { - let mut visibility = AccountFieldVisibility::new_all_enabled(); - if hidelamports { - visibility.disable_lamports(); - } - if hidedata { - visibility.disable_data(); - } - if hideowner { - visibility.disable_owner(); - } - if hideexecutable { - visibility.disable_executable(); - } - if hiderentepoch { - visibility.disable_rent_epoch(); - } - let config = ExplorerConfig::default(); - print_account(&pubkey, &visibility, format, &config).await?; -} diff --git a/crates/cli/src/command/explorer/program.rs b/crates/cli/src/command/explorer/program.rs deleted file mode 100644 index 2026c0cd..00000000 --- a/crates/cli/src/command/explorer/program.rs +++ /dev/null @@ -1,25 +0,0 @@ -use anyhow::Error; -use fehler::throws; -use solana_sdk::pubkey::Pubkey; -use trident_explorer::{ - config::ExplorerConfig, display::DisplayFormat, output::print_program, - program::ProgramFieldVisibility, -}; - -#[throws] -pub async fn view( - pubkey: Pubkey, - hideprogramaccount: bool, - hideprogramdataaccount: bool, - format: DisplayFormat, -) { - let mut visibility = ProgramFieldVisibility::new_all_enabled(); - if hideprogramaccount { - visibility.disable_program_account(); - } - if hideprogramdataaccount { - visibility.disable_programdata_account(); - } - let config = ExplorerConfig::default(); - print_program(&pubkey, &visibility, format, &config).await?; -} diff --git a/crates/cli/src/command/explorer/transaction.rs b/crates/cli/src/command/explorer/transaction.rs deleted file mode 100644 index 0685dc26..00000000 --- a/crates/cli/src/command/explorer/transaction.rs +++ /dev/null @@ -1,43 +0,0 @@ -use anyhow::Error; -use fehler::throws; -use solana_sdk::signature::Signature; -use trident_explorer::{ - config::ExplorerConfig, - display::DisplayFormat, - output::{print_raw_transaction, print_transaction}, - transaction::{RawTransactionFieldVisibility, TransactionFieldVisibility}, -}; - -#[throws] -pub async fn view( - signature: Signature, - raw: bool, - hideoverview: bool, - hidetransaction: bool, - hidelogmessages: bool, - format: DisplayFormat, -) { - let config = ExplorerConfig::default(); - if raw { - let mut visibility = RawTransactionFieldVisibility::new_all_enabled(); - if hideoverview { - visibility.disable_overview(); - } - if hidetransaction { - visibility.disable_transaction(); - } - print_raw_transaction(&signature, &visibility, format, &config).await? - } else { - let mut visibility = TransactionFieldVisibility::new_all_enabled(); - if hideoverview { - visibility.disable_overview(); - } - if hidetransaction { - visibility.disable_transaction(); - } - if hidelogmessages { - visibility.disable_log_messages(); - } - print_transaction(&signature, &visibility, format, &config).await? - }; -} diff --git a/crates/cli/src/command/fuzz.rs b/crates/cli/src/command/fuzz.rs index 87b74507..27bf5fd7 100644 --- a/crates/cli/src/command/fuzz.rs +++ b/crates/cli/src/command/fuzz.rs @@ -2,10 +2,12 @@ use anyhow::{bail, Error}; use clap::Subcommand; use fehler::throws; -use trident_client::{Commander, TestGenerator}; +use trident_client::___private::{Commander, TestGenerator}; use crate::_discover; +use super::SnapshotsType; + pub const TRIDENT_TOML: &str = "Trident.toml"; #[derive(Subcommand)] @@ -27,7 +29,10 @@ pub enum FuzzCommand { crash_file_path: String, }, /// Add new fuzz test. Explicit fuzz test name is not yet supported. Implicit name is fuzz_ID, where ID is automatically derived. - Add, + Add { + #[clap(default_value = "file")] + snapshots_type: SnapshotsType, + }, } #[throws] @@ -64,10 +69,13 @@ pub async fn fuzz(root: Option, subcmd: FuzzCommand) { commander.run_fuzzer_debug(target, crash_file_path).await?; } - FuzzCommand::Add => { + FuzzCommand::Add { snapshots_type } => { // generate generator with root so that we do not need to again // look for root within the generator - let mut generator = TestGenerator::new_with_root(root); + let mut generator = match snapshots_type { + SnapshotsType::Macro => TestGenerator::new_with_root(root, false), + SnapshotsType::File => TestGenerator::new_with_root(root, true), + }; generator.add_fuzz_test().await?; } }; diff --git a/crates/cli/src/command/init.rs b/crates/cli/src/command/init.rs index bf4c4c88..e862e41a 100644 --- a/crates/cli/src/command/init.rs +++ b/crates/cli/src/command/init.rs @@ -1,7 +1,7 @@ use anyhow::{bail, Error}; use clap::ValueEnum; use fehler::throws; -use trident_client::TestGenerator; +use trident_client::___private::TestGenerator; use crate::_discover; @@ -13,9 +13,14 @@ pub enum TestsType { Fuzz, Poc, } +#[derive(ValueEnum, Clone)] +pub enum SnapshotsType { + Macro, + File, +} #[throws] -pub async fn init(tests_type: TestsType) { +pub async fn init(tests_type: TestsType, snapshots_type: SnapshotsType) { // look for Anchor.toml let root = if let Some(r) = _discover(ANCHOR_TOML)? { r @@ -23,7 +28,10 @@ pub async fn init(tests_type: TestsType) { bail!("It does not seem that Anchor is initialized because the Anchor.toml file was not found in any parent directory!"); }; - let mut generator: TestGenerator = TestGenerator::new_with_root(root); + let mut generator: TestGenerator = match snapshots_type { + SnapshotsType::Macro => TestGenerator::new_with_root(root, false), + SnapshotsType::File => TestGenerator::new_with_root(root, true), + }; match tests_type { TestsType::Poc => { diff --git a/crates/cli/src/command/keypair.rs b/crates/cli/src/command/keypair.rs index 69100132..44a32fb7 100644 --- a/crates/cli/src/command/keypair.rs +++ b/crates/cli/src/command/keypair.rs @@ -2,7 +2,7 @@ use anyhow::Error; use clap::Subcommand; use fehler::throws; use solana_sdk::signer::Signer; -use trident_client::{keypair as other_keypair, program_keypair, system_keypair}; +use trident_client::___private::{keypair as other_keypair, program_keypair, system_keypair}; #[derive(Subcommand)] pub enum KeyPairCommand { diff --git a/crates/cli/src/command/localnet.rs b/crates/cli/src/command/localnet.rs deleted file mode 100644 index 9cb4973d..00000000 --- a/crates/cli/src/command/localnet.rs +++ /dev/null @@ -1,15 +0,0 @@ -use anyhow::Error; -use fehler::throws; -use tokio::signal; -use trident_client::*; - -#[throws] -pub async fn localnet() { - let commander = Commander::new(); - let validator_handle = commander.start_localnet().await?; - - // wait for SIGINT (^C) signal - signal::ctrl_c().await.expect("failed to listen for event"); - - validator_handle.stop_and_remove_ledger().await?; -} diff --git a/crates/cli/src/command/test.rs b/crates/cli/src/command/test.rs index 0655db1d..0420e3fe 100644 --- a/crates/cli/src/command/test.rs +++ b/crates/cli/src/command/test.rs @@ -1,6 +1,6 @@ use anyhow::{bail, Error}; use fehler::throws; -use trident_client::*; +use trident_client::___private::Commander; use crate::_discover; diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 5aef3fac..f1addc70 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -1,13 +1,12 @@ use anyhow::Error; use anyhow::{Context, Result}; use clap::{Parser, Subcommand}; -use command::TestsType; +use command::{SnapshotsType, TestsType}; use fehler::throws; // subcommand functions to call and nested subcommands mod command; // bring nested subcommand enums into scope -use command::ExplorerCommand; use command::FuzzCommand; use command::KeyPairCommand; @@ -46,18 +45,14 @@ enum Command { #[clap(subcommand)] subcmd: FuzzCommand, }, - /// Run local test validator - Localnet, - /// The Hacker's Explorer - Explorer { - #[clap(subcommand)] - subcmd: ExplorerCommand, - }, /// Initialize test environment Init { /// Specifies the types of tests for which the frameworks should be initialized. - #[clap(default_value = "both")] + #[clap(default_value = "fuzz")] tests_type: TestsType, + /// Specifies type of Accounts Snapshots, i.e used derive macro or generated file + #[clap(default_value = "file")] + snapshots_type: SnapshotsType, }, /// Removes target contents except for KeyPair and removes hfuzz_target folder Clean, @@ -72,9 +67,10 @@ pub async fn start() { Command::KeyPair { subcmd } => command::keypair(subcmd)?, Command::Test { root } => command::test(root).await?, Command::Fuzz { root, subcmd } => command::fuzz(root, subcmd).await?, - Command::Localnet => command::localnet().await?, - Command::Explorer { subcmd } => command::explorer(subcmd).await?, - Command::Init { tests_type } => command::init(tests_type).await?, + Command::Init { + tests_type, + snapshots_type, + } => command::init(tests_type, snapshots_type).await?, Command::Clean => command::clean().await?, } } diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 6ae6cea2..0a951805 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -1,82 +1,73 @@ [package] name = "trident-client" -version = "0.6.0" +version = "0.7.0" edition = "2021" repository = "https://github.com/Ackee-Blockchain/trident" license-file = "../../LICENSE" readme = "../../README.md" description = "The trident_client crate helps you build and deploy an Anchor program to a local cluster and run a test suite against it." -[features] -fuzzing = [ - "dep:solana-program-test", - "dep:honggfuzz", - "quinn-proto/arbitrary", - "dep:solana-program-runtime", -] - [build-dependencies] anyhow = { version = "1.0.45", features = ["std"], default-features = false } [dev-dependencies] pretty_assertions = "1.1.0" -macrotest = "1.0.9" [dependencies] -trident-derive-displayix = { path = "./derive/display_ix", version = "0.0.1" } -trident-derive-fuzz-deserialize = { path = "./derive/fuzz_deserialize", version = "0.0.1" } -trident-derive-fuzz-test-executor = { path = "./derive/fuzz_test_executor", version = "0.0.1" } -trident-test = { workspace = true } +# TRIDENT +trident-derive-displayix = { path = "../fuzz/derive/display_ix", version = "0.0.2" } +trident-derive-fuzz-deserialize = { path = "../fuzz/derive/fuzz_deserialize", version = "0.0.2" } +trident-derive-fuzz-test-executor = { path = "../fuzz/derive/fuzz_test_executor", version = "0.0.2" } +trident-derive-accounts-snapshots = { path = "../fuzz/derive/accounts_snapshots", version = "0.0.1" } + +trident-test = { path = "../test", version = "0.3.3" } +trident-fuzz = { path = "../fuzz", version = "0.1.0" } + +# ANCHOR # INFO: Anchor-spl is here as dependency only to activate the idl-build feature, so that # users do not have to do it manually in their program's Cargo.toml -anchor-spl = { version = ">=0.29.0", features = ["idl-build"] } -anchor-lang = { version = ">=0.29.0", features = [ - "idl-build", - "init-if-needed", -] } -anchor-syn = { version = ">=0.29.0" } +anchor-lang = { workspace = true, features = ["init-if-needed"] } +anchor-syn = { workspace = true } +anchor-client = { workspace = true, features = ["async"] } + +# SOLANA solana-sdk = { workspace = true } solana-cli-output = { workspace = true } solana-transaction-status = { workspace = true } solana-account-decoder = { workspace = true } -anchor-client = { workspace = true } spl-token = { workspace = true } spl-associated-token-account = { workspace = true } -tokio = { workspace = true } -rand = { workspace = true } -serde_json = { workspace = true } -serde = { workspace = true } -bincode = { workspace = true } -borsh = { workspace = true } -futures = { workspace = true } -fehler = { workspace = true } -thiserror = { workspace = true } -ed25519-dalek = { workspace = true } -serial_test = { workspace = true } -anyhow = { workspace = true } -cargo_metadata = { workspace = true } -syn = { workspace = true, features = ["visit"] } -quote = { workspace = true } -heck = { workspace = true } -toml = { workspace = true } -log = { workspace = true } -rstest = { workspace = true } -lazy_static = { workspace = true } -proc-macro2 = { workspace = true } -honggfuzz = { version = "0.5.55", optional = true } +solana-program-test = { workspace = true } + + +# HONGGFUZZ +honggfuzz = { version = "0.5.55" } +# ARBITRARY arbitrary = { version = "1.3.0", features = ["derive"] } -solana-program-test = { version = "1.16", optional = true } -quinn-proto = { version = "0.10.6", optional = true } -solana-program-runtime = { version = "1.16", optional = true } -shellexpand = { workspace = true } + + +# MISC +shellexpand = "3.1.0" +tokio = "1" +serde_json = "1.0.72" +serde = { version = "1.0.136", default-features = false } +bincode = "1.3.3" +borsh = "0.10.3" +futures = "0.3.18" +fehler = "1.0.0" +thiserror = "1.0.30" +ed25519-dalek = "1.0.1" +serial_test = "2.0.0" +anyhow = "1.0.45" +cargo_metadata = "0.17.0" +syn = { version = "1.0.109", features = ["visit"] } +quote = "1.0.14" +heck = { version = "0.4.0", default-features = false } +toml = { version = "0.5.8", features = ["preserve_order"] } +log = "0.4" +rstest = "0.18.1" +proc-macro2 = { version = "1.0.66", default-features = false } +quinn-proto = { version = "0.10.6", features = ["arbitrary"] } pathdiff = "0.2.1" -solana-banks-client = "1.16" indicatif = "0.17.8" regex = "1.10.3" -solana-bpf-loader-program = "1.16" - - -# ----------- -solana-program = "1.16" -solana-sdk-macro = "1.16" -solana-system-program = "1.16" diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index 4af6c586..59ec46b1 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -1,4 +1,6 @@ -use crate::{config::Config, Reader, TempClone}; +use crate::___private::Reader; +use crate::___private::TempClone; +use crate::config::Config; use anchor_client::{ anchor_lang::{ prelude::System, solana_program::program_pack::Pack, AccountDeserialize, Id, diff --git a/crates/client/src/commander.rs b/crates/client/src/commander.rs index a2346ffd..1219fbcb 100644 --- a/crates/client/src/commander.rs +++ b/crates/client/src/commander.rs @@ -1,9 +1,7 @@ +use crate::___private::Client; use crate::config::Config; +use crate::idl::{self}; use crate::test_generator::ProgramData; -use crate::{ - idl::{self}, - Client, -}; use fehler::{throw, throws}; use log::debug; use solana_sdk::signer::keypair::Keypair; @@ -19,6 +17,8 @@ use tokio::{ }; use crate::constants::*; +use tokio::io::AsyncBufReadExt; +use trident_fuzz::fuzz_stats::FuzzingStatistics; #[derive(Error, Debug)] pub enum Error { @@ -153,7 +153,13 @@ impl Commander { // arguments so we need to parse the variable content. let hfuzz_run_args = std::env::var("HFUZZ_RUN_ARGS").unwrap_or_default(); - let fuzz_args = config.get_honggfuzz_args(hfuzz_run_args); + let genesis_folder = PathBuf::from(self.root.to_string()).join("trident-genesis"); + + let rustflags = std::env::var("RUSTFLAGS").unwrap_or_default(); + + let rustflags = config.get_rustflags_args(rustflags); + + let mut fuzz_args = config.get_honggfuzz_args(hfuzz_run_args); // let cargo_target_dir = std::env::var("CARGO_TARGET_DIR").unwrap_or_default(); @@ -181,36 +187,36 @@ impl Commander { } } - let mut rustflags = if config.fuzz.allow_duplicate_txs { - "--cfg allow_duplicate_txs " - } else { - "" - } - .to_string(); - - rustflags.push_str(&std::env::var("RUSTFLAGS").unwrap_or_default()); - - let mut child = Command::new("cargo") - .env("HFUZZ_RUN_ARGS", fuzz_args) - .env("CARGO_TARGET_DIR", cargo_target_dir) - .env("HFUZZ_WORKSPACE", hfuzz_workspace) - .env("RUSTFLAGS", rustflags) - .arg("hfuzz") - .arg("run") - .arg(target) - .spawn()?; - - tokio::select! { - res = child.wait() => - match res { - Ok(status) => if !status.success() { - println!("Honggfuzz exited with an error!"); - }, - Err(_) => throw!(Error::FuzzingFailed), - }, - _ = signal::ctrl_c() => { - tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; - }, + match rustflags.contains("fuzzing_with_stats") { + true => { + // enforce keep output to be true + fuzz_args.push_str("--keep_output"); + let mut child = Command::new("cargo") + .env("GENESIS_FOLDER", genesis_folder) + .env("HFUZZ_RUN_ARGS", fuzz_args) + .env("CARGO_TARGET_DIR", cargo_target_dir) + .env("HFUZZ_WORKSPACE", hfuzz_workspace) + .env("RUSTFLAGS", rustflags) + .arg("hfuzz") + .arg("run") + .arg(target) + .stdout(Stdio::piped()) + .spawn()?; + Self::handle_child_with_stats(&mut child).await?; + } + false => { + let mut child = Command::new("cargo") + .env("GENESIS_FOLDER", genesis_folder) + .env("HFUZZ_RUN_ARGS", fuzz_args) + .env("CARGO_TARGET_DIR", cargo_target_dir) + .env("HFUZZ_WORKSPACE", hfuzz_workspace) + .env("RUSTFLAGS", rustflags) + .arg("hfuzz") + .arg("run") + .arg(target) + .spawn()?; + Self::handle_child(&mut child).await?; + } } if let Ok(crash_files) = get_crash_files(&crash_dir, &ext) { @@ -219,7 +225,7 @@ impl Commander { "The crash directory {} contains new fuzz test crashes. Exiting!", crash_dir.to_string_lossy() ); - process::exit(1); + process::exit(99); } } } @@ -231,37 +237,68 @@ impl Commander { let hfuzz_run_args = std::env::var("HFUZZ_RUN_ARGS").unwrap_or_default(); + let genesis_folder = PathBuf::from(self.root.to_string()).join("trident-genesis"); + let cargo_target_dir = std::env::var("CARGO_TARGET_DIR") .unwrap_or_else(|_| config.get_env_arg("CARGO_TARGET_DIR")); let hfuzz_workspace = std::env::var("HFUZZ_WORKSPACE") .unwrap_or_else(|_| config.get_env_arg("HFUZZ_WORKSPACE")); - let fuzz_args = config.get_honggfuzz_args(hfuzz_run_args); - - let mut rustflags = if config.fuzz.allow_duplicate_txs { - "--cfg allow_duplicate_txs " - } else { - "" + let mut fuzz_args = config.get_honggfuzz_args(hfuzz_run_args); + + let rustflags = std::env::var("RUSTFLAGS").unwrap_or_default(); + + let rustflags = config.get_rustflags_args(rustflags); + + match rustflags.contains("fuzzing_with_stats") { + true => { + // enforce keep output to be true + fuzz_args.push_str("--keep_output"); + let mut child = Command::new("cargo") + .env("GENESIS_FOLDER", genesis_folder) + .env("HFUZZ_RUN_ARGS", fuzz_args) + .env("CARGO_TARGET_DIR", cargo_target_dir) + .env("HFUZZ_WORKSPACE", hfuzz_workspace) + .env("RUSTFLAGS", rustflags) + .arg("hfuzz") + .arg("run") + .arg(target) + .stdout(Stdio::piped()) + .spawn()?; + Self::handle_child_with_stats(&mut child).await?; + } + false => { + let mut child = Command::new("cargo") + .env("GENESIS_FOLDER", genesis_folder) + .env("HFUZZ_RUN_ARGS", fuzz_args) + .env("CARGO_TARGET_DIR", cargo_target_dir) + .env("HFUZZ_WORKSPACE", hfuzz_workspace) + .env("RUSTFLAGS", rustflags) + .arg("hfuzz") + .arg("run") + .arg(target) + .spawn()?; + Self::handle_child(&mut child).await?; + } } - .to_string(); - - rustflags.push_str(&std::env::var("RUSTFLAGS").unwrap_or_default()); - - let mut child = Command::new("cargo") - .env("HFUZZ_RUN_ARGS", fuzz_args) - .env("CARGO_TARGET_DIR", cargo_target_dir) - .env("HFUZZ_WORKSPACE", hfuzz_workspace) - .env("RUSTFLAGS", rustflags) - .arg("hfuzz") - .arg("run") - .arg(target) - .spawn()?; + } + /// Manages a child process in an async context, specifically for monitoring fuzzing tasks. + /// Waits for the process to exit or a Ctrl+C signal. Prints an error message if the process + /// exits with an error, and sleeps briefly on Ctrl+C. Throws `Error::FuzzingFailed` on errors. + /// + /// # Arguments + /// * `child` - A mutable reference to a `Child` process. + /// + /// # Errors + /// * Throws `Error::FuzzingFailed` if waiting on the child process fails. + #[throws] + async fn handle_child(child: &mut Child) { tokio::select! { res = child.wait() => match res { Ok(status) => if !status.success() { - println!("Honggfuzz exited with an error!"); + throw!(Error::FuzzingFailed); }, Err(_) => throw!(Error::FuzzingFailed), }, @@ -270,6 +307,86 @@ impl Commander { }, } } + /// Asynchronously manages a child fuzzing process, collecting and logging its statistics. + /// This function spawns a new task dedicated to reading the process's standard output and logging the fuzzing statistics. + /// It waits for either the child process to exit or a Ctrl+C signal to be received. Upon process exit or Ctrl+C signal, + /// it stops the logging task and displays the collected statistics in a table format. + /// + /// The implementation ensures that the statistics logging task only stops after receiving a signal indicating the end of the fuzzing process + /// or an interrupt from the user, preventing premature termination of the logging task if scenarios where reading is faster than fuzzing, + /// which should not be common. + /// + /// # Arguments + /// * `child` - A mutable reference to a `Child` process, representing the child fuzzing process. + /// + /// # Errors + /// * `Error::FuzzingFailed` - Thrown if there's an issue with managing the child process, such as failing to wait on the child process. + #[throws] + async fn handle_child_with_stats(child: &mut Child) { + let stdout = child + .stdout + .take() + .expect("child did not have a handle to stdout"); + + let reader = tokio::io::BufReader::new(stdout); + + let fuzz_end = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + let fuzz_end_clone = std::sync::Arc::clone(&fuzz_end); + + let stats_handle: tokio::task::JoinHandle> = + tokio::spawn(async move { + let mut stats_logger = FuzzingStatistics::new(); + + let mut lines = reader.lines(); + loop { + let _line = lines.next_line().await; + match _line { + Ok(__line) => match __line { + Some(content) => { + stats_logger.insert_serialized(&content); + } + None => { + if fuzz_end_clone.load(std::sync::atomic::Ordering::SeqCst) { + break; + } + } + }, + Err(e) => return Err(e), + } + } + Ok(stats_logger) + }); + + tokio::select! { + res = child.wait() =>{ + fuzz_end.store(true, std::sync::atomic::Ordering::SeqCst); + + match res { + Ok(status) => { + if !status.success() { + throw!(Error::FuzzingFailed); + } + }, + Err(_) => throw!(Error::FuzzingFailed), + } + }, + _ = signal::ctrl_c() => { + fuzz_end.store(true, std::sync::atomic::Ordering::SeqCst); + tokio::time::sleep(tokio::time::Duration::from_millis(100)).await; + }, + } + let stats_result = stats_handle + .await + .expect("Unable to obtain Statistics Handle"); + match stats_result { + Ok(stats_result) => { + stats_result.show_table(); + } + Err(e) => { + println!("Statistics thread exited with the Error: {}", e); + } + } + } /// Runs fuzzer on the given target. #[throws] @@ -278,6 +395,8 @@ impl Commander { let crash_file = std::path::Path::new(&self.root as &str).join(crash_file_path); + let genesis_folder = PathBuf::from(self.root.to_string()).join("trident-genesis"); + if !crash_file.try_exists()? { println!("{ERROR} The crash file [{:?}] not found", crash_file); throw!(Error::CrashFileNotFound); @@ -286,17 +405,13 @@ impl Commander { let cargo_target_dir = std::env::var("CARGO_TARGET_DIR") .unwrap_or_else(|_| config.get_env_arg("CARGO_TARGET_DIR")); - let mut rustflags = if config.fuzz.allow_duplicate_txs { - "--cfg allow_duplicate_txs " - } else { - "" - } - .to_string(); + let rustflags = std::env::var("RUSTFLAGS").unwrap_or_default(); - rustflags.push_str(&std::env::var("RUSTFLAGS").unwrap_or_default()); + let rustflags = config.get_rustflags_args(rustflags); // using exec rather than spawn and replacing current process to avoid unflushed terminal output after ctrl+c signal std::process::Command::new("cargo") + .env("GENESIS_FOLDER", genesis_folder) .env("CARGO_TARGET_DIR", cargo_target_dir) .env("RUSTFLAGS", rustflags) .arg("hfuzz") diff --git a/crates/client/src/config.rs b/crates/client/src/config.rs index 20ece1fd..1df19f12 100644 --- a/crates/client/src/config.rs +++ b/crates/client/src/config.rs @@ -42,20 +42,44 @@ impl From<_Test> for Test { } } -#[derive(Debug, Deserialize, Clone, Default)] +#[derive(Debug, Deserialize, Clone)] +pub struct Cfg { + pub cfg_identifier: String, + pub val: bool, +} + +#[derive(Debug, Deserialize, Clone)] pub struct Fuzz { - pub allow_duplicate_txs: bool, + pub rust_flags: Vec, } #[derive(Default, Debug, Deserialize, Clone)] struct _Fuzz { #[serde(default)] pub allow_duplicate_txs: Option, + #[serde(default)] + pub fuzzing_with_stats: Option, } impl From<_Fuzz> for Fuzz { - fn from(_t: _Fuzz) -> Self { - Self { - allow_duplicate_txs: _t.allow_duplicate_txs.unwrap_or(false), - } + fn from(_f: _Fuzz) -> Self { + let mut _self = Self { rust_flags: vec![] }; + + // allow_duplicate_txs + let allow_duplicate_txs = _f.allow_duplicate_txs.unwrap_or(false); + + _self.rust_flags.push(Cfg { + cfg_identifier: "allow_duplicate_txs".to_string(), + val: allow_duplicate_txs, + }); + + // fuzzing_with_stats + let fuzzing_with_stats = _f.fuzzing_with_stats.unwrap_or(false); + + _self.rust_flags.push(Cfg { + cfg_identifier: "fuzzing_with_stats".to_string(), + val: fuzzing_with_stats, + }); + + _self } } #[derive(Debug, Deserialize, Clone)] @@ -367,6 +391,22 @@ impl Config { args.push(cli_input); args.join(" ") } + pub fn get_rustflags_args(&self, cli_input: String) -> String { + let mut args: Vec = self + .fuzz + .rust_flags + .iter() + .map(|arg| { + if arg.val { + format!("--cfg {}", arg.cfg_identifier) + } else { + "".to_string() + } + }) + .collect(); + args.push(cli_input); + args.join(" ") + } pub fn get_env_arg(&self, env_variable: &str) -> String { let expect = format!("{env_variable} not found"); self.honggfuzz @@ -404,6 +444,23 @@ mod tests { } } + impl Default for Fuzz { + fn default() -> Self { + let rust_flags = vec![ + Cfg { + cfg_identifier: "allow_duplicate_txs".to_string(), + val: false, + }, + Cfg { + cfg_identifier: "fuzzing_with_stats".to_string(), + val: false, + }, + ]; + + Self { rust_flags } + } + } + use super::*; #[test] fn test_merge_and_precedence1() { @@ -514,4 +571,78 @@ mod tests { let hfuzz_workspace = config.get_env_arg(HFUZZ_WORKSPACE_ENV); assert_eq!(hfuzz_workspace, "new_value_y"); } + + #[test] + fn test_obtain_rustflags_variable1() { + let config = Config { + test: Test::default(), + honggfuzz: HonggFuzz::default(), + fuzz: Fuzz::default(), + }; + + let rustflags = config.get_rustflags_args("".to_string()); + let default_rustflags = " "; + + assert_eq!(rustflags, default_rustflags); + } + #[test] + fn test_obtain_rustflags_variable2() { + let config = Config { + test: Test::default(), + honggfuzz: HonggFuzz::default(), + fuzz: Fuzz { + rust_flags: vec![Cfg { + cfg_identifier: "fuzzing_with_stats".to_string(), + val: true, + }], + }, + }; + + let rustflags = config.get_rustflags_args("".to_string()); + let reference_rustflags = "--cfg fuzzing_with_stats "; + + assert_eq!(rustflags, reference_rustflags); + } + #[test] + fn test_obtain_rustflags_variable3() { + let config = Config { + test: Test::default(), + honggfuzz: HonggFuzz::default(), + fuzz: Fuzz { + rust_flags: vec![ + Cfg { + cfg_identifier: "allow_duplicate_txs".to_string(), + val: true, + }, + Cfg { + cfg_identifier: "fuzzing_with_stats".to_string(), + val: false, + }, + ], + }, + }; + + let rustflags = config.get_rustflags_args("".to_string()); + let reference_rustflags = "--cfg allow_duplicate_txs "; + + assert_eq!(rustflags, reference_rustflags); + } + #[test] + fn test_obtain_rustflags_variable4() { + let config = Config { + test: Test::default(), + honggfuzz: HonggFuzz::default(), + fuzz: Fuzz { + rust_flags: vec![Cfg { + cfg_identifier: "allow_duplicate_txs".to_string(), + val: true, + }], + }, + }; + + let rustflags = config.get_rustflags_args("--cfg fuzzing_with_stats".to_string()); + let reference_rustflags = "--cfg allow_duplicate_txs --cfg fuzzing_with_stats"; + + assert_eq!(rustflags, reference_rustflags); + } } diff --git a/crates/client/src/fuzzer/data_builder.rs b/crates/client/src/fuzzer/data_builder.rs deleted file mode 100644 index 174611dc..00000000 --- a/crates/client/src/fuzzer/data_builder.rs +++ /dev/null @@ -1,370 +0,0 @@ -use anchor_client::anchor_lang::solana_program::account_info::{Account as Acc, AccountInfo}; -use anchor_client::anchor_lang::solana_program::hash::Hash; -use anchor_lang::prelude::Rent; -use arbitrary::Arbitrary; -use arbitrary::Unstructured; -use solana_sdk::account::{Account, AccountSharedData}; -use solana_sdk::instruction::AccountMeta; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::Keypair; -use solana_sdk::transaction::VersionedTransaction; -use std::cell::RefCell; -use std::collections::HashMap; -use std::error::Error; -use std::fmt::Display; - -use crate::error::*; - -pub struct FuzzData { - pub pre_ixs: Vec, - pub ixs: Vec, - pub post_ixs: Vec, - pub accounts: RefCell, -} - -pub struct FuzzDataIterator<'a, T> { - pre_ixs_iter: std::slice::Iter<'a, T>, - ixs_iter: std::slice::Iter<'a, T>, - post_ixs_iter: std::slice::Iter<'a, T>, -} - -impl FuzzData { - pub fn iter(&self) -> FuzzDataIterator<'_, T> { - FuzzDataIterator { - pre_ixs_iter: self.pre_ixs.iter(), - ixs_iter: self.ixs.iter(), - post_ixs_iter: self.post_ixs.iter(), - } - } -} - -impl<'a, T> Iterator for FuzzDataIterator<'a, T> { - type Item = &'a T; - - fn next(&mut self) -> Option { - self.pre_ixs_iter - .next() - .or_else(|| self.ixs_iter.next()) - .or_else(|| self.post_ixs_iter.next()) - } -} - -impl FuzzData -where - T: FuzzTestExecutor + Display, -{ - pub fn run_with_runtime( - &self, - program_id: Pubkey, - client: &mut impl FuzzClient, - ) -> core::result::Result<(), Box> { - // solana_logger::setup_with_default("off"); - // #[cfg(fuzzing_debug)] - // solana_logger::setup_with_default( - // "solana_rbpf::vm=debug,\ - // solana_runtime::message_processor=debug,\ - // solana_runtime::system_instruction_processor=trace,\ - // solana_program_test=info,\ - // fuzz_target=info", - // ); - - #[cfg(fuzzing_debug)] - { - eprintln!("\x1b[34mInstructions sequence\x1b[0m:"); - for ix in self.iter() { - eprintln!("{}", ix); - } - eprintln!("------ End of Instructions sequence ------ "); - } - - let mut sent_txs: HashMap = HashMap::new(); - - for fuzz_ix in &mut self.iter() { - #[cfg(fuzzing_debug)] - eprintln!("\x1b[34mCurrently processing\x1b[0m: {}", fuzz_ix); - - if fuzz_ix - .run_fuzzer(program_id, &self.accounts, client, &mut sent_txs) - .is_err() - { - // for now skip following instructions in case of error and move to the next fuzz iteration - return Ok(()); - } - } - Ok(()) - } -} - -pub trait FuzzTestExecutor { - fn run_fuzzer( - &self, - program_id: Pubkey, - accounts: &RefCell, - client: &mut impl FuzzClient, - sent_txs: &mut HashMap, - ) -> core::result::Result<(), FuzzClientErrorWithOrigin>; -} - -#[allow(unused_variables)] -pub trait FuzzDataBuilder Arbitrary<'a>> { - /// The instruction(s) executed as first, can be used for initialization. - fn pre_ixs(u: &mut Unstructured) -> arbitrary::Result> { - Ok(vec![]) - } - - /// The main instructions for fuzzing. - fn ixs(u: &mut Unstructured) -> arbitrary::Result> { - let v = >::arbitrary(u)?; - // Return always a vector with at least one element, othewise return error. - if v.is_empty() { - return Err(arbitrary::Error::NotEnoughData); - } - Ok(v) - } - - /// The instuction(s) executed as last. - fn post_ixs(u: &mut Unstructured) -> arbitrary::Result> { - Ok(vec![]) - } -} - -/// A trait providing methods to prepare data and accounts for the fuzzed instructions and allowing -/// users to implement custom invariants checks and transactions error handling. -pub trait IxOps<'info> { - /// The data to be passed as instruction data parameter - type IxData; - /// The accounts to be passed as instruction accounts - type IxAccounts; - /// The structure to which the instruction accounts will be deserialized - type IxSnapshot; - - /// Provides instruction data for the fuzzed instruction. - /// It is assumed that the instruction data will be based on the fuzzer input stored in the `self.data` variable. - /// However it is on the developer to decide and it can be also for example a hardcoded constant. - /// You should only avoid any non-deterministic random values to preserve reproducibility of the tests. - fn get_data( - &self, - client: &mut impl FuzzClient, - fuzz_accounts: &mut Self::IxAccounts, - ) -> Result; - - /// Provides accounts required for the fuzzed instruction. The method returns a tuple of signers and account metas. - fn get_accounts( - &self, - client: &mut impl FuzzClient, - fuzz_accounts: &mut Self::IxAccounts, - ) -> Result<(Vec, Vec), FuzzingError>; - - /// A method to implement custom invariants checks for a given instruction. This method is called after each - /// successfully executed instruction and by default does nothing. You can override this behavior by providing - /// your own implementation. You can access the snapshots of account states before and after the transaction for comparison. - /// - /// If you want to detect a crash, you have to return a `FuzzingError` (or alternativelly panic). - /// - /// If you want to perform checks also on a failed instruction execution, you can do so using the [`tx_error_handler`](trident_client::fuzzer::data_builder::IxOps::tx_error_handler) method. - #[allow(unused_variables)] - fn check( - &self, - pre_ix: Self::IxSnapshot, - post_ix: Self::IxSnapshot, - ix_data: Self::IxData, - ) -> Result<(), FuzzingError> { - Ok(()) - } - - /// A method to implement custom error handler for failed transactions. - /// - /// The fuzzer might generate a sequence of one or more instructions that are executed sequentially. - /// By default, if the execution of one of the instructions fails, the remaining instructions are skipped - /// and are not executed. This can be overriden by implementing this method and returning `Ok(())` - /// instead of propagating the error. - /// - /// You can also check the kind of the transaction error by inspecting the `e` parameter. - /// If you would like to detect a crash on a specific error, call `panic!()`. - /// - /// If your accounts are malformed and the fuzzed program is unable to deserialize it, the transaction - /// execution will fail. In that case also the deserialization of accounts snapshot before executing - /// the instruction would fail. You are provided with the raw account infos snapshots and you are free - /// to deserialize the accounts by yourself and therefore also handling potential errors. To deserialize - /// the `pre_ix_acc_infos` raw accounts to a snapshot structure, you can call: - /// - /// ```rust,ignore - /// self.deserialize_option(pre_ix_acc_infos) - /// ``` - #[allow(unused_variables)] - fn tx_error_handler( - &self, - e: FuzzClientErrorWithOrigin, - ix_data: Self::IxData, - pre_ix_acc_infos: &'info mut [Option>], - ) -> Result<(), FuzzClientErrorWithOrigin> { - Err(e) - } -} - -pub trait FuzzDeserialize<'info> { - type Ix; - // TODO return also remaining accounts - - fn deserialize_option( - &self, - accounts: &'info mut [Option>], - ) -> Result; -} - -/// A trait providing methods to read and write (manipulate) accounts -pub trait FuzzClient { - /// Create an empty account and add lamports to it - fn set_account(&mut self, lamports: u64) -> Keypair; - - /// Create or overwrite a custom account, subverting normal runtime checks. - fn set_account_custom(&mut self, address: &Pubkey, account: &AccountSharedData); - - /// Create an SPL token account - #[allow(clippy::too_many_arguments)] - fn set_token_account( - &mut self, - mint: Pubkey, - owner: Pubkey, - amount: u64, - delegate: Option, - is_native: Option, - delegated_amount: u64, - close_authority: Option, - ) -> Pubkey; - - /// Create an SPL mint account - fn set_mint_account( - &mut self, - decimals: u8, - owner: &Pubkey, - freeze_authority: Option, - ) -> Pubkey; - - /// Get the Keypair of the client's payer account - fn payer(&self) -> Keypair; - - /// Get the account at the given address - fn get_account(&mut self, key: &Pubkey) -> Result, FuzzClientError>; - - /// Get accounts based on the supplied meta information - fn get_accounts( - &mut self, - metas: &[AccountMeta], - ) -> Result>, FuzzClientErrorWithOrigin>; - - /// Get last blockhash - fn get_last_blockhash(&self) -> Hash; - - /// Get the cluster rent - fn get_rent(&mut self) -> Result; - - /// Send a transaction and return until the transaction has been finalized or rejected. - fn process_transaction( - &mut self, - transaction: impl Into, - ) -> Result<(), FuzzClientError>; -} - -#[macro_export] -macro_rules! fuzz_trident { - ($ix:ident: $ix_dty:ident , |$buf:ident: $dty:ident| $body:block) => { - fuzz(|$buf| { - let mut $buf: FuzzData<$ix_dty, _> = { - use arbitrary::Unstructured; - - let mut buf = Unstructured::new($buf); - if let Ok(fuzz_data) = build_ix_fuzz_data($dty {}, &mut buf) { - fuzz_data - } else { - return; - } - }; - $body - }); - }; -} -/// Prints the details of a given account in a pretty-printed format. -/// -/// This macro takes a single argument, which is an expression referring to the account -/// you want to print. The account data structure must implement or derive the [`Debug`] -/// trait for this macro to work, as it relies on `std::fmt::Debug` for formatting. -/// -/// # Examples -/// -/// ```rust,ignore -/// use trident_client::fuzzing::show_account; -/// -/// #[derive(Debug)] -/// #[account] -/// struct Escrow { -/// recipeint: Pubkey, -/// id: u32, -/// balance: f64, -/// name: String, -/// } -/// -/// fn check( -/// &self, -/// pre_ix: Self::IxSnapshot, -/// post_ix: Self::IxSnapshot, -/// ix_data: Self::IxData, -/// ) -> Result<(), FuzzingError> { -/// if let Some(escrow) = pre_ix.escrow{ -/// show_account!(escrow); -/// } -/// } -/// ``` -/// -/// # Requirements -/// -/// The `account` passed to `show_account!` must implement or derive the [`Debug`] trait. -/// Attempting to use this macro with a type that does not meet this requirement will -/// result in a compilation error. -#[macro_export] -macro_rules! show_account { - ($account:expr) => { - eprintln!("{:#?}", $account); - }; -} - -pub fn build_ix_fuzz_data Arbitrary<'a>, T: FuzzDataBuilder, V: Default>( - _data_builder: T, - u: &mut arbitrary::Unstructured, -) -> arbitrary::Result> { - Ok(FuzzData { - pre_ixs: T::pre_ixs(u)?, - ixs: T::ixs(u)?, - post_ixs: T::post_ixs(u)?, - accounts: RefCell::new(V::default()), - }) -} - -/// Creates `AccountInfo`s from `Accounts` and corresponding `AccountMeta` slices. -pub fn get_account_infos_option<'info>( - accounts: &'info mut [Option], - metas: &'info [AccountMeta], -) -> Result>>, FuzzingError> { - let iter = accounts.iter_mut().zip(metas); - let r = iter - .map(|(account, meta)| { - if let Some(account) = account { - let (lamports, data, owner, executable, rent_epoch) = account.get(); - Some(AccountInfo::new( - &meta.pubkey, - meta.is_signer, - meta.is_writable, - lamports, - data, - owner, - executable, - rent_epoch, - )) - } else { - None - } - }) - .collect(); - - Ok(r) -} diff --git a/crates/client/src/fuzzer/mod.rs b/crates/client/src/fuzzer/mod.rs deleted file mode 100644 index fc1a9b39..00000000 --- a/crates/client/src/fuzzer/mod.rs +++ /dev/null @@ -1,11 +0,0 @@ -pub mod accounts_storage; -pub mod data_builder; -pub mod fuzzer_generator; -#[cfg(feature = "fuzzing")] -pub mod program_test_client_blocking; -pub mod snapshot; -pub mod snapshot_generator; - -pub type AccountId = u8; - -pub mod error; diff --git a/crates/client/src/idl.rs b/crates/client/src/idl.rs index 01b9419d..02339d01 100644 --- a/crates/client/src/idl.rs +++ b/crates/client/src/idl.rs @@ -112,7 +112,7 @@ pub enum Error { #[error("{0:?}")] RustParsingError(#[from] syn::Error), #[error("missing or invalid program item: '{0}'")] - MissingOrInvalidProgramItems(&'static str), + MissingOrInvalidProgramItems(String), } struct ModPub { @@ -239,12 +239,14 @@ pub fn parse_to_idl_program(name: String, code: &str) -> Result Result new_pubkey_call, _ => { return Err(Error::MissingOrInvalidProgramItems( - "static ID: new pubkey call not found", + "static ID: new pubkey call not found".to_string(), )) } }; @@ -276,7 +278,7 @@ pub fn parse_to_idl_program(name: String, code: &str) -> Result pubkey_bytes, _ => { return Err(Error::MissingOrInvalidProgramItems( - "static ID: pubkey bytes not found", + "static ID: pubkey bytes not found".to_string(), )) } } @@ -354,7 +356,7 @@ pub fn parse_to_idl_program(name: String, code: &str) -> Result None?, }) .ok_or(Error::MissingOrInvalidProgramItems( - "mod private: mod global not found", + "mod private: mod global not found".to_string(), ))?; let items = item_mod_global .content @@ -480,7 +482,7 @@ pub fn parse_to_idl_program(name: String, code: &str) -> Result Result Result Result Result None?, }) - .ok_or(Error::MissingOrInvalidProgramItems( - "account mod: struct not found", - ))?; + .ok_or(Error::MissingOrInvalidProgramItems(format!( + "account mod: struct with name {} not found", + account_struct_name + )))?; let account_item_struct_fields = match account_item_struct.fields { syn::Fields::Named(fields_named) => fields_named.named, syn::Fields::Unit => syn::punctuated::Punctuated::new(), syn::Fields::Unnamed(_) => { return Err(Error::MissingOrInvalidProgramItems( - "account struct: unnamed fields not allowed", + "account struct: unnamed fields not allowed".to_string(), )) } }; @@ -670,7 +677,7 @@ fn set_account_modules(account_modules: &mut Vec, item_module: &sy .content .as_ref() .ok_or(Error::MissingOrInvalidProgramItems( - "account mod: empty content", + "account mod: empty content".to_string(), )) .unwrap() .1; diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index cb07f622..68d2aded 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -3,104 +3,124 @@ //! //! Trident could be useful for writing Rust dApps, too. -pub use anchor_client::{ - self, - anchor_lang::{self, prelude::System, Id, InstructionData, ToAccountMetas}, - solana_sdk::{ - self, - instruction::Instruction, - pubkey::Pubkey, - signature::Signature, - signer::{keypair::Keypair, Signer}, - }, - ClientError, -}; -pub use anyhow::{self, Error}; - -#[cfg(feature = "fuzzing")] +/// Aimed for the fuzz tests pub mod fuzzing { - pub use self::anchor_lang::solana_program::instruction::AccountMeta; - pub use super::{ - anchor_lang, anchor_lang::system_program::ID as SYSTEM_PROGRAM_ID, - anchor_lang::InstructionData, anchor_lang::ToAccountInfo, anchor_lang::ToAccountMetas, - fuzz_trident, show_account, solana_sdk::account::Account, - solana_sdk::entrypoint::ProcessInstruction, solana_sdk::transaction::Transaction, - Instruction, Keypair, Pubkey, Signer, TempClone, - }; - pub use anchor_client::anchor_lang::solana_program::account_info::AccountInfo; - pub use anchor_client::anchor_lang::solana_program::hash::Hash; + /// anchor_lang + pub use anchor_lang; + pub use anchor_lang::solana_program::hash::Hash; + pub use anchor_lang::InstructionData; pub use anchor_lang::Key; + pub use anchor_lang::ToAccountInfo; + pub use anchor_lang::ToAccountMetas; + + /// solana_sdk + pub use solana_sdk; + pub use solana_sdk::account_info::AccountInfo; + pub use solana_sdk::entrypoint::ProcessInstruction; + pub use solana_sdk::instruction::AccountMeta; + pub use solana_sdk::instruction::Instruction; + pub use solana_sdk::pubkey::Pubkey; + pub use solana_sdk::signer::keypair::Keypair; + pub use solana_sdk::signer::Signer; + pub use solana_sdk::transaction::Transaction; + + /// arbitrary and honggfuzz pub use arbitrary; pub use arbitrary::Arbitrary; pub use honggfuzz::fuzz; - pub use solana_program_test::{ - processor, tokio::runtime::Runtime, BanksClient, BanksClientError, ProgramTest, - ProgramTestContext, - }; - - pub use super::error::*; - pub use super::fuzzer::accounts_storage::*; - pub use super::fuzzer::data_builder::build_ix_fuzz_data; - pub use super::fuzzer::data_builder::*; - - pub use super::fuzzer::program_test_client_blocking::ProgramEntry; - pub use super::fuzzer::program_test_client_blocking::ProgramTestClientBlocking; - pub use super::fuzzer::snapshot::Snapshot; - pub use super::fuzzer::*; - pub use std::cell::RefCell; - pub use std::collections::HashMap; + + /// trident derive pub use trident_derive_displayix::DisplayIx; pub use trident_derive_fuzz_deserialize::FuzzDeserialize; pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; -} -pub use futures::{self, FutureExt}; -pub use rstest::*; -pub use serial_test; -pub use solana_transaction_status::EncodedConfirmedTransactionWithStatusMeta; -pub use tokio; + /// trident macros + pub use trident_fuzz::convert_entry; + pub use trident_fuzz::fuzz_trident; + pub use trident_fuzz::show_account; + pub use trident_fuzz::*; + + pub use solana_program_test::processor; + pub use trident_fuzz::program_test_client_blocking::FuzzingProgram; + pub use trident_fuzz::program_test_client_blocking::ProgramEntry; + + pub use super::temp_clone::*; + /// trident methods + pub use trident_fuzz::accounts_storage::*; + pub use trident_fuzz::error::*; + pub use trident_fuzz::fuzz_client::FuzzClient; + pub use trident_fuzz::fuzz_data::build_ix_fuzz_data; + pub use trident_fuzz::fuzz_data::*; + pub use trident_fuzz::fuzz_deserialize::FuzzDeserialize; + pub use trident_fuzz::fuzz_stats::FuzzingStatistics; + pub use trident_fuzz::fuzz_test_executor::FuzzTestExecutor; + pub use trident_fuzz::ix_ops::IxOps; + pub use trident_fuzz::program_test_client_blocking::ProgramTestClientBlocking; + pub use trident_fuzz::snapshot::Snapshot; -pub use trident_test::trident_test; - -mod config; + pub use std::cell::RefCell; + pub use std::collections::HashMap; +} -mod client; -pub use client::Client; -pub use client::PrintableTransaction; +/// Aimed for the integration tests +pub mod test { + pub use super::client::*; + pub use super::error_reporter::report_error; + pub use super::keys::*; + pub use super::tester::Tester; + pub use anyhow::{self, Error, Result}; + pub use futures::{self, FutureExt}; + pub use rstest::*; + pub use serial_test; + pub use solana_transaction_status::EncodedConfirmedTransactionWithStatusMeta; + pub use tokio; + pub use trident_test::trident_test; +} -mod reader; -pub use reader::Reader; +/// Aimed for general usage +pub mod prelude { + pub use super::temp_clone::*; + pub use anchor_client::ClientError; + pub use anchor_lang; + pub use anchor_lang::InstructionData; + pub use anchor_lang::ToAccountMetas; + pub use solana_sdk; + pub use solana_sdk::instruction::Instruction; + pub use solana_sdk::pubkey::Pubkey; + pub use solana_sdk::signer::keypair::Keypair; + pub use solana_sdk::signer::Signer; +} +mod cleaner; +mod client; mod commander; -pub use commander::{Commander, LocalnetHandle}; - -mod tester; -pub use tester::Tester; - -mod temp_clone; -pub use temp_clone::TempClone; - +mod config; +mod error_reporter; +mod idl; mod keys; -pub use keys::*; - -mod fuzzer; -pub use fuzzer::*; -pub mod idl; -pub mod program_client_generator; - -pub mod test_generator; -pub use test_generator::TestGenerator; - -pub mod error_reporter; -pub use error_reporter::*; - -pub mod cleaner; -pub use cleaner::*; +mod reader; +mod source_code_generators; +mod temp_clone; +mod test_generator; +mod tester; -// This is a workaround for tests: https://github.com/Ackee-Blockchain/trident/pull/112#issuecomment-1924920952 -pub use trident_derive_displayix::DisplayIx; -pub use trident_derive_fuzz_deserialize::FuzzDeserialize; -pub use trident_derive_fuzz_test_executor::FuzzTestExecutor; +pub mod ___private { + pub use super::cleaner::*; + pub use super::client::*; + pub use super::commander::Commander; + pub use super::commander::Error; + pub use super::commander::LocalnetHandle; + pub use super::error_reporter::*; + pub use super::idl::*; + pub use super::keys::*; + pub use super::reader::*; + pub use super::source_code_generators::*; + pub use super::temp_clone::TempClone; + pub use super::test_generator::ProgramData; + pub use super::test_generator::TestGenerator; + pub use super::tester::*; + // pub use trident_fuzz_test::fuzz_trident; +} mod constants { // program_client diff --git a/crates/client/src/fuzzer/fuzzer_generator.rs b/crates/client/src/source_code_generators/fuzzer_generator.rs similarity index 100% rename from crates/client/src/fuzzer/fuzzer_generator.rs rename to crates/client/src/source_code_generators/fuzzer_generator.rs diff --git a/crates/client/src/source_code_generators/mod.rs b/crates/client/src/source_code_generators/mod.rs new file mode 100644 index 00000000..1877329d --- /dev/null +++ b/crates/client/src/source_code_generators/mod.rs @@ -0,0 +1,3 @@ +pub mod fuzzer_generator; +pub mod program_client_generator; +pub mod snapshot_generator; diff --git a/crates/client/src/program_client_generator.rs b/crates/client/src/source_code_generators/program_client_generator.rs similarity index 100% rename from crates/client/src/program_client_generator.rs rename to crates/client/src/source_code_generators/program_client_generator.rs diff --git a/crates/client/src/fuzzer/snapshot_generator.rs b/crates/client/src/source_code_generators/snapshot_generator.rs similarity index 98% rename from crates/client/src/fuzzer/snapshot_generator.rs rename to crates/client/src/source_code_generators/snapshot_generator.rs index 252649b5..1531916e 100644 --- a/crates/client/src/fuzzer/snapshot_generator.rs +++ b/crates/client/src/source_code_generators/snapshot_generator.rs @@ -63,12 +63,9 @@ pub fn generate_snapshots_code(programs_data: &[ProgramData]) -> Result bool { AccountField::CompositeField(f) => &f.constraints, }; - constraints.init.is_some() || constraints.is_close() || is_optional + constraints.init.is_some() || constraints.is_close() || is_optional || constraints.is_zeroed() } /// Creates new Snapshot struct from the context struct. Removes Box<> types. @@ -385,6 +382,7 @@ fn deserialize_ctx_struct_anchor( let generated_deser_impl: syn::Item = parse_quote! { impl<'info> #snapshot_name<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -504,7 +502,7 @@ fn deserialize_account_tokens( .ok_or(FuzzingError::NotEnoughAccounts(#name_str.to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { #deser_method(acc).map_err(|_| FuzzingError::CannotDeserializeAccount(#name_str.to_string())) } else {Err(FuzzingError::OptionalAccountNotProvided( #name_str.to_string(), diff --git a/crates/client/src/temp_clone.rs b/crates/client/src/temp_clone.rs index 8efba3fb..e261fe19 100644 --- a/crates/client/src/temp_clone.rs +++ b/crates/client/src/temp_clone.rs @@ -1,5 +1,4 @@ -use crate::Keypair; - +use solana_sdk::signer::keypair::Keypair; // @TODO remove once `Clone` is implemented for `Keypair` // https://docs.rs/solana-sdk/latest/solana_sdk/signer/keypair/struct.Keypair.html diff --git a/crates/client/src/templates/Trident.toml.tmpl b/crates/client/src/templates/Trident.toml.tmpl index e05d7801..a398402c 100644 --- a/crates/client/src/templates/Trident.toml.tmpl +++ b/crates/client/src/templates/Trident.toml.tmpl @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/crates/client/src/templates/program_client/Cargo.toml.tmpl b/crates/client/src/templates/program_client/Cargo.toml.tmpl index 28d2924e..ad7622ea 100644 --- a/crates/client/src/templates/program_client/Cargo.toml.tmpl +++ b/crates/client/src/templates/program_client/Cargo.toml.tmpl @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2018" [dependencies.trident-client] -version = "0.6.0" +version = "0.7.0" diff --git a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl index de0d9d82..cd0687a6 100644 --- a/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_fuzz.toml.tmpl @@ -7,11 +7,10 @@ edition = "2021" # Dependencies specific to Fuzz test [dependencies] # ... your dependencies here -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] -version = "0.6.0" -features=["fuzzing"] +version = "0.7.0" diff --git a/crates/client/src/templates/trident-tests/Cargo_poc.toml.tmpl b/crates/client/src/templates/trident-tests/Cargo_poc.toml.tmpl index 9985ef0a..8fa1bca4 100644 --- a/crates/client/src/templates/trident-tests/Cargo_poc.toml.tmpl +++ b/crates/client/src/templates/trident-tests/Cargo_poc.toml.tmpl @@ -10,7 +10,7 @@ edition = "2021" fehler = "1.0.0" [dev-dependencies.trident-client] -version = "0.6.0" +version = "0.7.0" [dev-dependencies.program_client] diff --git a/crates/client/src/templates/trident-tests/test.rs b/crates/client/src/templates/trident-tests/test.rs index 75725d02..e02b9a56 100644 --- a/crates/client/src/templates/trident-tests/test.rs +++ b/crates/client/src/templates/trident-tests/test.rs @@ -1,5 +1,6 @@ use fehler::throws; -use trident_client::{anyhow::Result, *}; +use trident_client::prelude::*; +use trident_client::test::*; // @todo: create and deploy your fixture #[throws] diff --git a/crates/client/src/templates/trident-tests/test_fuzz.rs b/crates/client/src/templates/trident-tests/test_fuzz.rs index f54a1267..238de666 100644 --- a/crates/client/src/templates/trident-tests/test_fuzz.rs +++ b/crates/client/src/templates/trident-tests/test_fuzz.rs @@ -1,8 +1,8 @@ -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "###PROGRAM_NAME###"; +pub type FuzzInstruction = todo!(); struct MyFuzzData; @@ -11,10 +11,18 @@ impl FuzzDataBuilder for MyFuzzData {} fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new(todo!(),todo!(),processor!(convert_entry!(todo!()))); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[todo!()]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(todo!(), &mut client); }); } } diff --git a/crates/client/src/test_generator.rs b/crates/client/src/test_generator.rs index 47b022e7..f502c65a 100644 --- a/crates/client/src/test_generator.rs +++ b/crates/client/src/test_generator.rs @@ -1,10 +1,12 @@ use crate::{ commander::{Commander, Error as CommanderError}, - fuzzer, idl::IdlProgram, - program_client_generator, - snapshot_generator::generate_snapshots_code, }; + +use crate::source_code_generators::fuzzer_generator; +use crate::source_code_generators::program_client_generator; +use crate::source_code_generators::snapshot_generator; + use cargo_metadata::{camino::Utf8PathBuf, Package}; use fehler::{throw, throws}; use std::{fs::File, io::prelude::*}; @@ -118,10 +120,11 @@ pub struct TestGenerator { pub programs_data: Vec, pub packages: Vec, pub use_tokens: Vec, + pub with_snapshot_file: bool, } impl Default for TestGenerator { fn default() -> Self { - Self::new() + Self::new(false) } } @@ -131,12 +134,13 @@ impl TestGenerator { /// # Returns /// /// A new `TestGenerator` instance. - pub fn new() -> Self { + pub fn new(with_snapshot_file: bool) -> Self { Self { root: Path::new("../../").to_path_buf(), programs_data: Vec::default(), packages: Vec::default(), use_tokens: Vec::default(), + with_snapshot_file, } } /// Creates a new instance of `TestGenerator` with a specified root directory. @@ -148,12 +152,13 @@ impl TestGenerator { /// # Returns /// /// A new `TestGenerator` instance with the specified root directory. - pub fn new_with_root(root: String) -> Self { + pub fn new_with_root(root: String, with_snapshot_file: bool) -> Self { Self { root: Path::new(&root).to_path_buf(), programs_data: Vec::default(), packages: Vec::default(), use_tokens: Vec::default(), + with_snapshot_file, } } /// Generates both proof of concept (POC) and fuzz tests along with the necessary setup. @@ -279,7 +284,9 @@ impl TestGenerator { } if self.use_tokens.is_empty() { self.use_tokens - .push(syn::parse_quote! { use trident_client::*; }) + .push(syn::parse_quote! {use trident_client::prelude::*;}); + self.use_tokens + .push(syn::parse_quote! {use trident_client::test::*;}); } } @@ -416,17 +423,6 @@ impl TestGenerator { /// If not present add fuzz_tests into the workspace virtual manifest as member #[throws] pub async fn add_new_fuzz_test(&self) { - let program_name = if !&self.programs_data.is_empty() { - &self - .programs_data - .first() - .unwrap() - .program_idl - .name - .snake_case - } else { - throw!(Error::NoProgramsFound) - }; let fuzz_dir_path = construct_path!(self.root, TESTS_WORKSPACE_DIRECTORY, FUZZ_TEST_DIRECTORY); let fuzz_tests_manifest_path = construct_path!(fuzz_dir_path, CARGO_TOML); @@ -469,39 +465,17 @@ impl TestGenerator { self.create_directory(&new_fuzz_test_dir).await?; - let fuzz_test_path = new_fuzz_test_dir.join(FUZZ_TEST); - - let fuzz_test_content = load_template!("/src/templates/trident-tests/test_fuzz.rs"); - - let use_entry = format!("use {}::entry;\n", program_name); - let use_instructions = format!("use {}::ID as PROGRAM_ID;\n", program_name); - let use_fuzz_instructions = format!( - "use fuzz_instructions::{}_fuzz_instructions::FuzzInstruction;\n", - program_name - ); - let template = - format!("{use_entry}{use_instructions}{use_fuzz_instructions}{fuzz_test_content}"); - let fuzz_test_content = template.replace("###PROGRAM_NAME###", program_name); - - self.create_file(&fuzz_test_path, &fuzz_test_content) - .await?; + // create fuzz file + self.initialize_fuzz(&new_fuzz_test_dir).await?; // create fuzz instructions file - let fuzz_instructions_path = new_fuzz_test_dir.join(FUZZ_INSTRUCTIONS_FILE_NAME); - let program_fuzzer = fuzzer::fuzzer_generator::generate_source_code(&self.programs_data); - let program_fuzzer = Commander::format_program_code(&program_fuzzer).await?; - - self.create_file(&fuzz_instructions_path, &program_fuzzer) + self.initialize_fuzz_instructions(&new_fuzz_test_dir) .await?; - // // create accounts_snapshots file - let accounts_snapshots_path = new_fuzz_test_dir.join(ACCOUNTS_SNAPSHOTS_FILE_NAME); - let fuzzer_snapshots = - generate_snapshots_code(&self.programs_data).map_err(Error::ReadProgramCodeFailed)?; - let fuzzer_snapshots = Commander::format_program_code(&fuzzer_snapshots).await?; - - self.create_file(&accounts_snapshots_path, &fuzzer_snapshots) - .await?; + // create accounts_snapshots file + if self.with_snapshot_file { + self.initialize_fuzz_snapshots(&new_fuzz_test_dir).await?; + } let cargo_toml_content = load_template!("/src/templates/trident-tests/Cargo_fuzz.toml.tmpl"); @@ -520,6 +494,77 @@ impl TestGenerator { .await?; } + #[throws] + pub async fn initialize_fuzz(&self, new_fuzz_test_dir: &Path) { + if self.programs_data.is_empty() { + throw!(Error::NoProgramsFound) + } + + let fuzz_test_path = new_fuzz_test_dir.join(FUZZ_TEST); + + let fuzz_test_content = load_template!("/src/templates/trident-tests/test_fuzz.rs"); + + let mut entry_points: String = String::new(); + let mut program_ids: String = String::new(); + let mut program_names: String = String::new(); + let mut fuzz_instructions: String = String::new(); + + for x in self.programs_data.iter() { + let program_name = &x.program_idl.name.snake_case; + + let use_entry = format!("use {}::entry as entry_{};\n", program_name, program_name); + entry_points.push_str(&use_entry); + + let program_name_var = format!( + "const PROGRAM_NAME_{}: &str = \"{}\";\n", + program_name.to_uppercase(), + program_name, + ); + program_names.push_str(&program_name_var); + + let program_id = format!( + "use {}::ID as PROGRAM_ID_{};\n", + program_name, + program_name.to_uppercase() + ); + program_ids.push_str(&program_id); + + let use_fuzz_instructions = format!( + "use fuzz_instructions::{}_fuzz_instructions::FuzzInstruction as FuzzInstruction_{};\n", + program_name,program_name + ); + fuzz_instructions.push_str(&use_fuzz_instructions); + } + + let template = format!( + "{}{}{}{}{}", + entry_points, program_ids, program_names, fuzz_instructions, fuzz_test_content + ); + + self.create_file(&fuzz_test_path, &template).await?; + } + + #[throws] + pub async fn initialize_fuzz_instructions(&self, new_fuzz_test_dir: &Path) { + let fuzz_instructions_path = new_fuzz_test_dir.join(FUZZ_INSTRUCTIONS_FILE_NAME); + let program_fuzzer = fuzzer_generator::generate_source_code(&self.programs_data); + let program_fuzzer = Commander::format_program_code(&program_fuzzer).await?; + + self.create_file(&fuzz_instructions_path, &program_fuzzer) + .await?; + } + + #[throws] + pub async fn initialize_fuzz_snapshots(&self, new_fuzz_test_dir: &Path) { + let accounts_snapshots_path = new_fuzz_test_dir.join(ACCOUNTS_SNAPSHOTS_FILE_NAME); + let fuzzer_snapshots = snapshot_generator::generate_snapshots_code(&self.programs_data) + .map_err(Error::ReadProgramCodeFailed)?; + let fuzzer_snapshots = Commander::format_program_code(&fuzzer_snapshots).await?; + + self.create_file(&accounts_snapshots_path, &fuzzer_snapshots) + .await?; + } + /// Add/Update .program_client /// If not present create .program_client directory. /// If not present create src directory. @@ -609,7 +654,7 @@ impl TestGenerator { } None => { members.push(new_member); - println!("{FINISH} [{CARGO_TOML}] with [{member}]"); + println!("{FINISH} [{CARGO_TOML}] updated with [{member}]"); fs::write(cargo, content.to_string()).await?; } }; diff --git a/crates/client/src/tester.rs b/crates/client/src/tester.rs index 470172b4..d28121e8 100644 --- a/crates/client/src/tester.rs +++ b/crates/client/src/tester.rs @@ -1,4 +1,4 @@ -use crate::{commander::Error, Commander, LocalnetHandle}; +use crate::___private::{Commander, Error, LocalnetHandle}; use fehler::throws; use log::debug; use std::{borrow::Cow, mem}; diff --git a/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs b/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs index 00617fb4..99474cbc 100644 --- a/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs +++ b/crates/client/tests/test_data/expected_source_codes/expected_accounts_snapshots.rs @@ -1,6 +1,5 @@ -use fuzz_example3::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, @@ -22,6 +21,7 @@ pub struct WithdrawUnlockedSnapshot<'info> { } impl<'info> InitVestingSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -52,7 +52,7 @@ impl<'info> InitVestingSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc).map_err(|_| { FuzzingError::CannotDeserializeAccount("escrow".to_string()) }) @@ -114,6 +114,7 @@ impl<'info> InitVestingSnapshot<'info> { } impl<'info> WithdrawUnlockedSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -144,7 +145,7 @@ impl<'info> WithdrawUnlockedSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc).map_err(|_| { FuzzingError::CannotDeserializeAccount("escrow".to_string()) }) diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.expanded.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.expanded.rs deleted file mode 100644 index bdf5e32c..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.expanded.rs +++ /dev/null @@ -1,62 +0,0 @@ -use trident_client::DisplayIx; -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -impl std::fmt::Display for FuzzInstruction { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - FuzzInstruction::InitVesting(ref content) => { - f.write_fmt(format_args!("InitVesting"))?; - f.write_fmt(format_args!("({0:#?})", content)) - } - FuzzInstruction::WithdrawUnlocked(ref content) => { - f.write_fmt(format_args!("WithdrawUnlocked"))?; - f.write_fmt(format_args!("({0:#?})", content)) - } - } - } -} -impl FuzzInstruction { - fn to_context_string(&self) -> String { - match self { - FuzzInstruction::InitVesting(_) => String::from("InitVesting"), - FuzzInstruction::WithdrawUnlocked(_) => String::from("WithdrawUnlocked"), - } - } -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.rs deleted file mode 100644 index bfc315a2..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_display_ix.rs +++ /dev/null @@ -1,41 +0,0 @@ -use trident_client::DisplayIx; -#[derive(DisplayIx)] -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.expanded.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.expanded.rs deleted file mode 100644 index 4774ac7a..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.expanded.rs +++ /dev/null @@ -1,58 +0,0 @@ -use trident_client::FuzzDeserialize; -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -impl<'info> FuzzDeserialize<'info> for InitVesting { - type Ix = InitVestingSnapshot<'info>; - fn deserialize_option( - &self, - accounts: &'info mut [Option>], - ) -> Result { - Self::Ix::deserialize_option(accounts) - } -} -impl<'info> FuzzDeserialize<'info> for WithdrawUnlocked { - type Ix = WithdrawUnlockedSnapshot<'info>; - fn deserialize_option( - &self, - accounts: &'info mut [Option>], - ) -> Result { - Self::Ix::deserialize_option(accounts) - } -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs deleted file mode 100644 index 04163f0e..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs +++ /dev/null @@ -1,41 +0,0 @@ -use trident_client::FuzzDeserialize; -#[derive(FuzzDeserialize)] -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.expanded.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.expanded.rs deleted file mode 100644 index 5f32ef5f..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.expanded.rs +++ /dev/null @@ -1,243 +0,0 @@ -use trident_client::FuzzTestExecutor; -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -impl FuzzTestExecutor for FuzzInstruction { - fn run_fuzzer( - &self, - program_id: Pubkey, - accounts: &RefCell, - client: &mut impl FuzzClient, - sent_txs: &mut HashMap, - ) -> core::result::Result<(), FuzzClientErrorWithOrigin> { - match self { - FuzzInstruction::InitVesting(ix) => { - let (mut signers, metas) = ix - .get_accounts(client, &mut accounts.borrow_mut()) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Accounts calculation expect"); - let mut snaphot = Snapshot::new(&metas, ix); - snaphot.capture_before(client).unwrap(); - let data = ix - .get_data(client, &mut accounts.borrow_mut()) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Data calculation expect"); - let ixx = Instruction { - program_id, - accounts: metas.clone(), - data: data.data(), - }; - let mut transaction = Transaction::new_with_payer( - &[ixx], - Some(&client.payer().pubkey()), - ); - signers.push(client.payer().clone()); - let sig: Vec<&Keypair> = signers.iter().collect(); - transaction.sign(&sig, client.get_last_blockhash()); - let duplicate_tx = if false { - None - } else { - let message_hash = transaction.message().hash(); - sent_txs.insert(message_hash, ()) - }; - match duplicate_tx { - Some(_) => { - ::std::io::_eprint( - format_args!( - "\u{1b}[1;93mWarning\u{1b}[0m: Skipping duplicate instruction `{0}`\n", - self.to_context_string(), - ), - ); - } - None => { - let tx_result = client - .process_transaction(transaction) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }); - match tx_result { - Ok(_) => { - snaphot.capture_after(client).unwrap(); - let (acc_before, acc_after) = snaphot - .get_snapshot() - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Snapshot deserialization expect"); - if let Err(e) - = ix - .check(acc_before, acc_after, data) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - { - { - ::std::io::_eprint( - format_args!( - "\u{1b}[31mCRASH DETECTED!\u{1b}[0m Custom check after the {0} instruction did not pass!\n", - self.to_context_string(), - ), - ); - }; - { - #[cold] - #[track_caller] - #[inline(never)] - #[rustc_const_panic_str] - #[rustc_do_not_const_check] - const fn panic_cold_display( - arg: &T, - ) -> ! { - ::core::panicking::panic_display(arg) - } - panic_cold_display(&e); - } - } - } - Err(e) => { - let mut raw_accounts = snaphot.get_raw_pre_ix_accounts(); - ix.tx_error_handler(e, data, &mut raw_accounts)? - } - } - } - } - } - FuzzInstruction::WithdrawUnlocked(ix) => { - let (mut signers, metas) = ix - .get_accounts(client, &mut accounts.borrow_mut()) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Accounts calculation expect"); - let mut snaphot = Snapshot::new(&metas, ix); - snaphot.capture_before(client).unwrap(); - let data = ix - .get_data(client, &mut accounts.borrow_mut()) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Data calculation expect"); - let ixx = Instruction { - program_id, - accounts: metas.clone(), - data: data.data(), - }; - let mut transaction = Transaction::new_with_payer( - &[ixx], - Some(&client.payer().pubkey()), - ); - signers.push(client.payer().clone()); - let sig: Vec<&Keypair> = signers.iter().collect(); - transaction.sign(&sig, client.get_last_blockhash()); - let duplicate_tx = if false { - None - } else { - let message_hash = transaction.message().hash(); - sent_txs.insert(message_hash, ()) - }; - match duplicate_tx { - Some(_) => { - ::std::io::_eprint( - format_args!( - "\u{1b}[1;93mWarning\u{1b}[0m: Skipping duplicate instruction `{0}`\n", - self.to_context_string(), - ), - ); - } - None => { - let tx_result = client - .process_transaction(transaction) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }); - match tx_result { - Ok(_) => { - snaphot.capture_after(client).unwrap(); - let (acc_before, acc_after) = snaphot - .get_snapshot() - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - .expect("Snapshot deserialization expect"); - if let Err(e) - = ix - .check(acc_before, acc_after, data) - .map_err(|e| { - e.with_origin(Origin::Instruction(self.to_context_string())) - }) - { - { - ::std::io::_eprint( - format_args!( - "\u{1b}[31mCRASH DETECTED!\u{1b}[0m Custom check after the {0} instruction did not pass!\n", - self.to_context_string(), - ), - ); - }; - { - #[cold] - #[track_caller] - #[inline(never)] - #[rustc_const_panic_str] - #[rustc_do_not_const_check] - const fn panic_cold_display( - arg: &T, - ) -> ! { - ::core::panicking::panic_display(arg) - } - panic_cold_display(&e); - } - } - } - Err(e) => { - let mut raw_accounts = snaphot.get_raw_pre_ix_accounts(); - ix.tx_error_handler(e, data, &mut raw_accounts)? - } - } - } - } - } - } - Ok(()) - } -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs deleted file mode 100644 index 5c475d87..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs +++ /dev/null @@ -1,41 +0,0 @@ -use trident_client::FuzzTestExecutor; -#[derive(FuzzTestExecutor)] -pub enum FuzzInstruction { - InitVesting(InitVesting), - WithdrawUnlocked(WithdrawUnlocked), -} -pub struct InitVesting { - pub accounts: InitVestingAccounts, - pub data: InitVestingData, -} -pub struct InitVestingAccounts { - pub sender: AccountId, - pub sender_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct InitVestingData { - pub recipient: AccountId, - pub amount: u64, - pub start_at: u64, - pub end_at: u64, - pub interval: u64, -} -pub struct WithdrawUnlocked { - pub accounts: WithdrawUnlockedAccounts, - pub data: WithdrawUnlockedData, -} -pub struct WithdrawUnlockedAccounts { - pub recipient: AccountId, - pub recipient_token_account: AccountId, - pub escrow: AccountId, - pub escrow_token_account: AccountId, - pub escrow_pda_authority: AccountId, - pub mint: AccountId, - pub token_program: AccountId, - pub system_program: AccountId, -} -pub struct WithdrawUnlockedData {} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.expanded.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.expanded.rs deleted file mode 100644 index 505f0903..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.expanded.rs +++ /dev/null @@ -1,25 +0,0 @@ -use trident_client::fuzz_trident; -fn main() { - loop { - fuzz(|fuzz_data| { - let mut fuzz_data: FuzzData = { - use arbitrary::Unstructured; - let mut buf = Unstructured::new(fuzz_data); - if let Ok(fuzz_data) = build_ix_fuzz_data(MyFuzzData {}, &mut buf) { - fuzz_data - } else { - return; - } - }; - { - let mut client = ProgramTestClientBlocking::new( - PROGRAM_NAME, - PROGRAM_ID, - xyz, - ) - .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); - } - }); - } -} diff --git a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs b/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs deleted file mode 100644 index 6e4f45fd..00000000 --- a/crates/client/tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs +++ /dev/null @@ -1,12 +0,0 @@ -use trident_client::fuzz_trident; - -fn main() { - loop { - fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { - let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, xyz) - .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); - }); - } -} diff --git a/crates/client/tests/test_fuzz.rs b/crates/client/tests/test_fuzz.rs index 5edb38c9..4cf4f534 100644 --- a/crates/client/tests/test_fuzz.rs +++ b/crates/client/tests/test_fuzz.rs @@ -2,7 +2,7 @@ use anyhow::Error; use cargo_metadata::camino::Utf8PathBuf; use fehler::throws; use pretty_assertions::assert_str_eq; -use trident_client::test_generator::ProgramData; +use trident_client::___private::ProgramData; const PROGRAM_NAME: &str = "fuzz_example3"; @@ -33,8 +33,10 @@ async fn test_snapshots_and_instructions() { let path = Utf8PathBuf::from(program_path); - let program_idl = - trident_client::idl::parse_to_idl_program(PROGRAM_NAME.to_owned(), expanded_fuzz_example3)?; + let program_idl = trident_client::___private::parse_to_idl_program( + PROGRAM_NAME.to_owned(), + expanded_fuzz_example3, + )?; let code = expanded_fuzz_example3.to_string(); @@ -47,54 +49,16 @@ async fn test_snapshots_and_instructions() { let program_data = vec![program_data]; let fuzzer_snapshots = - trident_client::snapshot_generator::generate_snapshots_code(&program_data).unwrap(); + trident_client::___private::snapshot_generator::generate_snapshots_code(&program_data) + .unwrap(); let fuzzer_snapshots = - trident_client::Commander::format_program_code(&fuzzer_snapshots).await?; + trident_client::___private::Commander::format_program_code(&fuzzer_snapshots).await?; let fuzz_instructions_code = - trident_client::fuzzer_generator::generate_source_code(&program_data); + trident_client::___private::fuzzer_generator::generate_source_code(&program_data); let fuzz_instructions_code = - trident_client::Commander::format_program_code(&fuzz_instructions_code).await?; + trident_client::___private::Commander::format_program_code(&fuzz_instructions_code).await?; assert_str_eq!(fuzzer_snapshots, expected_accounts_snapshots); assert_str_eq!(fuzz_instructions_code, expected_fuzz_instructions_code); } - -#[throws] -#[tokio::test] -async fn test_display_ix() { - // this will automatically create expanded code within the same directory - // with ".expanded.rs" extension, if the file does not exist already. - // Do not perform any formatting command on the expanded code - // the test will then fail - macrotest::expand("tests/test_data/fuzzer_macros/fuzz_display_ix.rs"); -} -#[throws] -#[tokio::test] -async fn test_fuzz_deserialize() { - // this will automatically create expanded code within the same directory - // with ".expanded.rs" extension, if the file does not exist already. - // Do not perform any formatting command on the expanded code - // the test will then fail - macrotest::expand("tests/test_data/fuzzer_macros/fuzz_fuzz_deserialize.rs"); -} - -#[throws] -#[tokio::test] -async fn test_fuzz_test_executor() { - // this will automatically create expanded code within the same directory - // with ".expanded.rs" extension, if the file does not exist already. - // Do not perform any formatting command on the expanded code - // the test will then fail - macrotest::expand("tests/test_data/fuzzer_macros/fuzz_fuzz_test_executor.rs"); -} - -#[throws] -#[tokio::test] -async fn test_fuzz_trident() { - // this will automatically created expanded code within the same directory - // with ".expanded.rs" extension, if the file does not exist already. - // Do not perform any formatting command on the expanded code - // the test will then fail - macrotest::expand("tests/test_data/fuzzer_macros/fuzz_fuzz_trident.rs"); -} diff --git a/crates/client/tests/test_program_client.rs b/crates/client/tests/test_program_client.rs index 3b082355..c1cc7a58 100644 --- a/crates/client/tests/test_program_client.rs +++ b/crates/client/tests/test_program_client.rs @@ -1,7 +1,7 @@ use anyhow::Error; use fehler::throws; use pretty_assertions::assert_str_eq; -use trident_client::test_generator::ProgramData; +use trident_client::___private::ProgramData; #[throws] #[tokio::test] @@ -24,7 +24,7 @@ pub async fn generate_program_client() { "/tests/test_data/expected_source_codes/expected_program_client_code.rs" )); - let program_idl = trident_client::idl::parse_to_idl_program("escrow".to_owned(), code)?; + let program_idl = trident_client::___private::parse_to_idl_program("escrow".to_owned(), code)?; let program_data = ProgramData { code: code.to_string(), @@ -34,9 +34,12 @@ pub async fn generate_program_client() { let program_data = vec![program_data]; let use_modules: Vec = vec![syn::parse_quote! { use trident_client::*; }]; + let client_code = trident_client::___private::program_client_generator::generate_source_code( + &program_data, + &use_modules, + ); let client_code = - trident_client::program_client_generator::generate_source_code(&program_data, &use_modules); - let client_code = trident_client::Commander::format_program_code(&client_code).await?; + trident_client::___private::Commander::format_program_code(&client_code).await?; assert_str_eq!(client_code, expected_client_code); } diff --git a/crates/explorer/Cargo.toml b/crates/explorer/Cargo.toml deleted file mode 100644 index 68b68a2d..00000000 --- a/crates/explorer/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "trident-explorer" -version = "0.3.2" -edition = "2021" -repository = "https://github.com/Ackee-Blockchain/trident" -license-file = "../../LICENSE" -readme = "../../README.md" -description = "Trident explorer for Solana." - -[dependencies] -solana-cli-config = { workspace = true } -solana-client = { workspace = true } -solana-sdk = { workspace = true } -solana-program = { workspace = true } -solana-logger = { workspace = true } -solana-transaction-status = { workspace = true } -solana-vote-program = { workspace = true } -solana-account-decoder = { workspace = true } -spl-token = { workspace = true } -spl-memo = { workspace = true } -spl-associated-token-account = { workspace = true } -thiserror = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -bs58 = { workspace = true } -base64 = { workspace = true } -pretty-hex = { workspace = true } -console = { workspace = true } -chrono = { workspace = true } -phf = { workspace = true } -bincode = { workspace = true } -num-derive = { workspace = true } -num-traits = { workspace = true } diff --git a/crates/explorer/src/account.rs b/crates/explorer/src/account.rs deleted file mode 100644 index bb176db4..00000000 --- a/crates/explorer/src/account.rs +++ /dev/null @@ -1,216 +0,0 @@ -use crate::output::pretty_lamports_to_sol; -use console::style; -use serde::Serialize; -use solana_sdk::{account::Account, pubkey::Pubkey}; -use std::fmt; - -#[derive(Serialize)] -pub struct KeyedAccount { - pub pubkey: Pubkey, - pub account: Account, -} - -pub struct AccountFieldVisibility { - lamports: bool, - data: bool, - owner: bool, - executable: bool, - rent_epoch: bool, -} - -impl AccountFieldVisibility { - pub fn new_all_enabled() -> Self { - Self { - lamports: true, - data: true, - owner: true, - executable: true, - rent_epoch: true, - } - } - - pub fn new_all_disabled() -> Self { - Self { - lamports: false, - data: false, - owner: false, - executable: false, - rent_epoch: false, - } - } - - pub fn lamports(&self) -> bool { - self.lamports - } - - pub fn enable_lamports(&mut self) -> &mut Self { - self.lamports = true; - self - } - - pub fn disable_lamports(&mut self) -> &mut Self { - self.lamports = false; - self - } - - pub fn data(&self) -> bool { - self.data - } - - pub fn enable_data(&mut self) -> &mut Self { - self.data = true; - self - } - - pub fn disable_data(&mut self) -> &mut Self { - self.data = false; - self - } - - pub fn owner(&self) -> bool { - self.owner - } - - pub fn enable_owner(&mut self) -> &mut Self { - self.owner = true; - self - } - - pub fn disable_owner(&mut self) -> &mut Self { - self.owner = false; - self - } - - pub fn executable(&self) -> bool { - self.executable - } - - pub fn enable_executable(&mut self) -> &mut Self { - self.executable = true; - self - } - - pub fn disable_executable(&mut self) -> &mut Self { - self.executable = false; - self - } - - pub fn rent_epoch(&self) -> bool { - self.rent_epoch - } - - pub fn enable_rent_epoch(&mut self) -> &mut Self { - self.rent_epoch = true; - self - } - - pub fn disable_rent_epoch(&mut self) -> &mut Self { - self.rent_epoch = false; - self - } -} - -#[derive(Serialize)] -pub struct DisplayAccount { - #[serde(skip_serializing_if = "Option::is_none")] - pub lamports: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub data: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub owner: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub executable: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub rent_epoch: Option, -} - -#[derive(Serialize)] -pub struct DisplayKeyedAccount { - pub pubkey: String, - pub account: DisplayAccount, -} - -impl DisplayKeyedAccount { - pub fn from_keyed_account( - keyed_account: &KeyedAccount, - visibility: &AccountFieldVisibility, - ) -> Self { - Self { - pubkey: keyed_account.pubkey.to_string(), - account: DisplayAccount { - lamports: if visibility.lamports { - Some(keyed_account.account.lamports) - } else { - None - }, - data: if visibility.data { - Some(base64::encode(&keyed_account.account.data)) - } else { - None - }, - owner: if visibility.owner { - Some(keyed_account.account.owner.to_string()) - } else { - None - }, - executable: if visibility.executable { - Some(keyed_account.account.executable) - } else { - None - }, - rent_epoch: if visibility.rent_epoch { - Some(keyed_account.account.rent_epoch) - } else { - None - }, - }, - } - } -} - -impl fmt::Display for DisplayKeyedAccount { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - writeln!( - f, - "========================================================" - )?; - writeln!(f, "{} {}", style("Public Key:").bold(), self.pubkey)?; - writeln!( - f, - "========================================================" - )?; - - if let Some(lamports) = self.account.lamports { - writeln!(f)?; - write!( - f, - "{} {} (â—Ž {})", - style("Lamports:").bold(), - lamports, - pretty_lamports_to_sol(lamports) - )?; - } - if let Some(data) = &self.account.data { - writeln!(f)?; - if data.is_empty() { - write!(f, "{} [Empty]", style("Data:").bold())?; - } else { - write!(f, "{} [Hexdump below]", style("Data:").bold())?; - } - } - if let Some(owner) = &self.account.owner { - writeln!(f)?; - write!(f, "{} {}", style("Owner").bold(), owner)?; - } - if let Some(executable) = self.account.executable { - writeln!(f)?; - write!(f, "{} {}", style("Executable:").bold(), executable)?; - } - if let Some(rent_epoch) = self.account.rent_epoch { - writeln!(f)?; - write!(f, "{} {}", style("Rent Epoch:").bold(), rent_epoch)?; - } - - Ok(()) - } -} diff --git a/crates/explorer/src/config.rs b/crates/explorer/src/config.rs deleted file mode 100644 index 87d26536..00000000 --- a/crates/explorer/src/config.rs +++ /dev/null @@ -1,64 +0,0 @@ -use solana_cli_config::{Config, CONFIG_FILE}; -use solana_client::rpc_client::RpcClient; -use solana_sdk::commitment_config::CommitmentConfig; - -pub struct ExplorerConfig { - json_rpc_url: String, - rpc_client: RpcClient, -} - -impl ExplorerConfig { - pub fn new() -> Self { - let json_rpc_url = if let Some(ref config_file) = *CONFIG_FILE { - Config::load(config_file).unwrap_or_default().json_rpc_url - } else { - Config::default().json_rpc_url - }; - - let rpc_client = - RpcClient::new_with_commitment(json_rpc_url.clone(), CommitmentConfig::confirmed()); - - // setup_logging(LogLevel::DEBUG); - - ExplorerConfig { - json_rpc_url, - rpc_client, - } - } - - pub fn json_rpc_url(&self) -> &String { - &self.json_rpc_url - } - - pub fn rpc_client(&self) -> &RpcClient { - &self.rpc_client - } -} - -impl Default for ExplorerConfig { - fn default() -> Self { - Self::new() - } -} - -pub enum LogLevel { - ERROR, - WARN, - INFO, - DEBUG, - TRACE, -} - -pub fn setup_logging(level: LogLevel) { - match level { - LogLevel::ERROR => solana_logger::setup_with_default("error"), - LogLevel::WARN => solana_logger::setup_with_default("warn"), - LogLevel::INFO => solana_logger::setup_with_default("info"), - LogLevel::DEBUG => solana_logger::setup_with_default("debug"), - LogLevel::TRACE => solana_logger::setup_with_default("trace"), - } -} - -pub fn reset_logging() { - setup_logging(LogLevel::ERROR); -} diff --git a/crates/explorer/src/display.rs b/crates/explorer/src/display.rs deleted file mode 100644 index 4847eca6..00000000 --- a/crates/explorer/src/display.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::error::Result; -use serde::Serialize; -use std::fmt; - -#[derive(Clone, Copy)] -pub enum DisplayFormat { - Cli, - JSONPretty, - JSON, -} - -impl DisplayFormat { - pub fn formatted_string(&self, item: &T) -> Result - where - T: fmt::Display + Serialize, - { - match self { - DisplayFormat::Cli => Ok(format!("{item}")), - DisplayFormat::JSONPretty => Ok(serde_json::to_string_pretty(&item)?), - DisplayFormat::JSON => Ok(serde_json::to_string(&item)?), - } - } -} diff --git a/crates/explorer/src/error.rs b/crates/explorer/src/error.rs deleted file mode 100644 index 0d1b5dbf..00000000 --- a/crates/explorer/src/error.rs +++ /dev/null @@ -1,25 +0,0 @@ -use serde_json::error::Error as SerdeError; -use solana_client::client_error::ClientError; -use solana_sdk::instruction::InstructionError; -use std::fmt::Error as FmtError; -use thiserror::Error; - -pub type Result = std::result::Result; - -#[derive(Debug, Error)] -pub enum ExplorerError { - #[error("{0}")] - SolanaClient(#[from] ClientError), - - #[error("{0}")] - SerdeJson(#[from] SerdeError), - - #[error("{0}")] - Fmt(#[from] FmtError), - - #[error("{0}")] - Instruction(#[from] InstructionError), - - #[error("{0}")] - Custom(String), -} diff --git a/crates/explorer/src/lib.rs b/crates/explorer/src/lib.rs deleted file mode 100644 index 86dd9450..00000000 --- a/crates/explorer/src/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -pub mod config; -pub mod error; - -pub mod display; -pub mod output; - -pub mod parse; - -pub mod account; -pub mod program; -pub mod transaction; diff --git a/crates/explorer/src/output.rs b/crates/explorer/src/output.rs deleted file mode 100644 index aa772da4..00000000 --- a/crates/explorer/src/output.rs +++ /dev/null @@ -1,365 +0,0 @@ -use crate::{ - account::{AccountFieldVisibility, DisplayKeyedAccount, KeyedAccount}, - config::ExplorerConfig, - display::DisplayFormat, - error::{ExplorerError, Result}, - program::{DisplayUpgradeableProgram, ProgramFieldVisibility}, - transaction::{ - DisplayRawTransaction, DisplayTransaction, RawTransactionFieldVisibility, - TransactionFieldVisibility, - }, -}; -use console::style; -use pretty_hex::*; -use solana_client::rpc_config::RpcTransactionConfig; -use solana_sdk::{ - account_utils::StateMut, bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, - bpf_loader_upgradeable::UpgradeableLoaderState, commitment_config::CommitmentConfig, - native_token, pubkey::Pubkey, signature::Signature, -}; -use solana_transaction_status::{TransactionConfirmationStatus, UiTransactionEncoding}; -use std::{cmp::Ordering, fmt::Write}; - -pub fn pretty_lamports_to_sol(lamports: u64) -> String { - let sol_str = format!("{:.9}", native_token::lamports_to_sol(lamports)); - sol_str - .trim_end_matches('0') - .trim_end_matches('.') - .to_string() -} - -pub fn classify_account(fee_payer: bool, writable: bool, signer: bool, program: bool) -> String { - let mut account_type_string = String::new(); - let mut started = false; - if fee_payer { - account_type_string.push_str("[Fee Payer]"); - started = true; - } - if writable { - if started { - account_type_string.push(' '); - } - account_type_string.push_str("[Writable]"); - started = true; - } - if signer { - if started { - account_type_string.push(' '); - } - account_type_string.push_str("[Signer]"); - started = true; - } - if program { - if started { - account_type_string.push(' '); - } - account_type_string.push_str("[Program]"); - } - account_type_string -} - -pub fn calculate_change(post: u64, pre: u64) -> String { - match post.cmp(&pre) { - Ordering::Greater => format!( - "â—Ž {} (+{})", - pretty_lamports_to_sol(post), - pretty_lamports_to_sol(post - pre) - ), - Ordering::Less => format!( - "â—Ž {} (-{})", - pretty_lamports_to_sol(post), - pretty_lamports_to_sol(pre - post) - ), - Ordering::Equal => format!("â—Ž {}", pretty_lamports_to_sol(post)), - } -} - -pub fn change_in_sol(post: u64, pre: u64) -> String { - match post.cmp(&pre) { - Ordering::Greater => format!("+{}", pretty_lamports_to_sol(post - pre)), - Ordering::Less => format!("-{}", pretty_lamports_to_sol(pre - post)), - Ordering::Equal => "0".to_string(), - } -} - -pub fn status_to_string(status: &TransactionConfirmationStatus) -> String { - match status { - TransactionConfirmationStatus::Processed => "Processed".to_string(), - TransactionConfirmationStatus::Confirmed => "Confirmed".to_string(), - TransactionConfirmationStatus::Finalized => "Finalized".to_string(), - } -} - -pub async fn print_account( - pubkey: &Pubkey, - visibility: &AccountFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result<()> { - let account_string = get_account_string(pubkey, visibility, format, config).await?; - println!("{account_string}"); - Ok(()) -} - -pub async fn print_program( - program_id: &Pubkey, - visibility: &ProgramFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result<()> { - let program_string = get_program_string(program_id, visibility, format, config).await?; - println!("{program_string}"); - Ok(()) -} - -pub async fn print_raw_transaction( - signature: &Signature, - visibility: &RawTransactionFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result<()> { - let raw_transaction_string = - get_raw_transaction_string(signature, visibility, format, config).await?; - println!("{raw_transaction_string}"); - Ok(()) -} - -pub async fn print_transaction( - signature: &Signature, - visibility: &TransactionFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result<()> { - let transaction_string = get_transaction_string(signature, visibility, format, config).await?; - println!("{transaction_string}"); - Ok(()) -} - -pub async fn get_account_string( - pubkey: &Pubkey, - visibility: &AccountFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result { - let rpc_client = config.rpc_client(); - let account = rpc_client.get_account(pubkey)?; - let keyed_account = KeyedAccount { - pubkey: *pubkey, - account, - }; - let display_keyed_account = DisplayKeyedAccount::from_keyed_account(&keyed_account, visibility); - let mut account_string = format.formatted_string(&display_keyed_account)?; - - if display_keyed_account.account.data.is_some() { - let data = &keyed_account.account.data; - if let DisplayFormat::Cli = format { - if !data.is_empty() { - writeln!(&mut account_string)?; - writeln!(&mut account_string)?; - - writeln!( - &mut account_string, - "{} {} bytes", - style("Hexdump:").bold(), - data.len() - )?; - // Show hexdump of not more than MAX_BYTES_SHOWN bytes - const MAX_BYTES_SHOWN: usize = 64; - let len = data.len(); - let (end, finished) = if MAX_BYTES_SHOWN > len { - (len, true) - } else { - (MAX_BYTES_SHOWN, false) - }; - let raw_account_data = &data[..end]; - let cfg = HexConfig { - title: false, - width: 16, - group: 0, - chunk: 2, - ..HexConfig::default() - }; - write!(&mut account_string, "{:?}", raw_account_data.hex_conf(cfg))?; - if !finished { - writeln!(&mut account_string)?; - write!(&mut account_string, "... (skipped)")?; - } - } - }; - } - - Ok(account_string) -} - -pub async fn get_program_string( - program_id: &Pubkey, - visibility: &ProgramFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result { - let rpc_client = config.rpc_client(); - let program_account = rpc_client.get_account(program_id)?; - let program_keyed_account = KeyedAccount { - pubkey: *program_id, - account: program_account, - }; - - if program_keyed_account.account.owner == bpf_loader::id() - || program_keyed_account.account.owner == bpf_loader_deprecated::id() - { - // these loaders are not interesting, just accounts with the program.so in data - let mut program_string = get_account_string( - program_id, - &AccountFieldVisibility::new_all_enabled(), - format, - config, - ) - .await?; - - if let DisplayFormat::Cli = format { - program_string.push_str( - "\n\nNote: the program is loaded either by the deprecated BPFLoader or BPFLoader2, -it is an executable account with program.so in its data, hence this output.", - ); - } - - Ok(program_string) - } else if program_keyed_account.account.owner == bpf_loader_upgradeable::id() { - // this is the only interesting loader which uses redirection to programdata account - if let Ok(UpgradeableLoaderState::Program { - programdata_address, - }) = program_keyed_account.account.state() - { - if let Ok(programdata_account) = rpc_client.get_account(&programdata_address) { - let programdata_keyed_account = KeyedAccount { - pubkey: programdata_address, - account: programdata_account, - }; - if let Ok(UpgradeableLoaderState::ProgramData { - upgrade_authority_address, - slot, - }) = programdata_keyed_account.account.state() - { - let program = DisplayUpgradeableProgram::from( - &program_keyed_account, - &programdata_keyed_account, - slot, - &upgrade_authority_address, - visibility, - ); - let mut program_string = format.formatted_string(&program)?; - - if program.programdata_account.is_some() { - if let DisplayFormat::Cli = format { - writeln!(&mut program_string)?; - writeln!(&mut program_string)?; - writeln!( - &mut program_string, - "{} {} bytes", - style("Followed by Raw Program Data (program.so):").bold(), - programdata_keyed_account.account.data.len() - - UpgradeableLoaderState::size_of_programdata_metadata() - )?; - - // Show hexdump of not more than MAX_BYTES_SHOWN bytes - const MAX_BYTES_SHOWN: usize = 64; - let len = programdata_keyed_account.account.data.len(); - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let (end, finished) = if offset + MAX_BYTES_SHOWN > len { - (len, true) - } else { - (offset + MAX_BYTES_SHOWN, false) - }; - let raw_program_data = - &programdata_keyed_account.account.data[offset..end]; - let cfg = HexConfig { - title: false, - width: 16, - group: 0, - chunk: 2, - ..HexConfig::default() - }; - write!(&mut program_string, "{:?}", raw_program_data.hex_conf(cfg))?; - if !finished { - writeln!(&mut program_string)?; - write!(&mut program_string, "... (skipped)")?; - } - } - } - - Ok(program_string) - } else { - Err(ExplorerError::Custom(format!( - "Program {program_id} has been closed" - ))) - } - } else { - Err(ExplorerError::Custom(format!( - "Program {program_id} has been closed" - ))) - } - } else { - Err(ExplorerError::Custom(format!( - "{program_id} is not a Program account" - ))) - } - } else { - Err(ExplorerError::Custom(format!( - "{program_id} is not a pubkey of an on-chain BPF program." - ))) - } -} - -pub async fn get_raw_transaction_string( - signature: &Signature, - visibility: &RawTransactionFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result { - let rpc_client = config.rpc_client(); - let config = RpcTransactionConfig { - encoding: Some(UiTransactionEncoding::Binary), - commitment: Some(CommitmentConfig::confirmed()), - max_supported_transaction_version: None, - }; - - let transaction = rpc_client.get_transaction_with_config(signature, config)?; - - let response = rpc_client.get_signature_statuses_with_history(&[*signature])?; - - let transaction_status = response.value[0].as_ref().unwrap(); - - let display_transaction = - DisplayRawTransaction::from(&transaction, transaction_status, visibility)?; - - let transaction_string = format.formatted_string(&display_transaction)?; - - Ok(transaction_string) -} - -pub async fn get_transaction_string( - signature: &Signature, - visibility: &TransactionFieldVisibility, - format: DisplayFormat, - config: &ExplorerConfig, -) -> Result { - let rpc_client = config.rpc_client(); - let config = RpcTransactionConfig { - encoding: Some(UiTransactionEncoding::Binary), - commitment: Some(CommitmentConfig::confirmed()), - max_supported_transaction_version: Some(0), - }; - - let transaction = rpc_client.get_transaction_with_config(signature, config)?; - - let response = rpc_client.get_signature_statuses_with_history(&[*signature])?; - - let transaction_status = response.value[0].as_ref().unwrap(); - - let display_transaction = - DisplayTransaction::from(&transaction, transaction_status, visibility)?; - - let transaction_string = format.formatted_string(&display_transaction)?; - - Ok(transaction_string) -} diff --git a/crates/explorer/src/parse.rs b/crates/explorer/src/parse.rs deleted file mode 100644 index 4287d461..00000000 --- a/crates/explorer/src/parse.rs +++ /dev/null @@ -1,145 +0,0 @@ -use self::{ - associated_token_account::parse_associated_token_account, bpf_loader::parse_bpf_loader, - bpf_upgradeable_loader::parse_bpf_upgradeable_loader, memo::parse_memo, stake::parse_stake, - system::parse_system, token::parse_token, vote::parse_vote, -}; -use crate::transaction::{DisplayParsedInstruction, DisplayPartiallyParsedInstruction}; -use phf::phf_map; -use serde::Serialize; -use serde_json::Value; -use solana_sdk::{instruction::CompiledInstruction, pubkey::Pubkey}; -use thiserror::Error; - -mod associated_token_account; -mod bpf_loader; -mod bpf_upgradeable_loader; -mod memo; -mod stake; -mod system; -mod token; -mod vote; - -#[derive(Clone, Debug)] -pub enum ParsableProgram { - System, - BPFLoaderDeprecated, - BPFLoader, - BPFLoaderUpgradeable, - Stake, - Vote, - SPLMemoV1, - SPLMemo, - SPLToken, - SPLAssociatedTokenAccount, -} - -static PARSABLE_PROGRAM_IDS: phf::Map<&'static str, ParsableProgram> = phf_map! { - // System - "11111111111111111111111111111111" => ParsableProgram::System, - // BPF Loader Deprecated - "BPFLoader1111111111111111111111111111111111" => ParsableProgram::BPFLoaderDeprecated, - // BPF Loader - "BPFLoader2111111111111111111111111111111111" => ParsableProgram::BPFLoader, - // BPF Loader Upgradeable - "BPFLoaderUpgradeab1e11111111111111111111111" => ParsableProgram::BPFLoaderUpgradeable, - // Stake - "Stake11111111111111111111111111111111111111" => ParsableProgram::Stake, - // Vote - "Vote111111111111111111111111111111111111111" => ParsableProgram::Vote, - // SPL Memo v1 - "Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo" => ParsableProgram::SPLMemoV1, - // SPL Memo (current) - "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" => ParsableProgram::SPLMemo, - // SPL Token - "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" => ParsableProgram::SPLToken, - // SPL Associated Token Account - "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" => ParsableProgram::SPLAssociatedTokenAccount -}; - -#[derive(Error, Debug)] -pub enum ParseInstructionError { - #[error("{0:?} instruction not parsable")] - InstructionNotParsable(ParsableProgram), - - #[error("{0:?} instruction key mismatch")] - InstructionKeyMismatch(ParsableProgram), - - #[error("Program not parsable")] - ProgramNotParsable, - - #[error("Internal error, please report")] - SerdeJsonError(#[from] serde_json::error::Error), -} - -#[derive(Serialize, PartialEq, Eq, Debug)] -pub struct ParsedInstructionEnum { - #[serde(rename = "type")] - pub instruction_type: String, - #[serde(skip_serializing_if = "Value::is_null")] - pub info: Value, -} - -pub fn parse( - program_id: &Pubkey, - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let program_name = PARSABLE_PROGRAM_IDS - .get(&program_id.to_string()) - .ok_or(ParseInstructionError::ProgramNotParsable)?; - - let parsed_json = match program_name { - ParsableProgram::System => serde_json::to_value(parse_system(instruction, account_keys)?)?, - ParsableProgram::BPFLoaderDeprecated | ParsableProgram::BPFLoader => { - serde_json::to_value(parse_bpf_loader(instruction, account_keys)?)? - } - ParsableProgram::BPFLoaderUpgradeable => { - serde_json::to_value(parse_bpf_upgradeable_loader(instruction, account_keys)?)? - } - ParsableProgram::Stake => serde_json::to_value(parse_stake(instruction, account_keys)?)?, - ParsableProgram::Vote => serde_json::to_value(parse_vote(instruction, account_keys)?)?, - ParsableProgram::SPLMemoV1 | ParsableProgram::SPLMemo => { - serde_json::to_value(parse_memo(instruction)?)? - } - ParsableProgram::SPLToken => serde_json::to_value(parse_token(instruction, account_keys)?)?, - ParsableProgram::SPLAssociatedTokenAccount => { - serde_json::to_value(parse_associated_token_account(instruction, account_keys)?)? - } - }; - - Ok(DisplayParsedInstruction { - program: format!("{program_name:?}"), - program_id: program_id.to_string(), - parsed: parsed_json, - }) -} - -pub fn check_num_accounts( - accounts: &[u8], - num: usize, - parsable_program: ParsableProgram, -) -> Result<(), ParseInstructionError> { - if accounts.len() < num { - Err(ParseInstructionError::InstructionKeyMismatch( - parsable_program, - )) - } else { - Ok(()) - } -} - -pub fn partially_parse( - program_id: &Pubkey, - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> DisplayPartiallyParsedInstruction { - DisplayPartiallyParsedInstruction { - program_id: program_id.to_string(), - accounts: instruction - .accounts - .iter() - .map(|&i| account_keys[i as usize].to_string()) - .collect(), - data: bs58::encode(instruction.data.clone()).into_string(), - } -} diff --git a/crates/explorer/src/parse/associated_token_account.rs b/crates/explorer/src/parse/associated_token_account.rs deleted file mode 100644 index d9acfb3c..00000000 --- a/crates/explorer/src/parse/associated_token_account.rs +++ /dev/null @@ -1,96 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde_json::json; -use solana_sdk::{instruction::CompiledInstruction, pubkey::Pubkey}; - -pub fn parse_associated_token_account( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::SPLAssociatedTokenAccount, - )); - } - } - check_num_associated_token_accounts(&instruction.accounts, 6)?; - Ok(ParsedInstructionEnum { - instruction_type: "Create".to_string(), - info: json!({ - "Source": account_keys[instruction.accounts[0] as usize].to_string(), - "Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Wallet": account_keys[instruction.accounts[2] as usize].to_string(), - "Mint": account_keys[instruction.accounts[3] as usize].to_string(), - "System Program": account_keys[instruction.accounts[4] as usize].to_string(), - "Token Program": account_keys[instruction.accounts[5] as usize].to_string(), - }), - }) -} - -fn check_num_associated_token_accounts( - accounts: &[u8], - num: usize, -) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::SPLAssociatedTokenAccount) -} - -#[cfg(test)] -mod test { - use super::*; - use spl_associated_token_account::instruction::create_associated_token_account; - use spl_associated_token_account::{ - get_associated_token_address, - solana_program::{ - instruction::CompiledInstruction as SplAssociatedTokenCompiledInstruction, - message::Message, pubkey::Pubkey as SplAssociatedTokenPubkey, - }, - }; - - fn convert_pubkey(pubkey: Pubkey) -> SplAssociatedTokenPubkey { - SplAssociatedTokenPubkey::new_from_array(pubkey.to_bytes()) - } - - fn convert_compiled_instruction( - instruction: &SplAssociatedTokenCompiledInstruction, - ) -> CompiledInstruction { - CompiledInstruction { - program_id_index: instruction.program_id_index, - accounts: instruction.accounts.clone(), - data: instruction.data.clone(), - } - } - #[test] - fn test_parse_associated_token() { - let funder = Pubkey::new_unique(); - let wallet_address = Pubkey::new_unique(); - let mint = Pubkey::new_unique(); - let associated_account_address = - get_associated_token_address(&convert_pubkey(wallet_address), &convert_pubkey(mint)); - let create_ix = create_associated_token_account( - &convert_pubkey(funder), - &convert_pubkey(wallet_address), - &convert_pubkey(mint), - &&spl_token::id(), - ); - let message = Message::new(&[create_ix], None); - let compiled_instruction = convert_compiled_instruction(&message.instructions[0]); - assert_eq!( - parse_associated_token_account(&compiled_instruction, &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Create".to_string(), - info: json!({ - "Source": funder.to_string(), - "Account": associated_account_address.to_string(), - "Wallet": wallet_address.to_string(), - "Mint": mint.to_string(), - "System Program": solana_sdk::system_program::id().to_string(), - "Token Program": &spl_token::id().to_string(), - }) - } - ); - } -} diff --git a/crates/explorer/src/parse/bpf_loader.rs b/crates/explorer/src/parse/bpf_loader.rs deleted file mode 100644 index 85614395..00000000 --- a/crates/explorer/src/parse/bpf_loader.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::parse::{ParsableProgram, ParseInstructionError, ParsedInstructionEnum}; -use serde_json::json; -use solana_sdk::{ - instruction::CompiledInstruction, loader_instruction::LoaderInstruction, pubkey::Pubkey, -}; - -pub fn parse_bpf_loader( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let bpf_loader_instruction: LoaderInstruction = bincode::deserialize(&instruction.data) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::BPFLoader))?; - if instruction.accounts.is_empty() || instruction.accounts[0] as usize >= account_keys.len() { - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::BPFLoader, - )); - } - match bpf_loader_instruction { - LoaderInstruction::Write { offset, bytes } => Ok(ParsedInstructionEnum { - instruction_type: "Write".to_string(), - info: json!({ - "Offset": offset, - "Bytes": base64::encode(bytes), - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }), - LoaderInstruction::Finalize => Ok(ParsedInstructionEnum { - instruction_type: "Finalize".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }), - } -} - -#[cfg(test)] -mod test { - use super::*; - use solana_sdk::{message::Message, pubkey}; - - #[test] - fn test_parse_bpf_loader_instructions() { - let account_pubkey = pubkey::new_rand(); - let program_id = pubkey::new_rand(); - let offset = 4242; - let bytes = vec![8; 99]; - let fee_payer = pubkey::new_rand(); - let account_keys = vec![fee_payer, account_pubkey]; - let missing_account_keys = vec![account_pubkey]; - - let instruction = solana_sdk::loader_instruction::write( - &account_pubkey, - &program_id, - offset, - bytes.clone(), - ); - let message = Message::new(&[instruction], Some(&fee_payer)); - assert_eq!( - parse_bpf_loader(&message.instructions[0], &account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Write".to_string(), - info: json!({ - "Offset": offset, - "Bytes": base64::encode(&bytes), - "Account": account_pubkey.to_string(), - }), - } - ); - assert!(parse_bpf_loader(&message.instructions[0], &missing_account_keys).is_err()); - - let instruction = solana_sdk::loader_instruction::finalize(&account_pubkey, &program_id); - let message = Message::new(&[instruction], Some(&fee_payer)); - assert_eq!( - parse_bpf_loader(&message.instructions[0], &account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Finalize".to_string(), - info: json!({ - "Account": account_pubkey.to_string(), - }), - } - ); - assert!(parse_bpf_loader(&message.instructions[0], &missing_account_keys).is_err()); - - let bad_compiled_instruction = CompiledInstruction { - program_id_index: 3, - accounts: vec![1, 2], - data: vec![2, 0, 0, 0], // LoaderInstruction enum only has 2 variants - }; - assert!(parse_bpf_loader(&bad_compiled_instruction, &account_keys).is_err()); - - let bad_compiled_instruction = CompiledInstruction { - program_id_index: 3, - accounts: vec![], - data: vec![1, 0, 0, 0], - }; - assert!(parse_bpf_loader(&bad_compiled_instruction, &account_keys).is_err()); - } -} diff --git a/crates/explorer/src/parse/bpf_upgradeable_loader.rs b/crates/explorer/src/parse/bpf_upgradeable_loader.rs deleted file mode 100644 index 5b881b57..00000000 --- a/crates/explorer/src/parse/bpf_upgradeable_loader.rs +++ /dev/null @@ -1,420 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde_json::json; -use solana_sdk::{ - instruction::CompiledInstruction, loader_upgradeable_instruction::UpgradeableLoaderInstruction, - pubkey::Pubkey, -}; - -pub fn parse_bpf_upgradeable_loader( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let bpf_upgradeable_loader_instruction: UpgradeableLoaderInstruction = - bincode::deserialize(&instruction.data).map_err(|_| { - ParseInstructionError::InstructionNotParsable(ParsableProgram::BPFLoaderUpgradeable) - })?; - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::BPFLoaderUpgradeable, - )); - } - } - match bpf_upgradeable_loader_instruction { - UpgradeableLoaderInstruction::InitializeBuffer => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 1)?; - let mut value = json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() > 1 { - map.insert( - "Authority".to_string(), - json!(account_keys[instruction.accounts[1] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "InitializeBuffer".to_string(), - info: value, - }) - } - UpgradeableLoaderInstruction::Write { offset, bytes } => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "Write".to_string(), - info: json!({ - "Offset": offset, - "Bytes": base64::encode(bytes), - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Authority": account_keys[instruction.accounts[1] as usize].to_string(), - }), - }) - } - UpgradeableLoaderInstruction::DeployWithMaxDataLen { max_data_len } => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 8)?; - Ok(ParsedInstructionEnum { - instruction_type: "DeployWithMaxDataLen".to_string(), - info: json!({ - "MaxDataLen": max_data_len, - "Payer Account": account_keys[instruction.accounts[0] as usize].to_string(), - "ProgramData Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Program Account": account_keys[instruction.accounts[2] as usize].to_string(), - "Buffer Account": account_keys[instruction.accounts[3] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[4] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[5] as usize].to_string(), - "System Program": account_keys[instruction.accounts[6] as usize].to_string(), - "Authority": account_keys[instruction.accounts[7] as usize].to_string(), - }), - }) - } - UpgradeableLoaderInstruction::Upgrade => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 7)?; - Ok(ParsedInstructionEnum { - instruction_type: "Upgrade".to_string(), - info: json!({ - "ProgramData Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Program Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Buffer Account": account_keys[instruction.accounts[2] as usize].to_string(), - "Spill Account": account_keys[instruction.accounts[3] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[4] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[5] as usize].to_string(), - "Authority": account_keys[instruction.accounts[6] as usize].to_string(), - }), - }) - } - UpgradeableLoaderInstruction::SetAuthority => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "SetAuthority".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "New Authority": if instruction.accounts.len() > 2 { - Some(account_keys[instruction.accounts[2] as usize].to_string()) - } else { - None - }, - }), - }) - } - UpgradeableLoaderInstruction::Close => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "Close".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Recipient": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string() - }), - }) - } - UpgradeableLoaderInstruction::ExtendProgram { additional_bytes } => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "ExtendProgram".to_string(), - info: json!({ - "AdditionalBytes": additional_bytes, - "ProgramData Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Program Account": account_keys[instruction.accounts[1] as usize].to_string(), - "System Program": account_keys[instruction.accounts[2] as usize].to_string(), - "Payer Account": account_keys[instruction.accounts[3] as usize].to_string(), - }), - }) - } - UpgradeableLoaderInstruction::SetAuthorityChecked => { - check_num_bpf_upgradeable_loader_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "SetAuthorityChecked".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "New Authority": account_keys[instruction.accounts[2] as usize].to_string() - }), - }) - } - } -} - -fn check_num_bpf_upgradeable_loader_accounts( - accounts: &[u8], - num: usize, -) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::BPFLoaderUpgradeable) -} - -#[cfg(test)] -mod test { - use super::*; - use serde_json::Value; - use solana_sdk::{ - bpf_loader_upgradeable, message::Message, pubkey::Pubkey, system_program, sysvar, - }; - - #[test] - fn test_parse_bpf_upgradeable_loader_create_buffer_ix() { - let max_data_len = 54321; - - let payer_address = Pubkey::new_unique(); - let buffer_address = Pubkey::new_unique(); - let authority_address = Pubkey::new_unique(); - let instructions = bpf_loader_upgradeable::create_buffer( - &payer_address, - &buffer_address, - &authority_address, - 55, - max_data_len, - ) - .unwrap(); - let message = Message::new(&instructions, None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "InitializeBuffer".to_string(), - info: json!({ - "Account": buffer_address.to_string(), - "Authority": authority_address.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[1], - &message.account_keys[0..2] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_write_ix() { - let offset = 4242; - let bytes = vec![8; 99]; - - let buffer_address = Pubkey::new_unique(); - let authority_address = Pubkey::new_unique(); - let instruction = bpf_loader_upgradeable::write( - &buffer_address, - &authority_address, - offset, - bytes.clone(), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Write".to_string(), - info: json!({ - "Offset": offset, - "Bytes": base64::encode(&bytes), - "Account": buffer_address.to_string(), - "Authority": authority_address.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..1] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_deploy_ix() { - let max_data_len = 54321; - - let payer_address = Pubkey::new_unique(); - let program_address = Pubkey::new_unique(); - let buffer_address = Pubkey::new_unique(); - let upgrade_authority_address = Pubkey::new_unique(); - let programdata_address = Pubkey::find_program_address( - &[program_address.as_ref()], - &bpf_loader_upgradeable::id(), - ) - .0; - let instructions = bpf_loader_upgradeable::deploy_with_max_program_len( - &payer_address, - &program_address, - &buffer_address, - &upgrade_authority_address, - 55, - max_data_len, - ) - .unwrap(); - let message = Message::new(&instructions, None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "DeployWithMaxDataLen".to_string(), - info: json!({ - "MaxDataLen": max_data_len, - "Payer Account": payer_address.to_string(), - "Program Account": program_address.to_string(), - "Authority": upgrade_authority_address.to_string(), - "ProgramData Account": programdata_address.to_string(), - "Buffer Account": buffer_address.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "System Program": system_program::ID.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[1], - &message.account_keys[0..7] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_upgrade_ix() { - let program_address = Pubkey::new_unique(); - let buffer_address = Pubkey::new_unique(); - let authority_address = Pubkey::new_unique(); - let spill_address = Pubkey::new_unique(); - let programdata_address = Pubkey::find_program_address( - &[program_address.as_ref()], - &bpf_loader_upgradeable::id(), - ) - .0; - let instruction = bpf_loader_upgradeable::upgrade( - &program_address, - &buffer_address, - &authority_address, - &spill_address, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Upgrade".to_string(), - info: json!({ - "Authority": authority_address.to_string(), - "ProgramData Account": programdata_address.to_string(), - "Program Account": program_address.to_string(), - "Buffer Account": buffer_address.to_string(), - "Spill Account": spill_address.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..6] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_set_buffer_authority_ix() { - let buffer_address = Pubkey::new_unique(); - let current_authority_address = Pubkey::new_unique(); - let new_authority_address = Pubkey::new_unique(); - let instruction = bpf_loader_upgradeable::set_buffer_authority( - &buffer_address, - ¤t_authority_address, - &new_authority_address, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetAuthority".to_string(), - info: json!({ - "Account": buffer_address.to_string(), - "Authority": current_authority_address.to_string(), - "New Authority": new_authority_address.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..1] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_set_upgrade_authority_ix() { - let program_address = Pubkey::new_unique(); - let current_authority_address = Pubkey::new_unique(); - let new_authority_address = Pubkey::new_unique(); - let (programdata_address, _) = Pubkey::find_program_address( - &[program_address.as_ref()], - &bpf_loader_upgradeable::id(), - ); - let instruction = bpf_loader_upgradeable::set_upgrade_authority( - &program_address, - ¤t_authority_address, - Some(&new_authority_address), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetAuthority".to_string(), - info: json!({ - "Account": programdata_address.to_string(), - "Authority": current_authority_address.to_string(), - "New Authority": new_authority_address.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..1] - ) - .is_err()); - - let instruction = bpf_loader_upgradeable::set_upgrade_authority( - &program_address, - ¤t_authority_address, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetAuthority".to_string(), - info: json!({ - "Account": programdata_address.to_string(), - "Authority": current_authority_address.to_string(), - "New Authority": Value::Null, - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..1] - ) - .is_err()); - } - - #[test] - fn test_parse_bpf_upgradeable_loader_close_ix() { - let close_address = Pubkey::new_unique(); - let recipient_address = Pubkey::new_unique(); - let authority_address = Pubkey::new_unique(); - let instruction = - bpf_loader_upgradeable::close(&close_address, &recipient_address, &authority_address); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_bpf_upgradeable_loader(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Close".to_string(), - info: json!({ - "Account": close_address.to_string(), - "Recipient": recipient_address.to_string(), - "Authority": authority_address.to_string(), - }), - } - ); - assert!(parse_bpf_upgradeable_loader( - &message.instructions[0], - &message.account_keys[0..1] - ) - .is_err()); - } -} diff --git a/crates/explorer/src/parse/memo.rs b/crates/explorer/src/parse/memo.rs deleted file mode 100644 index 61fc368a..00000000 --- a/crates/explorer/src/parse/memo.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::parse::{ParsableProgram, ParseInstructionError}; -use serde_json::Value; -use solana_sdk::instruction::CompiledInstruction; -use std::str::{from_utf8, Utf8Error}; - -pub fn parse_memo(instruction: &CompiledInstruction) -> Result { - parse_memo_data(&instruction.data) - .map(Value::String) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::SPLMemo)) -} - -pub fn parse_memo_data(data: &[u8]) -> Result { - from_utf8(data).map(|s| s.to_string()) -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn test_parse_memo() { - let good_memo = "good memo".to_string(); - assert_eq!( - parse_memo(&CompiledInstruction { - program_id_index: 0, - accounts: vec![], - data: good_memo.as_bytes().to_vec(), - }) - .unwrap(), - Value::String(good_memo), - ); - - let bad_memo = vec![128u8]; - assert!(std::str::from_utf8(&bad_memo).is_err()); - assert!(parse_memo(&CompiledInstruction { - program_id_index: 0, - data: bad_memo, - accounts: vec![], - }) - .is_err(),); - } -} diff --git a/crates/explorer/src/parse/stake.rs b/crates/explorer/src/parse/stake.rs deleted file mode 100644 index 640c57c8..00000000 --- a/crates/explorer/src/parse/stake.rs +++ /dev/null @@ -1,934 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde_json::{json, Map}; -use solana_sdk::{ - instruction::CompiledInstruction, pubkey::Pubkey, stake::instruction::StakeInstruction, -}; - -pub fn parse_stake( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let stake_instruction: StakeInstruction = bincode::deserialize(&instruction.data) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::Stake))?; - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::Stake, - )); - } - } - match stake_instruction { - StakeInstruction::Initialize(authorized, lockup) => { - check_num_stake_accounts(&instruction.accounts, 2)?; - let authorized = json!({ - "Staker": authorized.staker.to_string(), - "Withdrawer": authorized.withdrawer.to_string(), - }); - let lockup = json!({ - "Unix Timestamp": lockup.unix_timestamp, - "Epoch": lockup.epoch, - "Custodian": lockup.custodian.to_string(), - }); - Ok(ParsedInstructionEnum { - instruction_type: "Initialize".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authorized": authorized, - "Lockup": lockup, - }), - }) - } - StakeInstruction::Authorize(new_authorized, authority_type) => { - check_num_stake_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authority": new_authorized.to_string(), - "Authority Type": authority_type, - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() >= 4 { - map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[3] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "Authorize".to_string(), - info: value, - }) - } - StakeInstruction::DelegateStake => { - check_num_stake_accounts(&instruction.accounts, 6)?; - Ok(ParsedInstructionEnum { - instruction_type: "Delegate".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Vote Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Stake History Sysvar": account_keys[instruction.accounts[3] as usize].to_string(), - "Stake Config Account": account_keys[instruction.accounts[4] as usize].to_string(), - "Stake Authority": account_keys[instruction.accounts[5] as usize].to_string(), - }), - }) - } - StakeInstruction::Split(lamports) => { - check_num_stake_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "Split".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "New Split Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Stake Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "Lamports": lamports, - }), - }) - } - StakeInstruction::Withdraw(lamports) => { - check_num_stake_accounts(&instruction.accounts, 5)?; - let mut value = json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Destination": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Stake History Sysvar": account_keys[instruction.accounts[3] as usize].to_string(), - "Withdraw Authority": account_keys[instruction.accounts[4] as usize].to_string(), - "Lamports": lamports, - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() >= 6 { - map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[5] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "Withdraw".to_string(), - info: value, - }) - } - StakeInstruction::Deactivate => { - check_num_stake_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "Deactivate".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Stake Authority": account_keys[instruction.accounts[2] as usize].to_string(), - }), - }) - } - StakeInstruction::SetLockup(lockup_args) => { - check_num_stake_accounts(&instruction.accounts, 2)?; - let mut lockup_map = Map::new(); - if let Some(timestamp) = lockup_args.unix_timestamp { - lockup_map.insert("Unix Timestamp".to_string(), json!(timestamp)); - } - if let Some(epoch) = lockup_args.epoch { - lockup_map.insert("Epoch".to_string(), json!(epoch)); - } - if let Some(custodian) = lockup_args.custodian { - lockup_map.insert("Custodian".to_string(), json!(custodian.to_string())); - } - Ok(ParsedInstructionEnum { - instruction_type: "SetLockup".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Custodian": account_keys[instruction.accounts[1] as usize].to_string(), - "Lockup": lockup_map, - }), - }) - } - StakeInstruction::Merge => { - check_num_stake_accounts(&instruction.accounts, 5)?; - Ok(ParsedInstructionEnum { - instruction_type: "Merge".to_string(), - info: json!({ - "Destination": account_keys[instruction.accounts[0] as usize].to_string(), - "Source": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Stake History Sysvar": account_keys[instruction.accounts[3] as usize].to_string(), - "Stake Authority": account_keys[instruction.accounts[4] as usize].to_string(), - }), - }) - } - StakeInstruction::AuthorizeWithSeed(args) => { - check_num_stake_accounts(&instruction.accounts, 2)?; - let mut value = json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Authority Base": account_keys[instruction.accounts[1] as usize].to_string(), - "New Authorized": args.new_authorized_pubkey.to_string(), - "Authority Type": args.stake_authorize, - "Authority Seed": args.authority_seed, - "Authority Owner": args.authority_owner.to_string(), - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() >= 3 { - map.insert( - "Clock Sysvar".to_string(), - json!(account_keys[instruction.accounts[2] as usize].to_string()), - ); - } - if instruction.accounts.len() >= 4 { - map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[3] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeWithSeed".to_string(), - info: value, - }) - } - StakeInstruction::InitializeChecked => { - check_num_stake_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "InitializeChecked".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Staker": account_keys[instruction.accounts[2] as usize].to_string(), - "Withdrawer": account_keys[instruction.accounts[3] as usize].to_string(), - }), - }) - } - StakeInstruction::AuthorizeChecked(authority_type) => { - check_num_stake_accounts(&instruction.accounts, 4)?; - let mut value = json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authority": account_keys[instruction.accounts[3] as usize].to_string(), - "Authority Type": authority_type, - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() >= 5 { - map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[4] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeChecked".to_string(), - info: value, - }) - } - StakeInstruction::AuthorizeCheckedWithSeed(args) => { - check_num_stake_accounts(&instruction.accounts, 4)?; - let mut value = json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Authority Base": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authorized": account_keys[instruction.accounts[3] as usize].to_string(), - "Authority Type": args.stake_authorize, - "Authority Seed": args.authority_seed, - "Authority Owner": args.authority_owner.to_string(), - }); - let map = value.as_object_mut().unwrap(); - if instruction.accounts.len() >= 5 { - map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[4] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeCheckedWithSeed".to_string(), - info: value, - }) - } - StakeInstruction::SetLockupChecked(lockup_args) => { - check_num_stake_accounts(&instruction.accounts, 2)?; - let mut lockup_map = Map::new(); - if let Some(timestamp) = lockup_args.unix_timestamp { - lockup_map.insert("Unix Timestamp".to_string(), json!(timestamp)); - } - if let Some(epoch) = lockup_args.epoch { - lockup_map.insert("Epoch".to_string(), json!(epoch)); - } - if instruction.accounts.len() >= 3 { - lockup_map.insert( - "Custodian".to_string(), - json!(account_keys[instruction.accounts[2] as usize].to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "SetLockupChecked".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Custodian": account_keys[instruction.accounts[1] as usize].to_string(), - "Lockup": lockup_map, - }), - }) - } - StakeInstruction::GetMinimumDelegation => Ok(ParsedInstructionEnum { - instruction_type: "GetMinimumDelegation".to_string(), - info: json!({}), - }), - StakeInstruction::DeactivateDelinquent => { - check_num_stake_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "DeactivateDelinquent".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Delinquent Vote Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Reference Vote Account": account_keys[instruction.accounts[2] as usize].to_string(), - }), - }) - } - StakeInstruction::Redelegate => { - check_num_stake_accounts(&instruction.accounts, 5)?; - Ok(ParsedInstructionEnum { - instruction_type: "Redelegate".to_string(), - info: json!({ - "Stake Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Uninitialized Stake Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Vote Account": account_keys[instruction.accounts[2] as usize].to_string(), - "Config Address": account_keys[instruction.accounts[3] as usize].to_string(), - "Stake Authority": account_keys[instruction.accounts[4] as usize].to_string(), - }), - }) - } - } -} - -fn check_num_stake_accounts(accounts: &[u8], num: usize) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::Stake) -} - -#[cfg(test)] -mod test { - use { - super::*, - solana_sdk::{ - message::Message, - pubkey::Pubkey, - stake::{ - config, - instruction::{self, LockupArgs}, - state::{Authorized, Lockup, StakeAuthorize}, - }, - sysvar, - }, - }; - - #[test] - fn test_parse_stake_initialize_ix() { - let from_pubkey = Pubkey::new_unique(); - let stake_pubkey = Pubkey::new_unique(); - let authorized = Authorized { - staker: Pubkey::new_unique(), - withdrawer: Pubkey::new_unique(), - }; - let lockup = Lockup { - unix_timestamp: 1_234_567_890, - epoch: 11, - custodian: Pubkey::new_unique(), - }; - let lamports = 55; - - let instructions = instruction::create_account( - &from_pubkey, - &stake_pubkey, - &authorized, - &lockup, - lamports, - ); - let message = Message::new(&instructions, None); - assert_eq!( - parse_stake(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Initialize".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Authorized": { - "Staker": authorized.staker.to_string(), - "Withdrawer": authorized.withdrawer.to_string(), - }, - "Lockup": { - "Unix Timestamp": lockup.unix_timestamp, - "Epoch": lockup.epoch, - "Custodian": lockup.custodian.to_string(), - } - }), - } - ); - assert!(parse_stake(&message.instructions[1], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_stake_authorize_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let custodian_pubkey = Pubkey::new_unique(); - let instruction = instruction::authorize( - &stake_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Staker, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Authorize".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": StakeAuthorize::Staker, - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..2]).is_err()); - - let instruction = instruction::authorize( - &stake_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Withdrawer, - Some(&custodian_pubkey), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Authorize".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": StakeAuthorize::Withdrawer, - "Custodian": custodian_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_stake_delegate_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let vote_pubkey = Pubkey::new_unique(); - let instruction = - instruction::delegate_stake(&stake_pubkey, &authorized_pubkey, &vote_pubkey); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Delegate".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Vote Account": vote_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Stake History Sysvar": sysvar::stake_history::ID.to_string(), - "Stake Config Account": config::ID.to_string(), - "Stake Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..5]).is_err()); - } - - #[test] - fn test_parse_stake_split_ix() { - let lamports = 55; - let stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let split_stake_pubkey = Pubkey::new_unique(); - let instructions = instruction::split( - &stake_pubkey, - &authorized_pubkey, - lamports, - &split_stake_pubkey, - ); - let message = Message::new(&instructions, None); - assert_eq!( - parse_stake(&message.instructions[2], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Split".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "New Split Account": split_stake_pubkey.to_string(), - "Stake Authority": authorized_pubkey.to_string(), - "Lamports": lamports, - }), - } - ); - assert!(parse_stake(&message.instructions[2], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_stake_withdraw_ix() { - let lamports = 55; - let stake_pubkey = Pubkey::new_unique(); - let withdrawer_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let custodian_pubkey = Pubkey::new_unique(); - let instruction = instruction::withdraw( - &stake_pubkey, - &withdrawer_pubkey, - &to_pubkey, - lamports, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Withdraw".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Destination": to_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Stake History Sysvar": sysvar::stake_history::ID.to_string(), - "Withdraw Authority": withdrawer_pubkey.to_string(), - "Lamports": lamports, - }), - } - ); - let instruction = instruction::withdraw( - &stake_pubkey, - &withdrawer_pubkey, - &to_pubkey, - lamports, - Some(&custodian_pubkey), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Withdraw".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Destination": to_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Stake History Sysvar": sysvar::stake_history::ID.to_string(), - "Withdraw Authority": withdrawer_pubkey.to_string(), - "Custodian": custodian_pubkey.to_string(), - "Lamports": lamports, - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..4]).is_err()); - } - - #[test] - fn test_parse_stake_deactivate_stake_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let instruction = instruction::deactivate_stake(&stake_pubkey, &authorized_pubkey); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Deactivate".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Stake Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_stake_merge_ix() { - let destination_stake_pubkey = Pubkey::new_unique(); - let source_stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let instructions = instruction::merge( - &destination_stake_pubkey, - &source_stake_pubkey, - &authorized_pubkey, - ); - let message = Message::new(&instructions, None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Merge".to_string(), - info: json!({ - "Destination": destination_stake_pubkey.to_string(), - "Source": source_stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Stake History Sysvar": sysvar::stake_history::ID.to_string(), - "Stake Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..4]).is_err()); - } - - #[test] - fn test_parse_stake_authorize_with_seed_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authority_base_pubkey = Pubkey::new_unique(); - let authority_owner_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let custodian_pubkey = Pubkey::new_unique(); - - let seed = "test_seed"; - let instruction = instruction::authorize_with_seed( - &stake_pubkey, - &authority_base_pubkey, - seed.to_string(), - &authority_owner_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Staker, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeWithSeed".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Authority Owner": authority_owner_pubkey.to_string(), - "New Authorized": new_authorized_pubkey.to_string(), - "Authority Base": authority_base_pubkey.to_string(), - "Authority Seed": seed, - "Authority Type": StakeAuthorize::Staker, - "Clock Sysvar": sysvar::clock::ID.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..2]).is_err()); - - let instruction = instruction::authorize_with_seed( - &stake_pubkey, - &authority_base_pubkey, - seed.to_string(), - &authority_owner_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Withdrawer, - Some(&custodian_pubkey), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeWithSeed".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Authority Owner": authority_owner_pubkey.to_string(), - "New Authorized": new_authorized_pubkey.to_string(), - "Authority Base": authority_base_pubkey.to_string(), - "Authority Seed": seed, - "Authority Type": StakeAuthorize::Withdrawer, - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Custodian": custodian_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..3]).is_err()); - } - - #[test] - #[allow(clippy::same_item_push)] - fn test_parse_stake_set_lockup() { - let mut keys: Vec = vec![]; - for _ in 0..3 { - keys.push(Pubkey::new_unique()); - } - let unix_timestamp = 1_234_567_890; - let epoch = 11; - let custodian = Pubkey::new_unique(); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: None, - custodian: None, - }; - let instruction = instruction::set_lockup(&keys[1], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..2]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockup".to_string(), - info: json!({ - "Stake Account": keys[1].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp - } - }), - } - ); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: Some(epoch), - custodian: None, - }; - let instruction = instruction::set_lockup(&keys[1], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..2]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockup".to_string(), - info: json!({ - "Stake Account": keys[1].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp, - "Epoch": epoch, - } - }), - } - ); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: Some(epoch), - custodian: Some(custodian), - }; - let instruction = instruction::set_lockup(&keys[1], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..2]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockup".to_string(), - info: json!({ - "Stake Account": keys[1].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp, - "Epoch": epoch, - "Custodian": custodian.to_string(), - } - }), - } - ); - - assert!(parse_stake(&message.instructions[0], &keys[0..1]).is_err()); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: None, - custodian: None, - }; - let instruction = instruction::set_lockup_checked(&keys[1], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..2]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockupChecked".to_string(), - info: json!({ - "Stake Account": keys[1].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp - } - }), - } - ); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: Some(epoch), - custodian: None, - }; - let instruction = instruction::set_lockup_checked(&keys[1], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..2]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockupChecked".to_string(), - info: json!({ - "Stake Account": keys[1].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp, - "Epoch": epoch, - } - }), - } - ); - assert!(parse_stake(&message.instructions[0], &keys[0..1]).is_err()); - - let lockup = LockupArgs { - unix_timestamp: Some(unix_timestamp), - epoch: Some(epoch), - custodian: Some(keys[1]), - }; - let instruction = instruction::set_lockup_checked(&keys[2], &lockup, &keys[0]); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &keys[0..3]).unwrap(), - ParsedInstructionEnum { - instruction_type: "SetLockupChecked".to_string(), - info: json!({ - "Stake Account": keys[2].to_string(), - "Custodian": keys[0].to_string(), - "Lockup": { - "Unix Timestamp": unix_timestamp, - "Epoch": epoch, - "Custodian": keys[1].to_string(), - } - }), - } - ); - assert!(parse_stake(&message.instructions[0], &keys[0..2]).is_err()); - } - - #[test] - fn test_parse_stake_create_account_checked_ix() { - let from_pubkey = Pubkey::new_unique(); - let stake_pubkey = Pubkey::new_unique(); - - let authorized = Authorized { - staker: Pubkey::new_unique(), - withdrawer: Pubkey::new_unique(), - }; - let lamports = 55; - - let instructions = - instruction::create_account_checked(&from_pubkey, &stake_pubkey, &authorized, lamports); - let message = Message::new(&instructions, None); - assert_eq!( - parse_stake(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "InitializeChecked".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Staker": authorized.staker.to_string(), - "Withdrawer": authorized.withdrawer.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[1], &message.account_keys[0..3]).is_err()); - } - - #[test] - fn test_parse_stake_authorize_checked_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let custodian_pubkey = Pubkey::new_unique(); - - let instruction = instruction::authorize_checked( - &stake_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Staker, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeChecked".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": StakeAuthorize::Staker, - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..3]).is_err()); - - let instruction = instruction::authorize_checked( - &stake_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Withdrawer, - Some(&custodian_pubkey), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeChecked".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": StakeAuthorize::Withdrawer, - "Custodian": custodian_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..4]).is_err()); - } - - #[test] - fn test_parse_stake_authorize_checked_with_seed_ix() { - let stake_pubkey = Pubkey::new_unique(); - let authority_base_pubkey = Pubkey::new_unique(); - let authority_owner_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let custodian_pubkey = Pubkey::new_unique(); - - let seed = "test_seed"; - let instruction = instruction::authorize_checked_with_seed( - &stake_pubkey, - &authority_base_pubkey, - seed.to_string(), - &authority_owner_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Staker, - None, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeCheckedWithSeed".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Authority Owner": authority_owner_pubkey.to_string(), - "New Authorized": new_authorized_pubkey.to_string(), - "Authority Base": authority_base_pubkey.to_string(), - "Authority Seed": seed, - "Authority Type": StakeAuthorize::Staker, - "Clock Sysvar": sysvar::clock::ID.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..3]).is_err()); - - let instruction = instruction::authorize_checked_with_seed( - &stake_pubkey, - &authority_base_pubkey, - seed.to_string(), - &authority_owner_pubkey, - &new_authorized_pubkey, - StakeAuthorize::Withdrawer, - Some(&custodian_pubkey), - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_stake(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeCheckedWithSeed".to_string(), - info: json!({ - "Stake Account": stake_pubkey.to_string(), - "Authority Owner": authority_owner_pubkey.to_string(), - "New Authorized": new_authorized_pubkey.to_string(), - "Authority Base": authority_base_pubkey.to_string(), - "Authority Seed": seed, - "Authority Type": StakeAuthorize::Withdrawer, - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Custodian": custodian_pubkey.to_string(), - }), - } - ); - assert!(parse_stake(&message.instructions[0], &message.account_keys[0..4]).is_err()); - } -} diff --git a/crates/explorer/src/parse/system.rs b/crates/explorer/src/parse/system.rs deleted file mode 100644 index 76a4017e..00000000 --- a/crates/explorer/src/parse/system.rs +++ /dev/null @@ -1,540 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde_json::json; -use solana_sdk::{ - instruction::CompiledInstruction, pubkey::Pubkey, system_instruction::SystemInstruction, -}; - -pub fn parse_system( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let system_instruction: SystemInstruction = bincode::deserialize(&instruction.data) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::System))?; - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::System, - )); - } - } - match system_instruction { - SystemInstruction::CreateAccount { - lamports, - space, - owner, - } => { - check_num_system_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "CreateAccount".to_string(), - info: json!({ - "Source": account_keys[instruction.accounts[0] as usize].to_string(), - "New Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Lamports": lamports, - "Space": space, - "Owner": owner.to_string(), - }), - }) - } - SystemInstruction::UpgradeNonceAccount => { - check_num_system_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "UpgradeNonceAccount".to_string(), - info: json!({ - "Nonce Account": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - SystemInstruction::Assign { owner } => { - check_num_system_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "Assign".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Owner": owner.to_string(), - }), - }) - } - SystemInstruction::Transfer { lamports } => { - check_num_system_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "Transfer".to_string(), - info: json!({ - "Source": account_keys[instruction.accounts[0] as usize].to_string(), - "Destination": account_keys[instruction.accounts[1] as usize].to_string(), - "Lamports": lamports, - }), - }) - } - SystemInstruction::CreateAccountWithSeed { - base, - seed, - lamports, - space, - owner, - } => { - check_num_system_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "CreateAccountWithSeed".to_string(), - info: json!({ - "Source": account_keys[instruction.accounts[0] as usize].to_string(), - "New Account": account_keys[instruction.accounts[1] as usize].to_string(), - "Base": base.to_string(), - "Seed": seed, - "Lamports": lamports, - "Space": space, - "Owner": owner.to_string(), - }), - }) - } - SystemInstruction::AdvanceNonceAccount => { - check_num_system_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "AdvanceNonce".to_string(), - info: json!({ - "Nonce Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Recent Blockhashes Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Nonce Authority": account_keys[instruction.accounts[2] as usize].to_string(), - }), - }) - } - SystemInstruction::WithdrawNonceAccount(lamports) => { - check_num_system_accounts(&instruction.accounts, 5)?; - Ok(ParsedInstructionEnum { - instruction_type: "WithdrawFromNonce".to_string(), - info: json!({ - "Nonce Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Destination": account_keys[instruction.accounts[1] as usize].to_string(), - "Recent Blockhashes Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[3] as usize].to_string(), - "Nonce Authority": account_keys[instruction.accounts[4] as usize].to_string(), - "Lamports": lamports, - }), - }) - } - SystemInstruction::InitializeNonceAccount(authority) => { - check_num_system_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "InitializeNonce".to_string(), - info: json!({ - "Nonce Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Recent Blockhashes Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Nonce Authority": authority.to_string(), - }), - }) - } - SystemInstruction::AuthorizeNonceAccount(authority) => { - check_num_system_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeNonce".to_string(), - info: json!({ - "Nonce Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Nonce Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "New Authorized": authority.to_string(), - }), - }) - } - SystemInstruction::Allocate { space } => { - check_num_system_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "Allocate".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Space": space, - }), - }) - } - SystemInstruction::AllocateWithSeed { - base, - seed, - space, - owner, - } => { - check_num_system_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "AllocateWithSeed".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Base": base.to_string(), - "Seed": seed, - "Space": space, - "Owner": owner.to_string(), - }), - }) - } - SystemInstruction::AssignWithSeed { base, seed, owner } => { - check_num_system_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "AssignWithSeed".to_string(), - info: json!({ - "Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Base": base.to_string(), - "Seed": seed, - "Owner": owner.to_string(), - }), - }) - } - SystemInstruction::TransferWithSeed { - lamports, - from_seed, - from_owner, - } => { - check_num_system_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "TransferWithSeed".to_string(), - info: json!({ - "Source": account_keys[instruction.accounts[0] as usize].to_string(), - "Source Base": account_keys[instruction.accounts[1] as usize].to_string(), - "Destination": account_keys[instruction.accounts[2] as usize].to_string(), - "Lamports": lamports, - "Source Seed": from_seed, - "Source Owner": from_owner.to_string(), - }), - }) - } - } -} - -fn check_num_system_accounts(accounts: &[u8], num: usize) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::System) -} - -#[cfg(test)] -mod test { - use super::*; - use solana_sdk::{message::Message, pubkey::Pubkey, system_instruction, sysvar}; - - #[test] - fn test_parse_system_create_account_ix() { - let lamports = 55; - let space = 128; - let from_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let owner_pubkey = Pubkey::new_unique(); - - let instruction = system_instruction::create_account( - &from_pubkey, - &to_pubkey, - lamports, - space, - &owner_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "CreateAccount".to_string(), - info: json!({ - "Source": from_pubkey.to_string(), - "New Account": to_pubkey.to_string(), - "Lamports": lamports, - "Owner": owner_pubkey.to_string(), - "Space": space, - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_system_assign_ix() { - let account_pubkey = Pubkey::new_unique(); - let owner_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::assign(&account_pubkey, &owner_pubkey); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Assign".to_string(), - info: json!({ - "Account": account_pubkey.to_string(), - "Owner": owner_pubkey.to_string(), - }), - } - ); - assert!(parse_system(&message.instructions[0], &[]).is_err()); - } - - #[test] - fn test_parse_system_transfer_ix() { - let lamports = 55; - let from_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::transfer(&from_pubkey, &to_pubkey, lamports); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Transfer".to_string(), - info: json!({ - "Source": from_pubkey.to_string(), - "Destination": to_pubkey.to_string(), - "Lamports": lamports, - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_system_create_account_with_seed_ix() { - let lamports = 55; - let space = 128; - let seed = "test_seed"; - let from_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let base_pubkey = Pubkey::new_unique(); - let owner_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::create_account_with_seed( - &from_pubkey, - &to_pubkey, - &base_pubkey, - seed, - lamports, - space, - &owner_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "CreateAccountWithSeed".to_string(), - info: json!({ - "Source": from_pubkey.to_string(), - "New Account": to_pubkey.to_string(), - "Lamports": lamports, - "Base": base_pubkey.to_string(), - "Seed": seed, - "Owner": owner_pubkey.to_string(), - "Space": space, - }), - } - ); - - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_system_allocate_ix() { - let space = 128; - let account_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::allocate(&account_pubkey, space); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Allocate".to_string(), - info: json!({ - "Account": account_pubkey.to_string(), - "Space": space, - }), - } - ); - assert!(parse_system(&message.instructions[0], &[]).is_err()); - } - - #[test] - fn test_parse_system_allocate_with_seed_ix() { - let space = 128; - let seed = "test_seed"; - let account_pubkey = Pubkey::new_unique(); - let base_pubkey = Pubkey::new_unique(); - let owner_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::allocate_with_seed( - &account_pubkey, - &base_pubkey, - seed, - space, - &owner_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AllocateWithSeed".to_string(), - info: json!({ - "Account": account_pubkey.to_string(), - "Base": base_pubkey.to_string(), - "Seed": seed, - "Owner": owner_pubkey.to_string(), - "Space": space, - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_system_assign_with_seed_ix() { - let seed = "test_seed"; - let account_pubkey = Pubkey::new_unique(); - let base_pubkey = Pubkey::new_unique(); - let owner_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::assign_with_seed( - &account_pubkey, - &base_pubkey, - seed, - &owner_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AssignWithSeed".to_string(), - info: json!({ - "Account": account_pubkey.to_string(), - "Base": base_pubkey.to_string(), - "Seed": seed, - "Owner": owner_pubkey.to_string(), - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_system_transfer_with_seed_ix() { - let lamports = 55; - let seed = "test_seed"; - let from_pubkey = Pubkey::new_unique(); - let from_base_pubkey = Pubkey::new_unique(); - let from_owner_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let instruction = system_instruction::transfer_with_seed( - &from_pubkey, - &from_base_pubkey, - seed.to_string(), - &from_owner_pubkey, - &to_pubkey, - lamports, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "TransferWithSeed".to_string(), - info: json!({ - "Source": from_pubkey.to_string(), - "Source Base": from_base_pubkey.to_string(), - "Source Seed": seed, - "Source Owner": from_owner_pubkey.to_string(), - "Lamports": lamports, - "Destination": to_pubkey.to_string() - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_system_advance_nonce_account_ix() { - let nonce_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - - let instruction = - system_instruction::advance_nonce_account(&nonce_pubkey, &authorized_pubkey); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AdvanceNonce".to_string(), - info: json!({ - "Nonce Account": nonce_pubkey.to_string(), - "Recent Blockhashes Sysvar": sysvar::recent_blockhashes::ID.to_string(), - "Nonce Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_system_withdraw_nonce_account_ix() { - let nonce_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - - let lamports = 55; - let instruction = system_instruction::withdraw_nonce_account( - &nonce_pubkey, - &authorized_pubkey, - &to_pubkey, - lamports, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "WithdrawFromNonce".to_string(), - info: json!({ - "Nonce Account": nonce_pubkey.to_string(), - "Destination": to_pubkey.to_string(), - "Recent Blockhashes Sysvar": sysvar::recent_blockhashes::ID.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Nonce Authority": authorized_pubkey.to_string(), - "Lamports": lamports - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..4]).is_err()); - } - - #[test] - fn test_parse_system_initialize_nonce_ix() { - let lamports = 55; - let from_pubkey = Pubkey::new_unique(); - let nonce_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - - let instructions = system_instruction::create_nonce_account( - &from_pubkey, - &nonce_pubkey, - &authorized_pubkey, - lamports, - ); - let message = Message::new(&instructions, None); - assert_eq!( - parse_system(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "InitializeNonce".to_string(), - info: json!({ - "Nonce Account": nonce_pubkey.to_string(), - "Recent Blockhashes Sysvar": sysvar::recent_blockhashes::ID.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Nonce Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_system(&message.instructions[1], &message.account_keys[0..3]).is_err()); - } - - #[test] - fn test_parse_system_authorize_nonce_account_ix() { - let nonce_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let new_authority_pubkey = Pubkey::new_unique(); - - let instruction = system_instruction::authorize_nonce_account( - &nonce_pubkey, - &authorized_pubkey, - &new_authority_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_system(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeNonce".to_string(), - info: json!({ - "Nonce Account": nonce_pubkey.to_string(), - "New Authorized": new_authority_pubkey.to_string(), - "Nonce Authority": authorized_pubkey.to_string(), - }), - } - ); - assert!(parse_system(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } -} diff --git a/crates/explorer/src/parse/token.rs b/crates/explorer/src/parse/token.rs deleted file mode 100644 index a90a25d1..00000000 --- a/crates/explorer/src/parse/token.rs +++ /dev/null @@ -1,651 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde::{Deserialize, Serialize}; -use serde_json::{json, Map, Value}; -use solana_account_decoder::parse_token::token_amount_to_ui_amount; -use solana_program::{program_option::COption, pubkey::Pubkey}; -use solana_sdk::instruction::CompiledInstruction; -use spl_token::instruction::{AuthorityType, TokenInstruction}; - -pub fn parse_token( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let token_instruction = TokenInstruction::unpack(&instruction.data) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::SPLToken))?; - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::SPLToken, - )); - } - } - match token_instruction { - TokenInstruction::InitializeMint { - decimals, - mint_authority, - freeze_authority, - } => { - check_num_token_accounts(&instruction.accounts, 2)?; - let mut value = json!({ - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - "decimals": decimals, - "mintAuthority": mint_authority.to_string(), - "rentSysvar": account_keys[instruction.accounts[1] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - if let COption::Some(freeze_authority) = freeze_authority { - map.insert( - "freezeAuthority".to_string(), - json!(freeze_authority.to_string()), - ); - } - Ok(ParsedInstructionEnum { - instruction_type: "initializeMint".to_string(), - info: value, - }) - } - TokenInstruction::InitializeAccount => { - check_num_token_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "initializeAccount".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "owner": account_keys[instruction.accounts[2] as usize].to_string(), - "rentSysvar": account_keys[instruction.accounts[3] as usize].to_string(), - }), - }) - } - TokenInstruction::InitializeAccount2 { owner } => { - check_num_token_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "initializeAccount2".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "owner": owner.to_string(), - "rentSysvar": account_keys[instruction.accounts[2] as usize].to_string(), - }), - }) - } - TokenInstruction::InitializeMultisig { m } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut signers: Vec = vec![]; - for i in instruction.accounts[2..].iter() { - signers.push(account_keys[*i as usize].to_string()); - } - Ok(ParsedInstructionEnum { - instruction_type: "initializeMultisig".to_string(), - info: json!({ - "multisig": account_keys[instruction.accounts[0] as usize].to_string(), - "rentSysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "signers": signers, - "m": m, - }), - }) - } - TokenInstruction::Transfer { amount } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "source": account_keys[instruction.accounts[0] as usize].to_string(), - "destination": account_keys[instruction.accounts[1] as usize].to_string(), - "amount": amount.to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "authority", - "multisigAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "transfer".to_string(), - info: value, - }) - } - TokenInstruction::Approve { amount } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "source": account_keys[instruction.accounts[0] as usize].to_string(), - "delegate": account_keys[instruction.accounts[1] as usize].to_string(), - "amount": amount.to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "owner", - "multisigOwner", - ); - Ok(ParsedInstructionEnum { - instruction_type: "approve".to_string(), - info: value, - }) - } - TokenInstruction::Revoke => { - check_num_token_accounts(&instruction.accounts, 2)?; - let mut value = json!({ - "source": account_keys[instruction.accounts[0] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 1, - account_keys, - &instruction.accounts, - "owner", - "multisigOwner", - ); - Ok(ParsedInstructionEnum { - instruction_type: "revoke".to_string(), - info: value, - }) - } - TokenInstruction::SetAuthority { - authority_type, - new_authority, - } => { - check_num_token_accounts(&instruction.accounts, 2)?; - let owned = match authority_type { - AuthorityType::MintTokens | AuthorityType::FreezeAccount => "mint", - AuthorityType::AccountOwner | AuthorityType::CloseAccount => "account", - }; - let mut value = json!({ - owned: account_keys[instruction.accounts[0] as usize].to_string(), - "authorityType": Into::::into(authority_type), - "newAuthority": match new_authority { - COption::Some(authority) => Some(authority.to_string()), - COption::None => None, - }, - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 1, - account_keys, - &instruction.accounts, - "authority", - "multisigAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "setAuthority".to_string(), - info: value, - }) - } - TokenInstruction::MintTo { amount } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - "account": account_keys[instruction.accounts[1] as usize].to_string(), - "amount": amount.to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "mintAuthority", - "multisigMintAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "mintTo".to_string(), - info: value, - }) - } - TokenInstruction::Burn { amount } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "amount": amount.to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "authority", - "multisigAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "burn".to_string(), - info: value, - }) - } - TokenInstruction::CloseAccount => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "destination": account_keys[instruction.accounts[1] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "owner", - "multisigOwner", - ); - Ok(ParsedInstructionEnum { - instruction_type: "closeAccount".to_string(), - info: value, - }) - } - TokenInstruction::FreezeAccount => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "freezeAuthority", - "multisigFreezeAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "freezeAccount".to_string(), - info: value, - }) - } - TokenInstruction::ThawAccount => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "freezeAuthority", - "multisigFreezeAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "thawAccount".to_string(), - info: value, - }) - } - TokenInstruction::TransferChecked { amount, decimals } => { - check_num_token_accounts(&instruction.accounts, 4)?; - let mut value = json!({ - "source": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "destination": account_keys[instruction.accounts[2] as usize].to_string(), - "tokenAmount": token_amount_to_ui_amount(amount, decimals), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 3, - account_keys, - &instruction.accounts, - "authority", - "multisigAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "transferChecked".to_string(), - info: value, - }) - } - TokenInstruction::ApproveChecked { amount, decimals } => { - check_num_token_accounts(&instruction.accounts, 4)?; - let mut value = json!({ - "source": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "delegate": account_keys[instruction.accounts[2] as usize].to_string(), - "tokenAmount": token_amount_to_ui_amount(amount, decimals), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 3, - account_keys, - &instruction.accounts, - "owner", - "multisigOwner", - ); - Ok(ParsedInstructionEnum { - instruction_type: "approveChecked".to_string(), - info: value, - }) - } - TokenInstruction::MintToChecked { amount, decimals } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - "account": account_keys[instruction.accounts[1] as usize].to_string(), - "tokenAmount": token_amount_to_ui_amount(amount, decimals), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "mintAuthority", - "multisigMintAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "mintToChecked".to_string(), - info: value, - }) - } - TokenInstruction::BurnChecked { amount, decimals } => { - check_num_token_accounts(&instruction.accounts, 3)?; - let mut value = json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mint": account_keys[instruction.accounts[1] as usize].to_string(), - "tokenAmount": token_amount_to_ui_amount(amount, decimals), - }); - let map = value.as_object_mut().unwrap(); - parse_signers( - map, - 2, - account_keys, - &instruction.accounts, - "authority", - "multisigAuthority", - ); - Ok(ParsedInstructionEnum { - instruction_type: "burnChecked".to_string(), - info: value, - }) - } - TokenInstruction::SyncNative => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "syncNative".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - TokenInstruction::InitializeAccount3 { owner } => { - check_num_token_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "initializeAccount3".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mintAccount": account_keys[instruction.accounts[1] as usize].to_string(), - "owner": owner.to_string(), - }), - }) - } - TokenInstruction::InitializeMint2 { mint_authority, .. } => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "initializeMint2".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - "mintAuthority": mint_authority.to_string(), - }), - }) - } - TokenInstruction::InitializeMultisig2 { m } => { - check_num_token_accounts(&instruction.accounts, 2)?; - let mut signers: Vec = vec![]; - for i in instruction.accounts[1..].iter() { - signers.push(account_keys[*i as usize].to_string()); - } - Ok(ParsedInstructionEnum { - instruction_type: "initializeMultisig2".to_string(), - info: json!({ - "multisig": account_keys[instruction.accounts[0] as usize].to_string(), - "signers": signers, - "m": m, - }), - }) - } - TokenInstruction::GetAccountDataSize => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "getAccountDataSize".to_string(), - info: json!({ - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - TokenInstruction::InitializeImmutableOwner => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "initializeImmutableOwner".to_string(), - info: json!({ - "account": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - TokenInstruction::AmountToUiAmount { amount } => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "amountToUiAmount".to_string(), - info: json!({ - "amount": amount, - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - TokenInstruction::UiAmountToAmount { ui_amount } => { - check_num_token_accounts(&instruction.accounts, 1)?; - Ok(ParsedInstructionEnum { - instruction_type: "uiAmountToAmount".to_string(), - info: json!({ - "uiAmount": ui_amount, - "mint": account_keys[instruction.accounts[0] as usize].to_string(), - }), - }) - } - } -} - -#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] -#[serde(rename_all = "camelCase")] -pub enum UiAuthorityType { - MintTokens, - FreezeAccount, - AccountOwner, - CloseAccount, -} - -impl From for UiAuthorityType { - fn from(authority_type: AuthorityType) -> Self { - match authority_type { - AuthorityType::MintTokens => UiAuthorityType::MintTokens, - AuthorityType::FreezeAccount => UiAuthorityType::FreezeAccount, - AuthorityType::AccountOwner => UiAuthorityType::AccountOwner, - AuthorityType::CloseAccount => UiAuthorityType::CloseAccount, - } - } -} - -fn parse_signers( - map: &mut Map, - last_nonsigner_index: usize, - account_keys: &[Pubkey], - accounts: &[u8], - owner_field_name: &str, - multisig_field_name: &str, -) { - if accounts.len() > last_nonsigner_index + 1 { - let mut signers: Vec = vec![]; - for i in accounts[last_nonsigner_index + 1..].iter() { - signers.push(account_keys[*i as usize].to_string()); - } - map.insert( - multisig_field_name.to_string(), - json!(account_keys[accounts[last_nonsigner_index] as usize].to_string()), - ); - map.insert("signers".to_string(), json!(signers)); - } else { - map.insert( - owner_field_name.to_string(), - json!(account_keys[accounts[last_nonsigner_index] as usize].to_string()), - ); - } -} - -fn check_num_token_accounts(accounts: &[u8], num: usize) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::SPLToken) -} - -#[cfg(test)] -mod test { - use super::*; - use solana_sdk::{instruction::CompiledInstruction, pubkey::Pubkey}; - use spl_token::{ - instruction::*, - solana_program::{ - instruction::CompiledInstruction as SplTokenCompiledInstruction, - instruction::Instruction as SplTokenInstruction, message::Message, - pubkey::Pubkey as SplTokenPubkey, - }, - }; - use std::str::FromStr; - - fn convert_pubkey(pubkey: Pubkey) -> SplTokenPubkey { - SplTokenPubkey::from_str(&pubkey.to_string()).unwrap() - } - - fn convert_compiled_instruction( - instruction: &SplTokenCompiledInstruction, - ) -> CompiledInstruction { - CompiledInstruction { - program_id_index: instruction.program_id_index, - accounts: instruction.accounts.clone(), - data: instruction.data.clone(), - } - } - - fn make_coerced_message( - mut instruction: SplTokenInstruction, - program_id: &SplTokenPubkey, - ) -> Message { - instruction.program_id = *program_id; - Message::new(&[instruction], None) - } - - #[test] - #[allow(clippy::same_item_push)] - fn test_parse_token_v3() { - test_parse_token(&spl_token::id()); - } - - fn test_parse_token(program_id: &SplTokenPubkey) { - let mint_pubkey = Pubkey::new_unique(); - let mint_authority = Pubkey::new_unique(); - let freeze_authority = Pubkey::new_unique(); - let rent_sysvar = solana_sdk::sysvar::rent::id(); - - // Test InitializeMint variations - let initialize_mint_ix = initialize_mint( - &spl_token::id(), // TODO: replace with `program_id` - &convert_pubkey(mint_pubkey), - &convert_pubkey(mint_authority), - Some(&convert_pubkey(freeze_authority)), - 2, - ) - .unwrap(); - let message = make_coerced_message(initialize_mint_ix, program_id); - let compiled_instruction = convert_compiled_instruction(&message.instructions[0]); - assert_eq!( - parse_token(&compiled_instruction, &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "initializeMint".to_string(), - info: json!({ - "mint": mint_pubkey.to_string(), - "decimals": 2, - "mintAuthority": mint_authority.to_string(), - "freezeAuthority": freeze_authority.to_string(), - "rentSysvar": rent_sysvar.to_string(), - }) - } - ); - - let initialize_mint_ix = initialize_mint( - &spl_token::id(), // TODO: replace with `program_id` - &convert_pubkey(mint_pubkey), - &convert_pubkey(mint_authority), - None, - 2, - ) - .unwrap(); - let message = make_coerced_message(initialize_mint_ix, program_id); - let compiled_instruction = convert_compiled_instruction(&message.instructions[0]); - assert_eq!( - parse_token(&compiled_instruction, &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "initializeMint".to_string(), - info: json!({ - "mint": mint_pubkey.to_string(), - "decimals": 2, - "mintAuthority": mint_authority.to_string(), - "rentSysvar": rent_sysvar.to_string(), - }) - } - ); - - // Test InitializeAccount - let account_pubkey = Pubkey::new_unique(); - let owner = Pubkey::new_unique(); - let initialize_account_ix = initialize_account( - &spl_token::id(), // TODO: replace with `program_id` - &convert_pubkey(account_pubkey), - &convert_pubkey(mint_pubkey), - &convert_pubkey(owner), - ) - .unwrap(); - let message = make_coerced_message(initialize_account_ix, program_id); - let compiled_instruction = convert_compiled_instruction(&message.instructions[0]); - assert_eq!( - parse_token(&compiled_instruction, &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "initializeAccount".to_string(), - info: json!({ - "account": account_pubkey.to_string(), - "mint": mint_pubkey.to_string(), - "owner": owner.to_string(), - "rentSysvar": rent_sysvar.to_string(), - }) - } - ); - - // Test InitializeAccount2 - let initialize_account_ix = initialize_account2( - &spl_token::id(), // TODO: replace with `program_id` - &convert_pubkey(account_pubkey), - &convert_pubkey(mint_pubkey), - &convert_pubkey(owner), - ) - .unwrap(); - let message = make_coerced_message(initialize_account_ix, program_id); - let compiled_instruction = convert_compiled_instruction(&message.instructions[0]); - assert_eq!( - parse_token(&compiled_instruction, &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "initializeAccount2".to_string(), - info: json!({ - "account": account_pubkey.to_string(), - "mint": mint_pubkey.to_string(), - "owner": owner.to_string(), - "rentSysvar": rent_sysvar.to_string(), - }) - } - ); - } -} diff --git a/crates/explorer/src/parse/vote.rs b/crates/explorer/src/parse/vote.rs deleted file mode 100644 index bcda9dfd..00000000 --- a/crates/explorer/src/parse/vote.rs +++ /dev/null @@ -1,470 +0,0 @@ -use crate::parse::{ - check_num_accounts, ParsableProgram, ParseInstructionError, ParsedInstructionEnum, -}; -use serde_json::json; -use solana_sdk::{instruction::CompiledInstruction, pubkey::Pubkey}; -use solana_vote_program::vote_instruction::VoteInstruction; - -pub fn parse_vote( - instruction: &CompiledInstruction, - account_keys: &[Pubkey], -) -> Result { - let vote_instruction: VoteInstruction = bincode::deserialize(&instruction.data) - .map_err(|_| ParseInstructionError::InstructionNotParsable(ParsableProgram::Vote))?; - match instruction.accounts.iter().max() { - Some(index) if (*index as usize) < account_keys.len() => {} - _ => { - // Runtime should prevent this from ever happening - return Err(ParseInstructionError::InstructionKeyMismatch( - ParsableProgram::Vote, - )); - } - } - match vote_instruction { - VoteInstruction::InitializeAccount(vote_init) => { - check_num_vote_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "Initialize".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Rent Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Node": account_keys[instruction.accounts[3] as usize].to_string(), - "Authorized Voter": vote_init.authorized_voter.to_string(), - "Authorized Withdrawer": vote_init.authorized_withdrawer.to_string(), - "Commission": vote_init.commission, - }), - }) - } - VoteInstruction::Authorize(new_authorized, authority_type) => { - check_num_vote_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "Authorize".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authority": new_authorized.to_string(), - "Authority Type": authority_type, - }), - }) - } - VoteInstruction::Vote(vote) => { - check_num_vote_accounts(&instruction.accounts, 4)?; - let vote = json!({ - "Slots": vote.slots, - "Hash": vote.hash.to_string(), - "Timestamp": vote.timestamp, - }); - Ok(ParsedInstructionEnum { - instruction_type: "Vote".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Slot Hashes Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[3] as usize].to_string(), - "Vote": vote, - }), - }) - } - VoteInstruction::Withdraw(lamports) => { - check_num_vote_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "Withdraw".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Destination": account_keys[instruction.accounts[1] as usize].to_string(), - "Withdraw Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "Lamports": lamports, - }), - }) - } - VoteInstruction::UpdateValidatorIdentity => { - check_num_vote_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "UpdateValidatorIdentity".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "New Validator Identity": account_keys[instruction.accounts[1] as usize].to_string(), - "Withdraw Authority": account_keys[instruction.accounts[2] as usize].to_string(), - }), - }) - } - VoteInstruction::UpdateCommission(commission) => { - check_num_vote_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "UpdateCommission".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Withdraw Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "Commission": commission, - }), - }) - } - VoteInstruction::VoteSwitch(vote, hash) => { - check_num_vote_accounts(&instruction.accounts, 4)?; - let vote = json!({ - "Slots": vote.slots, - "Hash": vote.hash.to_string(), - "Timestamp": vote.timestamp, - }); - Ok(ParsedInstructionEnum { - instruction_type: "VoteSwitch".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Slot Hashes Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[2] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[3] as usize].to_string(), - "Vote": vote, - "Hash": hash.to_string(), - }), - }) - } - VoteInstruction::AuthorizeChecked(authority_type) => { - check_num_vote_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeChecked".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authority": account_keys[instruction.accounts[3] as usize].to_string(), - "Authority Type": authority_type, - }), - }) - } - VoteInstruction::UpdateVoteState(state) => { - check_num_vote_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "UpdateVoteState".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "State Hash": state.hash.to_string(), - }), - }) - } - VoteInstruction::UpdateVoteStateSwitch(state, hash) => { - check_num_vote_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "UpdateVoteStateSwitch".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "Hash": hash.to_string(), - "State Hash": state.hash.to_string(), - }), - }) - } - VoteInstruction::AuthorizeWithSeed(authority_type) => { - check_num_vote_accounts(&instruction.accounts, 3)?; - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeWithSeed".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "Authority Type": authority_type, - }), - }) - } - VoteInstruction::AuthorizeCheckedWithSeed(authority_type) => { - check_num_vote_accounts(&instruction.accounts, 4)?; - Ok(ParsedInstructionEnum { - instruction_type: "AuthorizeCheckedWithSeed".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Clock Sysvar": account_keys[instruction.accounts[1] as usize].to_string(), - "Authority": account_keys[instruction.accounts[2] as usize].to_string(), - "New Authority": account_keys[instruction.accounts[3] as usize].to_string(), - "Authority Type": authority_type, - }), - }) - } - VoteInstruction::CompactUpdateVoteState(state) => { - check_num_vote_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "CompactUpdateVoteState".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "State Hash": state.hash.to_string(), - }), - }) - } - VoteInstruction::CompactUpdateVoteStateSwitch(state, hash) => { - check_num_vote_accounts(&instruction.accounts, 2)?; - Ok(ParsedInstructionEnum { - instruction_type: "CompactUpdateVoteStateSwitch".to_string(), - info: json!({ - "Vote Account": account_keys[instruction.accounts[0] as usize].to_string(), - "Vote Authority": account_keys[instruction.accounts[1] as usize].to_string(), - "Hash": hash.to_string(), - "State Hash": state.hash.to_string(), - }), - }) - } - } -} - -fn check_num_vote_accounts(accounts: &[u8], num: usize) -> Result<(), ParseInstructionError> { - check_num_accounts(accounts, num, ParsableProgram::Vote) -} - -#[cfg(test)] -mod test { - use super::*; - use solana_program::vote::instruction::CreateVoteAccountConfig; - use solana_sdk::{hash::Hash, message::Message, pubkey::Pubkey, sysvar}; - use solana_vote_program::{ - vote_instruction, - vote_state::{Vote, VoteAuthorize, VoteInit}, - }; - - #[test] - fn test_parse_vote_initialize_ix() { - let lamports = 55; - - let commission = 10; - let node_pubkey = Pubkey::new_unique(); - let vote_pubkey = Pubkey::new_unique(); - let authorized_voter = Pubkey::new_unique(); - let authorized_withdrawer = Pubkey::new_unique(); - let vote_init = VoteInit { - node_pubkey, - authorized_voter, - authorized_withdrawer, - commission, - }; - - let instructions = vote_instruction::create_account_with_config( - &Pubkey::new_unique(), - &vote_pubkey, - &vote_init, - lamports, - CreateVoteAccountConfig::default(), - ); - let message = Message::new(&instructions, None); - assert_eq!( - parse_vote(&message.instructions[1], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Initialize".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Rent Sysvar": sysvar::rent::ID.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Node": node_pubkey.to_string(), - "Authorized Voter": authorized_voter.to_string(), - "Authorized Withdrawer": authorized_withdrawer.to_string(), - "Commission": commission, - }), - } - ); - assert!(parse_vote(&message.instructions[1], &message.account_keys[0..3]).is_err()); - } - - #[test] - fn test_parse_vote_authorize_ix() { - let vote_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let authority_type = VoteAuthorize::Voter; - let instruction = vote_instruction::authorize( - &vote_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - authority_type, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Authorize".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": authority_type, - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_vote_ix() { - let hash = Hash::new_from_array([1; 32]); - let vote = Vote { - slots: vec![1, 2, 4], - hash, - timestamp: Some(1_234_567_890), - }; - - let vote_pubkey = Pubkey::new_unique(); - let authorized_voter_pubkey = Pubkey::new_unique(); - let instruction = vote_instruction::vote(&vote_pubkey, &authorized_voter_pubkey, vote); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Vote".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Slot Hashes Sysvar": sysvar::slot_hashes::ID.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Vote Authority": authorized_voter_pubkey.to_string(), - "Vote": { - "Slots": [1, 2, 4], - "Hash": hash.to_string(), - "Timestamp": 1_234_567_890, - }, - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..3]).is_err()); - } - - #[test] - fn test_parse_vote_withdraw_ix() { - let lamports = 55; - let vote_pubkey = Pubkey::new_unique(); - let authorized_withdrawer_pubkey = Pubkey::new_unique(); - let to_pubkey = Pubkey::new_unique(); - let instruction = vote_instruction::withdraw( - &vote_pubkey, - &authorized_withdrawer_pubkey, - lamports, - &to_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "Withdraw".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Destination": to_pubkey.to_string(), - "Withdraw Authority": authorized_withdrawer_pubkey.to_string(), - "Lamports": lamports, - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_vote_update_validator_identity_ix() { - let vote_pubkey = Pubkey::new_unique(); - let authorized_withdrawer_pubkey = Pubkey::new_unique(); - let node_pubkey = Pubkey::new_unique(); - let instruction = vote_instruction::update_validator_identity( - &vote_pubkey, - &authorized_withdrawer_pubkey, - &node_pubkey, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "UpdateValidatorIdentity".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "New Validator Identity": node_pubkey.to_string(), - "Withdraw Authority": authorized_withdrawer_pubkey.to_string(), - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..2]).is_err()); - } - - #[test] - fn test_parse_vote_update_commission_ix() { - let commission = 10; - let vote_pubkey = Pubkey::new_unique(); - let authorized_withdrawer_pubkey = Pubkey::new_unique(); - let instruction = vote_instruction::update_commission( - &vote_pubkey, - &authorized_withdrawer_pubkey, - commission, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "UpdateCommission".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Withdraw Authority": authorized_withdrawer_pubkey.to_string(), - "Commission": commission, - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..1]).is_err()); - } - - #[test] - fn test_parse_vote_switch_ix() { - let hash = Hash::new_from_array([1; 32]); - let vote = Vote { - slots: vec![1, 2, 4], - hash, - timestamp: Some(1_234_567_890), - }; - - let vote_pubkey = Pubkey::new_unique(); - let authorized_voter_pubkey = Pubkey::new_unique(); - let proof_hash = Hash::new_from_array([2; 32]); - let instruction = - vote_instruction::vote_switch(&vote_pubkey, &authorized_voter_pubkey, vote, proof_hash); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "VoteSwitch".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Slot Hashes Sysvar": sysvar::slot_hashes::ID.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Vote Authority": authorized_voter_pubkey.to_string(), - "Vote": { - "Slots": [1, 2, 4], - "Hash": hash.to_string(), - "Timestamp": 1_234_567_890, - }, - "Hash": proof_hash.to_string(), - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..3]).is_err()); - } - - #[test] - fn test_parse_vote_authorized_checked_ix() { - let vote_pubkey = Pubkey::new_unique(); - let authorized_pubkey = Pubkey::new_unique(); - let new_authorized_pubkey = Pubkey::new_unique(); - let authority_type = VoteAuthorize::Voter; - let instruction = vote_instruction::authorize_checked( - &vote_pubkey, - &authorized_pubkey, - &new_authorized_pubkey, - authority_type, - ); - let message = Message::new(&[instruction], None); - assert_eq!( - parse_vote(&message.instructions[0], &message.account_keys).unwrap(), - ParsedInstructionEnum { - instruction_type: "AuthorizeChecked".to_string(), - info: json!({ - "Vote Account": vote_pubkey.to_string(), - "Clock Sysvar": sysvar::clock::ID.to_string(), - "Authority": authorized_pubkey.to_string(), - "New Authority": new_authorized_pubkey.to_string(), - "Authority Type": authority_type, - }), - } - ); - assert!(parse_vote(&message.instructions[0], &message.account_keys[0..3]).is_err()); - } -} diff --git a/crates/explorer/src/program.rs b/crates/explorer/src/program.rs deleted file mode 100644 index ba6a5495..00000000 --- a/crates/explorer/src/program.rs +++ /dev/null @@ -1,257 +0,0 @@ -use crate::{account::KeyedAccount, output::pretty_lamports_to_sol}; -use console::style; -use serde::Serialize; -use solana_sdk::{bpf_loader_upgradeable::UpgradeableLoaderState, pubkey::Pubkey}; -use std::fmt; - -pub struct ProgramFieldVisibility { - program_account: bool, - programdata_account: bool, -} - -impl ProgramFieldVisibility { - pub fn new_all_enabled() -> Self { - Self { - program_account: true, - programdata_account: true, - } - } - - pub fn new_all_disabled() -> Self { - Self { - program_account: false, - programdata_account: false, - } - } - - pub fn program_account(&self) -> bool { - self.program_account - } - - pub fn enable_program_account(&mut self) -> &mut Self { - self.program_account = true; - self - } - - pub fn disable_program_account(&mut self) -> &mut Self { - self.program_account = false; - self - } - - pub fn programdata_account(&self) -> bool { - self.programdata_account - } - - pub fn enable_programdata_account(&mut self) -> &mut Self { - self.programdata_account = true; - self - } - - pub fn disable_programdata_account(&mut self) -> &mut Self { - self.programdata_account = false; - self - } -} - -#[derive(Serialize)] -pub struct ProgramDataDeserialized { - pub slot: u64, - pub upgrade_authority_address: String, - pub raw_program_data: String, -} - -#[derive(Serialize)] -pub struct ProgramDeserialized { - pub programdata_address: String, -} - -#[derive(Serialize)] -pub struct DisplayProgramDataAccount { - pub lamports: u64, - pub data: ProgramDataDeserialized, - pub owner: String, - pub executable: bool, - pub rent_epoch: u64, -} - -#[derive(Serialize)] -pub struct DisplayProgramAccount { - pub lamports: u64, - pub data: ProgramDeserialized, - pub owner: String, - pub executable: bool, - pub rent_epoch: u64, -} - -#[derive(Serialize)] -pub struct DisplayUpgradeableProgram { - pub program_id: String, - #[serde(skip_serializing_if = "Option::is_none")] - pub program_account: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub programdata_account: Option, -} - -impl DisplayUpgradeableProgram { - pub fn from( - program_account: &KeyedAccount, - programdata_account: &KeyedAccount, - slot: u64, - upgrade_authority_address: &Option, - visibility: &ProgramFieldVisibility, - ) -> Self { - Self { - program_id: program_account.pubkey.to_string(), - program_account: if visibility.program_account { - Some(DisplayProgramAccount { - lamports: program_account.account.lamports, - data: ProgramDeserialized { - programdata_address: programdata_account.pubkey.to_string(), - }, - owner: program_account.account.owner.to_string(), - executable: program_account.account.executable, - rent_epoch: program_account.account.rent_epoch, - }) - } else { - None - }, - programdata_account: if visibility.programdata_account { - Some(DisplayProgramDataAccount { - lamports: programdata_account.account.lamports, - data: ProgramDataDeserialized { - slot, - upgrade_authority_address: upgrade_authority_address - .map(|pubkey| pubkey.to_string()) - .unwrap_or_else(|| "none".to_string()), - raw_program_data: base64::encode( - &programdata_account.account.data - [UpgradeableLoaderState::size_of_programdata_metadata()..], - ), - }, - owner: programdata_account.account.owner.to_string(), - executable: programdata_account.account.executable, - rent_epoch: programdata_account.account.rent_epoch, - }) - } else { - None - }, - } - } -} - -impl fmt::Display for DisplayUpgradeableProgram { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - writeln!( - f, - "========================================================" - )?; - writeln!(f, "{} {}", style("Program Id:").bold(), self.program_id)?; - writeln!( - f, - "========================================================" - )?; - - if let Some(program_account) = &self.program_account { - writeln!(f)?; - - writeln!(f, "{}", style("--> Program Account").bold(),)?; - - writeln!(f)?; - - writeln!( - f, - "{} {} (â—Ž {})", - style("Lamports:").bold(), - program_account.lamports, - pretty_lamports_to_sol(program_account.lamports) - )?; - writeln!( - f, - "{} [Deserialized and interpreted below]", - style("Data:").bold() - )?; - writeln!(f, "{} {}", style("Owner").bold(), program_account.owner)?; - writeln!( - f, - "{} {}", - style("Executable:").bold(), - program_account.executable - )?; - writeln!( - f, - "{} {}", - style("Rent Epoch:").bold(), - program_account.rent_epoch - )?; - - writeln!(f)?; - - writeln!(f, "{}", style("Deserialized:").bold())?; - write!(f, " - ")?; - write!( - f, - "{} {}", - style("ProgramData Address:").bold(), - program_account.data.programdata_address - )?; - - if self.programdata_account.is_some() { - writeln!(f)?; - } - } - - if let Some(programdata_account) = &self.programdata_account { - writeln!(f)?; - - writeln!(f, "{}", style("--> ProgramData Account").bold())?; - - writeln!(f)?; - - writeln!( - f, - "{} {} (â—Ž {})", - style("Lamports:").bold(), - programdata_account.lamports, - pretty_lamports_to_sol(programdata_account.lamports) - )?; - writeln!( - f, - "{} [Deserialized and interpreted below]", - style("Data:").bold() - )?; - writeln!(f, "{} {}", style("Owner").bold(), programdata_account.owner)?; - writeln!( - f, - "{} {}", - style("Executable:").bold(), - programdata_account.executable - )?; - writeln!( - f, - "{} {}", - style("Rent Epoch:").bold(), - programdata_account.rent_epoch - )?; - - writeln!(f)?; - - writeln!(f, "{}", style("Deserialized:").bold())?; - write!(f, " - ")?; - writeln!( - f, - "{} {}", - style("Last Deployed Slot:").bold(), - programdata_account.data.slot - )?; - write!(f, " - ")?; - write!( - f, - "{} {}", - style("Upgrade Authority:").bold(), - programdata_account.data.upgrade_authority_address - )?; - } - - Ok(()) - } -} diff --git a/crates/explorer/src/transaction.rs b/crates/explorer/src/transaction.rs deleted file mode 100644 index bd903dce..00000000 --- a/crates/explorer/src/transaction.rs +++ /dev/null @@ -1,788 +0,0 @@ -use crate::{ - error::Result, - output::{change_in_sol, classify_account, pretty_lamports_to_sol, status_to_string}, - parse::{parse, partially_parse}, -}; -use chrono::{TimeZone, Utc}; -use console::style; -use serde::Serialize; -use serde_json::Value; -use solana_program::message::VersionedMessage; -use solana_sdk::{instruction::CompiledInstruction, pubkey::Pubkey}; -use solana_transaction_status::{ - option_serializer::OptionSerializer, EncodedConfirmedTransactionWithStatusMeta, - EncodedTransactionWithStatusMeta, TransactionStatus, -}; -use std::fmt; - -pub struct RawTransactionFieldVisibility { - overview: bool, - transaction: bool, -} - -impl RawTransactionFieldVisibility { - pub fn new_all_enabled() -> Self { - Self { - overview: true, - transaction: true, - } - } - - pub fn new_all_disabled() -> Self { - Self { - overview: false, - transaction: false, - } - } - - pub fn overview(&self) -> bool { - self.overview - } - - pub fn enable_overview(&mut self) -> &mut Self { - self.overview = true; - self - } - - pub fn disable_overview(&mut self) -> &mut Self { - self.overview = false; - self - } - - pub fn transaction(&self) -> bool { - self.transaction - } - - pub fn enable_transaction(&mut self) -> &mut Self { - self.transaction = true; - self - } - - pub fn disable_transaction(&mut self) -> &mut Self { - self.transaction = false; - self - } -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawMessageHeader { - pub num_required_signatures: u8, - pub num_readonly_signed_accounts: u8, - pub num_readonly_unsigned_accounts: u8, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawInstruction { - pub program_id_index: u8, - pub accounts: Vec, - pub data: String, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawMessage { - pub header: DisplayRawMessageHeader, - pub account_keys: Vec, - pub recent_blockhash: String, - pub instructions: Vec, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawTransactionContent { - pub signatures: Vec, - pub message: DisplayRawMessage, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawTransactionOverview { - pub signature: String, - pub result: String, - pub timestamp: String, - pub confirmation_status: String, - pub confirmations: String, - pub slot: u64, - pub recent_blockhash: String, - pub fee: String, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayRawTransaction { - #[serde(skip_serializing_if = "Option::is_none")] - pub overview: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub transaction: Option, -} - -impl DisplayRawTransaction { - pub fn from( - transaction: &EncodedConfirmedTransactionWithStatusMeta, - transaction_status: &TransactionStatus, - visibility: &RawTransactionFieldVisibility, - ) -> Result { - let EncodedConfirmedTransactionWithStatusMeta { - slot, - transaction, - block_time, - } = transaction; - - let EncodedTransactionWithStatusMeta { - transaction, meta, .. - } = transaction; - - let decoded_transaction = transaction.decode().unwrap(); - - let message = decoded_transaction.message; - - let overview = if visibility.overview { - Some(DisplayRawTransactionOverview { - signature: decoded_transaction.signatures[0].to_string(), - result: meta - .as_ref() - .unwrap() - .err - .as_ref() - .map(|err| err.to_string()) - .unwrap_or_else(|| "Success".to_string()), - timestamp: Utc - .timestamp_opt(block_time.unwrap(), 0) - .unwrap() - .to_string(), - confirmation_status: status_to_string( - transaction_status.confirmation_status.as_ref().unwrap(), - ), - confirmations: transaction_status - .confirmations - .map_or_else(|| "MAX (32)".to_string(), |n| n.to_string()), - slot: *slot, - recent_blockhash: message.recent_blockhash().to_string(), - fee: format!("â—Ž {}", pretty_lamports_to_sol(meta.as_ref().unwrap().fee)), - }) - } else { - None - }; - - let transaction = if visibility.transaction { - Some(DisplayRawTransactionContent { - signatures: decoded_transaction - .signatures - .into_iter() - .map(|sig| sig.to_string()) - .collect(), - message: DisplayRawMessage { - header: DisplayRawMessageHeader { - num_required_signatures: message.header().num_required_signatures, - num_readonly_signed_accounts: message.header().num_readonly_signed_accounts, - num_readonly_unsigned_accounts: message - .header() - .num_readonly_unsigned_accounts, - }, - account_keys: message - .static_account_keys() - .iter() - .map(|key| key.to_string()) - .collect(), - recent_blockhash: message.recent_blockhash().to_string(), - instructions: message - .instructions() - .iter() - .map(|instruction| DisplayRawInstruction { - program_id_index: instruction.program_id_index, - accounts: instruction.accounts.clone(), - data: bs58::encode(instruction.data.clone()).into_string(), - }) - .collect(), - }, - }) - } else { - None - }; - - Ok(DisplayRawTransaction { - overview, - transaction, - }) - } -} - -impl fmt::Display for DisplayRawTransaction { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if let Some(overview) = &self.overview { - writeln!( - f, - "================================================================================" - )?; - writeln!(f, "{:^80}", style("Overview").bold())?; - writeln!( - f, - "================================================================================" - )?; - - writeln!(f)?; - - writeln!(f, "{} {}", style("Signature:").bold(), overview.signature)?; - writeln!(f, "{} {}", style("Result:").bold(), overview.result)?; - writeln!(f, "{} {}", style("Timestamp:").bold(), overview.timestamp)?; - writeln!( - f, - "{} {}", - style("Confirmation Status:").bold(), - overview.confirmation_status - )?; - writeln!( - f, - "{} {}", - style("Confirmations:").bold(), - overview.confirmations - )?; - writeln!(f, "{} {}", style("Slot:").bold(), overview.slot)?; - writeln!( - f, - "{} {}", - style("Recent Blockhash:").bold(), - overview.recent_blockhash - )?; - write!(f, "{} {}", style("Fee:").bold(), overview.fee)?; - } - - if self.overview.is_some() && self.transaction.is_some() { - writeln!(f)?; - writeln!(f)?; - } - - if let Some(transaction) = &self.transaction { - writeln!( - f, - "================================================================================" - )?; - writeln!(f, "{:^80}", style("Raw Transaction").bold())?; - writeln!( - f, - "================================================================================" - )?; - - writeln!(f)?; - - writeln!( - f, - "{}", - style(format!("Signatures ({}):", transaction.signatures.len())).bold() - )?; - - for (index, signature) in transaction.signatures.iter().enumerate() { - writeln!(f, " {:>2} {}", style(index).bold(), signature)?; - } - - writeln!(f)?; - - writeln!(f, "{}", style("Message:").bold())?; - - writeln!(f, " {}", style("Header:").bold())?; - - writeln!( - f, - " {} {}", - style("# of required signatures:").bold(), - transaction.message.header.num_required_signatures - )?; - - writeln!( - f, - " {} {}", - style("# of read-only signed accounts:").bold(), - transaction.message.header.num_readonly_signed_accounts - )?; - - writeln!( - f, - " {} {}", - style("# of read-only unsigned accounts:").bold(), - transaction.message.header.num_readonly_unsigned_accounts - )?; - - writeln!( - f, - " {}", - style(format!( - "Account Keys ({}):", - transaction.message.account_keys.len() - )) - .bold() - )?; - - for (index, account_key) in transaction.message.account_keys.iter().enumerate() { - writeln!(f, " {:>2} {}", style(index).bold(), account_key)?; - } - - writeln!(f, " {}", style("Recent Blockhash:").bold())?; - - writeln!(f, " {}", transaction.message.recent_blockhash)?; - - write!( - f, - " {}", - style(format!( - "Instructions ({}):", - transaction.message.instructions.len() - )) - .bold() - )?; - - for ( - index, - DisplayRawInstruction { - program_id_index, - accounts, - data, - }, - ) in transaction.message.instructions.iter().enumerate() - { - writeln!(f)?; - writeln!( - f, - " {:>2} {} {}", - style(index).bold(), - style("Program Id Index:").bold(), - program_id_index - )?; - writeln!( - f, - " {} {:?}", - style("Account Indices:").bold(), - accounts - )?; - write!(f, " {} {:?}", style("Data:").bold(), data)?; - } - } - - Ok(()) - } -} - -pub struct TransactionFieldVisibility { - overview: bool, - transaction: bool, - log_messages: bool, -} - -impl TransactionFieldVisibility { - pub fn new_all_enabled() -> Self { - Self { - overview: true, - transaction: true, - log_messages: true, - } - } - - pub fn new_all_disabled() -> Self { - Self { - overview: false, - transaction: false, - log_messages: false, - } - } - - pub fn overview(&self) -> bool { - self.overview - } - - pub fn enable_overview(&mut self) -> &mut Self { - self.overview = true; - self - } - - pub fn disable_overview(&mut self) -> &mut Self { - self.overview = false; - self - } - - pub fn transaction(&self) -> bool { - self.transaction - } - - pub fn enable_transaction(&mut self) -> &mut Self { - self.transaction = true; - self - } - - pub fn disable_transaction(&mut self) -> &mut Self { - self.transaction = false; - self - } - - pub fn log_messages(&self) -> bool { - self.log_messages - } - - pub fn enable_log_messages(&mut self) -> &mut Self { - self.log_messages = true; - self - } - - pub fn disable_log_messages(&mut self) -> &mut Self { - self.log_messages = false; - self - } -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayPartiallyParsedInstruction { - pub program_id: String, - pub accounts: Vec, - pub data: String, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayParsedInstruction { - pub program: String, - pub program_id: String, - pub parsed: Value, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub enum DisplayInstruction { - Parsed(DisplayParsedInstruction), - PartiallyParsed(DisplayPartiallyParsedInstruction), -} - -impl DisplayInstruction { - fn parse(instruction: &CompiledInstruction, account_keys: &[Pubkey]) -> Self { - let program_id = &account_keys[instruction.program_id_index as usize]; - if let Ok(parsed_instruction) = parse(program_id, instruction, account_keys) { - DisplayInstruction::Parsed(parsed_instruction) - } else { - DisplayInstruction::PartiallyParsed(partially_parse( - program_id, - instruction, - account_keys, - )) - } - } -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayInputAccount { - pub pubkey: String, - pub fee_payer: bool, - pub writable: bool, - pub signer: bool, - pub program: bool, - pub post_balance_in_sol: String, - pub balance_change_in_sol: String, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayTransactionContent { - pub accounts: Vec, - pub instructions: Vec, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayTransactionOverview { - pub signature: String, - pub result: String, - pub timestamp: String, - pub confirmation_status: String, - pub confirmations: String, - pub slot: u64, - pub recent_blockhash: String, - pub fee: String, -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -pub struct DisplayTransaction { - #[serde(skip_serializing_if = "Option::is_none")] - pub overview: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub transaction: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub log_messages: Option>>, -} - -impl DisplayTransaction { - pub fn from( - transaction: &EncodedConfirmedTransactionWithStatusMeta, - transaction_status: &TransactionStatus, - visibility: &TransactionFieldVisibility, - ) -> Result { - let EncodedConfirmedTransactionWithStatusMeta { - slot, - transaction, - block_time, - } = transaction; - - let EncodedTransactionWithStatusMeta { - transaction, meta, .. - } = transaction; - - let decoded_transaction = transaction.decode().unwrap(); - - let message = decoded_transaction.message; - let overview = if visibility.overview { - Some(DisplayTransactionOverview { - signature: decoded_transaction.signatures[0].to_string(), - result: meta - .as_ref() - .unwrap() - .err - .as_ref() - .map(|err| err.to_string()) - .unwrap_or_else(|| "Success".to_string()), - timestamp: Utc - .timestamp_opt(block_time.unwrap(), 0) - .unwrap() - .to_string(), - confirmation_status: status_to_string( - transaction_status.confirmation_status.as_ref().unwrap(), - ), - confirmations: transaction_status - .confirmations - .map_or_else(|| "MAX (32)".to_string(), |n| n.to_string()), - slot: *slot, - recent_blockhash: message.recent_blockhash().to_string(), - fee: format!("â—Ž {}", pretty_lamports_to_sol(meta.as_ref().unwrap().fee)), - }) - } else { - None - }; - - let mut fee_payer_found = false; // always first account - let transaction = if visibility.transaction { - Some(DisplayTransactionContent { - accounts: message - .static_account_keys() - .iter() - .enumerate() - .map(|(index, account_key)| DisplayInputAccount { - pubkey: account_key.to_string(), - fee_payer: if !fee_payer_found { - fee_payer_found = true; - true - } else { - false - }, - writable: message.is_maybe_writable(index), - signer: message.is_signer(index), - program: match message.clone() { - VersionedMessage::Legacy(m) => m.maybe_executable(index), - VersionedMessage::V0(m) => m.is_key_called_as_program(index), - }, - post_balance_in_sol: pretty_lamports_to_sol( - meta.as_ref().unwrap().post_balances[index], - ), - balance_change_in_sol: change_in_sol( - meta.as_ref().unwrap().post_balances[index], - meta.as_ref().unwrap().pre_balances[index], - ), - }) - .collect(), - instructions: message - .instructions() - .iter() - .map(|instruction| { - DisplayInstruction::parse(instruction, message.static_account_keys()) - }) - .collect(), - }) - } else { - None - }; - - let log_messages = if visibility.log_messages { - Some(meta.as_ref().unwrap().log_messages.clone()) - } else { - None - }; - - Ok(DisplayTransaction { - overview, - transaction, - log_messages, - }) - } -} - -impl fmt::Display for DisplayTransaction { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - if let Some(overview) = &self.overview { - writeln!( - f, - "================================================================================" - )?; - writeln!(f, "{:^80}", style("Overview").bold())?; - writeln!( - f, - "================================================================================" - )?; - - writeln!(f)?; - - writeln!(f, "{} {}", style("Signature:").bold(), overview.signature)?; - writeln!(f, "{} {}", style("Result:").bold(), overview.result)?; - writeln!(f, "{} {}", style("Timestamp:").bold(), overview.timestamp)?; - writeln!( - f, - "{} {}", - style("Confirmation Status:").bold(), - overview.confirmation_status - )?; - writeln!( - f, - "{} {}", - style("Confirmations:").bold(), - overview.confirmations - )?; - writeln!(f, "{} {}", style("Slot:").bold(), overview.slot)?; - writeln!( - f, - "{} {}", - style("Recent Blockhash:").bold(), - overview.recent_blockhash - )?; - write!(f, "{} {}", style("Fee:").bold(), overview.fee)?; - } - - if self.overview.is_some() && self.transaction.is_some() { - writeln!(f)?; - writeln!(f)?; - } - - if let Some(transaction) = &self.transaction { - writeln!( - f, - "================================================================================" - )?; - writeln!(f, "{:^80}", style("Transaction").bold())?; - writeln!( - f, - "================================================================================" - )?; - - writeln!(f)?; - - writeln!( - f, - "{}", - style(format!("Accounts ({}):", transaction.accounts.len())).bold() - )?; - - for (index, account) in transaction.accounts.iter().enumerate() { - let account_type_string = classify_account( - account.fee_payer, - account.writable, - account.signer, - account.program, - ); - - let balance_information_string = if account.balance_change_in_sol != "0" { - format!( - "â—Ž {} (â—Ž {})", - account.post_balance_in_sol, account.balance_change_in_sol - ) - } else { - format!("â—Ž {}", account.post_balance_in_sol) - }; - - writeln!( - f, - " {:>2} {:<44} {:31} {}", - style(index).bold(), - account.pubkey, - account_type_string, - balance_information_string - )?; - } - - writeln!(f)?; - - writeln!( - f, - "{}", - style(format!( - "Instructions ({}):", - transaction.instructions.len() - )) - .bold() - )?; - - for (index, instruction) in transaction.instructions.iter().enumerate() { - if let DisplayInstruction::Parsed(instruction) = instruction { - writeln!( - f, - " {:>2} {} {} {}", - style(index).bold(), - style(&instruction.program).bold(), - style("Program:").bold(), - instruction.parsed["type"].to_string().trim_matches('"') - )?; - writeln!(f, " [{}]", instruction.program_id)?; - for (name, value) in instruction.parsed["info"].as_object().unwrap() { - writeln!( - f, - " {}{} {}", - style(name).bold(), - style(":").bold(), - value - )?; - } - } else if let DisplayInstruction::PartiallyParsed(instruction) = instruction { - writeln!( - f, - " {:>2} {} Unknown Instruction", - style(index).bold(), - style("Unknown Program:").bold(), - )?; - writeln!(f, " [{}]", instruction.program_id)?; - for (index, account) in instruction.accounts.iter().enumerate() { - writeln!( - f, - " {} {}{} {:<44}", - style("Account").bold(), - style(index).bold(), - style(":").bold(), - account, - )?; - } - writeln!( - f, - " {} {:?}", - style("Data:").bold(), - bs58::encode(instruction.data.clone()).into_string() - )?; - } - writeln!(f)?; - } - } - - if self.overview.is_some() && self.transaction.is_none() && self.log_messages.is_some() { - writeln!(f)?; - writeln!(f)?; - } - - if let Some(OptionSerializer::Some(log_messages)) = &self.log_messages { - write!( - f, - "{}", - style(format!("Log Messages ({}):", log_messages.len())).bold() - )?; - - for (log_message_index, log_message) in log_messages.iter().enumerate() { - writeln!(f)?; - write!(f, " {:>2} {}", style(log_message_index).bold(), log_message)?; - } - } - - Ok(()) - } -} diff --git a/crates/fuzz/Cargo.toml b/crates/fuzz/Cargo.toml new file mode 100644 index 00000000..1d693bab --- /dev/null +++ b/crates/fuzz/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "trident-fuzz" +version = "0.1.0" +edition = "2021" +repository = "https://github.com/Ackee-Blockchain/trident" +license-file = "../../LICENSE" +readme = "../../README.md" +description = "The trident_fuzz crate helps you to write Rust Fuzz Tests for your programs with Trident." + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +# SOLANA +solana-sdk = { workspace = true } +solana-banks-client = { workspace = true } +spl-token = { workspace = true } +solana-program-runtime = { workspace = true } +solana-program-test = { workspace = true } + +# ANCHOR +anchor-lang = { workspace = true, features = ["init-if-needed"] } +anchor-syn = { workspace = true } + + +# ARBITRARY +arbitrary = { version = "1.3.0", features = ["derive"] } + + +# MISC +thiserror = "1.0.30" +syn = { version = "1.0.109", features = ["visit"] } +proc-macro2 = { version = "1.0.66", default-features = false } +quote = "1.0.14" +heck = { version = "0.4.0", default-features = false } +regex = "1.10.3" +prettytable = "0.10.0" +serde = { version = "1.0.136", default-features = false } +serde_json = "1.0.72" +tokio = "1" +convert_case = "0.6.0" diff --git a/crates/fuzz/derive/accounts_snapshots/Cargo.toml b/crates/fuzz/derive/accounts_snapshots/Cargo.toml new file mode 100644 index 00000000..24ed70a8 --- /dev/null +++ b/crates/fuzz/derive/accounts_snapshots/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +rust-version = "1.60" +edition = "2021" +license-file = "../../../../LICENSE" +readme = "../../../../README.md" +description = "trident-accounts-snapshots" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +proc-macro = true + +[dependencies] +proc-macro2 = { version = "1", features = ["span-locations"] } +quote = "1" +syn = { version = "1", features = ["full"] } +anchor-syn = { workspace = true } diff --git a/crates/fuzz/derive/accounts_snapshots/src/lib.rs b/crates/fuzz/derive/accounts_snapshots/src/lib.rs new file mode 100644 index 00000000..fc44a00c --- /dev/null +++ b/crates/fuzz/derive/accounts_snapshots/src/lib.rs @@ -0,0 +1,758 @@ +use anchor_syn::{AccountField, AccountTy}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::parse::{Parse, ParseStream}; +use syn::parse_macro_input; +use syn::{Ident, ItemStruct, Result as ParseResult}; + +#[proc_macro_derive(AccountsSnapshots)] +pub fn derive_accounts_snapshots(item: proc_macro::TokenStream) -> proc_macro::TokenStream { + parse_macro_input!(item as TridentAccountsStruct) + .to_token_stream() + .into() +} + +struct TridentAccountsStruct(anchor_syn::AccountsStruct); + +impl Parse for TridentAccountsStruct { + fn parse(input: ParseStream) -> ParseResult { + let strct = ::parse(input)?; + // TODO make sure that these convertions between types are correct + Ok(TridentAccountsStruct(anchor_syn::parser::accounts::parse( + &strct, + )?)) + } +} + +fn snapshot_field(field: &anchor_syn::Field, is_optional: bool) -> proc_macro2::TokenStream { + let account_ty = field.account_ty(); + let container_ty = field.container_ty(); + + let inner_ty = match &field.ty { + anchor_syn::Ty::AccountInfo => { + quote! { + &'info AccountInfo<'info> + } + } + anchor_syn::Ty::UncheckedAccount => { + quote! { + UncheckedAccount<'info> + } + } + anchor_syn::Ty::AccountLoader(_) => { + quote! { + #container_ty<'info,#account_ty> + } + } + anchor_syn::Ty::Sysvar(_) => { + quote! { + Sysvar<'info,#account_ty> + } + } + anchor_syn::Ty::Account(AccountTy { boxed, .. }) => { + // Verbously say that if the account is boxed we dont care. + #[allow(clippy::if_same_then_else)] + if *boxed { + quote! { + #container_ty<'info,#account_ty> + } + } else { + quote! { + #container_ty<'info,#account_ty> + } + } + } + anchor_syn::Ty::Program(_) => { + quote! { + #container_ty<'info,#account_ty> + } + } + anchor_syn::Ty::Interface(_) => { + quote! { + #container_ty<'info,#account_ty> + } + } + anchor_syn::Ty::InterfaceAccount(_) => { + quote! { + #container_ty<'info,#account_ty> + } + } + anchor_syn::Ty::Signer => { + quote! { + Signer<'info> + } + } + anchor_syn::Ty::SystemAccount => { + quote! { + SystemAccount<'info> + } + } + anchor_syn::Ty::ProgramData => { + todo!() + } + }; + let f_name = &field.ident; + + if is_optional { + quote! { + #f_name:Option<#inner_ty> + } + } else { + quote! { + #f_name:#inner_ty + } + } +} +fn type_decl_try_from(field: &anchor_syn::Field) -> proc_macro2::TokenStream { + let _account_ty = field.account_ty(); + let _container_ty = field.container_ty(); + + let inner_ty = match &field.ty { + anchor_syn::Ty::AccountInfo => { + quote! {} + } + anchor_syn::Ty::UncheckedAccount => { + quote! { + anchor_lang::accounts::unchecked_account::UncheckedAccount + } + } + anchor_syn::Ty::AccountLoader(_) => { + quote! { + anchor_lang::accounts::account_loader::AccountLoader + } + } + anchor_syn::Ty::Sysvar(_) => { + quote! { + anchor_lang::accounts::sysvar::Sysvar + } + } + anchor_syn::Ty::Account(AccountTy { boxed, .. }) => { + // Verbously say that if the account is boxed we dont care. + #[allow(clippy::if_same_then_else)] + if *boxed { + quote! { + anchor_lang::accounts::account::Account + } + } else { + quote! { + anchor_lang::accounts::account::Account + } + } + } + anchor_syn::Ty::Program(_) => { + quote! { + anchor_lang::accounts::program::Program + } + } + anchor_syn::Ty::Interface(_) => { + quote! { + anchor_lang::accounts::interface::Interface + } + } + anchor_syn::Ty::InterfaceAccount(_) => { + quote! { + anchor_lang::accounts::interface_account::InterfaceAccount + } + } + anchor_syn::Ty::Signer => { + quote! { + anchor_lang::accounts::signer::Signer + } + } + anchor_syn::Ty::SystemAccount => { + quote! { + anchor_lang::accounts::system_account::SystemAccount + } + } + anchor_syn::Ty::ProgramData => { + quote! {} + } + }; + quote! { + #inner_ty + } +} + +fn type_decl_deserialize(field: &anchor_syn::Field, is_optional: bool) -> proc_macro2::TokenStream { + let name = &field.ident; + let account_ty = field.account_ty(); + let container_ty = field.container_ty(); + + let ty_decl = match &field.ty { + anchor_syn::Ty::AccountInfo => { + quote! { + AccountInfo + } + } + anchor_syn::Ty::UncheckedAccount => { + quote! { + UncheckedAccount + } + } + anchor_syn::Ty::AccountLoader(_) => { + quote! { + anchor_lang::accounts::account_loader::AccountLoader<#account_ty> + } + } + anchor_syn::Ty::Sysvar(_) => { + quote! { + Sysvar<#account_ty> + } + } + anchor_syn::Ty::Account(AccountTy { boxed, .. }) => { + // Verbously say that if the account is boxed we dont care. + #[allow(clippy::if_same_then_else)] + if *boxed { + quote! { + #container_ty<#account_ty> + } + } else { + quote! { + #container_ty<#account_ty> + } + } + } + anchor_syn::Ty::Program(_) => { + quote! { + #container_ty<#account_ty> + } + } + anchor_syn::Ty::Interface(_) => { + quote! { + anchor_lang::accounts::interface::Interface<#account_ty> + } + } + anchor_syn::Ty::InterfaceAccount(_) => { + quote! { + anchor_lang::accounts::interface_account::InterfaceAccount<#account_ty> + } + } + anchor_syn::Ty::Signer => { + quote! { + Signer + } + } + anchor_syn::Ty::SystemAccount => { + quote! { + SystemAccount + } + } + anchor_syn::Ty::ProgramData => { + quote! {} + } + }; + if is_optional { + quote! { + #name: Option<#ty_decl> + } + } else { + quote! { + #name: #ty_decl + } + } +} + +impl From<&TridentAccountsStruct> for TokenStream { + fn from(accounts: &TridentAccountsStruct) -> Self { + generate(accounts) + } +} + +impl ToTokens for TridentAccountsStruct { + fn to_tokens(&self, tokens: &mut TokenStream) { + tokens.extend::(self.into()); + } +} + +fn deserialize_option_account( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + // TODO It would be helpful to do something like line below. + // where we propagate anchor error + // However I suggest that this is not possible right now as for + // fuzz_example3 the anchor_lang has version 0.28.0. However trident + // uses 0.29.0 I think this is the reason why the '?' operator cannot propagate + // the error even though I implemnted From trait + // that i + // .map_err(|e| e.with_account_name(#name_str).into())?; + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_account_info( + f_name: &Ident, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref(); + } + } else { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))?; + } + } +} +fn deserialize_option_unchecked_account( + f_name: &Ident, + f_name_as_string: String, + ty_decl: TokenStream, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from); + } + } else { + quote! { + let #f_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))?; + } + } +} +// TODO optional ? +fn deserialize_option_program( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +// TODO optional ? +fn deserialize_option_signer( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_sysvar( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::from_account_info(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::from_account_info) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_interface( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_interface_account( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_system_account( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn deserialize_option_account_loader( + typed_name: TokenStream, + ty_decl: TokenStream, + f_name_as_string: String, + is_optional: bool, +) -> proc_macro2::TokenStream { + if is_optional { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(|acc| { + if acc.key() != *_program_id { + #ty_decl::try_from(acc).map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string())) + } else {Err(trident_fuzz::error::FuzzingError::OptionalAccountNotProvided( + #f_name_as_string.to_string(), + )) + } + }) + .transpose() + .unwrap_or(None); + } + } else { + quote! { + let #typed_name = accounts_iter + .next() + .ok_or(trident_fuzz::error::FuzzingError::NotEnoughAccounts(#f_name_as_string.to_string()))? + .as_ref() + .map(#ty_decl::try_from) + .ok_or(trident_fuzz::error::FuzzingError::AccountNotFound(#f_name_as_string.to_string()))? + .map_err(|_| trident_fuzz::error::FuzzingError::CannotDeserializeAccount(#f_name_as_string.to_string()))?; + } + } +} + +fn generate(accs: &TridentAccountsStruct) -> proc_macro2::TokenStream { + let context_name = &accs.0.ident; + let snapshot_name = syn::Ident::new(&format!("{}Snapshot", context_name), context_name.span()); + let module_name = syn::Ident::new( + &format!("trident_fuzz_{}_snapshot", context_name), + context_name.span(), + ); + + // CONSTRUCT DESERIALIZE OPTION + let deserialize_fields = accs.0.fields.iter().map(|field| { + let is_optional = is_optional(field); + match &field { + anchor_syn::AccountField::Field(field) => { + let f_name = &field.ident; + let f_name_as_string = f_name.to_string(); + let typed_name = type_decl_deserialize(field, is_optional); + let ty_decl = type_decl_try_from(field); + + match field.ty { + anchor_syn::Ty::AccountInfo => { + deserialize_option_account_info(f_name, f_name_as_string, is_optional) + } + anchor_syn::Ty::UncheckedAccount => deserialize_option_unchecked_account( + f_name, + f_name_as_string, + ty_decl, + is_optional, + ), + anchor_syn::Ty::AccountLoader(_) => deserialize_option_account_loader( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::Sysvar(_) => deserialize_option_sysvar( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::Account(_) => deserialize_option_account( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::Program(_) => deserialize_option_program( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::Interface(_) => deserialize_option_interface( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::InterfaceAccount(_) => deserialize_option_interface_account( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::Signer => deserialize_option_signer( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::SystemAccount => deserialize_option_system_account( + typed_name, + ty_decl, + f_name_as_string, + is_optional, + ), + anchor_syn::Ty::ProgramData => todo!(), + } + } + anchor_syn::AccountField::CompositeField(_) => todo!(), + } + }); + + // CONSTRUCT SNAPSHOT STRUCT + let snapshot_fields = accs.0.fields.iter().map(|field| { + let is_optional = is_optional(field); + + let snapshot_field = match &field { + anchor_syn::AccountField::Field(field) => snapshot_field(field, is_optional), + anchor_syn::AccountField::CompositeField(_composite) => todo!(), + }; + quote! { + pub #snapshot_field, + } + }); + + // CONSTRUCT RETURN VALUE + let struct_fields = accs.0.fields.iter().map(|field| { + let field_name = match &field { + anchor_syn::AccountField::Field(field) => field.ident.to_owned(), + anchor_syn::AccountField::CompositeField(_composite) => todo!(), + }; + quote! { #field_name } + }); + + quote! { + #[cfg(feature = "trident-fuzzing")] + pub mod #module_name{ + #[cfg(target_os = "solana")] + compile_error!("Do not use fuzzing with Production Code"); + use super::*; + impl<'info> #snapshot_name<'info> { + pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, + accounts: &'info mut [Option>], + ) -> core::result::Result { + let mut accounts_iter = accounts.iter(); + + #(#deserialize_fields)* + + Ok(Self { + #(#struct_fields),* + }) + } + } + pub struct #snapshot_name<'info> { + #(#snapshot_fields)* + } + } + } +} + +/// Determines if an Account should be wrapped into the `Option` type. +/// The function returns true if the account has the init or close constraints set +/// or if it is wrapped into the `Option` type. +fn is_optional(parsed_field: &AccountField) -> bool { + let is_optional = match parsed_field { + AccountField::Field(field) => field.is_optional, + AccountField::CompositeField(_) => false, + }; + let constraints = match parsed_field { + AccountField::Field(f) => &f.constraints, + AccountField::CompositeField(f) => &f.constraints, + }; + + constraints.init.is_some() || constraints.is_close() || is_optional || constraints.is_zeroed() +} diff --git a/crates/client/derive/display_ix/Cargo.toml b/crates/fuzz/derive/display_ix/Cargo.toml similarity index 93% rename from crates/client/derive/display_ix/Cargo.toml rename to crates/fuzz/derive/display_ix/Cargo.toml index a8bf1c66..532dd5a0 100644 --- a/crates/client/derive/display_ix/Cargo.toml +++ b/crates/fuzz/derive/display_ix/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-derive-displayix" -version = "0.0.1" +version = "0.0.2" rust-version = "1.60" edition = "2021" license-file = "../../../../LICENSE" diff --git a/crates/client/derive/display_ix/src/lib.rs b/crates/fuzz/derive/display_ix/src/lib.rs similarity index 100% rename from crates/client/derive/display_ix/src/lib.rs rename to crates/fuzz/derive/display_ix/src/lib.rs diff --git a/crates/client/derive/fuzz_deserialize/Cargo.toml b/crates/fuzz/derive/fuzz_deserialize/Cargo.toml similarity index 94% rename from crates/client/derive/fuzz_deserialize/Cargo.toml rename to crates/fuzz/derive/fuzz_deserialize/Cargo.toml index fe882895..f0b0a01a 100644 --- a/crates/client/derive/fuzz_deserialize/Cargo.toml +++ b/crates/fuzz/derive/fuzz_deserialize/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-derive-fuzz-deserialize" -version = "0.0.1" +version = "0.0.2" rust-version = "1.60" edition = "2021" license-file = "../../../../LICENSE" diff --git a/crates/client/derive/fuzz_deserialize/src/lib.rs b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs similarity index 88% rename from crates/client/derive/fuzz_deserialize/src/lib.rs rename to crates/fuzz/derive/fuzz_deserialize/src/lib.rs index 46e5b753..3ed818de 100644 --- a/crates/client/derive/fuzz_deserialize/src/lib.rs +++ b/crates/fuzz/derive/fuzz_deserialize/src/lib.rs @@ -16,9 +16,10 @@ pub fn fuzz_deserialize(input: TokenStream) -> TokenStream { type Ix = #snapshot_name<'info>; fn deserialize_option( &self, + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> Result { - Self::Ix::deserialize_option(accounts) + Self::Ix::deserialize_option(_program_id,accounts) } } } diff --git a/crates/client/derive/fuzz_test_executor/Cargo.toml b/crates/fuzz/derive/fuzz_test_executor/Cargo.toml similarity index 94% rename from crates/client/derive/fuzz_test_executor/Cargo.toml rename to crates/fuzz/derive/fuzz_test_executor/Cargo.toml index aabecf6c..655ba5dd 100644 --- a/crates/client/derive/fuzz_test_executor/Cargo.toml +++ b/crates/fuzz/derive/fuzz_test_executor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-derive-fuzz-test-executor" -version = "0.0.1" +version = "0.0.2" rust-version = "1.60" edition = "2021" license-file = "../../../../LICENSE" diff --git a/crates/client/derive/fuzz_test_executor/src/lib.rs b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs similarity index 56% rename from crates/client/derive/fuzz_test_executor/src/lib.rs rename to crates/fuzz/derive/fuzz_test_executor/src/lib.rs index 22298327..20f466d4 100644 --- a/crates/client/derive/fuzz_test_executor/src/lib.rs +++ b/crates/fuzz/derive/fuzz_test_executor/src/lib.rs @@ -47,27 +47,47 @@ pub fn fuzz_test_executor(input: TokenStream) -> TokenStream { match duplicate_tx { Some(_) => eprintln!("\x1b[1;93mWarning\x1b[0m: Skipping duplicate instruction `{}`", self.to_context_string()), None => { + #[cfg(fuzzing_with_stats)] + let mut stats_logger = FuzzingStatistics::new(); + #[cfg(fuzzing_with_stats)] + stats_logger.increase_invoked(self.to_context_string()); + let tx_result = client.process_transaction(transaction) .map_err(|e| e.with_origin(Origin::Instruction(self.to_context_string()))); - match tx_result { - Ok(_) => { - snaphot.capture_after(client).unwrap(); - let (acc_before, acc_after) = snaphot.get_snapshot() - .map_err(|e| e.with_origin(Origin::Instruction(self.to_context_string()))) - .expect("Snapshot deserialization expect"); // we want to panic if we cannot unwrap to cause a crash + Ok(_) => { + #[cfg(fuzzing_with_stats)] + stats_logger.increase_successful(self.to_context_string()); + + snaphot.capture_after(client).unwrap(); + let (acc_before, acc_after) = snaphot.get_snapshot(&program_id) + .map_err(|e| e.with_origin(Origin::Instruction(self.to_context_string()))) + .expect("Snapshot deserialization expect"); // we want to panic if we cannot unwrap to cause a crash + + if let Err(e) = ix.check(acc_before, acc_after, data).map_err(|e| e.with_origin(Origin::Instruction(self.to_context_string()))) { + #[cfg(fuzzing_with_stats)] + { + stats_logger.increase_failed_check(self.to_context_string()); + stats_logger.output_serialized(); + } + eprintln!( + "\x1b[31mCRASH DETECTED!\x1b[0m Custom check after the {} instruction did not pass!", + self.to_context_string()); + panic!("{}", e) + } + #[cfg(fuzzing_with_stats)] + stats_logger.output_serialized(); - if let Err(e) = ix.check(acc_before, acc_after, data).map_err(|e| e.with_origin(Origin::Instruction(self.to_context_string()))) { - eprintln!( - "\x1b[31mCRASH DETECTED!\x1b[0m Custom check after the {} instruction did not pass!", - self.to_context_string()); - panic!("{}", e) + }, + Err(e) => { + #[cfg(fuzzing_with_stats)] + { + stats_logger.increase_failed(self.to_context_string()); + stats_logger.output_serialized(); + } + let mut raw_accounts = snaphot.get_raw_pre_ix_accounts(); + ix.tx_error_handler(e, data, &mut raw_accounts)? } - }, - Err(e) => { - let mut raw_accounts = snaphot.get_raw_pre_ix_accounts(); - ix.tx_error_handler(e, data, &mut raw_accounts)? - } } } } diff --git a/crates/client/src/fuzzer/accounts_storage.rs b/crates/fuzz/src/accounts_storage.rs similarity index 98% rename from crates/client/src/fuzzer/accounts_storage.rs rename to crates/fuzz/src/accounts_storage.rs index 01e2ef11..4e5145d6 100644 --- a/crates/client/src/fuzzer/accounts_storage.rs +++ b/crates/fuzz/src/accounts_storage.rs @@ -1,8 +1,9 @@ +#![allow(dead_code)] use std::collections::HashMap; use solana_sdk::{pubkey::Pubkey, signature::Keypair}; -use crate::{data_builder::FuzzClient, AccountId}; +use crate::{fuzz_client::FuzzClient, AccountId}; pub struct PdaStore { pub pubkey: Pubkey, diff --git a/crates/client/src/fuzzer/error.rs b/crates/fuzz/src/error.rs similarity index 99% rename from crates/client/src/fuzzer/error.rs rename to crates/fuzz/src/error.rs index cc488669..4058519c 100644 --- a/crates/client/src/fuzzer/error.rs +++ b/crates/fuzz/src/error.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + use solana_banks_client::BanksClientError; use solana_sdk::pubkey::Pubkey; use std::fmt::{Debug, Display}; diff --git a/crates/fuzz/src/fuzz_client.rs b/crates/fuzz/src/fuzz_client.rs new file mode 100644 index 00000000..6fe11334 --- /dev/null +++ b/crates/fuzz/src/fuzz_client.rs @@ -0,0 +1,66 @@ +#![allow(dead_code)] + +use anchor_lang::prelude::Rent; +use anchor_lang::solana_program::hash::Hash; + +use solana_sdk::account::{Account, AccountSharedData}; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::signature::Keypair; +use solana_sdk::transaction::VersionedTransaction; + +use crate::error::*; + +/// A trait providing methods to read and write (manipulate) accounts +pub trait FuzzClient { + /// Create an empty account and add lamports to it + fn set_account(&mut self, lamports: u64) -> Keypair; + + /// Create or overwrite a custom account, subverting normal runtime checks. + fn set_account_custom(&mut self, address: &Pubkey, account: &AccountSharedData); + + /// Create an SPL token account + #[allow(clippy::too_many_arguments)] + fn set_token_account( + &mut self, + mint: Pubkey, + owner: Pubkey, + amount: u64, + delegate: Option, + is_native: Option, + delegated_amount: u64, + close_authority: Option, + ) -> Pubkey; + + /// Create an SPL mint account + fn set_mint_account( + &mut self, + decimals: u8, + owner: &Pubkey, + freeze_authority: Option, + ) -> Pubkey; + + /// Get the Keypair of the client's payer account + fn payer(&self) -> Keypair; + + /// Get the account at the given address + fn get_account(&mut self, key: &Pubkey) -> Result, FuzzClientError>; + + /// Get accounts based on the supplied meta information + fn get_accounts( + &mut self, + metas: &[AccountMeta], + ) -> Result>, FuzzClientErrorWithOrigin>; + + /// Get last blockhash + fn get_last_blockhash(&self) -> Hash; + + /// Get the cluster rent + fn get_rent(&mut self) -> Result; + + /// Send a transaction and return until the transaction has been finalized or rejected. + fn process_transaction( + &mut self, + transaction: impl Into, + ) -> Result<(), FuzzClientError>; +} diff --git a/crates/fuzz/src/fuzz_data.rs b/crates/fuzz/src/fuzz_data.rs new file mode 100644 index 00000000..4d67161e --- /dev/null +++ b/crates/fuzz/src/fuzz_data.rs @@ -0,0 +1,161 @@ +#![allow(dead_code)] + +use anchor_lang::solana_program::account_info::{Account as AccountTrait, AccountInfo}; +use anchor_lang::solana_program::hash::Hash; +use arbitrary::Arbitrary; +use arbitrary::Unstructured; +use solana_sdk::account::Account; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::pubkey::Pubkey; +use std::cell::RefCell; +use std::collections::HashMap; +use std::error::Error; +use std::fmt::Display; + +use crate::error::*; +use crate::fuzz_client::FuzzClient; +use crate::fuzz_test_executor::FuzzTestExecutor; + +pub struct FuzzData { + pub pre_ixs: Vec, + pub ixs: Vec, + pub post_ixs: Vec, + pub accounts: RefCell, +} + +pub struct FuzzDataIterator<'a, T> { + pre_ixs_iter: std::slice::Iter<'a, T>, + ixs_iter: std::slice::Iter<'a, T>, + post_ixs_iter: std::slice::Iter<'a, T>, +} + +impl FuzzData { + pub fn iter(&self) -> FuzzDataIterator<'_, T> { + FuzzDataIterator { + pre_ixs_iter: self.pre_ixs.iter(), + ixs_iter: self.ixs.iter(), + post_ixs_iter: self.post_ixs.iter(), + } + } +} + +impl<'a, T> Iterator for FuzzDataIterator<'a, T> { + type Item = &'a T; + + fn next(&mut self) -> Option { + self.pre_ixs_iter + .next() + .or_else(|| self.ixs_iter.next()) + .or_else(|| self.post_ixs_iter.next()) + } +} + +impl FuzzData +where + T: FuzzTestExecutor + Display, +{ + pub fn run_with_runtime( + &self, + program_id: Pubkey, + client: &mut impl FuzzClient, + ) -> core::result::Result<(), Box> { + // solana_logger::setup_with_default("off"); + // #[cfg(fuzzing_debug)] + // solana_logger::setup_with_default( + // "solana_rbpf::vm=debug,\ + // solana_runtime::message_processor=debug,\ + // solana_runtime::system_instruction_processor=trace,\ + // solana_program_test=info,\ + // fuzz_target=info", + // ); + + #[cfg(fuzzing_debug)] + { + eprintln!("\x1b[34mInstructions sequence\x1b[0m:"); + for ix in self.iter() { + eprintln!("{}", ix); + } + eprintln!("------ End of Instructions sequence ------ "); + } + + let mut sent_txs: HashMap = HashMap::new(); + + for fuzz_ix in &mut self.iter() { + #[cfg(fuzzing_debug)] + eprintln!("\x1b[34mCurrently processing\x1b[0m: {}", fuzz_ix); + + if fuzz_ix + .run_fuzzer(program_id, &self.accounts, client, &mut sent_txs) + .is_err() + { + // for now skip following instructions in case of error and move to the next fuzz iteration + return Ok(()); + } + } + Ok(()) + } +} + +#[allow(unused_variables)] +pub trait FuzzDataBuilder Arbitrary<'a>> { + /// The instruction(s) executed as first, can be used for initialization. + fn pre_ixs(u: &mut Unstructured) -> arbitrary::Result> { + Ok(vec![]) + } + + /// The main instructions for fuzzing. + fn ixs(u: &mut Unstructured) -> arbitrary::Result> { + let v = >::arbitrary(u)?; + // Return always a vector with at least one element, othewise return error. + if v.is_empty() { + return Err(arbitrary::Error::NotEnoughData); + } + Ok(v) + } + + /// The instuction(s) executed as last. + fn post_ixs(u: &mut Unstructured) -> arbitrary::Result> { + Ok(vec![]) + } +} + +pub fn build_ix_fuzz_data Arbitrary<'a>, T: FuzzDataBuilder, V: Default>( + _data_builder: T, + u: &mut arbitrary::Unstructured, +) -> arbitrary::Result> { + Ok(FuzzData { + pre_ixs: T::pre_ixs(u)?, + ixs: T::ixs(u)?, + post_ixs: T::post_ixs(u)?, + accounts: RefCell::new(V::default()), + }) +} + +/// Creates `AccountInfo`s from `Accounts` and corresponding `AccountMeta` slices. +pub fn get_account_infos_option<'info>( + accounts: &'info mut [Option], + metas: &'info [AccountMeta], +) -> Result>>, FuzzingError> { + let iter = accounts.iter_mut().zip(metas); + let r = iter + .map(|(account, meta)| { + if let Some(account) = account { + let (lamports, data, owner, executable, rent_epoch) = account.get(); + Some(AccountInfo::new( + &meta.pubkey, + meta.is_signer, + meta.is_writable, + lamports, + data, + owner, + executable, + rent_epoch, + )) + } else { + None + } + }) + .collect(); + + Ok(r) +} diff --git a/crates/fuzz/src/fuzz_deserialize.rs b/crates/fuzz/src/fuzz_deserialize.rs new file mode 100644 index 00000000..e38093a9 --- /dev/null +++ b/crates/fuzz/src/fuzz_deserialize.rs @@ -0,0 +1,16 @@ +#![allow(dead_code)] + +use anchor_lang::solana_program::account_info::AccountInfo; + +use crate::error::FuzzingError; + +pub trait FuzzDeserialize<'info> { + type Ix; + // TODO return also remaining accounts + + fn deserialize_option( + &self, + _program_id: &anchor_lang::prelude::Pubkey, + accounts: &'info mut [Option>], + ) -> Result; +} diff --git a/crates/fuzz/src/fuzz_stats.rs b/crates/fuzz/src/fuzz_stats.rs new file mode 100644 index 00000000..d1ac5c62 --- /dev/null +++ b/crates/fuzz/src/fuzz_stats.rs @@ -0,0 +1,147 @@ +#![allow(dead_code)] + +use prettytable::{row, Table}; +use std::collections::HashMap; + +/// Represents fuzzing statistics, specifically tracking the number of times +/// an instruction was invoked and successfully executed. +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct IterationStats { + pub invoked: u64, + pub successful: u64, + pub failed: u64, + pub failed_check: u64, +} + +/// Manages and aggregates statistics for fuzzing instructions. +#[derive(Debug, Default)] +pub struct FuzzingStatistics { + pub instructions: HashMap, +} + +impl FuzzingStatistics { + /// Constructs a new, empty `FuzzingStatistics`. + pub fn new() -> Self { + let empty_instructions = HashMap::::default(); + Self { + instructions: empty_instructions, + } + } + /// Outputs the statistics as a serialized JSON string. + pub fn output_serialized(&self) { + let serialized = serde_json::to_string(&self.instructions).unwrap(); + println!("{}", serialized); + } + + /// Increments the invocation count for a given instruction. + /// # Arguments + /// * `instruction` - The instruction to increment the count for. + pub fn increase_invoked(&mut self, instruction: String) { + self.instructions + .entry(instruction) + .and_modify(|iterations_stats| iterations_stats.invoked += 1) + .or_insert(IterationStats { + invoked: 1, + successful: 0, + failed: 0, + failed_check: 0, + }); + } + + /// Increments the successful invocation count for a given instruction. + /// # Arguments + /// * `instruction` - The instruction to increment the successful count for. + pub fn increase_successful(&mut self, instruction: String) { + self.instructions + .entry(instruction) + .and_modify(|iterations_stats| iterations_stats.successful += 1) + .or_insert( + // this should not occure as instruction has to be invoked + // and then successfully_invoked + IterationStats { + invoked: 1, + successful: 1, + failed: 0, + failed_check: 0, + }, + ); + } + pub fn increase_failed(&mut self, instruction: String) { + self.instructions + .entry(instruction) + .and_modify(|iterations_stats| iterations_stats.failed += 1) + .or_insert( + // this should not occure as instruction has to be invoked + // and then unsuccessfully_invoked + IterationStats { + invoked: 1, + successful: 0, + failed: 1, + failed_check: 0, + }, + ); + } + pub fn increase_failed_check(&mut self, instruction: String) { + self.instructions + .entry(instruction) + .and_modify(|iterations_stats| iterations_stats.failed_check += 1) + .or_insert( + // this should not occure as instruction has to be invoked + // and then unsuccessfully_invoked + IterationStats { + invoked: 1, + successful: 1, + failed: 0, + failed_check: 1, + }, + ); + } + + /// Inserts or updates instructions with statistics provided in a serialized string. + /// # Arguments + /// * `serialized_iteration` - The serialized statistics to insert or update. + pub fn insert_serialized(&mut self, serialized_iteration: &str) { + let result = serde_json::from_str::>(serialized_iteration); + + if let Ok(deserialized_instruction) = result { + for (key, value) in deserialized_instruction { + self.instructions + .entry(key) + .and_modify(|instruction_stats| { + instruction_stats.invoked += value.invoked; + instruction_stats.successful += value.successful; + instruction_stats.failed += value.failed; + instruction_stats.failed_check += value.failed_check; + }) + .or_insert_with(|| IterationStats { + invoked: value.invoked, + successful: value.successful, + failed: value.failed, + failed_check: value.failed_check, + }); + } + } + } + /// Displays the collected statistics in a formatted table. + pub fn show_table(&self) { + let mut table = Table::new(); + table.add_row(row![ + "Instruction", + "Invoked Total", + "Ix Success", + "Check Failed", + "Ix Failed" + ]); + for (instruction, stats) in &self.instructions { + table.add_row(row![ + instruction, + stats.invoked, + stats.successful, + stats.failed_check, + stats.failed, + ]); + } + table.printstd(); + println!("Note that unhandled panics are currently logged only as crashes and are not displayed in the table above.") + } +} diff --git a/crates/fuzz/src/fuzz_test_executor.rs b/crates/fuzz/src/fuzz_test_executor.rs new file mode 100644 index 00000000..41eca4af --- /dev/null +++ b/crates/fuzz/src/fuzz_test_executor.rs @@ -0,0 +1,21 @@ +#![allow(dead_code)] + +use anchor_lang::solana_program::hash::Hash; + +use solana_sdk::pubkey::Pubkey; + +use std::cell::RefCell; +use std::collections::HashMap; + +use crate::error::FuzzClientErrorWithOrigin; +use crate::fuzz_client::FuzzClient; + +pub trait FuzzTestExecutor { + fn run_fuzzer( + &self, + program_id: Pubkey, + accounts: &RefCell, + client: &mut impl FuzzClient, + sent_txs: &mut HashMap, + ) -> core::result::Result<(), FuzzClientErrorWithOrigin>; +} diff --git a/crates/fuzz/src/fuzz_trident.rs b/crates/fuzz/src/fuzz_trident.rs new file mode 100644 index 00000000..aab7e17d --- /dev/null +++ b/crates/fuzz/src/fuzz_trident.rs @@ -0,0 +1,62 @@ +#[macro_export] +macro_rules! fuzz_trident { + ($ix:ident: $ix_dty:ident , |$buf:ident: $dty:ident| $body:block) => { + fuzz(|$buf| { + let mut $buf: FuzzData<$ix_dty, _> = { + use arbitrary::Unstructured; + + let mut buf = Unstructured::new($buf); + if let Ok(fuzz_data) = build_ix_fuzz_data($dty {}, &mut buf) { + fuzz_data + } else { + return; + } + }; + $body + }); + }; +} + +/// Prints the details of a given account in a pretty-printed format. +/// +/// This macro takes a single argument, which is an expression referring to the account +/// you want to print. The account data structure must implement or derive the [`Debug`] +/// trait for this macro to work, as it relies on `std::fmt::Debug` for formatting. +/// +/// # Examples +/// +/// ```rust,ignore +/// use trident_client::fuzzing::show_account; +/// +/// #[derive(Debug)] +/// #[account] +/// struct Escrow { +/// recipeint: Pubkey, +/// id: u32, +/// balance: f64, +/// name: String, +/// } +/// +/// fn check( +/// &self, +/// pre_ix: Self::IxSnapshot, +/// post_ix: Self::IxSnapshot, +/// ix_data: Self::IxData, +/// ) -> Result<(), FuzzingError> { +/// if let Some(escrow) = pre_ix.escrow{ +/// show_account!(escrow); +/// } +/// } +/// ``` +/// +/// # Requirements +/// +/// The `account` passed to `show_account!` must implement or derive the [`Debug`] trait. +/// Attempting to use this macro with a type that does not meet this requirement will +/// result in a compilation error. +#[macro_export] +macro_rules! show_account { + ($account:expr) => { + eprintln!("{:#?}", $account); + }; +} diff --git a/crates/fuzz/src/ix_ops.rs b/crates/fuzz/src/ix_ops.rs new file mode 100644 index 00000000..a5081368 --- /dev/null +++ b/crates/fuzz/src/ix_ops.rs @@ -0,0 +1,81 @@ +#![allow(dead_code)] + +use crate::error::*; +use crate::fuzz_client::FuzzClient; +use anchor_lang::solana_program::account_info::AccountInfo; +use solana_sdk::instruction::AccountMeta; +use solana_sdk::signature::Keypair; + +/// A trait providing methods to prepare data and accounts for the fuzzed instructions and allowing +/// users to implement custom invariants checks and transactions error handling. +pub trait IxOps<'info> { + /// The data to be passed as instruction data parameter + type IxData; + /// The accounts to be passed as instruction accounts + type IxAccounts; + /// The structure to which the instruction accounts will be deserialized + type IxSnapshot; + + /// Provides instruction data for the fuzzed instruction. + /// It is assumed that the instruction data will be based on the fuzzer input stored in the `self.data` variable. + /// However it is on the developer to decide and it can be also for example a hardcoded constant. + /// You should only avoid any non-deterministic random values to preserve reproducibility of the tests. + fn get_data( + &self, + client: &mut impl FuzzClient, + fuzz_accounts: &mut Self::IxAccounts, + ) -> Result; + + /// Provides accounts required for the fuzzed instruction. The method returns a tuple of signers and account metas. + fn get_accounts( + &self, + client: &mut impl FuzzClient, + fuzz_accounts: &mut Self::IxAccounts, + ) -> Result<(Vec, Vec), FuzzingError>; + + /// A method to implement custom invariants checks for a given instruction. This method is called after each + /// successfully executed instruction and by default does nothing. You can override this behavior by providing + /// your own implementation. You can access the snapshots of account states before and after the transaction for comparison. + /// + /// If you want to detect a crash, you have to return a `FuzzingError` (or alternativelly panic). + /// + /// If you want to perform checks also on a failed instruction execution, you can do so using the [`tx_error_handler`](trident_client::fuzzer::data_builder::IxOps::tx_error_handler) method. + #[allow(unused_variables)] + fn check( + &self, + pre_ix: Self::IxSnapshot, + post_ix: Self::IxSnapshot, + ix_data: Self::IxData, + ) -> Result<(), FuzzingError> { + Ok(()) + } + + /// A method to implement custom error handler for failed transactions. + /// + /// The fuzzer might generate a sequence of one or more instructions that are executed sequentially. + /// By default, if the execution of one of the instructions fails, the remaining instructions are skipped + /// and are not executed. This can be overriden by implementing this method and returning `Ok(())` + /// instead of propagating the error. + /// + /// You can also check the kind of the transaction error by inspecting the `e` parameter. + /// If you would like to detect a crash on a specific error, call `panic!()`. + /// + /// If your accounts are malformed and the fuzzed program is unable to deserialize it, the transaction + /// execution will fail. In that case also the deserialization of accounts snapshot before executing + /// the instruction would fail. You are provided with the raw account infos snapshots and you are free + /// to deserialize the accounts by yourself and therefore also handling potential errors. To deserialize + /// the `pre_ix_acc_infos` raw accounts to a snapshot structure, you can call: + /// + /// ```rust,ignore + /// self.deserialize_option(pre_ix_acc_infos) + /// ``` + #[allow(unused_variables)] + fn tx_error_handler( + &self, + e: FuzzClientErrorWithOrigin, + ix_data: Self::IxData, + pre_ix_acc_infos: &'info mut [Option>], + ) -> Result<(), FuzzClientErrorWithOrigin> { + Err(e) + } +} diff --git a/crates/fuzz/src/lib.rs b/crates/fuzz/src/lib.rs new file mode 100644 index 00000000..d12aaf10 --- /dev/null +++ b/crates/fuzz/src/lib.rs @@ -0,0 +1,12 @@ +pub mod accounts_storage; +pub mod error; +pub mod fuzz_data; +pub mod fuzz_stats; +pub mod program_test_client_blocking; +pub mod snapshot; +pub type AccountId = u8; +pub mod fuzz_client; +pub mod fuzz_deserialize; +pub mod fuzz_test_executor; +pub mod fuzz_trident; +pub mod ix_ops; diff --git a/crates/client/src/fuzzer/program_test_client_blocking.rs b/crates/fuzz/src/program_test_client_blocking.rs similarity index 74% rename from crates/client/src/fuzzer/program_test_client_blocking.rs rename to crates/fuzz/src/program_test_client_blocking.rs index f31858a2..55bc7374 100644 --- a/crates/client/src/fuzzer/program_test_client_blocking.rs +++ b/crates/fuzz/src/program_test_client_blocking.rs @@ -1,9 +1,14 @@ -use crate::fuzzing::ProgramTest; -use crate::fuzzing::{ProgramTestContext, SYSTEM_PROGRAM_ID}; -use crate::solana_sdk::account::Account; +use std::fs::File; +use std::io::Read; +use std::path::PathBuf; + use solana_program_runtime::invoke_context::BuiltinFunctionWithContext; +use solana_program_test::ProgramTest; +use solana_program_test::ProgramTestContext; +use solana_sdk::account::Account; use solana_sdk::account_info::AccountInfo; use solana_sdk::entrypoint::ProgramResult; +use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; use solana_sdk::{ account::AccountSharedData, hash::Hash, instruction::AccountMeta, program_option::COption, program_pack::Pack, pubkey::Pubkey, rent::Rent, signature::Keypair, signature::Signer, @@ -12,8 +17,8 @@ use solana_sdk::{ use spl_token::state::Mint; use tokio::runtime::Builder; -use crate::data_builder::FuzzClient; use crate::error::*; +use crate::fuzz_client::FuzzClient; pub type ProgramEntry = for<'info> fn( program_id: &Pubkey, @@ -26,13 +31,49 @@ pub struct ProgramTestClientBlocking { rt: tokio::runtime::Runtime, } -impl ProgramTestClientBlocking { +pub struct FuzzingProgram { + pub program_name: String, + pub program_id: Pubkey, + pub entry: Option, +} +impl FuzzingProgram { pub fn new( program_name: &str, - program_id: Pubkey, - entry: Option, - ) -> Result { - let program_test = ProgramTest::new(program_name, program_id, entry); + program_id: &Pubkey, + entry_fn: Option, + ) -> FuzzingProgram { + Self { + program_name: program_name.to_string(), + program_id: *program_id, + entry: entry_fn, + } + } +} + +impl ProgramTestClientBlocking { + pub fn new(program_: &[FuzzingProgram]) -> Result { + let mut program_test = ProgramTest::default(); + for x in program_ { + match x.entry { + Some(entry) => { + program_test.add_builtin_program(&x.program_name, x.program_id, entry); + } + None => { + let data = read_program(&x.program_name); + + program_test.add_account( + x.program_id, + Account { + lamports: Rent::default().minimum_balance(data.len()).max(1), + data, + owner: solana_sdk::bpf_loader::id(), + executable: true, + rent_epoch: 0, + }, + ); + } + } + } let rt: tokio::runtime::Runtime = Builder::new_current_thread().enable_all().build()?; let ctx = rt.block_on(program_test.start_with_context()); @@ -200,3 +241,18 @@ impl FuzzClient for ProgramTestClientBlocking { Ok(self.rt.block_on(self.ctx.banks_client.get_rent())?) } } + +fn read_program(program_name: &str) -> Vec { + let genesis_folder = std::env::var("GENESIS_FOLDER") + .unwrap_or_else(|err| panic!("Failed to read env variable GENESIS_FOLDER: {}", err)); + + let program_path = PathBuf::from(genesis_folder).join(format!("{program_name}.so")); + + let mut file = File::open(&program_path) + .unwrap_or_else(|err| panic!("Failed to open \"{}\": {}", program_path.display(), err)); + + let mut file_data = Vec::new(); + file.read_to_end(&mut file_data) + .unwrap_or_else(|err| panic!("Failed to read \"{}\": {}", program_path.display(), err)); + file_data +} diff --git a/crates/client/src/fuzzer/snapshot.rs b/crates/fuzz/src/snapshot.rs similarity index 89% rename from crates/client/src/fuzzer/snapshot.rs rename to crates/fuzz/src/snapshot.rs index 69cdfe73..647ed59a 100644 --- a/crates/client/src/fuzzer/snapshot.rs +++ b/crates/fuzz/src/snapshot.rs @@ -1,10 +1,12 @@ #![allow(dead_code)] // The Snapshot is constructed in the FuzzTestExecutor macro and is generated automatically -use anchor_client::anchor_lang::solana_program::account_info::Account as Acc; -use anchor_client::anchor_lang::solana_program::account_info::AccountInfo; +use anchor_lang::solana_program::account_info::Account as Acc; +use anchor_lang::solana_program::account_info::AccountInfo; use solana_sdk::{account::Account, instruction::AccountMeta}; -use crate::data_builder::{FuzzClient, FuzzDeserialize}; +use crate::fuzz_client::FuzzClient; +use crate::fuzz_deserialize::FuzzDeserialize; + use crate::error::*; pub struct Snapshot<'info, T> { before: Vec>, @@ -98,7 +100,10 @@ where Self::calculate_account_info(&mut self.before, self.metas) } - pub fn get_snapshot(&'info mut self) -> Result<(T::Ix, T::Ix), FuzzingErrorWithOrigin> { + pub fn get_snapshot( + &'info mut self, + program_id: &solana_sdk::pubkey::Pubkey, + ) -> Result<(T::Ix, T::Ix), FuzzingErrorWithOrigin> { // When user passes an account that is not initialized, the runtime will provide // a default empty account to the program. If the uninitialized account is of type // AccountInfo, Signer or UncheckedAccount, Anchor will not return an error. However @@ -114,11 +119,11 @@ where let pre_ix = self .ix - .deserialize_option(&mut self.before_acc_inf) + .deserialize_option(program_id, &mut self.before_acc_inf) .map_err(|e| e.with_context(Context::Pre))?; let post_ix = self .ix - .deserialize_option(&mut self.after_acc_inf) + .deserialize_option(program_id, &mut self.after_acc_inf) .map_err(|e| e.with_context(Context::Post))?; Ok((pre_ix, post_ix)) } diff --git a/crates/test/Cargo.toml b/crates/test/Cargo.toml index 2136b2d4..65557e13 100644 --- a/crates/test/Cargo.toml +++ b/crates/test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trident-test" -version = "0.3.2" +version = "0.3.3" edition = "2021" repository = "https://github.com/Ackee-Blockchain/trident" license-file = "../../LICENSE" @@ -14,7 +14,7 @@ proc-macro = true macrotest = "1" [dependencies] -syn = { workspace = true } -quote = { workspace = true } -proc-macro2 = { workspace = true } -darling = { workspace = true } +# MISC +syn = { version = "1.0.109", default-features = false } +quote = "1.0.14" +darling = "0.13.1" diff --git a/crates/test/src/lib.rs b/crates/test/src/lib.rs index f10b929d..1d8587fc 100644 --- a/crates/test/src/lib.rs +++ b/crates/test/src/lib.rs @@ -65,22 +65,22 @@ pub fn trident_test(args: TokenStream, input: TokenStream) -> TokenStream { // Note: The line `#(#input_fn_attrs)*` has to be above the line with the code // `#[trident_client::tokio::test...` to make macros like `#[rstest]` work - // see https://github.com/la10736/rstest#inject-test-attribute - #[trident_client::rstest] - #[trident_client::tokio::test(flavor = "multi_thread")] - #[trident_client::serial_test::serial] - async fn #input_fn_name(#input_fn_inputs) -> trident_client::anyhow::Result<()> { - let mut tester = trident_client::Tester::with_root(#root); + #[trident_client::test::rstest] + #[trident_client::test::tokio::test(flavor = "multi_thread")] + #[trident_client::test::serial_test::serial] + async fn #input_fn_name(#input_fn_inputs) -> trident_client::test::anyhow::Result<()> { + let mut tester = trident_client::test::Tester::with_root(#root); let localnet_handle = tester.before().await?; let test = async { #input_fn_body - Ok::<(), trident_client::anyhow::Error>(()) + Ok::<(), trident_client::test::anyhow::Error>(()) }; let result = std::panic::AssertUnwindSafe(test).catch_unwind().await; tester.after(localnet_handle).await?; assert!(result.is_ok()); let final_result = result.unwrap(); if let Err(error) = final_result { - trident_client::error_reporter::report_error(&error); + trident_client::test::report_error(&error); return Err(error); } Ok(()) diff --git a/crates/test/tests/expand/basic.expanded.rs b/crates/test/tests/expand/basic.expanded.rs index 72d8a1a1..1468e639 100644 --- a/crates/test/tests/expand/basic.expanded.rs +++ b/crates/test/tests/expand/basic.expanded.rs @@ -1,8 +1,8 @@ -#[trident_client::rstest] -#[trident_client::tokio::test(flavor = "multi_thread")] -#[trident_client::serial_test::serial] -async fn test_turnstile() -> trident_client::anyhow::Result<()> { - let mut tester = trident_client::Tester::with_root("../../"); +#[trident_client::test::rstest] +#[trident_client::test::tokio::test(flavor = "multi_thread")] +#[trident_client::test::serial_test::serial] +async fn test_turnstile() -> trident_client::test::anyhow::Result<()> { + let mut tester = trident_client::test::Tester::with_root("../../"); let localnet_handle = tester.before().await?; let test = async { { @@ -14,7 +14,7 @@ async fn test_turnstile() -> trident_client::anyhow::Result<()> { turnstile.push_unlocked().await?; turnstile.push_locked().await?; } - Ok::<(), trident_client::anyhow::Error>(()) + Ok::<(), trident_client::test::anyhow::Error>(()) }; let result = std::panic::AssertUnwindSafe(test).catch_unwind().await; tester.after(localnet_handle).await?; @@ -23,7 +23,7 @@ async fn test_turnstile() -> trident_client::anyhow::Result<()> { } let final_result = result.unwrap(); if let Err(error) = final_result { - trident_client::error_reporter::report_error(&error); + trident_client::test::report_error(&error); return Err(error); } Ok(()) diff --git a/crates/test/tests/expand/with_root.expanded.rs b/crates/test/tests/expand/with_root.expanded.rs index c829e4ad..b3d1dde2 100644 --- a/crates/test/tests/expand/with_root.expanded.rs +++ b/crates/test/tests/expand/with_root.expanded.rs @@ -1,12 +1,12 @@ -#[trident_client::rstest] -#[trident_client::tokio::test(flavor = "multi_thread")] -#[trident_client::serial_test::serial] -async fn test_with_defined_root() -> trident_client::anyhow::Result<()> { - let mut tester = trident_client::Tester::with_root("i_am_root"); +#[trident_client::test::rstest] +#[trident_client::test::tokio::test(flavor = "multi_thread")] +#[trident_client::test::serial_test::serial] +async fn test_with_defined_root() -> trident_client::test::anyhow::Result<()> { + let mut tester = trident_client::test::Tester::with_root("i_am_root"); let localnet_handle = tester.before().await?; let test = async { {} - Ok::<(), trident_client::anyhow::Error>(()) + Ok::<(), trident_client::test::anyhow::Error>(()) }; let result = std::panic::AssertUnwindSafe(test).catch_unwind().await; tester.after(localnet_handle).await?; @@ -15,7 +15,7 @@ async fn test_with_defined_root() -> trident_client::anyhow::Result<()> { } let final_result = result.unwrap(); if let Err(error) = final_result { - trident_client::error_reporter::report_error(&error); + trident_client::test::report_error(&error); return Err(error); } Ok(()) diff --git a/documentation/docs/fuzzing/fuzzing-current-limitations.md b/documentation/docs/fuzzing/fuzzing-current-limitations.md index 5f3ae35b..99c16845 100644 --- a/documentation/docs/fuzzing/fuzzing-current-limitations.md +++ b/documentation/docs/fuzzing/fuzzing-current-limitations.md @@ -2,6 +2,5 @@ This section summarizes some known limitations in the current development stage. Further development will be focused on resolving these limitations. -- Only fuzzing of one program without CPIs to other custom programs is supported. - Remaining accounts in check methods are not supported. - Composite accounts are not supported (however it is possible to generate a fuzz test and finish the composite accounts deserialization manually). diff --git a/documentation/docs/fuzzing/fuzzing-examples.md b/documentation/docs/fuzzing/fuzzing-examples.md index 8ad0b018..c8cf6055 100644 --- a/documentation/docs/fuzzing/fuzzing-examples.md +++ b/documentation/docs/fuzzing/fuzzing-examples.md @@ -14,3 +14,10 @@ ### Example usage of limiting the Instruction data structure with the Arbitrary trait - [arbitrary-limit-inputs-5](https://github.com/Ackee-Blockchain/trident/tree/master/examples/fuzz-tests/arbitrary-limit-inputs-5) + +### Example usage of CPI with available source code to the callee program +- [simple-cpi-6](https://github.com/Ackee-Blockchain/trident/tree/master/examples/fuzz-tests/simple-cpi-6) + + +### Example usage of CPI with unavailable source code to the callee program (i.e. callee as SBF) +- [cpi-metaplex-7](https://github.com/Ackee-Blockchain/trident/tree/master/examples/fuzz-tests/cpi-metaplex-7) diff --git a/documentation/docs/fuzzing/fuzzing-run-debug.md b/documentation/docs/fuzzing/fuzzing-run-debug.md index f2072e47..110233c5 100644 --- a/documentation/docs/fuzzing/fuzzing-run-debug.md +++ b/documentation/docs/fuzzing/fuzzing-run-debug.md @@ -11,32 +11,29 @@ trident fuzz run Under the hood {{ config.site_name }} uses [honggfuzz-rs](https://github.com/rust-fuzz/honggfuzz-rs). -You can pass [supported parameters](https://github.com/Ackee-Blockchain/trident/blob/develop/examples/fuzz_example0/Trident.toml) via the **{{ config.site_name }}.toml** configuration file. For example: +You can pass [supported parameters](https://github.com/Ackee-Blockchain/trident/blob/develop/examples/fuzz-tests/hello_world/Trident.toml) via the **{{ config.site_name }}.toml** configuration file: ```toml # Content of {{ config.site_name }}.toml -[fuzz] +[honggfuzz] # Timeout in seconds (default: 10) timeout = 10 # Number of fuzzing iterations (default: 0 [no limit]) -iterations = 10000 +iterations = 0 # Number of concurrent fuzzing threads (default: 0 [number of CPUs / 2]) threads = 0 -# Don't close children's stdin, stdout, -# stderr; can be noisy (default: false) +# Don't close children's stdin, stdout, stderr; can be noisy (default: false) keep_output = false # Disable ANSI console; use simple log output (default: false) verbose = false # Exit upon seeing the first crash (default: false) -exit_upon_crash = true +exit_upon_crash = false # Maximal number of mutations per one run (default: 6) mutations_per_run = 6 -# Target compilation directory, -# (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). +# Target compilation directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). # To not clash with cargo build's default target directory. cargo_target_dir = "" -# Honggfuzz working directory, -# (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_workspace"]). +# Honggfuzz working directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_workspace"]). hfuzz_workspace = "" # Directory where crashes are saved to (default: "" [workspace directory]) crashdir = "" @@ -44,12 +41,17 @@ crashdir = "" extension = "" # Number of seconds this fuzzing session will last (default: 0 [no limit]) run_time = 0 -# Maximal size of files processed by the fuzzer -# in bytes (default: 1048576 = 1MB) +# Maximal size of files processed by the fuzzer in bytes (default: 1048576 = 1MB) max_file_size = 1048576 -# Save all test-cases (not only the unique ones) by -# appending the current time-stamp to the filenames (default: false) +# Save all test-cases (not only the unique ones) by appending the current time-stamp to the filenames (default: false) save_all = false + +[fuzz] +# Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) +allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = true ``` Or you can pass any parameter via [environment variables](https://github.com/rust-fuzz/honggfuzz-rs#environment-variables). @@ -64,6 +66,13 @@ A list of hongfuzz parameters can be found in honggfuzz [usage documentation](ht HFUZZ_RUN_ARGS="-t 10 -n 1 -N 10000 -Q" trident fuzz run ``` +### Fuzzing statistics +Sometimes, it's useful to know how often a particular instruction has been invoked and how many times it has succeeded or failed. To display these statistics when fuzzing is finished or interrupted, set the `fuzzing_with_stats` option to `true` in the `[fuzz]` section of the Trident.toml configuration file. Please note that this option is disabled by default because it impacts performance. + +The statistics show the total number of invocations for each instruction, which is the sum of successful and failed invocations. Successful invocations are those that return an `Ok()` result. Failed invocations are those that return an `Err()` result. Additionally, the statistics also show as `Check Failed` the number of successful invocations that did not pass the user-defined invariants check. Note that unhandled panics are currently logged only as crashes and are not displayed in the fuzzing statistics table. + +Keep in mind that the number of fuzz iterations does not directly correspond to the total number of invocations. In one fuzz iteration, the fuzzer might be unable to deserialize fuzz data into instructions, causing the entire iteration to be skipped. + ## Debug To debug your program with values from a crash file: diff --git a/documentation/docs/fuzzing/initialization/fuzzing-initialization-all.md b/documentation/docs/fuzzing/initialization/fuzzing-initialization-all.md index 5bf2dfa3..23d4c8af 100644 --- a/documentation/docs/fuzzing/initialization/fuzzing-initialization-all.md +++ b/documentation/docs/fuzzing/initialization/fuzzing-initialization-all.md @@ -4,7 +4,7 @@ To initialize {{ config.site_name }} and generate all-suite test templates, navigate to your project's root directory and run ```bash -trident init +trident init both ``` The command will generate the following folder structure: diff --git a/documentation/docs/home/home-installation.md b/documentation/docs/home/home-installation.md index d8138d75..089bab1d 100644 --- a/documentation/docs/home/home-installation.md +++ b/documentation/docs/home/home-installation.md @@ -23,9 +23,10 @@ cargo install --version trident-cli - We support `Anchor` and `Solana` versions specified in the table below. -| {{ config.site_name }} CLI | Anchor | Solana | Rust | +| {{ config.site_name }} CLI | Anchor | Solana | Rust | |--------------|:---------:|----------:|:-----------------------| -| `v0.6.0` | `>=0.29.*`1 | `^1.17` | `nightly` | +| `v0.7.0` | `>=0.29.*`1 | `^1.17.4` | `nightly` | +| `v0.6.0` | `>=0.29.*`1 | `^1.17` | `nightly` | | `v0.5.0` | `~0.28.*` | `=1.16.6` | | | `v0.4.0` | `~0.27.*` | `>=1.15` | | | `v0.3.0` | `~0.25.*` | `>=1.10` | | diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock index 970c4fc5..827b3c8c 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -267,19 +266,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" -dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1096,7 +1082,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1135,6 +1121,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1229,6 +1224,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1596,6 +1612,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2062,13 +2084,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2278,6 +2300,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2483,6 +2516,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3083,6 +3125,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -3981,7 +4037,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4011,7 +4067,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4146,7 +4202,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4332,7 +4388,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4699,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -4743,7 +4799,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4819,7 +4875,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5005,7 +5061,7 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5177,7 +5233,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5263,20 +5319,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5306,28 +5348,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5347,7 +5367,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5379,22 +5399,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5407,7 +5411,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.2", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5607,6 +5611,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5983,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5996,13 +6010,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6010,15 +6022,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6026,12 +6032,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6059,12 +6077,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/Trident.toml b/examples/fuzz-tests/arbitrary-custom-types-4/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/Trident.toml +++ b/examples/fuzz-tests/arbitrary-custom-types-4/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/Cargo.toml index 070cb9bf..070d4827 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/Cargo.toml @@ -9,13 +9,12 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.arbitrary-custom-types-4] path = "../../programs/arbitrary-custom-types-4" diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index 8d3acb40..154ecb8a 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,6 +1,5 @@ -use arbitrary_custom_types_4::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub counter: Option>, pub user: Signer<'info>, @@ -12,6 +11,7 @@ pub struct UpdateSnapshot<'info> { } impl<'info> InitializeSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -22,7 +22,7 @@ impl<'info> InitializeSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("counter".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("counter".to_string())) } else { @@ -58,6 +58,7 @@ impl<'info> InitializeSnapshot<'info> { } impl<'info> UpdateSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index 266525d7..55f253da 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,8 @@ pub mod arbitrary_custom_types_4_fuzz_instructions { use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { Initialize(Initialize), diff --git a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index a5724c3d..30fa2e69 100644 --- a/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/arbitrary-custom-types-4/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,13 +1,14 @@ -use arbitrary_custom_types_4::entry; -use arbitrary_custom_types_4::ID as PROGRAM_ID; -use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::FuzzInstruction; +use arbitrary_custom_types_4::entry as entry_arbitrary_custom_types_4; +use arbitrary_custom_types_4::ID as PROGRAM_ID_ARBITRARY_CUSTOM_TYPES_4; +const PROGRAM_NAME_ARBITRARY_CUSTOM_TYPES_4: &str = "arbitrary_custom_types_4"; +use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::FuzzInstruction as FuzzInstruction_arbitrary_custom_types_4; use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Initialize; use fuzz_instructions::arbitrary_custom_types_4_fuzz_instructions::Update; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "arbitrary_custom_types_4"; +pub type FuzzInstruction = FuzzInstruction_arbitrary_custom_types_4; struct MyFuzzData; @@ -22,10 +23,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_ARBITRARY_CUSTOM_TYPES_4, + &PROGRAM_ID_ARBITRARY_CUSTOM_TYPES_4, + processor!(convert_entry!(entry_arbitrary_custom_types_4)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_ARBITRARY_CUSTOM_TYPES_4, &mut client); }); } } diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/.gitignore b/examples/fuzz-tests/arbitrary-limit-inputs-5/.gitignore index 87ec6eed..28be1fa0 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/.gitignore +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/.gitignore @@ -1,4 +1,3 @@ - .anchor .DS_Store target diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/.prettierignore b/examples/fuzz-tests/arbitrary-limit-inputs-5/.prettierignore index c1a0b75f..41425834 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/.prettierignore +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/.prettierignore @@ -1,4 +1,3 @@ - .anchor .DS_Store target diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Anchor.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/Anchor.toml index 632a4c1f..8fd375d5 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Anchor.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Anchor.toml @@ -1,18 +1,18 @@ [toolchain] [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -arbitrary_limit_inputs_5 = "HJ2QDmpWoqFXPuQnWDDAz5fTYjVV3cwz8pNLQDmqZ9Ut" +arbitrary_limit_inputs_5 = "AGpdCBtXUyLWKutvMCVDeTywkxgvQVjJk54btLQNLMiZ" [registry] url = "https://api.apr.dev" [provider] cluster = "Localnet" -wallet = "/home/andrej/.config/solana/id.json" +wallet = "~/.config/solana/id.json" [scripts] test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock index 3eec7e31..73e094f2 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -69,7 +69,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -81,7 +81,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -119,9 +119,9 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f619f1d04f53621925ba8a2e633ba5a6081f2ae14758cbb67f38fd823e0a3e" +checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn", "proc-macro2", @@ -131,9 +131,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f2a3e1df4685f18d12a943a9f2a7456305401af21a07c9fe076ef9ecd6e400" +checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn", "bs58 0.5.1", @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9423945cb55627f0b30903288e78baf6f62c6c8ab28fb344b6b25f1ffee3dca7" +checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn", "quote", @@ -155,9 +155,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ed12720033cc3c3bf3cfa293349c2275cd5ab99936e33dd4bf283aaad3e241" +checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn", "quote", @@ -166,9 +166,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eef4dc0371eba2d8c8b54794b0b0eb786a234a559b77593d6f80825b6d2c77a2" +checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn", "proc-macro2", @@ -178,20 +178,26 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b18c4f191331e078d4a6a080954d1576241c29c56638783322a18d308ab27e4f" +checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" dependencies = [ + "anchor-lang-idl", "anchor-syn", + "anyhow", + "bs58 0.5.1", + "heck 0.3.3", + "proc-macro2", "quote", + "serde_json", "syn 1.0.109", ] [[package]] name = "anchor-client" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb48c4a7911038da546dc752655a29fa49f6bd50ebc1edca218bac8da1012acd" +checksum = "95b4397af9b7d6919df3342210d897c0ffda1a31d052abc8eee3e6035ee71567" dependencies = [ "anchor-lang", "anyhow", @@ -208,9 +214,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de10d6e9620d3bcea56c56151cad83c5992f50d5960b3a9bebc4a50390ddc3c" +checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn", "quote", @@ -219,9 +225,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4e2e5be518ec6053d90a2a7f26843dbee607583c779e6c8395951b9739bdfbe" +checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn", "borsh-derive-internal 0.10.3", @@ -232,9 +238,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecc31d19fa54840e74b7a979d44bcea49d70459de846088a1d71e87ba53c419" +checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ "proc-macro2", "quote", @@ -243,9 +249,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35da4785497388af0553586d55ebdc08054a8b1724720ef2749d313494f2b8ad" +checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -256,38 +262,66 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", + "anchor-lang-idl", "arrayref", - "base64 0.13.1", + "base64 0.21.7", "bincode", "borsh 0.10.3", "bytemuck", - "getrandom 0.2.14", + "getrandom 0.2.15", "solana-program", "thiserror", ] +[[package]] +name = "anchor-lang-idl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" +dependencies = [ + "anchor-lang-idl-spec", + "anyhow", + "heck 0.3.3", + "regex", + "serde", + "serde_json", + "sha2 0.10.8", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", +] + [[package]] name = "anchor-spl" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" +checksum = "04bd077c34449319a1e4e0bc21cea572960c9ae0d0fefda0dd7c52fcc3c647a3" dependencies = [ "anchor-lang", - "solana-program", - "spl-associated-token-account", + "spl-associated-token-account 3.0.2", + "spl-pod 0.2.2", "spl-token", - "spl-token-2022 0.9.0", + "spl-token-2022 3.0.2", + "spl-token-group-interface 0.2.3", + "spl-token-metadata-interface 0.3.3", ] [[package]] name = "anchor-syn" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9101b84702fed2ea57bd22992f75065da5648017135b844283a2f6d74f27825" +checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" dependencies = [ "anyhow", "bs58 0.5.1", + "cargo_toml", "heck 0.3.3", "proc-macro2", "quote", @@ -324,9 +358,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.82" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" [[package]] name = "aquamarine" @@ -357,6 +391,8 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "trident-derive-accounts-snapshots", + "trident-fuzz", ] [[package]] @@ -400,7 +436,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version", @@ -423,7 +459,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", @@ -452,7 +488,7 @@ dependencies = [ "ark-serialize-derive", "ark-std", "digest 0.10.7", - "num-bigint 0.4.4", + "num-bigint 0.4.6", ] [[package]] @@ -552,9 +588,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9eabd7a98fe442131a17c316bd9349c43695e49e730c3c8e12cfb5f4da2693" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "brotli", "flate2", @@ -581,7 +617,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -597,15 +633,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -657,9 +693,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -734,11 +770,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" dependencies = [ - "borsh-derive 1.5.0", + "borsh-derive 1.5.1", "cfg_aliases", ] @@ -770,15 +806,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" dependencies = [ "once_cell", "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "syn_derive", ] @@ -828,9 +864,9 @@ dependencies = [ [[package]] name = "brotli" -version = "5.0.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19483b140a7ac7174d34b5a581b406c64f84da5409d3e09cf4fff604f9270e67" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -839,9 +875,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -880,22 +916,22 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -933,9 +969,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" dependencies = [ "serde", ] @@ -973,11 +1009,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml 0.8.14", +] + [[package]] name = "cc" -version = "1.0.95" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" dependencies = [ "jobserver", "libc", @@ -992,9 +1038,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" @@ -1008,7 +1054,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -1097,7 +1143,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1136,6 +1182,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1163,18 +1218,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -1200,9 +1255,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -1230,6 +1285,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1265,12 +1341,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ - "darling_core 0.20.8", - "darling_macro 0.20.8", + "darling_core 0.20.9", + "darling_macro 0.20.9", ] [[package]] @@ -1289,16 +1365,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim 0.10.0", - "syn 2.0.60", + "strsim 0.11.1", + "syn 2.0.68", ] [[package]] @@ -1314,13 +1390,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ - "darling_core 0.20.8", + "darling_core 0.20.9", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1361,7 +1437,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -1400,7 +1476,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1494,13 +1570,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1523,7 +1599,7 @@ checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1587,9 +1663,9 @@ dependencies = [ [[package]] name = "either" -version = "1.11.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1597,6 +1673,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -1617,13 +1699,13 @@ dependencies = [ [[package]] name = "enum-iterator-derive" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19cbb53d33b57ac4df1f0af6b92c38c107cded663c4aea9fae1189dcfc17cf5" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1632,11 +1714,11 @@ version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-traits", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1660,9 +1742,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", "windows-sys 0.52.0", @@ -1814,7 +1896,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -1901,9 +1983,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1914,9 +1996,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1950,7 +2032,7 @@ dependencies = [ "indexmap 2.2.6", "slab", "tokio", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tracing", ] @@ -2064,13 +2146,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2098,9 +2180,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -2116,9 +2198,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -2209,18 +2291,18 @@ dependencies = [ [[package]] name = "include_dir" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" dependencies = [ "include_dir_macros", ] [[package]] name = "include_dir_macros" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" dependencies = [ "proc-macro2", "quote", @@ -2228,9 +2310,9 @@ dependencies = [ [[package]] name = "index_list" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70891286cb8e844fdfcf1178b47569699f9e20b5ecc4b45a6240a64771444638" +checksum = "2cb725b6505e51229de32027e0cfcd9db29da4d89156f9747b0a5195643fa3e1" [[package]] name = "indexmap" @@ -2267,9 +2349,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ "cfg-if", ] @@ -2280,6 +2362,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2339,15 +2432,15 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.154" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libredox" @@ -2355,7 +2448,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "libc", ] @@ -2415,15 +2508,15 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254", "ark-ff", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "thiserror", ] [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "lock_api" @@ -2437,9 +2530,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" @@ -2452,9 +2545,9 @@ dependencies = [ [[package]] name = "lz4" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9e2dd86df36ce760a60f6ff6ad526f7ba1f14ba0356f8254fb6905e6494df1" +checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91" dependencies = [ "libc", "lz4-sys", @@ -2462,9 +2555,9 @@ dependencies = [ [[package]] name = "lz4-sys" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900" +checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3" dependencies = [ "cc", "libc", @@ -2472,9 +2565,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2485,6 +2578,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -2529,9 +2631,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", ] @@ -2651,11 +2753,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2695,7 +2796,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2709,9 +2810,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -2732,9 +2833,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -2776,7 +2877,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2788,7 +2889,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -2799,9 +2900,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.2" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -2889,9 +2990,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -2905,16 +3006,16 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pathdiff" @@ -2981,7 +3082,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3085,13 +3186,27 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -3139,9 +3254,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3163,7 +3278,7 @@ checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3283,7 +3398,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -3347,11 +3462,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3360,16 +3475,16 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -3379,9 +3494,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", @@ -3390,15 +3505,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "relative-path" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" @@ -3433,7 +3548,7 @@ dependencies = [ "system-configuration", "tokio", "tokio-rustls", - "tokio-util 0.7.10", + "tokio-util 0.7.11", "tower-service", "url", "wasm-bindgen", @@ -3466,7 +3581,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.14", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3509,7 +3624,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.60", + "syn 2.0.68", "unicode-ident", ] @@ -3525,9 +3640,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc-hash" @@ -3559,7 +3674,7 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", @@ -3611,15 +3726,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -3662,7 +3777,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3677,11 +3792,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3690,9 +3805,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" dependencies = [ "core-foundation-sys", "libc", @@ -3700,9 +3815,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" dependencies = [ "serde", ] @@ -3718,44 +3833,53 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.199" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.199" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.116" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3784,10 +3908,10 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ - "darling 0.20.8", + "darling 0.20.9", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3825,7 +3949,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -3967,9 +4091,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142161f13c328e7807fe98fb8f6eaaa5045a8eaf4492414aa81254870c4fc8a0" +checksum = "4973213a11c2e1b924b36e0c6688682b5aa4623f8d4eeaa1204c32cee524e6d6" dependencies = [ "Inflector", "base64 0.21.7", @@ -3984,17 +4108,17 @@ dependencies = [ "solana-sdk", "spl-token", "spl-token-2022 1.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", + "spl-token-group-interface 0.1.0", + "spl-token-metadata-interface 0.2.0", "thiserror", "zstd", ] [[package]] name = "solana-accounts-db" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e8b4b15e353d5f0e0ddd77966c6f01b296bd83569af455da5fd9329356ff642" +checksum = "74c06263320e399af20d46c8cebea7a1d5dc1bc56f31f8dfaacf7119576c48a7" dependencies = [ "arrayref", "bincode", @@ -4013,7 +4137,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4053,9 +4177,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4eef9fc8aa3ff804dbf17766ab2d2fe38561adc8b521705faa782c18a108d8" +checksum = "f4e57cb8f2e90361280b246f70bb7f5f86f4e4ff1ad5bbdfe18a81bea141f03a" dependencies = [ "bincode", "bytemuck", @@ -4074,11 +4198,11 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a4cbe27e78987b706caf90cbd16da9da3955c09a660b8107a96c2cb32f1124" +checksum = "7c65a9540370523f3ade7190526309337cc50f1d742b3341dfa7357da3f59a56" dependencies = [ - "borsh 1.5.0", + "borsh 1.5.1", "futures", "solana-banks-interface", "solana-program", @@ -4091,9 +4215,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741279a09bf5ea1a3d17e591db7b189e163722e5c46423308c6a6165bea5e74d" +checksum = "62b1dc20a7a71cf37bcbc2a3a5dfd73d7410a13850aa68d954a9c09e6a77e652" dependencies = [ "serde", "solana-sdk", @@ -4102,9 +4226,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66768544951feb91c3470e255d4613295b5cc5a58a9cc6a4207ab9a0178cfe9" +checksum = "d449d55d3c5c3fe4c9f0c9f790a9feabe294f8ff0b4c6b771a20b2313ad8974a" dependencies = [ "bincode", "crossbeam-channel", @@ -4122,9 +4246,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e9dd5e42193260cca0794bf4ab9e248f44b3d9710041f241b130d26ed682bc" +checksum = "6b1a55b8533f2dc716602e7c1b2bd555d5ac598ef6e80d28a517e6f31baf042e" dependencies = [ "bincode", "byteorder", @@ -4141,14 +4265,14 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7b34296d69867253671a71a2231b8d5b4a810bd7a5c1c603e7b542832d5980" +checksum = "fda213af7ae26ce249120f211060d2a85d87fe367c6490ee19b70845cbd320fc" dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4159,9 +4283,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e9f61034a61db538a41700b6df0b4b9f0392038adaf780150481923ff94356" +checksum = "909f4553d0b31bb5b97533a6b64cc321a4eace9112d6efbabcf4408ea1b3f1db" dependencies = [ "chrono", "clap 2.34.0", @@ -4176,9 +4300,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c11246ea0930c3e95dc489d42f1020ea423a3daced137904d42ecc10a838436" +checksum = "2242c4a0776cdaec1358d0ffc61b32131985a7b2210c491fa465d28c313eb880" dependencies = [ "dirs-next", "lazy_static", @@ -4192,9 +4316,9 @@ dependencies = [ [[package]] name = "solana-cli-output" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea94deca7268b61a245429a7798f3e673baccb5cee5909e7de403b322d4c130a" +checksum = "bada4ba96ef2f351363ba64ce4f592bc584ac48bb7d9da4e41303416b0a21026" dependencies = [ "Inflector", "base64 0.21.7", @@ -4219,9 +4343,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13f2bd5a986d7cac1b4ffb4344413b70b6f21fd7ffa92a985911756b4ac7682a" +checksum = "c5cc431df6cc1dd964134fa4ec7df765d3af3fae9c2148f96a3c4fb500290633" dependencies = [ "async-trait", "bincode", @@ -4252,9 +4376,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca100b2bdd7e455f5f0b9791bc204dacd684a0373ad1032697dbad43f34e527f" +checksum = "9eb36ef3c3a1f38515c1ae0d255c4d6e5e635a856ac2aa1cd5f892b3db58e857" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4262,9 +4386,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970d28779e92a11e32a89ee453edc7d89394d3a68d8c4b75ef0ffb833944c588" +checksum = "e38b040d3a42e8f7d80c4a86bb0d49d7aed663b56b0fe0ae135d2d145fb7ae3a" dependencies = [ "bincode", "chrono", @@ -4276,9 +4400,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7d0022ded19dca32ced5528c6a050596877fc8b9a89322d876960a89466e1b" +checksum = "ae02622c63943485f0af3d0896626eaf6478e734f0b6bc61c7cc5320963c6e75" dependencies = [ "async-trait", "bincode", @@ -4298,9 +4422,9 @@ dependencies = [ [[package]] name = "solana-cost-model" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd3c63699df1680535daee8e486bd496e2ec849c427de4b6a42d4f1b27430949" +checksum = "838532d8437d00958621d2589d6033e9c69ea95cd0936efa8964146e49dcff53" dependencies = [ "lazy_static", "log", @@ -4322,9 +4446,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a0b24cc4d0ebd5fd45d6bd47bed3790f8a75ade67af8ff24a3d719a8bc93bc" +checksum = "4867f66e9527fa44451c861c1dc6d9b2a7c7a668d7c6a297cdefbe39f4395b33" dependencies = [ "block-buffer 0.10.4", "bs58 0.4.0", @@ -4334,7 +4458,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4347,21 +4471,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51600f4066d3663ab2981fd24e77a8c2e65f5d20ea71b550b853ca9ae40eee7f" +checksum = "168f24d97347b85f05192df58d6be3e3047a4aadc4001bc1b9e711a5ec878eea" dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] name = "solana-loader-v4-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c566ebf0da216efc70054bf2d6d06c16fe44b63402c6f3bb04f6a88d8571d9b" +checksum = "98c426482234b7c267a5e0dfa8198442e1ffad2ad6c521f6b810949bc2719215" dependencies = [ "log", "solana-measure", @@ -4372,9 +4496,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79ef26804612173c95be8da84df3128d648173cf1f746de8f183ec8dbedd92" +checksum = "a0511082fc62f2d086520fff5aa1917c389d8c840930c08ad255ae05952c08a2" dependencies = [ "env_logger", "lazy_static", @@ -4383,9 +4507,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f716a5f1c2f4b562fb008a0cc7d7c0d889cff802a7f8177fdf28772ae1ed9" +checksum = "be55a3df105431d25f86f2a7da0cbbde5f54c1f0782ca59367ea4a8037bc6797" dependencies = [ "log", "solana-sdk", @@ -4393,9 +4517,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf1705d52e4f123856725e1b3842cd4928b954ff62391a95af142a5adc58ac6" +checksum = "ddec097ed7572804389195128dbd57958b427829153c6cd8ec3343c86fe3cd22" dependencies = [ "crossbeam-channel", "gethostname", @@ -4408,9 +4532,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f2634fd50743e2ca075e663e07b0bd5c2f94db0ac320ce5bc2022e0002d82d" +checksum = "258fa7c29fb7605b8d2ed89aa0d43c640d14f4147ad1f5b3fdad19a1ac145ca5" dependencies = [ "bincode", "clap 3.2.25", @@ -4436,9 +4560,9 @@ checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" [[package]] name = "solana-perf" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0264d7093d44c239d9eb41beb6877b7b1eea5ad8809c93c1d9ab0c840ba390" +checksum = "ca422edcf16a6e64003ca118575ea641f7b750f14a0ad28c71dd84f33dcb912a" dependencies = [ "ahash 0.8.11", "bincode", @@ -4465,9 +4589,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5513a02d622ba89e76baf4b49d25ae20c2c2c623fced12b0d6dd7b8f23e006" +checksum = "2bc5a636dc75e5c25651e34f7a36afc9ae60d38166687c5b0375abb580ac81a2" dependencies = [ "ark-bn254", "ark-ec", @@ -4475,11 +4599,11 @@ dependencies = [ "ark-serialize", "base64 0.21.7", "bincode", - "bitflags 2.5.0", + "bitflags 2.6.0", "blake3", "borsh 0.10.3", "borsh 0.9.3", - "borsh 1.5.0", + "borsh 1.5.1", "bs58 0.4.0", "bv", "bytemuck", @@ -4487,7 +4611,7 @@ dependencies = [ "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.14", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", @@ -4496,7 +4620,7 @@ dependencies = [ "light-poseidon", "log", "memoffset 0.9.1", - "num-bigint 0.4.4", + "num-bigint 0.4.6", "num-derive 0.4.2", "num-traits", "parking_lot", @@ -4520,9 +4644,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64dc9f666a8e4f93166ce58eea9dfbf275e5cad461b2f1bbfa06538718dc3212" +checksum = "bf373c3da0387f47fee4c5ed2465a9628b9db026a62211a692a9285aa9251544" dependencies = [ "base64 0.21.7", "bincode", @@ -4548,9 +4672,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2760112327ffce892f6a21030f7c9e4b6da3ded8c8eadf1dbfffcb5a754c61db" +checksum = "9194b8744c5b135401ab4a2923a1072d3a67697bd50f7450a4ed5302f36a6999" dependencies = [ "assert_matches", "async-trait", @@ -4578,9 +4702,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffdcbdad685b87475a91909fdb442d2edfabc2870110580c7f0cf7eb7883f97" +checksum = "97b9abc76168d19927561db6a3685b98752bd0961b4ce4f8b7f85ee12238c017" dependencies = [ "crossbeam-channel", "futures-util", @@ -4603,9 +4727,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056e909037b05097d2ff0181cb7e3d26876d8dff6d50701463a61e990cf84afd" +checksum = "7952c5306a0be5f5276448cd20246b31265bfa884f29a077a24303c6a16aeb34" dependencies = [ "async-mutex", "async-trait", @@ -4630,9 +4754,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93a5e1ef891dca2cca907f7196b6a5d3b80af4183f2be0f981906b16711ff5d" +checksum = "a4fa0cc66f8e73d769bca2ede3012ba2ef8ab67963e832808665369f2cf81743" dependencies = [ "lazy_static", "num_cpus", @@ -4640,9 +4764,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c06eaf47d9a98ba22e890e68868f5d48c91e01268c541a53b5960288b617d6" +checksum = "289803796d4ff7b4699504d3ab9e9d9c5205ea3892b2ebe397b377494dbd75d4" dependencies = [ "console", "dialoguer", @@ -4659,9 +4783,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1d4b6f1f4e3dab7509401e85edc1c1ac208c61819de90178e01cf162c9c051" +checksum = "6cb55a08018776a62ecff52139fbcdab1a7baa4e8f077202be58156e8dde4d5f" dependencies = [ "async-trait", "base64 0.21.7", @@ -4685,9 +4809,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31feddef24d3e0aab189571adea7f109639ef6179fcd3cd34ffc8c73d3409f1" +checksum = "72a8403038f4d6ab65bc7e7afb3afe8d9824c592232553c5cef55cf3de36025d" dependencies = [ "base64 0.21.7", "bs58 0.4.0", @@ -4707,9 +4831,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1837728262063723c659e4b8c0acf0baa99cd38cb333511456465d2c9e654474" +checksum = "4caca735caf76d51c074c3bacbfe38094bf7f92cfbe7b5b13f3bc4946e64f889" dependencies = [ "clap 2.34.0", "solana-clap-utils", @@ -4720,9 +4844,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3480088ad0ffb701ada496f19754b4ff737e516c6b5f1231508e50ae2e0ea3" +checksum = "b699943045665038bfa4e76dd2582b4c390f1aec6ab5edef36da43afe3469f1d" dependencies = [ "aquamarine", "arrayref", @@ -4745,7 +4869,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4797,15 +4921,15 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50cac89269a01235f6b421bc580132191f4df388f4265513e78fd00cf864dd" +checksum = "df43d3a1e1637397ab43cbc216a5a8f977ec8a3cc3f3ae8c3851c83a3255dbcf" dependencies = [ "assert_matches", "base64 0.21.7", "bincode", - "bitflags 2.5.0", - "borsh 1.5.0", + "bitflags 2.6.0", + "borsh 1.5.1", "bs58 0.4.0", "bytemuck", "byteorder", @@ -4821,7 +4945,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -4852,15 +4976,15 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cb099b2f9c0a65a6f23ced791325141cd68c27b04d11c04fef838a00f613861" +checksum = "86c76414183a325038ff020b22c07d1e9d2da0703ddc0244acfed37ee2921d96" dependencies = [ "bs58 0.4.0", "proc-macro2", "quote", "rustversion", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -4871,9 +4995,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-send-transaction-service" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0deed4fe8bb31ff178d8b7e8295bc81e6e1d704fc0e2c5565f58d9eb8feec89d" +checksum = "e056d865d22548bb7228121e118aa632486fc1a33a100961e5e98b5663371384" dependencies = [ "crossbeam-channel", "log", @@ -4887,9 +5011,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea02d44b82ed0eb271871cf8a1b8179a0ab50f4f995e7d8ae691c1971bd0a0e" +checksum = "c5dd1bc07beb75da5df5e07301d3d0d6104872c9afade22b910af9061fb4bc15" dependencies = [ "bincode", "log", @@ -4902,9 +5026,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a20843e8370adb3c04f47caa79ffdc92ae1bf078ad26530be1bca5d7bdd5d2" +checksum = "fad1bdb955ec6d23a1dbf87e403ff3e610d68616275693125a893d7ed4b2d323" dependencies = [ "async-channel", "bytes", @@ -4935,9 +5059,9 @@ dependencies = [ [[package]] name = "solana-system-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01294e45b407b7d4c8ff546af6f60344efd6591cf162c88e231ee3ba2c544672" +checksum = "78733745268c96d5a29c09cde9f0a6c9d662abba43e661b75dd858da8e3d0b2e" dependencies = [ "bincode", "log", @@ -4949,9 +5073,9 @@ dependencies = [ [[package]] name = "solana-thin-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c74da8f36b89b28c47e5ba3bad5279ff3dfea5829154882845d4821fc76ff497" +checksum = "bc301310ba0755c449a8800136f67f8ad14419b366404629894cd10021495360" dependencies = [ "bincode", "log", @@ -4964,9 +5088,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f2fd4b4aeffa14b9c5be9913072ea8e72ca261254a65a999f3d2fd70e7a660" +checksum = "fb887bd5078ff015e103e9ee54a6713380590efa8ff1804b3a653f07188928c6" dependencies = [ "async-trait", "bincode", @@ -4988,9 +5112,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3efa0d30f78dbc74e795638b053dd6ec7230739301e7f0e06b586f7731fd25c8" +checksum = "4a0cdfdf63192fb60de094fae8e81159e4e3e9aac9659fe3f9ef0e707023fb32" dependencies = [ "Inflector", "base64 0.21.7", @@ -5004,7 +5128,7 @@ dependencies = [ "serde_json", "solana-account-decoder", "solana-sdk", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-memo", "spl-token", "spl-token-2022 1.0.0", @@ -5013,9 +5137,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32af58cadd37be19d04e0f3877104b8640bccc4be8ca1dbf431549b399b784c2" +checksum = "3ea0d6d8d66e36371577f51c4d1d6192a66f1fa4efe7161a36d94677640dcadb" dependencies = [ "async-trait", "solana-connection-cache", @@ -5028,9 +5152,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42c7cef8aa9f1c633bf09dd91b8e635b6b30c40236652031b1800b245dc1bd02" +checksum = "6f4c2f531c22ce806b211118be8928a791425f97de4592371fb57b246ed33e34" dependencies = [ "log", "rustc_version", @@ -5044,9 +5168,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12945ee508c751ffdce58f976be6e58a05529ce0032c1f7db76eed6a8d76b33c" +checksum = "28ab95a5d19ff0464def1777adaae5a74e1edc9e6818103064c18fdc2643f6cb" dependencies = [ "crossbeam-channel", "itertools", @@ -5063,9 +5187,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "725a39044d455c08fe83fca758e94e5ddfaa25f6e2e2cfd5c31d7afdcad8de38" +checksum = "6d8a6486017e71a3714a8e1a635e17209135cc20535ba9808ccf106d80ff6e8b" dependencies = [ "bincode", "log", @@ -5085,9 +5209,9 @@ dependencies = [ [[package]] name = "solana-zk-token-proof-program" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39263f3e47a160b9b67896f2225d56e6872905c066152cbe61f5fd201c52a6d2" +checksum = "f1e3dfb2deb449f7eb1dbd0c7e66dd95ec7b1303a5788673f9fbc9b5a5ea59f2" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -5099,9 +5223,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.18.12" +version = "1.18.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630dc0b5f6250cf6a4c8b2bd3895283738915e83eba5453db20bb02b2527f302" +checksum = "513407f88394e437b4ff5aad892bc5bf51a655ae2401e6e63549734d3695c46f" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -5183,15 +5307,42 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-associated-token-account" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e688554bac5838217ffd1fab7845c573ff106b6336bf7d290db7c98d5a8efd" +dependencies = [ + "assert_matches", + "borsh 1.5.1", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022 3.0.2", + "thiserror", +] + [[package]] name = "spl-discriminator" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa600f2fe56f32e923261719bae640d873edadbc5237681a39b8e37bfd4d263" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator-derive", + "spl-discriminator-derive 0.1.2", +] + +[[package]] +name = "spl-discriminator" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d1814406e98b08c5cd02c1126f83fd407ad084adce0b05fda5730677822eac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive 0.2.0", ] [[package]] @@ -5201,8 +5352,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", - "syn 2.0.60", + "spl-discriminator-syn 0.1.2", + "syn 2.0.68", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn 0.2.0", + "syn 2.0.68", ] [[package]] @@ -5214,7 +5376,20 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.60", + "syn 2.0.68", + "thiserror", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.68", "thiserror", ] @@ -5229,27 +5404,53 @@ dependencies = [ [[package]] name = "spl-pod" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5db7e4efb1107b0b8e52a13f035437cdcb36ef99c58f6d467f089d9b2915a" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" dependencies = [ "borsh 0.10.3", "bytemuck", "solana-program", "solana-zk-token-sdk", - "spl-program-error", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-pod" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ce669f48cf2eca1ec518916d8725596bfb655beb1c74374cf71dc6cb773c9" +dependencies = [ + "borsh 1.5.1", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.4.1", ] [[package]] name = "spl-program-error" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e0657b6490196971d9e729520ba934911ff41fbb2cb9004463dbe23cf8b4b4f" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-program-error-derive", + "spl-program-error-derive 0.3.2", + "thiserror", +] + +[[package]] +name = "spl-program-error" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49065093ea91f57b9b2bd81493ff705e2ad4e64507a07dbc02b085778e02770e" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive 0.4.1", "thiserror", ] @@ -5262,35 +5463,47 @@ dependencies = [ "proc-macro2", "quote", "sha2 0.10.8", - "syn 2.0.60", + "syn 2.0.68", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.68", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.4.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-type-length-value 0.3.0", ] [[package]] name = "spl-tlv-account-resolution" -version = "0.5.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f335787add7fa711819f9e7c573f8145a5358a709446fe2d24bf2a88117c90" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] @@ -5310,9 +5523,9 @@ dependencies = [ [[package]] name = "spl-token-2022" -version = "0.9.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" dependencies = [ "arrayref", "bytemuck", @@ -5320,21 +5533,23 @@ dependencies = [ "num-traits", "num_enum 0.7.2", "solana-program", + "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.1.0", "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", + "spl-token-group-interface 0.1.0", + "spl-token-metadata-interface 0.2.0", + "spl-transfer-hook-interface 0.4.1", + "spl-type-length-value 0.3.0", "thiserror", ] [[package]] name = "spl-token-2022" -version = "1.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" dependencies = [ "arrayref", "bytemuck", @@ -5345,12 +5560,12 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo", - "spl-pod", + "spl-pod 0.2.2", "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", - "spl-type-length-value", + "spl-token-group-interface 0.2.3", + "spl-token-metadata-interface 0.3.3", + "spl-transfer-hook-interface 0.6.3", + "spl-type-length-value 0.4.3", "thiserror", ] @@ -5362,9 +5577,22 @@ checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d419b5cfa3ee8e0f2386fd7e02a33b3ec8a7db4a9c7064a2ea24849dc4a273b6" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", ] [[package]] @@ -5375,55 +5603,82 @@ checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30179c47e93625680dabb620c6e7931bd12d62af390f447bc7beb4a3a9b5feee" +dependencies = [ + "borsh 1.5.1", + "solana-program", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-type-length-value 0.4.3", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-tlv-account-resolution 0.5.1", + "spl-type-length-value 0.3.0", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.4.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" dependencies = [ "arrayref", "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.5.2", - "spl-type-length-value", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", + "spl-tlv-account-resolution 0.6.3", + "spl-type-length-value 0.4.3", ] [[package]] name = "spl-type-length-value" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f9ebd75d29c5f48de5f6a9c114e08531030b75b8ac2c557600ac7da0b73b1e8" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ "bytemuck", "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-type-length-value" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422ce13429dbd41d2cee8a73931c05fda0b0c8ca156a8b0c19445642550bb61a" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.2.2", + "spl-pod 0.2.2", + "spl-program-error 0.4.1", ] [[package]] @@ -5444,6 +5699,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "strum" version = "0.24.1" @@ -5491,9 +5752,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -5509,7 +5770,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5553,9 +5814,9 @@ dependencies = [ [[package]] name = "tar" -version = "0.4.40" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" dependencies = [ "filetime", "libc", @@ -5609,6 +5870,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5642,7 +5914,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5653,7 +5925,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "test-case-core", ] @@ -5674,22 +5946,22 @@ checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" [[package]] name = "thiserror" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.59" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5754,9 +6026,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "ce6b6a2fb3a985e99cebfaefa9faa3024743da73304ca1c683a36429613d3d22" dependencies = [ "tinyvec_macros", ] @@ -5769,9 +6041,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -5788,13 +6060,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5866,16 +6138,15 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -5888,11 +6159,26 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.14", +] + [[package]] name = "toml_datetime" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -5902,7 +6188,7 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -5913,7 +6199,20 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap 2.2.6", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", ] [[package]] @@ -5942,7 +6241,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -5985,7 +6284,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5998,13 +6296,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6012,28 +6308,34 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token", "syn 1.0.109", "thiserror", "tokio", - "toml", + "toml 0.5.11", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6061,12 +6363,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] @@ -6133,9 +6459,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" @@ -6192,9 +6518,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -6283,7 +6609,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -6317,7 +6643,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6390,7 +6716,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6408,7 +6734,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -6428,18 +6754,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -6450,9 +6776,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -6462,9 +6788,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -6474,15 +6800,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -6492,9 +6818,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -6504,9 +6830,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -6516,9 +6842,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -6528,9 +6854,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -6541,6 +6867,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -6591,22 +6926,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.32" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6626,7 +6961,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.68", ] [[package]] @@ -6650,9 +6985,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.11+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" dependencies = [ "cc", "pkg-config", diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.toml index 24518637..9783b3f0 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = ["programs/*", "trident-tests/fuzz_tests"] +resolver = "2" [profile.release] overflow-checks = true lto = "fat" diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml index e05d7801..f2f2b3a1 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/Trident.toml @@ -6,7 +6,7 @@ validator_startup_timeout = 15000 # Timeout in seconds (default: 10) timeout = 10 # Number of fuzzing iterations (default: 0 [no limit]) -iterations = 0 +iterations = 1000 # Number of concurrent fuzzing threads (default: 0 [number of CPUs / 2]) threads = 0 # Don't close children's stdin, stdout, stderr; can be noisy (default: false) @@ -14,7 +14,7 @@ keep_output = false # Disable ANSI console; use simple log output (default: false) verbose = false # Exit upon seeing the first crash (default: false) -exit_upon_crash = false +exit_upon_crash = true # Maximal number of mutations per one run (default: 6) mutations_per_run = 6 # Target compilation directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = true diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/package.json b/examples/fuzz-tests/arbitrary-limit-inputs-5/package.json index cd83bacd..bcaa6549 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/package.json +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/package.json @@ -1,19 +1,21 @@ { - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@coral-xyz/anchor": "^0.29.0" - }, - "devDependencies": { - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "typescript": "^4.3.5", - "prettier": "^2.6.2" - } + "license": "ISC", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.30.1" + }, + "devDependencies": { + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "typescript": "^4.3.5", + "prettier": "^2.6.2" + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/Cargo.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/Cargo.toml index 4c59ea06..2e68ebba 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/Cargo.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/Cargo.toml @@ -9,12 +9,16 @@ crate-type = ["cdylib", "lib"] name = "arbitrary_limit_inputs_5" [features] +default = [] +cpi = ["no-entrypoint"] no-entrypoint = [] no-idl = [] no-log-ix-name = [] -cpi = ["no-entrypoint"] -default = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +trident-fuzzing = ["dep:trident-fuzz"] [dependencies] -anchor-lang = "0.29.0" -anchor-spl = "0.29.0" +trident-derive-accounts-snapshots = { path = "../../../../../crates/fuzz/derive/accounts_snapshots" } +trident-fuzz = { path = "../../../../../crates/fuzz", optional = true } +anchor-lang = "0.30.1" +anchor-spl = "0.30.1" diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/initialize.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/initialize.rs index 8677c3c7..c123d745 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/initialize.rs +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/initialize.rs @@ -2,6 +2,7 @@ use anchor_lang::prelude::*; use anchor_spl::token::{ set_authority, transfer, Mint, SetAuthority, Token, TokenAccount, Transfer, }; +use trident_derive_accounts_snapshots::AccountsSnapshots; use crate::state::Escrow; use crate::VestingError; @@ -61,7 +62,7 @@ pub fn _init_vesting( Ok(()) } -#[derive(Accounts)] +#[derive(AccountsSnapshots, Accounts)] #[instruction(recipient: Pubkey)] pub struct InitVesting<'info> { #[account(mut)] diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/withdraw.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/withdraw.rs index 3170ad7a..f4a2ac02 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/withdraw.rs +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/instructions/withdraw.rs @@ -3,6 +3,8 @@ use anchor_spl::token::{transfer, Mint, Token, TokenAccount, Transfer}; use crate::{state::Escrow, VestingError}; +use trident_derive_accounts_snapshots::AccountsSnapshots; + pub fn _withdraw_unlocked(ctx: Context) -> Result<()> { let escrow = &mut ctx.accounts.escrow; @@ -32,7 +34,7 @@ pub fn _withdraw_unlocked(ctx: Context) -> Result<()> { Ok(()) } -#[derive(Accounts)] +#[derive(AccountsSnapshots, Accounts)] pub struct WithdrawUnlocked<'info> { #[account(mut)] pub recipient: Signer<'info>, diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/lib.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/lib.rs index f7c2b063..48bcf82c 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/lib.rs +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/programs/arbitrary-limit-inputs-5/src/lib.rs @@ -8,7 +8,7 @@ pub use error::*; pub use instructions::*; pub use state::*; -declare_id!("HJ2QDmpWoqFXPuQnWDDAz5fTYjVV3cwz8pNLQDmqZ9Ut"); +declare_id!("AGpdCBtXUyLWKutvMCVDeTywkxgvQVjJk54btLQNLMiZ"); #[program] pub mod arbitrary_limit_inputs_5 { diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/Cargo.toml index 37a59ce2..26cd7663 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/Cargo.toml @@ -9,14 +9,14 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" -anchor-spl = "0.29.0" +anchor-spl = "0.30.1" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.arbitrary-limit-inputs-5] path = "../../programs/arbitrary-limit-inputs-5" +features = ["trident-fuzzing"] diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs deleted file mode 100644 index 1aa9daaf..00000000 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ /dev/null @@ -1,217 +0,0 @@ -use anchor_spl::token::{Mint, Token, TokenAccount}; -use arbitrary_limit_inputs_5::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; -pub struct InitVestingSnapshot<'info> { - pub sender: Signer<'info>, - pub sender_token_account: Account<'info, TokenAccount>, - pub escrow: Option>, - pub escrow_token_account: Account<'info, TokenAccount>, - pub mint: Account<'info, Mint>, - pub token_program: Program<'info, Token>, - pub system_program: Program<'info, System>, -} -pub struct WithdrawUnlockedSnapshot<'info> { - pub recipient: Signer<'info>, - pub recipient_token_account: Account<'info, TokenAccount>, - pub escrow: Option>, - pub escrow_token_account: Account<'info, TokenAccount>, - pub escrow_pda_authority: &'info AccountInfo<'info>, - pub mint: Account<'info, Mint>, - pub token_program: Program<'info, Token>, - pub system_program: Program<'info, System>, -} -impl<'info> InitVestingSnapshot<'info> { - pub fn deserialize_option( - accounts: &'info mut [Option>], - ) -> core::result::Result { - let mut accounts_iter = accounts.iter(); - let sender: Signer<'_> = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("sender".to_string()))? - .as_ref() - .map(anchor_lang::accounts::signer::Signer::try_from) - .ok_or(FuzzingError::AccountNotFound("sender".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("sender".to_string()))?; - let sender_token_account: anchor_lang::accounts::account::Account = - accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "sender_token_account".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound( - "sender_token_account".to_string(), - ))? - .map_err(|_| { - FuzzingError::CannotDeserializeAccount("sender_token_account".to_string()) - })?; - let escrow: Option< - anchor_lang::accounts::account::Account, - > = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? - .as_ref() - .map(|acc| { - if acc.key() != PROGRAM_ID { - anchor_lang::accounts::account::Account::try_from(acc) - .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) - } else { - Err(FuzzingError::OptionalAccountNotProvided( - "escrow".to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - let escrow_token_account: anchor_lang::accounts::account::Account = - accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "escrow_token_account".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound( - "escrow_token_account".to_string(), - ))? - .map_err(|_| { - FuzzingError::CannotDeserializeAccount("escrow_token_account".to_string()) - })?; - let mint: anchor_lang::accounts::account::Account = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("mint".to_string()))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound("mint".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("mint".to_string()))?; - let token_program: anchor_lang::accounts::program::Program = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("token_program".to_string()))? - .as_ref() - .map(anchor_lang::accounts::program::Program::try_from) - .ok_or(FuzzingError::AccountNotFound("token_program".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("token_program".to_string()))?; - let system_program: anchor_lang::accounts::program::Program = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "system_program".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::program::Program::try_from) - .ok_or(FuzzingError::AccountNotFound("system_program".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("system_program".to_string()))?; - Ok(Self { - sender, - sender_token_account, - escrow, - escrow_token_account, - mint, - token_program, - system_program, - }) - } -} -impl<'info> WithdrawUnlockedSnapshot<'info> { - pub fn deserialize_option( - accounts: &'info mut [Option>], - ) -> core::result::Result { - let mut accounts_iter = accounts.iter(); - let recipient: Signer<'_> = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("recipient".to_string()))? - .as_ref() - .map(anchor_lang::accounts::signer::Signer::try_from) - .ok_or(FuzzingError::AccountNotFound("recipient".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("recipient".to_string()))?; - let recipient_token_account: anchor_lang::accounts::account::Account = - accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "recipient_token_account".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound( - "recipient_token_account".to_string(), - ))? - .map_err(|_| { - FuzzingError::CannotDeserializeAccount("recipient_token_account".to_string()) - })?; - let escrow: Option< - anchor_lang::accounts::account::Account, - > = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? - .as_ref() - .map(|acc| { - if acc.key() != PROGRAM_ID { - anchor_lang::accounts::account::Account::try_from(acc) - .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) - } else { - Err(FuzzingError::OptionalAccountNotProvided( - "escrow".to_string(), - )) - } - }) - .transpose() - .unwrap_or(None); - let escrow_token_account: anchor_lang::accounts::account::Account = - accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "escrow_token_account".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound( - "escrow_token_account".to_string(), - ))? - .map_err(|_| { - FuzzingError::CannotDeserializeAccount("escrow_token_account".to_string()) - })?; - let escrow_pda_authority = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "escrow_pda_authority".to_string(), - ))? - .as_ref() - .ok_or(FuzzingError::AccountNotFound( - "escrow_pda_authority".to_string(), - ))?; - let mint: anchor_lang::accounts::account::Account = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("mint".to_string()))? - .as_ref() - .map(anchor_lang::accounts::account::Account::try_from) - .ok_or(FuzzingError::AccountNotFound("mint".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("mint".to_string()))?; - let token_program: anchor_lang::accounts::program::Program = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts("token_program".to_string()))? - .as_ref() - .map(anchor_lang::accounts::program::Program::try_from) - .ok_or(FuzzingError::AccountNotFound("token_program".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("token_program".to_string()))?; - let system_program: anchor_lang::accounts::program::Program = accounts_iter - .next() - .ok_or(FuzzingError::NotEnoughAccounts( - "system_program".to_string(), - ))? - .as_ref() - .map(anchor_lang::accounts::program::Program::try_from) - .ok_or(FuzzingError::AccountNotFound("system_program".to_string()))? - .map_err(|_| FuzzingError::CannotDeserializeAccount("system_program".to_string()))?; - Ok(Self { - recipient, - recipient_token_account, - escrow, - escrow_token_account, - escrow_pda_authority, - mint, - token_program, - system_program, - }) - } -} diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index be0226bf..0758abde 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,9 @@ pub mod arbitrary_limit_inputs_5_fuzz_instructions { - use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use arbitrary_limit_inputs_5::instructions::initialize::trident_fuzz_InitVesting_snapshot::InitVestingSnapshot; + use arbitrary_limit_inputs_5::instructions::withdraw::trident_fuzz_WithdrawUnlocked_snapshot::WithdrawUnlockedSnapshot; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { InitVesting(InitVesting), diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index dd1c343e..b5baf295 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,15 +1,15 @@ -use arbitrary_limit_inputs_5::entry; -use arbitrary_limit_inputs_5::ID as PROGRAM_ID; -use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::FuzzInstruction; +use arbitrary_limit_inputs_5::entry as entry_arbitrary_limit_inputs_5; +use arbitrary_limit_inputs_5::ID as PROGRAM_ID_ARBITRARY_LIMIT_INPUTS_5; +const PROGRAM_NAME_ARBITRARY_LIMIT_INPUTS_5: &str = "arbitrary_limit_inputs_5"; +use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::FuzzInstruction as FuzzInstruction_arbitrary_limit_inputs_5; use fuzz_instructions::arbitrary_limit_inputs_5_fuzz_instructions::InitVesting; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; -mod accounts_snapshots; +use trident_client::fuzzing::*; mod fuzz_instructions; -const PROGRAM_NAME: &str = "arbitrary_limit_inputs_5"; - struct MyFuzzData; +pub type FuzzInstruction = FuzzInstruction_arbitrary_limit_inputs_5; + impl FuzzDataBuilder for MyFuzzData { fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { let init_ix = FuzzInstruction::InitVesting(InitVesting::arbitrary(u)?); @@ -21,10 +21,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_ARBITRARY_LIMIT_INPUTS_5, + &PROGRAM_ID_ARBITRARY_LIMIT_INPUTS_5, + processor!(convert_entry!(entry_arbitrary_limit_inputs_5)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_ARBITRARY_LIMIT_INPUTS_5, &mut client); }); } } diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/tsconfig.json b/examples/fuzz-tests/arbitrary-limit-inputs-5/tsconfig.json index 558b83e5..cd5d2e3d 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/tsconfig.json +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/tsconfig.json @@ -1,11 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } - } - \ No newline at end of file + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/examples/fuzz-tests/arbitrary-limit-inputs-5/yarn.lock b/examples/fuzz-tests/arbitrary-limit-inputs-5/yarn.lock index 6334457a..006980cd 100644 --- a/examples/fuzz-tests/arbitrary-limit-inputs-5/yarn.lock +++ b/examples/fuzz-tests/arbitrary-limit-inputs-5/yarn.lock @@ -2,19 +2,25 @@ # yarn lockfile v1 -"@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" - integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== +"@babel/runtime@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" -"@coral-xyz/anchor@^0.29.0": - version "0.29.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz#bd0be95bedfb30a381c3e676e5926124c310ff12" - integrity sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA== +"@coral-xyz/anchor-errors@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" + integrity sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ== + +"@coral-xyz/anchor@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" + integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== dependencies: - "@coral-xyz/borsh" "^0.29.0" + "@coral-xyz/anchor-errors" "^0.30.1" + "@coral-xyz/borsh" "^0.30.1" "@noble/hashes" "^1.3.1" "@solana/web3.js" "^1.68.0" bn.js "^5.1.2" @@ -29,22 +35,22 @@ superstruct "^0.15.4" toml "^3.0.0" -"@coral-xyz/borsh@^0.29.0": - version "0.29.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz#79f7045df2ef66da8006d47f5399c7190363e71f" - integrity sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ== +"@coral-xyz/borsh@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" + integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== dependencies: bn.js "^5.1.2" buffer-layout "^1.2.0" -"@noble/curves@^1.2.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== +"@noble/curves@^1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: "@noble/hashes" "1.4.0" -"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.3": +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== @@ -57,13 +63,13 @@ buffer "~6.0.3" "@solana/web3.js@^1.68.0": - version "1.91.1" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.1.tgz#d49d2f982b52070be3b987fd8d892fcbddd064b5" - integrity sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA== + version "1.94.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.94.0.tgz#f662ce046f59cb294e8304beeb4d549c3ff05d73" + integrity sha512-wMiBebzu5I2fTSz623uj6VXpWFhl0d7qJKqPFK2I4IBLTNUdv+bOeA4H7OBM7Gworv7sOvB3xibRql6l61MeqA== dependencies: - "@babel/runtime" "^7.23.4" - "@noble/curves" "^1.2.0" - "@noble/hashes" "^1.3.3" + "@babel/runtime" "^7.24.7" + "@noble/curves" "^1.4.0" + "@noble/hashes" "^1.4.0" "@solana/buffer-layout" "^4.0.1" agentkeepalive "^4.5.0" bigint-buffer "^1.1.5" @@ -74,8 +80,15 @@ fast-stable-stringify "^1.0.0" jayson "^4.1.0" node-fetch "^2.7.0" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" + rpc-websockets "^9.0.2" + superstruct "^1.0.4" + +"@swc/helpers@^0.5.11": + version "0.5.11" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" + integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== + dependencies: + tslib "^2.4.0" "@types/bn.js@^5.1.0": version "5.1.5" @@ -85,9 +98,9 @@ "@types/node" "*" "@types/chai@^4.3.0": - version "4.3.12" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.12.tgz#b192fe1c553b54f45d20543adc2ab88455a07d5e" - integrity sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw== + version "4.3.16" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" + integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== "@types/connect@^3.4.33": version "3.4.38" @@ -107,9 +120,9 @@ integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node@*": - version "20.11.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.27.tgz#debe5cfc8a507dd60fe2a3b4875b1604f215c2ac" - integrity sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg== + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== dependencies: undici-types "~5.26.4" @@ -118,6 +131,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -125,6 +143,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.2.2": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + "@ungap/promise-all-settled@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" @@ -191,9 +216,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== dependencies: safe-buffer "^5.0.1" @@ -210,9 +235,9 @@ bigint-buffer@^1.1.5: bindings "^1.3.0" binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bindings@^1.3.0: version "1.5.0" @@ -244,11 +269,11 @@ brace-expansion@^1.1.7: concat-map "0.0.1" braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browser-stdout@1.3.1: version "1.3.1" @@ -272,7 +297,7 @@ buffer-layout@^1.2.0, buffer-layout@^1.2.2: resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== -buffer@6.0.3, buffer@~6.0.3: +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -391,9 +416,9 @@ decamelize@^4.0.0: integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== dependencies: type-detect "^4.0.0" @@ -452,6 +477,11 @@ eventemitter3@^4.0.7: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -467,10 +497,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -778,9 +808,9 @@ node-fetch@^2.6.12, node-fetch@^2.7.0: whatwg-url "^5.0.0" node-gyp-build@^4.3.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" - integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -862,13 +892,16 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -rpc-websockets@^7.5.1: - version "7.9.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.9.0.tgz#a3938e16d6f134a3999fdfac422a503731bf8973" - integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== +rpc-websockets@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" + integrity sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw== dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" uuid "^8.3.2" ws "^8.5.0" optionalDependencies: @@ -934,16 +967,16 @@ strip-json-comments@3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - superstruct@^0.15.4: version "0.15.5" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== +superstruct@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -1018,10 +1051,10 @@ tsconfig-paths@^3.5.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^2.0.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.0.3, tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" @@ -1090,14 +1123,14 @@ wrappy@1: integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^7.4.5: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.5.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" - integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== y18n@^5.0.5: version "5.0.8" diff --git a/examples/fuzz-tests/cpi-metaplex-7/.gitignore b/examples/fuzz-tests/cpi-metaplex-7/.gitignore new file mode 100644 index 00000000..28be1fa0 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/.gitignore @@ -0,0 +1,8 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn +trident-tests/fuzz_tests/fuzzing/hfuzz_target diff --git a/examples/fuzz-tests/cpi-metaplex-7/.prettierignore b/examples/fuzz-tests/cpi-metaplex-7/.prettierignore new file mode 100644 index 00000000..41425834 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/examples/fuzz-tests/cpi-metaplex-7/Anchor.toml b/examples/fuzz-tests/cpi-metaplex-7/Anchor.toml new file mode 100644 index 00000000..1cedce83 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/Anchor.toml @@ -0,0 +1,24 @@ +[toolchain] + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +cpi_metaplex_7 = "3XtULmXDGS867VbBXiPkjYr4EMjytGW8X12F6BS23Zcw" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" + + +# include metadata program in genesis +[[test.genesis]] +address = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" +program = "trident-genesis/metaplex-token-metadata.so" diff --git a/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock b/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock new file mode 100644 index 00000000..c32d1099 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/Cargo.lock @@ -0,0 +1,7008 @@ +# This file is automatically @generated by Cargo. +# 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 = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[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", + "cipher", + "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", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "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.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" +dependencies = [ + "anchor-syn", + "bs58 0.5.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "bs58 0.5.1", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "anchor-client" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b4397af9b7d6919df3342210d897c0ffda1a31d052abc8eee3e6035ee71567" +dependencies = [ + "anchor-lang", + "anyhow", + "futures", + "regex", + "serde", + "solana-account-decoder", + "solana-client", + "solana-sdk", + "thiserror", + "tokio", + "url", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" +dependencies = [ + "anchor-syn", + "borsh-derive-internal 0.10.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "anchor-lang-idl", + "arrayref", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.15", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" +dependencies = [ + "anchor-lang-idl-spec", + "anyhow", + "heck 0.3.3", + "regex", + "serde", + "serde_json", + "sha2 0.10.8", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "anchor-spl" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04bd077c34449319a1e4e0bc21cea572960c9ae0d0fefda0dd7c52fcc3c647a3" +dependencies = [ + "anchor-lang", + "spl-associated-token-account 3.0.4", + "spl-pod 0.2.5", + "spl-token", + "spl-token-2022 3.0.4", + "spl-token-group-interface 0.2.5", + "spl-token-metadata-interface 0.3.5", +] + +[[package]] +name = "anchor-syn" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" +dependencies = [ + "anyhow", + "bs58 0.5.1", + "cargo_toml", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "aquamarine" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" +dependencies = [ + "include_dir", + "itertools", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +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", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "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", + "quote", + "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-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +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-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.71", + "syn_derive", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" + +[[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 = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml 0.8.14", +] + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode 0.3.6", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpi-metaplex-7" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "mpl-token-metadata", + "trident-derive-accounts-snapshots", + "trident-fuzz", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.71", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", + "rayon", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dir-diff" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" +dependencies = [ + "walkdir", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "fehler" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5729fe49ba028cd550747b6e62cd3d841beccab5390aa398538c31a2d983635" +dependencies = [ + "fehler-macros", +] + +[[package]] +name = "fehler-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb5acb1045ebbfa222e2c50679e392a71dd77030b78fb0189f2d9c5974400f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fuzz_tests" +version = "0.1.0" +dependencies = [ + "anchor-spl", + "arbitrary", + "assert_matches", + "cpi-metaplex-7", + "honggfuzz", + "mpl-token-metadata", + "trident-client", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +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", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util 0.7.11", + "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 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[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.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[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.7", +] + +[[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 = "honggfuzz" +version = "0.5.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" +dependencies = [ + "arbitrary", + "lazy_static", + "memmap2 0.9.4", + "rustc_version", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +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-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "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 = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "index_list" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb725b6505e51229de32027e0cfcd9db29da4d89156f9747b0a5195643fa3e1" + +[[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", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[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 = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.6", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[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.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +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 = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "mpl-token-metadata" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf0f61b553e424a6234af1268456972ee66c2222e1da89079242251fa7479e5" +dependencies = [ + "borsh 0.10.3", + "num-derive 0.3.3", + "num-traits", + "solana-program", + "thiserror", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "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 = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "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-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[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.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[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", + "pin-project", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.3", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[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.7", +] + +[[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 = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[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", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" + +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[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 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "arbitrary", + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[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.15", +] + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-util 0.7.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "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 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +dependencies = [ + "cfg-if", + "glob", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.71", + "unicode-ident", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[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.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "seqlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c67b6f14ecc5b86c66fa63d76b5092352678545a8a3cdae80aef5128371910" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.2.6", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serial_test" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" +dependencies = [ + "dashmap", + "futures", + "lazy_static", + "log", + "parking_lot", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shellexpand" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +dependencies = [ + "dirs", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account-decoder" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a1297281b114406a9165c6f55ff9f8706f6244545194c7aa837f9b25dee16e" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022 1.0.0", + "spl-token-group-interface 0.1.0", + "spl-token-metadata-interface 0.2.0", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-accounts-db" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff031129c39c32d0176be1e3bb9352dc83c521187058d6c16febfee2aedddca0" +dependencies = [ + "arrayref", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lz4", + "memmap2 0.5.10", + "modular-bitfield", + "num-derive 0.4.2", + "num-traits", + "num_cpus", + "num_enum 0.7.2", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "seqlock", + "serde", + "serde_derive", + "smallvec", + "solana-bucket-map", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-nohash-hasher", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "static_assertions", + "strum", + "strum_macros", + "tar", + "tempfile", + "thiserror", +] + +[[package]] +name = "solana-address-lookup-table-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622d95db00595a3dd2abd2ee22c37cf3744ba3df8f531d5c79faa3c155e2814b" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-banks-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d29258deb3e9a052ccdb2bbe986fc0a0c5117a8488298b75e013b8681d793a9" +dependencies = [ + "borsh 1.5.1", + "futures", + "solana-banks-interface", + "solana-program", + "solana-sdk", + "tarpc", + "thiserror", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "423a6215f7abd1af8e992785c91c685787651354b332781c06ad9fdd2b1095d8" +dependencies = [ + "serde", + "solana-sdk", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f986b20b5eecca738b8d2fd83fbaaffbbb2178d294c6d83813241dea48bcc0aa" +dependencies = [ + "bincode", + "crossbeam-channel", + "futures", + "solana-accounts-db", + "solana-banks-interface", + "solana-client", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "tarpc", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9934493a6034c8cf05913ba6812c057f6cd4792ad75c335e8d971adf63ce01c7" +dependencies = [ + "bincode", + "byteorder", + "libsecp256k1", + "log", + "scopeguard", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-bucket-map" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da941e0bde672cd33696961450efa2efb8b46322c4f814c1894c9c264122d1b" +dependencies = [ + "bv", + "bytemuck", + "log", + "memmap2 0.5.10", + "modular-bitfield", + "num_enum 0.7.2", + "rand 0.8.5", + "solana-measure", + "solana-sdk", + "tempfile", +] + +[[package]] +name = "solana-clap-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "811569ed647c15e97afd142297b0ad14a87149c51e11df740014daa81f297f8b" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-cli-config" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb4459594cbdbc6f3cd199bbca486f0ef7f1ecf107dce9cffa3f9d69df31dc7" +dependencies = [ + "dirs-next", + "lazy_static", + "serde", + "serde_derive", + "serde_yaml", + "solana-clap-utils", + "solana-sdk", + "url", +] + +[[package]] +name = "solana-cli-output" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb454e8df10d664ef0e1137c69af0f2d9fa0de713c1b608656318a76a2f5d3cc" +dependencies = [ + "Inflector", + "base64 0.21.7", + "chrono", + "clap 2.34.0", + "console", + "humantime", + "indicatif", + "pretty-hex", + "semver", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "792ed1869858f35b4359f696771517b4848cd3ff6e2d58155c4bcb292f30166b" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dde13cdf503b7269435ceee5a94f8c42313e9257df00e6c2aa06466345dd3fc" +dependencies = [ + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6db8509d749ff1396a0b538ade995908361563b4f2c875b09cf096ba4ba0fae" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257511b6c2b54c28eae24c5a9b7bab74522439fcd721d09e63092768333ba7b7" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", + "log", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-cost-model" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c391b492eb79c24756ee149b19f5504f7a2554612a8d2860fb9701df4e202a8b" +dependencies = [ + "lazy_static", + "log", + "rustc_version", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-metrics", + "solana-program-runtime", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f498a2b290abca1cf77feacef01b904be725fd46a7aea5ba121cce8c1269dcf" +dependencies = [ + "block-buffer 0.10.4", + "bs58 0.4.0", + "bv", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2 0.5.10", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ab48d1be18021f5c13f94671e766699511044f81aab3376313f6a2392f8fab" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.71", +] + +[[package]] +name = "solana-loader-v4-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d5e1fcf36f771e210db47d9e4db1e88821d334b313e6fb3c19cf6a987617ffb" +dependencies = [ + "log", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana_rbpf", +] + +[[package]] +name = "solana-logger" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed08bcdd54232d2017071a6f5d664b34649ef0110801ac310a01418215f22ff7" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db05e4bba8562a2419cb980301152fc7f60f643065c3aba4b3b5d6e3bd66e45" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-metrics" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a77735beed78eb221e123e0d46a991dc91db9e199d5c5fdbea22a55149d162" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-net-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f76d98286bdb149ce5375c3c7d7301e5d1bf7bf2576789d3fd488cf93d32471" +dependencies = [ + "bincode", + "clap 3.2.25", + "crossbeam-channel", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url", +] + +[[package]] +name = "solana-nohash-hasher" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" + +[[package]] +name = "solana-perf" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0a1b27503716c3f5362c61215d2ccf88a3ecf95fce51b2b59951c38a9ad94c" +dependencies = [ + "ahash 0.8.11", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97cec6d3d60ef58168c8b3e97fd88e8903fa059eff6635361427c61c946ec1e" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "borsh 1.5.1", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "light-poseidon", + "log", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b76599d73401663bc1fde39f9fa5e538bd74451ea4a8d4e3ac14541be0a5de" +dependencies = [ + "base64 0.21.7", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.4.2", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-program-test" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65563d5196f76a7c2feb399543389d045c7352f099acb5f5222d46922664457" +dependencies = [ + "assert_matches", + "async-trait", + "base64 0.21.7", + "bincode", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-accounts-db", + "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", + "solana_rbpf", + "test-case", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09aacbdbeaa5722b2ab1f843673f66c317609741f494a6ef11e2e8928cc7449e" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eeabd12e1039aa62cad34179fc1f139fca5c7bfeb7683057643bebff3506b0" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad791cc224c84d69498eeeaeadfc5af2cf710ec2719e48b51f2e2b6e67d8163" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca3c68439865c87d5a01c26dc0dcbcce2d45331adf8f0bf92a7c7d44853fefb" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "qstring", + "semver", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c9bdb88ebcea8b13103019ed0d39b7d4391dc84a0d614dc8ba2e1ca43468e9" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bb93738a111d44dfeec6ccdd6a49f0478550a25a60e38badb2bd713599de44" +dependencies = [ + "base64 0.21.7", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e066df081489cd10c91648f1e87d2b945fac2fcdfb34a715234a0b079a4c4375" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-runtime" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8e16747198f45ab41f146d1ab1782d83016fb9ed1ce7612b9174018f907bd5" +dependencies = [ + "aquamarine", + "arrayref", + "base64 0.21.7", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "dir-diff", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lru", + "lz4", + "memmap2 0.5.10", + "mockall", + "modular-bitfield", + "num-derive 0.4.2", + "num-traits", + "num_cpus", + "num_enum 0.7.2", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "serde", + "serde_derive", + "serde_json", + "solana-accounts-db", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget-program", + "solana-config-program", + "solana-cost-model", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-version", + "solana-vote", + "solana-vote-program", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", + "static_assertions", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-sdk" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c335bdf35728ea876506babffcfd85fa4dd66af6438f9472afc91b278946909" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "borsh 1.5.1", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2 0.5.10", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "siphasher", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba67050b90454a8638913a7d5775703c0557157def04ddcc8b59c964cda8535" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.71", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-send-transaction-service" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8c1dd225716ecd66ec9a5a30c76355d8d1788c721d7db4d53ebb4c6ef34c8d" +dependencies = [ + "crossbeam-channel", + "log", + "solana-client", + "solana-measure", + "solana-metrics", + "solana-runtime", + "solana-sdk", + "solana-tpu-client", +] + +[[package]] +name = "solana-stake-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ef08f7b2485af8578bfd4e23689286e5360b50d3cc9f350dfe3ad9fdabc679" +dependencies = [ + "bincode", + "log", + "rustc_version", + "solana-config-program", + "solana-program-runtime", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-streamer" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e8269eaa4aef1a9697fe8b9f659402272746c3fdd374fbffa96f68fe6745a6" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.2.6", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "smallvec", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-system-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22c8b55398485962ea6127fe84c5768a5ae4a4ecdbd80a0917eb6945593481f9" +dependencies = [ + "bincode", + "log", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-thin-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c174c724bbe19a53862156e1a5d2cf6cdf1bd5d5d9853b4696b2d9d836123b" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcdf9d7109d25900d0532539b00f53e820fb7200f6dc18f90e9d2be20c3d466" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7595aef5a9ddfdecd0966cc12ad0006713e4f8d87eafb4cb7b60fb18d98eff3a" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bs58 0.4.0", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account 2.3.0", + "spl-memo", + "spl-token", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59c49a3766232005385bd70f15b0fce756fa6e73fb6397ce9ed34113f090e2" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-version" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ece37d745e1fb3455acd69b8ba6ecea3ebcefde29e0f40ee8e6467acc4dc04" +dependencies = [ + "log", + "rustc_version", + "semver", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ca2744cf5509c7680a90d6704d00fbab899aa586542c4257fb23d4712b380c" +dependencies = [ + "crossbeam-channel", + "itertools", + "log", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", + "solana-vote-program", + "thiserror", +] + +[[package]] +name = "solana-vote-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6944bb3f8f34cc815017f6a50027331f5e7f48321e7998f1572cc898438b6a8a" +dependencies = [ + "bincode", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bd480f4b1b87dea1cdca14f3c6ba8e778e88756dc44ac090e797aab9c8759d" +dependencies = [ + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616130045004bccc9dd016fe03ac458db38bd61456f1d16f126acb60f968dcae" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive 0.4.2", + "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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[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 = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022 1.0.0", + "thiserror", +] + +[[package]] +name = "spl-associated-token-account" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143109d789171379e6143ef23191786dfaac54289ad6e7917cfb26b36c432b10" +dependencies = [ + "assert_matches", + "borsh 1.5.1", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022 3.0.4", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive 0.1.2", +] + +[[package]] +name = "spl-discriminator" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive 0.2.0", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn 0.1.2", + "syn 2.0.71", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn 0.2.0", + "syn 2.0.71", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", + "thiserror", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-pod" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" +dependencies = [ + "borsh 1.5.1", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error 0.4.4", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive 0.3.2", + "thiserror", +] + +[[package]] +name = "spl-program-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive 0.4.1", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-type-length-value 0.4.6", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod 0.1.0", + "spl-token", + "spl-token-group-interface 0.1.0", + "spl-token-metadata-interface 0.2.0", + "spl-transfer-hook-interface 0.4.1", + "spl-type-length-value 0.3.0", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01d1b2851964e257187c0bca43a0de38d0af59192479ca01ac3e2b58b1bd95a" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod 0.2.5", + "spl-token", + "spl-token-group-interface 0.2.5", + "spl-token-metadata-interface 0.3.5", + "spl-transfer-hook-interface 0.6.5", + "spl-type-length-value 0.4.6", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" +dependencies = [ + "borsh 1.5.1", + "solana-program", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-type-length-value 0.4.6", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", + "spl-tlv-account-resolution 0.5.1", + "spl-type-length-value 0.3.0", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-tlv-account-resolution 0.6.5", + "spl-type-length-value 0.4.6", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", + "spl-program-error 0.3.0", +] + +[[package]] +name = "spl-type-length-value" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.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 = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[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", + "quote", + "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 = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tar" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +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", + "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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + +[[package]] +name = "test-case" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" +dependencies = [ + "test-case-macros", +] + +[[package]] +name = "test-case-core" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "test-case-macros" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "test-case-core", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "indexmap 1.9.3", + "serde", +] + +[[package]] +name = "toml" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "trident-client" +version = "0.6.0" +dependencies = [ + "anchor-client", + "anchor-lang", + "anchor-syn", + "anyhow", + "arbitrary", + "bincode", + "borsh 0.10.3", + "cargo_metadata", + "ed25519-dalek", + "fehler", + "futures", + "heck 0.4.1", + "honggfuzz", + "indicatif", + "log", + "pathdiff", + "proc-macro2", + "quinn-proto", + "quote", + "regex", + "rstest", + "serde", + "serde_json", + "serial_test", + "shellexpand", + "solana-account-decoder", + "solana-cli-output", + "solana-program-test", + "solana-sdk", + "solana-transaction-status", + "spl-associated-token-account 2.3.0", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", + "toml 0.5.11", + "trident-derive-accounts-snapshots", + "trident-derive-displayix", + "trident-derive-fuzz-deserialize", + "trident-derive-fuzz-test-executor", + "trident-fuzz", + "trident-test", +] + +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-displayix" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-fuzz-deserialize" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-fuzz-test-executor" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + +[[package]] +name = "trident-test" +version = "0.3.2" +dependencies = [ + "darling 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[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", +] + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/fuzz-tests/cpi-metaplex-7/Cargo.toml b/examples/fuzz-tests/cpi-metaplex-7/Cargo.toml new file mode 100644 index 00000000..9783b3f0 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = ["programs/*", "trident-tests/fuzz_tests"] +resolver = "2" +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/examples/fuzz-tests/cpi-metaplex-7/Trident.toml b/examples/fuzz-tests/cpi-metaplex-7/Trident.toml new file mode 100644 index 00000000..1c4d43cb --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/Trident.toml @@ -0,0 +1,41 @@ +[test] +validator_startup_timeout = 15000 + + +[honggfuzz] +# Timeout in seconds (default: 10) +timeout = 10 +# Number of fuzzing iterations (default: 0 [no limit]) +iterations = 1000 +# Number of concurrent fuzzing threads (default: 0 [number of CPUs / 2]) +threads = 0 +# Don't close children's stdin, stdout, stderr; can be noisy (default: false) +keep_output = false +# Disable ANSI console; use simple log output (default: false) +verbose = false +# Exit upon seeing the first crash (default: false) +exit_upon_crash = false +# Maximal number of mutations per one run (default: 6) +mutations_per_run = 6 +# Target compilation directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). +# To not clash with cargo build's default target directory. +cargo_target_dir = "" +# Honggfuzz working directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_workspace"]). +hfuzz_workspace = "" +# Directory where crashes are saved to (default: "" [workspace directory]) +crashdir = "" +# Input file extension (e.g. 'swf'), (default: "" ['fuzz']) +extension = "" +# Number of seconds this fuzzing session will last (default: 0 [no limit]) +run_time = 0 +# Maximal size of files processed by the fuzzer in bytes (default: 1048576 = 1MB) +max_file_size = 1048576 +# Save all test-cases (not only the unique ones) by appending the current time-stamp to the filenames (default: false) +save_all = false + +[fuzz] +# Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) +allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/cpi-metaplex-7/migrations/deploy.ts b/examples/fuzz-tests/cpi-metaplex-7/migrations/deploy.ts new file mode 100644 index 00000000..82fb175f --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@coral-xyz/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +}; diff --git a/examples/fuzz-tests/cpi-metaplex-7/package.json b/examples/fuzz-tests/cpi-metaplex-7/package.json new file mode 100644 index 00000000..f10b5053 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/package.json @@ -0,0 +1,21 @@ +{ + "license": "ISC", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.30.1", + "@solana/spl-token": "^0.4.8" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5" + } +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml new file mode 100644 index 00000000..ad878cfa --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "cpi-metaplex-7" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "cpi_metaplex_7" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +trident-fuzzing = ["dep:trident-fuzz"] + + +[dependencies] +anchor-lang = "0.30.1" +anchor-spl = "0.30.1" +mpl-token-metadata = "4.1.2" +trident-derive-accounts-snapshots = { path = "../../../../../crates/fuzz/derive/accounts_snapshots" } +trident-fuzz = { path = "../../../../../crates/fuzz", optional = true } diff --git a/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Xargo.toml b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs new file mode 100644 index 00000000..82334497 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/programs/cpi-metaplex-7/src/lib.rs @@ -0,0 +1,106 @@ +use anchor_lang::prelude::*; +use anchor_spl::{token::Mint, token_interface::TokenInterface}; +use mpl_token_metadata::{ + instructions::{ + CreateMetadataAccountV3Cpi, CreateMetadataAccountV3CpiAccounts, + CreateMetadataAccountV3InstructionArgs, + }, + types::DataV2, + ID as MPL_METADATA_PROGRAM, +}; + +use trident_derive_accounts_snapshots::AccountsSnapshots; + +declare_id!("3XtULmXDGS867VbBXiPkjYr4EMjytGW8X12F6BS23Zcw"); + +#[program] +pub mod cpi_metaplex_7 { + + use super::*; + + pub fn initialize( + ctx: Context, + input: u8, + name: String, + symbol: String, + uri: String, + ) -> Result<()> { + ctx.accounts.create_metadata(name, symbol, uri)?; + + if input > 15 { + panic!("This number is magic"); + } + + Ok(()) + } +} + +#[derive(AccountsSnapshots, Accounts)] +pub struct Initialize<'info> { + #[account(mut)] + pub signer: Signer<'info>, + #[account( + init, + payer = signer, + mint::decimals = 9, + mint::authority = signer, + )] + pub mint: Account<'info, Mint>, + + /// CHECK: Will be initialized + #[account(mut)] + pub metadata_account: UncheckedAccount<'info>, + pub mpl_token_metadata: Program<'info, MplTokenMetadataProgram>, + pub system_program: Program<'info, System>, + pub token_program: Interface<'info, TokenInterface>, +} + +#[derive(Debug, Clone)] +pub struct MplTokenMetadataProgram; + +impl anchor_lang::Id for MplTokenMetadataProgram { + fn id() -> Pubkey { + MPL_METADATA_PROGRAM + } +} + +impl<'info> Initialize<'info> { + pub fn create_metadata(&self, name: String, symbol: String, uri: String) -> Result<()> { + let mpl_metadata_program = &self.mpl_token_metadata.to_account_info(); + let metadata = &self.metadata_account.to_account_info(); + let mint = &self.mint.to_account_info(); + let mint_authority = &self.signer.to_account_info(); + let payer = &self.signer.to_account_info(); + let system_program = &self.system_program.to_account_info(); + + let cpi_context = CreateMetadataAccountV3Cpi::new( + mpl_metadata_program, + CreateMetadataAccountV3CpiAccounts { + metadata, + mint, + mint_authority, + payer, + update_authority: (system_program, false), // second value sets if the account is also signer + system_program, + rent: None, + }, + CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: false, + collection_details: None, + }, + ); + + cpi_context.invoke()?; + + Ok(()) + } +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/tests/cpi-metaplex-7.ts b/examples/fuzz-tests/cpi-metaplex-7/tests/cpi-metaplex-7.ts new file mode 100644 index 00000000..440ea59b --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/tests/cpi-metaplex-7.ts @@ -0,0 +1,66 @@ +import * as anchor from "@coral-xyz/anchor"; +import { Program } from "@coral-xyz/anchor"; +import { CpiMetaplex7 } from "../target/types/cpi_metaplex_7"; +import { PublicKey } from '@solana/web3.js'; +import * as spl_token from '@solana/spl-token'; + + +export const MetaplexTokenMetadataProgram = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s") + +describe("cpi-metaplex-7", () => { + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env() + anchor.setProvider(provider); + + const program = anchor.workspace.CpiMetaplex7 as Program; + + const signer = anchor.web3.Keypair.generate(); + + it("Initialize with Metaplex!", async () => { + await airdrop(provider.connection, signer.publicKey) + + const name = "Name1"; + const symbol = "smb1"; + const uri = "uri1"; + + const [mint, metadata] = await get_adresses(); + + await program.methods.initialize(8, name, symbol, uri).accounts({ + signer: signer.publicKey, + mint: mint.publicKey, + metadataAccount: metadata, + mplTokenMetadata: MetaplexTokenMetadataProgram, + systemProgram: anchor.web3.SystemProgram.programId, + tokenProgram: spl_token.TOKEN_PROGRAM_ID, + }).signers([signer, mint]).rpc({ commitment: "confirmed" }) + }); +}); + + +export async function airdrop( + connection: any, + address: any, + amount = 500_000_000_000 +) { + await connection.confirmTransaction( + await connection.requestAirdrop(address, amount), + 'confirmed' + ); +} + +export async function get_adresses(): Promise<[anchor.web3.Keypair, anchor.web3.PublicKey]> { + // WE GENERATE RANDOM KEYPAIR FOR THE MINT + const mint = anchor.web3.Keypair.generate(); + const mintAddress = mint.publicKey; + + const [metadata, metadata_bump] = anchor.web3.PublicKey.findProgramAddressSync( + [ + Buffer.from('metadata'), + MetaplexTokenMetadataProgram.toBuffer(), + mintAddress.toBuffer(), + ], + MetaplexTokenMetadataProgram + ); + + return [mint, metadata]; +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/trident-genesis/metaplex-token-metadata.so b/examples/fuzz-tests/cpi-metaplex-7/trident-genesis/metaplex-token-metadata.so new file mode 100644 index 00000000..5da6f4fa Binary files /dev/null and b/examples/fuzz-tests/cpi-metaplex-7/trident-genesis/metaplex-token-metadata.so differ diff --git a/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml new file mode 100644 index 00000000..57ce3b7d --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/Cargo.toml @@ -0,0 +1,23 @@ +[[bin]] +name = "fuzz_0" +path = "fuzz_0/test_fuzz.rs" + +[package] +name = "fuzz_tests" +version = "0.1.0" +description = "Created with Trident" +edition = "2021" + +[dependencies] +honggfuzz = "0.5.56" +arbitrary = "1.3.0" +assert_matches = "1.4.0" +mpl-token-metadata = "4.1.2" +anchor-spl = "0.30.1" +[dependencies.trident-client] +path = "../../../../../crates/client" + + +[dependencies.cpi-metaplex-7] +path = "../../programs/cpi-metaplex-7" +features = ["trident-fuzzing"] diff --git a/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs new file mode 100644 index 00000000..639366db --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -0,0 +1,90 @@ +pub mod cpi_metaplex_7_fuzz_instructions { + use cpi_metaplex_7::trident_fuzz_Initialize_snapshot::InitializeSnapshot; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use trident_client::fuzzing::*; + #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] + pub enum FuzzInstruction { + Initialize(Initialize), + } + #[derive(Arbitrary, Debug)] + pub struct Initialize { + pub accounts: InitializeAccounts, + pub data: InitializeData, + } + #[derive(Arbitrary, Debug)] + pub struct InitializeAccounts { + pub signer: AccountId, + pub mint: AccountId, + pub metadata_account: AccountId, + pub mpl_token_metadata: AccountId, + pub system_program: AccountId, + pub token_program: AccountId, + } + #[derive(Arbitrary, Debug)] + pub struct InitializeData { + pub input: u8, + pub name: String, + pub symbol: String, + pub uri: String, + } + impl<'info> IxOps<'info> for Initialize { + type IxData = cpi_metaplex_7::instruction::Initialize; + type IxAccounts = FuzzAccounts; + type IxSnapshot = InitializeSnapshot<'info>; + fn get_data( + &self, + _client: &mut impl FuzzClient, + _fuzz_accounts: &mut FuzzAccounts, + ) -> Result { + let data = cpi_metaplex_7::instruction::Initialize { + input: self.data.input, + name: "NAME1".to_string(), + symbol: "SMB1".to_string(), + uri: "URI1".to_string(), + }; + Ok(data) + } + fn get_accounts( + &self, + client: &mut impl FuzzClient, + fuzz_accounts: &mut FuzzAccounts, + ) -> Result<(Vec, Vec), FuzzingError> { + let signer = fuzz_accounts.signer.get_or_create_account( + self.accounts.signer, + client, + 10 * LAMPORTS_PER_SOL, + ); + + let mint = fuzz_accounts.mint.get_or_create_account( + self.accounts.mint, + client, + 10 * LAMPORTS_PER_SOL, + ); + + let metadata_account = mpl_token_metadata::accounts::Metadata::find_pda(&mint.pubkey()); + + let signers = vec![signer.clone(), mint.clone()]; + let acc_meta = cpi_metaplex_7::accounts::Initialize { + signer: signer.pubkey(), + mint: mint.pubkey(), + metadata_account: metadata_account.0, + mpl_token_metadata: mpl_token_metadata::ID, + system_program: solana_sdk::system_program::ID, + token_program: anchor_spl::token::ID, + } + .to_account_metas(None); + Ok((signers, acc_meta)) + } + } + #[doc = r" Use AccountsStorage where T can be one of:"] + #[doc = r" Keypair, PdaStore, TokenStore, MintStore, ProgramStore"] + #[derive(Default)] + pub struct FuzzAccounts { + _metadata_account: AccountsStorage, + mint: AccountsStorage, + _mpl_token_metadata: AccountsStorage, + signer: AccountsStorage, + _system_program: AccountsStorage, + _token_program: AccountsStorage, + } +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs new file mode 100644 index 00000000..6398e7af --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -0,0 +1,52 @@ +use cpi_metaplex_7::entry as entry_cpi_metaplex_7; +use cpi_metaplex_7::ID as PROGRAM_ID_CPI_METAPLEX_7; +const PROGRAM_NAME_CPI_METAPLEX_7: &str = "cpi_metaplex_7"; +use fuzz_instructions::cpi_metaplex_7_fuzz_instructions::FuzzInstruction as FuzzInstruction_cpi_metaplex_7; +use fuzz_instructions::cpi_metaplex_7_fuzz_instructions::Initialize; +use trident_client::fuzzing::*; +mod fuzz_instructions; + +pub type FuzzInstruction = FuzzInstruction_cpi_metaplex_7; + +struct MyFuzzData; + +impl FuzzDataBuilder for MyFuzzData { + fn pre_ixs(u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + let init = FuzzInstruction::Initialize(Initialize::arbitrary(u)?); + Ok(vec![init]) + } + fn ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + Ok(vec![]) + } + fn post_ixs(_u: &mut arbitrary::Unstructured) -> arbitrary::Result> { + Ok(vec![]) + } +} + +fn main() { + loop { + fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_CPI_METAPLEX_7, + &PROGRAM_ID_CPI_METAPLEX_7, + processor!(convert_entry!(entry_cpi_metaplex_7)) + ); + let metaplex = FuzzingProgram::new( + "metaplex-token-metadata", + &mpl_token_metadata::ID, + None + ); + + let mut client = + ProgramTestClientBlocking::new(&[fuzzing_program1,metaplex]) + .unwrap(); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_CPI_METAPLEX_7, &mut client); + }); + } +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/tsconfig.json b/examples/fuzz-tests/cpi-metaplex-7/tsconfig.json new file mode 100644 index 00000000..cd5d2e3d --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/examples/fuzz-tests/cpi-metaplex-7/yarn.lock b/examples/fuzz-tests/cpi-metaplex-7/yarn.lock new file mode 100644 index 00000000..46fd2610 --- /dev/null +++ b/examples/fuzz-tests/cpi-metaplex-7/yarn.lock @@ -0,0 +1,1363 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" + integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== + dependencies: + regenerator-runtime "^0.14.0" + +"@coral-xyz/anchor-errors@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" + integrity sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ== + +"@coral-xyz/anchor@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" + integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== + dependencies: + "@coral-xyz/anchor-errors" "^0.30.1" + "@coral-xyz/borsh" "^0.30.1" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.68.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + +"@coral-xyz/borsh@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" + integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@noble/curves@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@solana/buffer-layout-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" + integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/web3.js" "^1.32.0" + bigint-buffer "^1.1.5" + bignumber.js "^9.0.1" + +"@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/codecs-core@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz#689784d032fbc1fedbde40bb25d76cdcecf6553b" + integrity sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg== + dependencies: + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-core@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-preview.4.tgz#770826105f2f884110a21662573e7a2014654324" + integrity sha512-A0VVuDDA5kNKZUinOqHxJQK32aKTucaVbvn31YenGzHX1gPqq+SOnFwgaEY6pq4XEopSmaK16w938ZQS8IvCnw== + dependencies: + "@solana/errors" "2.0.0-preview.4" + +"@solana/codecs-data-structures@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz#e82cb1b6d154fa636cd5c8953ff3f32959cc0370" + integrity sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-data-structures@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.4.tgz#f8a2470982a9792334737ea64000ccbdff287247" + integrity sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA== + dependencies: + "@solana/codecs-core" "2.0.0-preview.4" + "@solana/codecs-numbers" "2.0.0-preview.4" + "@solana/errors" "2.0.0-preview.4" + +"@solana/codecs-numbers@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz#56995c27396cd8ee3bae8bd055363891b630bbd0" + integrity sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-numbers@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.4.tgz#6a53b456bb7866f252d8c032c81a92651e150f66" + integrity sha512-Q061rLtMadsO7uxpguT+Z7G4UHnjQ6moVIxAQxR58nLxDPCC7MB1Pk106/Z7NDhDLHTcd18uO6DZ7ajHZEn2XQ== + dependencies: + "@solana/codecs-core" "2.0.0-preview.4" + "@solana/errors" "2.0.0-preview.4" + +"@solana/codecs-strings@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz#8bd01a4e48614d5289d72d743c3e81305d445c46" + integrity sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/errors" "2.0.0-preview.2" + +"@solana/codecs-strings@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.4.tgz#4d06bb722a55a5d04598d362021bfab4bd446760" + integrity sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw== + dependencies: + "@solana/codecs-core" "2.0.0-preview.4" + "@solana/codecs-numbers" "2.0.0-preview.4" + "@solana/errors" "2.0.0-preview.4" + +"@solana/codecs@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/codecs/-/codecs-2.0.0-preview.2.tgz#d6615fec98f423166fb89409f9a4ad5b74c10935" + integrity sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-data-structures" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + "@solana/codecs-strings" "2.0.0-preview.2" + "@solana/options" "2.0.0-preview.2" + +"@solana/codecs@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/codecs/-/codecs-2.0.0-preview.4.tgz#a1923cc78a6f64ebe656c7ec6335eb6b70405b22" + integrity sha512-gLMupqI4i+G4uPi2SGF/Tc1aXcviZF2ybC81x7Q/fARamNSgNOCUUoSCg9nWu1Gid6+UhA7LH80sWI8XjKaRog== + dependencies: + "@solana/codecs-core" "2.0.0-preview.4" + "@solana/codecs-data-structures" "2.0.0-preview.4" + "@solana/codecs-numbers" "2.0.0-preview.4" + "@solana/codecs-strings" "2.0.0-preview.4" + "@solana/options" "2.0.0-preview.4" + +"@solana/errors@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.0.0-preview.2.tgz#e0ea8b008c5c02528d5855bc1903e5e9bbec322e" + integrity sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA== + dependencies: + chalk "^5.3.0" + commander "^12.0.0" + +"@solana/errors@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.0.0-preview.4.tgz#056ba76b6dd900dafa70117311bec3aef0f5250b" + integrity sha512-kadtlbRv2LCWr8A9V22On15Us7Nn8BvqNaOB4hXsTB3O0fU40D1ru2l+cReqLcRPij4znqlRzW9Xi0m6J5DIhA== + dependencies: + chalk "^5.3.0" + commander "^12.1.0" + +"@solana/options@2.0.0-preview.2": + version "2.0.0-preview.2" + resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-preview.2.tgz#13ff008bf43a5056ef9a091dc7bb3f39321e867e" + integrity sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w== + dependencies: + "@solana/codecs-core" "2.0.0-preview.2" + "@solana/codecs-numbers" "2.0.0-preview.2" + +"@solana/options@2.0.0-preview.4": + version "2.0.0-preview.4" + resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-preview.4.tgz#212d35d1da87c7efb13de4d3569ad9eb070f013d" + integrity sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA== + dependencies: + "@solana/codecs-core" "2.0.0-preview.4" + "@solana/codecs-data-structures" "2.0.0-preview.4" + "@solana/codecs-numbers" "2.0.0-preview.4" + "@solana/codecs-strings" "2.0.0-preview.4" + "@solana/errors" "2.0.0-preview.4" + +"@solana/spl-token-group@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@solana/spl-token-group/-/spl-token-group-0.0.5.tgz#f955dcca782031c85e862b2b46878d1bb02db6c2" + integrity sha512-CLJnWEcdoUBpQJfx9WEbX3h6nTdNiUzswfFdkABUik7HVwSNA98u5AYvBVK2H93d9PGMOHAak2lHW9xr+zAJGQ== + dependencies: + "@solana/codecs" "2.0.0-preview.4" + "@solana/spl-type-length-value" "0.1.0" + +"@solana/spl-token-metadata@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz#5cdc3b857a8c4a6877df24e24a8648c4132d22ba" + integrity sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ== + dependencies: + "@solana/codecs" "2.0.0-preview.2" + "@solana/spl-type-length-value" "0.1.0" + +"@solana/spl-token@^0.4.8": + version "0.4.8" + resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.4.8.tgz#a84e4131af957fa9fbd2727e5fc45dfbf9083586" + integrity sha512-RO0JD9vPRi4LsAbMUdNbDJ5/cv2z11MGhtAvFeRzT4+hAGE/FUzRi0tkkWtuCfSIU3twC6CtmAihRp/+XXjWsA== + dependencies: + "@solana/buffer-layout" "^4.0.0" + "@solana/buffer-layout-utils" "^0.2.0" + "@solana/spl-token-group" "^0.0.5" + "@solana/spl-token-metadata" "^0.1.3" + buffer "^6.0.3" + +"@solana/spl-type-length-value@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz#b5930cf6c6d8f50c7ff2a70463728a4637a2f26b" + integrity sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA== + dependencies: + buffer "^6.0.3" + +"@solana/web3.js@^1.32.0", "@solana/web3.js@^1.68.0": + version "1.95.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.0.tgz#9cf08383e7dcba212a73d78349cf9b25bc34764f" + integrity sha512-iHwJ/HcWrF9qbnI1ctwI1UXHJ0vZXRpnt+lI5UcQIk8WvJNuQ5gV06icxzM6B7ojUES85Q1/FM4jZ49UQ8yZZQ== + dependencies: + "@babel/runtime" "^7.24.7" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@swc/helpers@^0.5.11": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== + dependencies: + tslib "^2.4.0" + +"@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/chai@^4.3.0": + version "4.3.16" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" + integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + dependencies: + undici-types "~5.26.4" + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@types/ws@^8.2.2": + version "8.5.11" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.11.tgz#90ad17b3df7719ce3e6bc32f83ff954d38656508" + integrity sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +agentkeepalive@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +bignumber.js@^9.0.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bindings@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^6.0.0, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^12.0.0, commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" + integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.5.10" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@^9.0.3: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@^2.6.12, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.3.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prettier@^2.6.2: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +rpc-websockets@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" + integrity sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== + +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^4.3.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.5.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/examples/fuzz-tests/hello_world/Cargo.lock b/examples/fuzz-tests/hello_world/Cargo.lock index 6deb6646..a167850b 100644 --- a/examples/fuzz-tests/hello_world/Cargo.lock +++ b/examples/fuzz-tests/hello_world/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -267,19 +266,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" -dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1089,7 +1075,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1128,6 +1114,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1222,6 +1217,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1589,6 +1605,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2062,13 +2084,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2278,6 +2300,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2483,6 +2516,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3083,6 +3125,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -3981,7 +4037,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4011,7 +4067,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4146,7 +4202,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4332,7 +4388,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4699,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -4743,7 +4799,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4819,7 +4875,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5005,7 +5061,7 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5177,7 +5233,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5263,20 +5319,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5306,28 +5348,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5347,7 +5367,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5379,22 +5399,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5407,7 +5411,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.2", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5607,6 +5611,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5983,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5996,13 +6010,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6010,15 +6022,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6026,12 +6032,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6059,12 +6077,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/hello_world/Trident.toml b/examples/fuzz-tests/hello_world/Trident.toml index 6c05d2e0..93edfd43 100644 --- a/examples/fuzz-tests/hello_world/Trident.toml +++ b/examples/fuzz-tests/hello_world/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/Cargo.toml index 46758245..a6dfd0ec 100644 --- a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/Cargo.toml @@ -9,13 +9,12 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.hello_world] path = "../../programs/hello_world" diff --git a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index 6c6df989..b915b2c5 100644 --- a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,6 +1,5 @@ -use hello_world::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub hello_world_account: Option>, @@ -8,6 +7,7 @@ pub struct InitializeSnapshot<'info> { } impl<'info> InitializeSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -27,7 +27,7 @@ impl<'info> InitializeSnapshot<'info> { ))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc).map_err(|_| { FuzzingError::CannotDeserializeAccount("hello_world_account".to_string()) }) diff --git a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index 8259542b..c60e5aa1 100644 --- a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,8 @@ pub mod hello_world_fuzz_instructions { use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { Initialize(Initialize), diff --git a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index 03a294da..06c39034 100644 --- a/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/hello_world/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,12 +1,13 @@ -use fuzz_instructions::hello_world_fuzz_instructions::FuzzInstruction; use fuzz_instructions::hello_world_fuzz_instructions::Initialize; -use hello_world::entry; -use hello_world::ID as PROGRAM_ID; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use hello_world::entry as entry_hello_world; +use hello_world::ID as PROGRAM_ID_HELLO_WORLD; +const PROGRAM_NAME_HELLO_WORLD: &str = "hello_world"; +use fuzz_instructions::hello_world_fuzz_instructions::FuzzInstruction as FuzzInstruction_hello_world; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "hello_world"; +pub type FuzzInstruction = FuzzInstruction_hello_world; struct MyFuzzData; @@ -20,10 +21,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_HELLO_WORLD, + &PROGRAM_ID_HELLO_WORLD, + processor!(convert_entry!(entry_hello_world)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_HELLO_WORLD, &mut client); }); } } diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock index 187583d8..f65cc8b5 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -1089,7 +1088,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1128,6 +1127,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1222,6 +1230,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1589,6 +1618,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2056,13 +2091,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2280,6 +2315,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2485,6 +2531,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3085,6 +3140,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4013,7 +4082,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4148,7 +4217,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4334,7 +4403,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4745,7 +4814,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4821,7 +4890,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5609,6 +5678,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5985,7 +6065,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5998,13 +6077,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6012,15 +6089,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6028,12 +6099,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6061,12 +6144,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Trident.toml b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/Trident.toml +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/Cargo.toml index 48e1bcd2..7e5fc3ec 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/Cargo.toml @@ -9,14 +9,13 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" anchor-spl = "0.29.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.incorrect-integer-arithmetic-3] path = "../../programs/incorrect-integer-arithmetic-3" diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index bf54bf95..7ff899d6 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,7 +1,6 @@ +use anchor_lang::prelude::*; use anchor_spl::token::{Mint, Token, TokenAccount}; -use incorrect_integer_arithmetic_3::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitVestingSnapshot<'info> { pub sender: Signer<'info>, pub sender_token_account: Account<'info, TokenAccount>, @@ -23,6 +22,7 @@ pub struct WithdrawUnlockedSnapshot<'info> { } impl<'info> InitVestingSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -54,7 +54,7 @@ impl<'info> InitVestingSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) } else { @@ -115,6 +115,7 @@ impl<'info> InitVestingSnapshot<'info> { } impl<'info> WithdrawUnlockedSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -146,7 +147,7 @@ impl<'info> WithdrawUnlockedSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) } else { diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index a01aaaca..c67fa64d 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,8 @@ pub mod incorrect_integer_arithmetic_3_fuzz_instructions { use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { InitVesting(InitVesting), diff --git a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index 6f5e58db..36f5c913 100644 --- a/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/incorrect-integer-arithmetic-3/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,12 +1,13 @@ -use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::FuzzInstruction; use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::InitVesting; -use incorrect_integer_arithmetic_3::entry; -use incorrect_integer_arithmetic_3::ID as PROGRAM_ID; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use incorrect_integer_arithmetic_3::entry as entry_incorrect_integer_arithmetic_3; +use incorrect_integer_arithmetic_3::ID as PROGRAM_ID_INCORRECT_INTEGER_ARITHMETIC_3; +const PROGRAM_NAME_INCORRECT_INTEGER_ARITHMETIC_3: &str = "incorrect_integer_arithmetic_3"; +use fuzz_instructions::incorrect_integer_arithmetic_3_fuzz_instructions::FuzzInstruction as FuzzInstruction_incorrect_integer_arithmetic_3; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "incorrect_integer_arithmetic_3"; +pub type FuzzInstruction = FuzzInstruction_incorrect_integer_arithmetic_3; struct MyFuzzData; @@ -21,10 +22,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_INCORRECT_INTEGER_ARITHMETIC_3, + &PROGRAM_ID_INCORRECT_INTEGER_ARITHMETIC_3, + processor!(convert_entry!(entry_incorrect_integer_arithmetic_3)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_INCORRECT_INTEGER_ARITHMETIC_3, &mut client); }); } } diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock index bfd6cc05..2efd68fb 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -267,19 +266,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" -dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1089,7 +1075,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1128,6 +1114,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1222,6 +1217,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1589,6 +1605,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2055,13 +2077,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2278,6 +2300,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2483,6 +2516,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3083,6 +3125,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -3981,7 +4037,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4011,7 +4067,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4146,7 +4202,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4332,7 +4388,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4699,7 +4755,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -4743,7 +4799,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4819,7 +4875,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -5005,7 +5061,7 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5177,7 +5233,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5263,20 +5319,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5306,28 +5348,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5347,7 +5367,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5379,22 +5399,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5407,7 +5411,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.2", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5607,6 +5611,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5983,7 +5998,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5996,13 +6010,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6010,15 +6022,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6026,12 +6032,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6059,12 +6077,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/Trident.toml b/examples/fuzz-tests/incorrect-ix-sequence-1/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/Trident.toml +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/Cargo.toml index 9810bcdc..be075577 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/Cargo.toml @@ -9,13 +9,12 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.incorrect-ix-sequence-1] path = "../../programs/incorrect-ix-sequence-1" diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index 2d49bd62..ec363fdd 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,6 +1,5 @@ -use incorrect_ix_sequence_1::ID as PROGRAM_ID; -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub state: Option>, @@ -24,6 +23,7 @@ pub struct InvestSnapshot<'info> { } impl<'info> InitializeSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -41,7 +41,7 @@ impl<'info> InitializeSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("state".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("state".to_string())) } else { @@ -70,6 +70,7 @@ impl<'info> InitializeSnapshot<'info> { } impl<'info> RegisterSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -89,7 +90,7 @@ impl<'info> RegisterSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("project".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("project".to_string())) } else { @@ -127,6 +128,7 @@ impl<'info> RegisterSnapshot<'info> { } impl<'info> EndRegistrationsSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -150,6 +152,7 @@ impl<'info> EndRegistrationsSnapshot<'info> { } impl<'info> InvestSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index 1c409e46..8d568e13 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,7 +1,9 @@ pub mod incorrect_ix_sequence_1_fuzz_instructions { use crate::accounts_snapshots::*; use incorrect_ix_sequence_1::{PROJECT_SEED, STATE_SEED}; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { Initialize(Initialize), diff --git a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index a2638ac1..81f0f9af 100644 --- a/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/incorrect-ix-sequence-1/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,12 +1,13 @@ -use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::FuzzInstruction; use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::Initialize; -use incorrect_ix_sequence_1::entry; -use incorrect_ix_sequence_1::ID as PROGRAM_ID; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; +use incorrect_ix_sequence_1::entry as entry_incorrect_ix_sequence_1; +use incorrect_ix_sequence_1::ID as PROGRAM_ID_INCORRECT_IX_SEQUENCE_1; +const PROGRAM_NAME_INCORRECT_IX_SEQUENCE_1: &str = "incorrect_ix_sequence_1"; +use fuzz_instructions::incorrect_ix_sequence_1_fuzz_instructions::FuzzInstruction as FuzzInstruction_incorrect_ix_sequence_1; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "incorrect_ix_sequence_1"; +pub type FuzzInstruction = FuzzInstruction_incorrect_ix_sequence_1; struct MyFuzzData; @@ -20,10 +21,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_INCORRECT_IX_SEQUENCE_1, + &PROGRAM_ID_INCORRECT_IX_SEQUENCE_1, + processor!(convert_entry!(entry_incorrect_ix_sequence_1)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_INCORRECT_IX_SEQUENCE_1, &mut client); }); } } diff --git a/examples/fuzz-tests/simple-cpi-6/.gitignore b/examples/fuzz-tests/simple-cpi-6/.gitignore new file mode 100644 index 00000000..28be1fa0 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/.gitignore @@ -0,0 +1,8 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn +trident-tests/fuzz_tests/fuzzing/hfuzz_target diff --git a/examples/fuzz-tests/simple-cpi-6/.prettierignore b/examples/fuzz-tests/simple-cpi-6/.prettierignore new file mode 100644 index 00000000..41425834 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/examples/fuzz-tests/simple-cpi-6/Anchor.toml b/examples/fuzz-tests/simple-cpi-6/Anchor.toml new file mode 100644 index 00000000..4256f231 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/Anchor.toml @@ -0,0 +1,21 @@ +[toolchain] +anchor_version = "0.30.1" +solana_version = "1.18.18" + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +callee = "HJR1TK8bgrUWzysdpS1pBGBYKF7zi1tU9cS4qj8BW8ZL" +caller = "FWtSodrkUnovFPnNRCxneP6VWh6JH6jtQZ4PHoP8Ejuz" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/examples/fuzz-tests/simple-cpi-6/Cargo.lock b/examples/fuzz-tests/simple-cpi-6/Cargo.lock new file mode 100644 index 00000000..cdf69895 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/Cargo.lock @@ -0,0 +1,6801 @@ +# This file is automatically @generated by Cargo. +# 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 = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[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", + "cipher", + "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", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "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.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" +dependencies = [ + "anchor-syn", + "bs58 0.5.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "bs58 0.5.1", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "anchor-client" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b4397af9b7d6919df3342210d897c0ffda1a31d052abc8eee3e6035ee71567" +dependencies = [ + "anchor-lang", + "anyhow", + "futures", + "regex", + "serde", + "solana-account-decoder", + "solana-client", + "solana-sdk", + "thiserror", + "tokio", + "url", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" +dependencies = [ + "anchor-syn", + "borsh-derive-internal 0.10.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "anchor-lang-idl", + "arrayref", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.15", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" +dependencies = [ + "anchor-lang-idl-spec", + "anyhow", + "heck 0.3.3", + "regex", + "serde", + "serde_json", + "sha2 0.10.8", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "anchor-syn" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" +dependencies = [ + "anyhow", + "bs58 0.5.1", + "cargo_toml", + "heck 0.3.3", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "aquamarine" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da02abba9f9063d786eab1509833ebb2fac0f966862ca59439c76b9c566760" +dependencies = [ + "include_dir", + "itertools", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + +[[package]] +name = "asn1-rs" +version = "0.5.2" +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", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "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", + "quote", + "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-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + +[[package]] +name = "async-compression" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +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-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +dependencies = [ + "borsh-derive 1.5.1", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.71", + "syn_derive", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "brotli" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" + +[[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 = "callee" +version = "0.1.0" +dependencies = [ + "anchor-lang", +] + +[[package]] +name = "caller" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "callee", +] + +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "caps" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +dependencies = [ + "libc", + "thiserror", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml 0.8.14", +] + +[[package]] +name = "cc" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9711f33475c22aab363b05564a17d7b789bf3dfec5ebabb586adee56f0e271b5" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.3", + "once_cell", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode 0.3.6", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "const-oid" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.71", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", + "rayon", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6919815d73839e7ad218de758883aae3a257ba6759ce7a9992501efbb53d705c" +dependencies = [ + "const-oid", +] + +[[package]] +name = "der-parser" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint 0.4.6", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dialoguer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +dependencies = [ + "console", + "shell-words", + "tempfile", + "zeroize", +] + +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "dir-diff" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ad16bf5f84253b50d6557681c58c3ab67c47c77d39fed9aeb56e947290bd10" +dependencies = [ + "walkdir", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "dlopen2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "enum-ordinalize" +version = "3.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "fehler" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5729fe49ba028cd550747b6e62cd3d841beccab5390aa398538c31a2d983635" +dependencies = [ + "fehler-macros", +] + +[[package]] +name = "fehler-macros" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb5acb1045ebbfa222e2c50679e392a71dd77030b78fb0189f2d9c5974400f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fragile" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fuzz_tests" +version = "0.1.0" +dependencies = [ + "arbitrary", + "assert_matches", + "callee", + "caller", + "honggfuzz", + "trident-client", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +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", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util 0.7.11", + "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 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[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.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[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.7", +] + +[[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 = "honggfuzz" +version = "0.5.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" +dependencies = [ + "arbitrary", + "lazy_static", + "memmap2 0.9.4", + "rustc_version", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +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-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "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 = "include_dir" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "index_list" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cb725b6505e51229de32027e0cfcd9db29da4d89156f9747b0a5195643fa3e1" + +[[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", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "indicatif" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpc-core" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" +dependencies = [ + "futures", + "futures-executor", + "futures-util", + "log", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[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 = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.6", + "thiserror", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[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.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6eab492fe7f8651add23237ea56dbf11b3c4ff762ab83d40a47f11433421f91" +dependencies = [ + "libc", + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9764018d143cc854c9f17f0b907de70f14393b1f502da6375dce70f00514eb3" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +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 = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mockall" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96" +dependencies = [ + "cfg-if", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "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 = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "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-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive 0.7.2", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[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.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[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", + "pin-project", + "rand 0.8.5", + "thiserror", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_str_bytes" +version = "6.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" + +[[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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.2", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + +[[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.7", +] + +[[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 = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[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", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "predicates" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" + +[[package]] +name = "predicates-tree" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +dependencies = [ + "predicates-core", + "termtree", +] + +[[package]] +name = "pretty-hex" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" + +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[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 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "arbitrary", + "bytes", + "rand 0.8.5", + "ring 0.16.20", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" +dependencies = [ + "bytes", + "libc", + "socket2", + "tracing", + "windows-sys 0.48.0", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[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.15", +] + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring 0.16.20", + "time", + "yasna", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "async-compression", + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-util 0.7.11", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "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 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rstest" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97eeab2f3c0a199bc4be135c36c924b6590b88c377d416494288c14f2db30199" +dependencies = [ + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", +] + +[[package]] +name = "rstest_macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d428f8247852f894ee1be110b375111b586d4fa431f6c46e64ba5a0dcccbe605" +dependencies = [ + "cfg-if", + "glob", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.71", + "unicode-ident", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[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.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[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.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "seqlock" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c67b6f14ecc5b86c66fa63d76b5092352678545a8a3cdae80aef5128371910" +dependencies = [ + "parking_lot", +] + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.2.6", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "serial_test" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" +dependencies = [ + "dashmap", + "futures", + "lazy_static", + "log", + "parking_lot", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shellexpand" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da03fa3b94cc19e3ebfc88c4229c49d8f08cdbd1228870a45f0ffdf84988e14b" +dependencies = [ + "dirs", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solana-account-decoder" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a1297281b114406a9165c6f55ff9f8706f6244545194c7aa837f9b25dee16e" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "bv", + "lazy_static", + "serde", + "serde_derive", + "serde_json", + "solana-config-program", + "solana-sdk", + "spl-token", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-accounts-db" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff031129c39c32d0176be1e3bb9352dc83c521187058d6c16febfee2aedddca0" +dependencies = [ + "arrayref", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lz4", + "memmap2 0.5.10", + "modular-bitfield", + "num-derive 0.4.2", + "num-traits", + "num_cpus", + "num_enum 0.7.2", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "seqlock", + "serde", + "serde_derive", + "smallvec", + "solana-bucket-map", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-nohash-hasher", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", + "static_assertions", + "strum", + "strum_macros", + "tar", + "tempfile", + "thiserror", +] + +[[package]] +name = "solana-address-lookup-table-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622d95db00595a3dd2abd2ee22c37cf3744ba3df8f531d5c79faa3c155e2814b" +dependencies = [ + "bincode", + "bytemuck", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-program", + "solana-program-runtime", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-banks-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d29258deb3e9a052ccdb2bbe986fc0a0c5117a8488298b75e013b8681d793a9" +dependencies = [ + "borsh 1.5.1", + "futures", + "solana-banks-interface", + "solana-program", + "solana-sdk", + "tarpc", + "thiserror", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-banks-interface" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "423a6215f7abd1af8e992785c91c685787651354b332781c06ad9fdd2b1095d8" +dependencies = [ + "serde", + "solana-sdk", + "tarpc", +] + +[[package]] +name = "solana-banks-server" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f986b20b5eecca738b8d2fd83fbaaffbbb2178d294c6d83813241dea48bcc0aa" +dependencies = [ + "bincode", + "crossbeam-channel", + "futures", + "solana-accounts-db", + "solana-banks-interface", + "solana-client", + "solana-runtime", + "solana-sdk", + "solana-send-transaction-service", + "tarpc", + "tokio", + "tokio-serde", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9934493a6034c8cf05913ba6812c057f6cd4792ad75c335e8d971adf63ce01c7" +dependencies = [ + "bincode", + "byteorder", + "libsecp256k1", + "log", + "scopeguard", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-bucket-map" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da941e0bde672cd33696961450efa2efb8b46322c4f814c1894c9c264122d1b" +dependencies = [ + "bv", + "bytemuck", + "log", + "memmap2 0.5.10", + "modular-bitfield", + "num_enum 0.7.2", + "rand 0.8.5", + "solana-measure", + "solana-sdk", + "tempfile", +] + +[[package]] +name = "solana-clap-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "811569ed647c15e97afd142297b0ad14a87149c51e11df740014daa81f297f8b" +dependencies = [ + "chrono", + "clap 2.34.0", + "rpassword", + "solana-remote-wallet", + "solana-sdk", + "thiserror", + "tiny-bip39", + "uriparse", + "url", +] + +[[package]] +name = "solana-cli-config" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cb4459594cbdbc6f3cd199bbca486f0ef7f1ecf107dce9cffa3f9d69df31dc7" +dependencies = [ + "dirs-next", + "lazy_static", + "serde", + "serde_derive", + "serde_yaml", + "solana-clap-utils", + "solana-sdk", + "url", +] + +[[package]] +name = "solana-cli-output" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb454e8df10d664ef0e1137c69af0f2d9fa0de713c1b608656318a76a2f5d3cc" +dependencies = [ + "Inflector", + "base64 0.21.7", + "chrono", + "clap 2.34.0", + "console", + "humantime", + "indicatif", + "pretty-hex", + "semver", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "792ed1869858f35b4359f696771517b4848cd3ff6e2d58155c4bcb292f30166b" +dependencies = [ + "async-trait", + "bincode", + "dashmap", + "futures", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "quinn", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dde13cdf503b7269435ceee5a94f8c42313e9257df00e6c2aa06466345dd3fc" +dependencies = [ + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-config-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6db8509d749ff1396a0b538ade995908361563b4f2c875b09cf096ba4ba0fae" +dependencies = [ + "bincode", + "chrono", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-connection-cache" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257511b6c2b54c28eae24c5a9b7bab74522439fcd721d09e63092768333ba7b7" +dependencies = [ + "async-trait", + "bincode", + "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", + "log", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", + "solana-metrics", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-cost-model" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c391b492eb79c24756ee149b19f5504f7a2554612a8d2860fb9701df4e202a8b" +dependencies = [ + "lazy_static", + "log", + "rustc_version", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-config-program", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-metrics", + "solana-program-runtime", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-vote-program", +] + +[[package]] +name = "solana-frozen-abi" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f498a2b290abca1cf77feacef01b904be725fd46a7aea5ba121cce8c1269dcf" +dependencies = [ + "block-buffer 0.10.4", + "bs58 0.4.0", + "bv", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2 0.5.10", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ab48d1be18021f5c13f94671e766699511044f81aab3376313f6a2392f8fab" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.71", +] + +[[package]] +name = "solana-loader-v4-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d5e1fcf36f771e210db47d9e4db1e88821d334b313e6fb3c19cf6a987617ffb" +dependencies = [ + "log", + "solana-measure", + "solana-program-runtime", + "solana-sdk", + "solana_rbpf", +] + +[[package]] +name = "solana-logger" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed08bcdd54232d2017071a6f5d664b34649ef0110801ac310a01418215f22ff7" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-measure" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db05e4bba8562a2419cb980301152fc7f60f643065c3aba4b3b5d6e3bd66e45" +dependencies = [ + "log", + "solana-sdk", +] + +[[package]] +name = "solana-metrics" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a77735beed78eb221e123e0d46a991dc91db9e199d5c5fdbea22a55149d162" +dependencies = [ + "crossbeam-channel", + "gethostname", + "lazy_static", + "log", + "reqwest", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-net-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f76d98286bdb149ce5375c3c7d7301e5d1bf7bf2576789d3fd488cf93d32471" +dependencies = [ + "bincode", + "clap 3.2.25", + "crossbeam-channel", + "log", + "nix", + "rand 0.8.5", + "serde", + "serde_derive", + "socket2", + "solana-logger", + "solana-sdk", + "solana-version", + "tokio", + "url", +] + +[[package]] +name = "solana-nohash-hasher" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8a731ed60e89177c8a7ab05fe0f1511cedd3e70e773f288f9de33a9cfdc21e" + +[[package]] +name = "solana-perf" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0a1b27503716c3f5362c61215d2ccf88a3ecf95fce51b2b59951c38a9ad94c" +dependencies = [ + "ahash 0.8.11", + "bincode", + "bv", + "caps", + "curve25519-dalek", + "dlopen2", + "fnv", + "lazy_static", + "libc", + "log", + "nix", + "rand 0.8.5", + "rayon", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-metrics", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97cec6d3d60ef58168c8b3e97fd88e8903fa059eff6635361427c61c946ec1e" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "borsh 1.5.1", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "light-poseidon", + "log", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-program-runtime" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b76599d73401663bc1fde39f9fa5e538bd74451ea4a8d4e3ac14541be0a5de" +dependencies = [ + "base64 0.21.7", + "bincode", + "eager", + "enum-iterator", + "itertools", + "libc", + "log", + "num-derive 0.4.2", + "num-traits", + "percentage", + "rand 0.8.5", + "rustc_version", + "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-measure", + "solana-metrics", + "solana-sdk", + "solana_rbpf", + "thiserror", +] + +[[package]] +name = "solana-program-test" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c65563d5196f76a7c2feb399543389d045c7352f099acb5f5222d46922664457" +dependencies = [ + "assert_matches", + "async-trait", + "base64 0.21.7", + "bincode", + "chrono-humanize", + "crossbeam-channel", + "log", + "serde", + "solana-accounts-db", + "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", + "solana_rbpf", + "test-case", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-pubsub-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09aacbdbeaa5722b2ab1f843673f66c317609741f494a6ef11e2e8928cc7449e" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2eeabd12e1039aa62cad34179fc1f139fca5c7bfeb7683057643bebff3506b0" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-rayon-threadlimit" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad791cc224c84d69498eeeaeadfc5af2cf710ec2719e48b51f2e2b6e67d8163" +dependencies = [ + "lazy_static", + "num_cpus", +] + +[[package]] +name = "solana-remote-wallet" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca3c68439865c87d5a01c26dc0dcbcce2d45331adf8f0bf92a7c7d44853fefb" +dependencies = [ + "console", + "dialoguer", + "log", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "qstring", + "semver", + "solana-sdk", + "thiserror", + "uriparse", +] + +[[package]] +name = "solana-rpc-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1c9bdb88ebcea8b13103019ed0d39b7d4391dc84a0d614dc8ba2e1ca43468e9" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bb93738a111d44dfeec6ccdd6a49f0478550a25a60e38badb2bd713599de44" +dependencies = [ + "base64 0.21.7", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e066df081489cd10c91648f1e87d2b945fac2fcdfb34a715234a0b079a4c4375" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + +[[package]] +name = "solana-runtime" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8e16747198f45ab41f146d1ab1782d83016fb9ed1ce7612b9174018f907bd5" +dependencies = [ + "aquamarine", + "arrayref", + "base64 0.21.7", + "bincode", + "blake3", + "bv", + "bytemuck", + "byteorder", + "bzip2", + "crossbeam-channel", + "dashmap", + "dir-diff", + "flate2", + "fnv", + "im", + "index_list", + "itertools", + "lazy_static", + "log", + "lru", + "lz4", + "memmap2 0.5.10", + "mockall", + "modular-bitfield", + "num-derive 0.4.2", + "num-traits", + "num_cpus", + "num_enum 0.7.2", + "ouroboros", + "percentage", + "qualifier_attr", + "rand 0.8.5", + "rayon", + "regex", + "rustc_version", + "serde", + "serde_derive", + "serde_json", + "solana-accounts-db", + "solana-address-lookup-table-program", + "solana-bpf-loader-program", + "solana-bucket-map", + "solana-compute-budget-program", + "solana-config-program", + "solana-cost-model", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-loader-v4-program", + "solana-measure", + "solana-metrics", + "solana-perf", + "solana-program-runtime", + "solana-rayon-threadlimit", + "solana-sdk", + "solana-stake-program", + "solana-system-program", + "solana-version", + "solana-vote", + "solana-vote-program", + "solana-zk-token-proof-program", + "solana-zk-token-sdk", + "static_assertions", + "strum", + "strum_macros", + "symlink", + "tar", + "tempfile", + "thiserror", + "zstd", +] + +[[package]] +name = "solana-sdk" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c335bdf35728ea876506babffcfd85fa4dd66af6438f9472afc91b278946909" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags 2.6.0", + "borsh 1.5.1", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2 0.5.10", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "siphasher", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba67050b90454a8638913a7d5775703c0557157def04ddcc8b59c964cda8535" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.71", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-send-transaction-service" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8c1dd225716ecd66ec9a5a30c76355d8d1788c721d7db4d53ebb4c6ef34c8d" +dependencies = [ + "crossbeam-channel", + "log", + "solana-client", + "solana-measure", + "solana-metrics", + "solana-runtime", + "solana-sdk", + "solana-tpu-client", +] + +[[package]] +name = "solana-stake-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2ef08f7b2485af8578bfd4e23689286e5360b50d3cc9f350dfe3ad9fdabc679" +dependencies = [ + "bincode", + "log", + "rustc_version", + "solana-config-program", + "solana-program-runtime", + "solana-sdk", + "solana-vote-program", +] + +[[package]] +name = "solana-streamer" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e8269eaa4aef1a9697fe8b9f659402272746c3fdd374fbffa96f68fe6745a6" +dependencies = [ + "async-channel", + "bytes", + "crossbeam-channel", + "futures-util", + "histogram", + "indexmap 2.2.6", + "itertools", + "libc", + "log", + "nix", + "pem", + "percentage", + "pkcs8", + "quinn", + "quinn-proto", + "rand 0.8.5", + "rcgen", + "rustls", + "smallvec", + "solana-metrics", + "solana-perf", + "solana-sdk", + "thiserror", + "tokio", + "x509-parser", +] + +[[package]] +name = "solana-system-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22c8b55398485962ea6127fe84c5768a5ae4a4ecdbd80a0917eb6945593481f9" +dependencies = [ + "bincode", + "log", + "serde", + "serde_derive", + "solana-program-runtime", + "solana-sdk", +] + +[[package]] +name = "solana-thin-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c174c724bbe19a53862156e1a5d2cf6cdf1bd5d5d9853b4696b2d9d836123b" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcdf9d7109d25900d0532539b00f53e820fb7200f6dc18f90e9d2be20c3d466" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-transaction-status" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7595aef5a9ddfdecd0966cc12ad0006713e4f8d87eafb4cb7b60fb18d98eff3a" +dependencies = [ + "Inflector", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bs58 0.4.0", + "lazy_static", + "log", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "spl-associated-token-account", + "spl-memo", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-udp-client" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59c49a3766232005385bd70f15b0fce756fa6e73fb6397ce9ed34113f090e2" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-version" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ece37d745e1fb3455acd69b8ba6ecea3ebcefde29e0f40ee8e6467acc4dc04" +dependencies = [ + "log", + "rustc_version", + "semver", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", +] + +[[package]] +name = "solana-vote" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ca2744cf5509c7680a90d6704d00fbab899aa586542c4257fb23d4712b380c" +dependencies = [ + "crossbeam-channel", + "itertools", + "log", + "rustc_version", + "serde", + "serde_derive", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk", + "solana-vote-program", + "thiserror", +] + +[[package]] +name = "solana-vote-program" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6944bb3f8f34cc815017f6a50027331f5e7f48321e7998f1572cc898438b6a8a" +dependencies = [ + "bincode", + "log", + "num-derive 0.4.2", + "num-traits", + "rustc_version", + "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.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bd480f4b1b87dea1cdca14f3c6ba8e778e88756dc44ac090e797aab9c8759d" +dependencies = [ + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-program-runtime", + "solana-sdk", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "1.18.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616130045004bccc9dd016fe03ac458db38bd61456f1d16f126acb60f968dcae" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive 0.4.2", + "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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d457cc2ba742c120492a64b7fa60e22c575e891f6b55039f4d736568fb112a3" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + +[[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 = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" +dependencies = [ + "assert_matches", + "borsh 0.10.3", + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.71", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.3", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.71", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.3.3", + "num-traits", + "num_enum 0.6.1", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.2", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.3", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[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 = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[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", + "quote", + "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 = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tar" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb797dad5fb5b76fcf519e702f4a589483b5ef06567f160c392832c1f5e44909" +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", + "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", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" + +[[package]] +name = "test-case" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb2550dd13afcd286853192af8601920d959b14c401fcece38071d53bf0768a8" +dependencies = [ + "test-case-macros", +] + +[[package]] +name = "test-case-core" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcb7fd841cd518e279be3d5a3eb0636409487998a4aff22f3de87b81e88384f" +dependencies = [ + "cfg-if", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "test-case-macros" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "test-case-core", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "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.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-serde" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +dependencies = [ + "bincode", + "bytes", + "educe", + "futures-core", + "futures-sink", + "pin-project", + "serde", + "serde_json", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.25.4", +] + +[[package]] +name = "tokio-util" +version = "0.6.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "slab", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "indexmap 1.9.3", + "serde", +] + +[[package]] +name = "toml" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59a3a72298453f564e2b111fa896f8d07fabb36f51f06d7e875fc5e0b5a3ef1" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.17.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "trident-client" +version = "0.6.0" +dependencies = [ + "anchor-client", + "anchor-lang", + "anchor-syn", + "anyhow", + "arbitrary", + "bincode", + "borsh 0.10.3", + "cargo_metadata", + "ed25519-dalek", + "fehler", + "futures", + "heck 0.4.1", + "honggfuzz", + "indicatif", + "log", + "pathdiff", + "proc-macro2", + "quinn-proto", + "quote", + "regex", + "rstest", + "serde", + "serde_json", + "serial_test", + "shellexpand", + "solana-account-decoder", + "solana-cli-output", + "solana-program-test", + "solana-sdk", + "solana-transaction-status", + "spl-associated-token-account", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", + "toml 0.5.11", + "trident-derive-accounts-snapshots", + "trident-derive-displayix", + "trident-derive-fuzz-deserialize", + "trident-derive-fuzz-test-executor", + "trident-fuzz", + "trident-test", +] + +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-displayix" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-fuzz-deserialize" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-derive-fuzz-test-executor" +version = "0.0.1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + +[[package]] +name = "trident-test" +version = "0.3.2" +dependencies = [ + "darling 0.13.4", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki-roots 0.24.0", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" +dependencies = [ + "rustls-webpki", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[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.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[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", +] + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[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.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/examples/fuzz-tests/simple-cpi-6/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/Cargo.toml new file mode 100644 index 00000000..9783b3f0 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/Cargo.toml @@ -0,0 +1,12 @@ +[workspace] +members = ["programs/*", "trident-tests/fuzz_tests"] +resolver = "2" +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/examples/fuzz-tests/simple-cpi-6/Trident.toml b/examples/fuzz-tests/simple-cpi-6/Trident.toml new file mode 100644 index 00000000..936fc1bd --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/Trident.toml @@ -0,0 +1,41 @@ +[test] +validator_startup_timeout = 15000 + + +[honggfuzz] +# Timeout in seconds (default: 10) +timeout = 10 +# Number of fuzzing iterations (default: 0 [no limit]) +iterations = 1000 +# Number of concurrent fuzzing threads (default: 0 [number of CPUs / 2]) +threads = 0 +# Don't close children's stdin, stdout, stderr; can be noisy (default: false) +keep_output = false +# Disable ANSI console; use simple log output (default: false) +verbose = false +# Exit upon seeing the first crash (default: false) +exit_upon_crash = false +# Maximal number of mutations per one run (default: 6) +mutations_per_run = 6 +# Target compilation directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). +# To not clash with cargo build's default target directory. +cargo_target_dir = "" +# Honggfuzz working directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_workspace"]). +hfuzz_workspace = "" +# Directory where crashes are saved to (default: "" [workspace directory]) +crashdir = "" +# Input file extension (e.g. 'swf'), (default: "" ['fuzz']) +extension = "" +# Number of seconds this fuzzing session will last (default: 0 [no limit]) +run_time = 0 +# Maximal size of files processed by the fuzzer in bytes (default: 1048576 = 1MB) +max_file_size = 1048576 +# Save all test-cases (not only the unique ones) by appending the current time-stamp to the filenames (default: false) +save_all = false + +[fuzz] +# Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) +allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = true diff --git a/examples/fuzz-tests/simple-cpi-6/migrations/deploy.ts b/examples/fuzz-tests/simple-cpi-6/migrations/deploy.ts new file mode 100644 index 00000000..82fb175f --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@coral-xyz/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +}; diff --git a/examples/fuzz-tests/simple-cpi-6/package.json b/examples/fuzz-tests/simple-cpi-6/package.json new file mode 100644 index 00000000..b036f2ff --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/package.json @@ -0,0 +1,20 @@ +{ + "license": "ISC", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.30.1" + }, + "devDependencies": { + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "typescript": "^4.3.5", + "prettier": "^2.6.2" + } +} diff --git a/examples/fuzz-tests/simple-cpi-6/programs/callee/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/callee/Cargo.toml new file mode 100644 index 00000000..73a67880 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/callee/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "callee" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "callee" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] + +[dependencies] +anchor-lang = "0.30.1" diff --git a/examples/fuzz-tests/simple-cpi-6/programs/callee/Xargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/callee/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/callee/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/examples/fuzz-tests/simple-cpi-6/programs/callee/src/lib.rs b/examples/fuzz-tests/simple-cpi-6/programs/callee/src/lib.rs new file mode 100644 index 00000000..c7576f3d --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/callee/src/lib.rs @@ -0,0 +1,22 @@ +use anchor_lang::prelude::*; + +declare_id!("HJR1TK8bgrUWzysdpS1pBGBYKF7zi1tU9cS4qj8BW8ZL"); + +#[program] +pub mod callee { + use super::*; + + pub fn initialize_callee(_ctx: Context, input: u8) -> Result<()> { + msg!("Greetings from Callee"); + + if input >= 15 { + panic!(); + } + Ok(()) + } +} + +#[derive(Accounts)] +pub struct InitializeCallee<'info> { + pub signer: Signer<'info>, +} diff --git a/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml new file mode 100644 index 00000000..ba3dbe19 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "caller" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "caller" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] + +[dependencies] +anchor-lang = "0.30.1" +callee = { path = "../callee", features = ["cpi"] } diff --git a/examples/fuzz-tests/simple-cpi-6/programs/caller/Xargo.toml b/examples/fuzz-tests/simple-cpi-6/programs/caller/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs b/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs new file mode 100644 index 00000000..96dde54c --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/programs/caller/src/lib.rs @@ -0,0 +1,28 @@ +use anchor_lang::prelude::*; +use callee::program::Callee; + +declare_id!("FWtSodrkUnovFPnNRCxneP6VWh6JH6jtQZ4PHoP8Ejuz"); + +#[program] +pub mod caller { + use super::*; + + pub fn initialize_caller(ctx: Context, input: u8) -> Result<()> { + msg!("Greetings from Caller"); + + let cpi_context = CpiContext::new( + ctx.accounts.program.to_account_info(), + callee::cpi::accounts::InitializeCallee { + signer: ctx.accounts.signer.to_account_info(), + }, + ); + + callee::cpi::initialize_callee(cpi_context, input)?; + Ok(()) + } +} +#[derive(Accounts)] +pub struct InitializeCaller<'info> { + pub signer: Signer<'info>, + pub program: Program<'info, Callee>, +} diff --git a/examples/fuzz-tests/simple-cpi-6/tests/simple-cpi-7.ts b/examples/fuzz-tests/simple-cpi-6/tests/simple-cpi-7.ts new file mode 100644 index 00000000..6da007ba --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/tests/simple-cpi-7.ts @@ -0,0 +1,16 @@ +import * as anchor from "@coral-xyz/anchor"; +import { Program } from "@coral-xyz/anchor"; +import { SimpleCpi7 } from "../target/types/simple_cpi_7"; + +describe("simple-cpi-7", () => { + // Configure the client to use the local cluster. + anchor.setProvider(anchor.AnchorProvider.env()); + + const program = anchor.workspace.SimpleCpi7 as Program; + + it("Is initialized!", async () => { + // Add your test here. + const tx = await program.methods.initialize().rpc(); + console.log("Your transaction signature", tx); + }); +}); diff --git a/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml new file mode 100644 index 00000000..2009814c --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/Cargo.toml @@ -0,0 +1,23 @@ +[[bin]] +name = "fuzz_0" +path = "fuzz_0/test_fuzz.rs" + +[package] +name = "fuzz_tests" +version = "0.1.0" +description = "Created with Trident" +edition = "2021" + +[dependencies] +honggfuzz = "0.5.56" +arbitrary = "1.3.0" +assert_matches = "1.4.0" + +[dependencies.trident-client] +path = "../../../../../crates/client" + +[dependencies.callee] +path = "../../programs/callee" + +[dependencies.caller] +path = "../../programs/caller" diff --git a/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs new file mode 100644 index 00000000..9e2777c7 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -0,0 +1,49 @@ +use anchor_lang::prelude::*; +use callee::program::Callee; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; +// pub struct InitializeCalleeSnapshot<'info> { +// pub signer: Signer<'info>, +// } +// impl<'info> InitializeCalleeSnapshot<'info> { +// pub fn deserialize_option( +// _program_id: &anchor_lang::prelude::Pubkey, +// accounts: &'info mut [Option>], +// ) -> core::result::Result { +// let mut accounts_iter = accounts.iter(); +// let signer: Signer<'_> = accounts_iter +// .next() +// .ok_or(FuzzingError::NotEnoughAccounts("signer".to_string()))? +// .as_ref() +// .map(anchor_lang::accounts::signer::Signer::try_from) +// .ok_or(FuzzingError::AccountNotFound("signer".to_string()))? +// .map_err(|_| FuzzingError::CannotDeserializeAccount("signer".to_string()))?; +// Ok(Self { signer }) +// } +// } +pub struct InitializeCallerSnapshot<'info> { + pub signer: Signer<'info>, + pub program: Program<'info, Callee>, +} +impl<'info> InitializeCallerSnapshot<'info> { + pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, + accounts: &'info mut [Option>], + ) -> core::result::Result { + let mut accounts_iter = accounts.iter(); + let signer: Signer<'_> = accounts_iter + .next() + .ok_or(FuzzingError::NotEnoughAccounts("signer".to_string()))? + .as_ref() + .map(anchor_lang::accounts::signer::Signer::try_from) + .ok_or(FuzzingError::AccountNotFound("signer".to_string()))? + .map_err(|_| FuzzingError::CannotDeserializeAccount("signer".to_string()))?; + let program: anchor_lang::accounts::program::Program = accounts_iter + .next() + .ok_or(FuzzingError::NotEnoughAccounts("program".to_string()))? + .as_ref() + .map(anchor_lang::accounts::program::Program::try_from) + .ok_or(FuzzingError::AccountNotFound("program".to_string()))? + .map_err(|_| FuzzingError::CannotDeserializeAccount("program".to_string()))?; + Ok(Self { signer, program }) + } +} diff --git a/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs new file mode 100644 index 00000000..6f92a3c9 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -0,0 +1,113 @@ +// pub mod callee_fuzz_instructions { +// use crate::accounts_snapshots::*; +// use trident_client::fuzzing::*; +// #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] +// pub enum FuzzInstruction { +// InitializeCallee(InitializeCallee), +// } +// #[derive(Arbitrary, Debug)] +// pub struct InitializeCallee { +// pub accounts: InitializeCalleeAccounts, +// pub data: InitializeCalleeData, +// } +// #[derive(Arbitrary, Debug)] +// pub struct InitializeCalleeAccounts { +// pub signer: AccountId, +// } +// #[derive(Arbitrary, Debug)] +// pub struct InitializeCalleeData { +// pub input: u8, +// } +// impl<'info> IxOps<'info> for InitializeCallee { +// type IxData = callee::instruction::InitializeCallee; +// type IxAccounts = FuzzAccounts; +// type IxSnapshot = InitializeCalleeSnapshot<'info>; +// fn get_data( +// &self, +// _client: &mut impl FuzzClient, +// _fuzz_accounts: &mut FuzzAccounts, +// ) -> Result { +// let data = callee::instruction::InitializeCallee { input: todo!() }; +// Ok(data) +// } +// fn get_accounts( +// &self, +// client: &mut impl FuzzClient, +// fuzz_accounts: &mut FuzzAccounts, +// ) -> Result<(Vec, Vec), FuzzingError> { +// let signers = vec![todo!()]; +// let acc_meta = +// callee::accounts::InitializeCallee { signer: todo!() }.to_account_metas(None); +// Ok((signers, acc_meta)) +// } +// } +// #[doc = r" Use AccountsStorage where T can be one of:"] +// #[doc = r" Keypair, PdaStore, TokenStore, MintStore, ProgramStore"] +// #[derive(Default)] +// pub struct FuzzAccounts { +// signer: AccountsStorage, +// } +// } + +pub mod caller_fuzz_instructions { + use crate::accounts_snapshots::*; + use trident_client::fuzzing::*; + #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] + pub enum FuzzInstruction { + InitializeCaller(InitializeCaller), + } + #[derive(Arbitrary, Debug)] + pub struct InitializeCaller { + pub accounts: InitializeCallerAccounts, + pub data: InitializeCallerData, + } + #[derive(Arbitrary, Debug)] + pub struct InitializeCallerAccounts { + pub signer: AccountId, + pub program: AccountId, + } + #[derive(Arbitrary, Debug)] + pub struct InitializeCallerData { + pub input: u8, + } + impl<'info> IxOps<'info> for InitializeCaller { + type IxData = caller::instruction::InitializeCaller; + type IxAccounts = FuzzAccounts; + type IxSnapshot = InitializeCallerSnapshot<'info>; + fn get_data( + &self, + _client: &mut impl FuzzClient, + _fuzz_accounts: &mut FuzzAccounts, + ) -> Result { + let data = caller::instruction::InitializeCaller { + input: self.data.input, + }; + Ok(data) + } + fn get_accounts( + &self, + client: &mut impl FuzzClient, + fuzz_accounts: &mut FuzzAccounts, + ) -> Result<(Vec, Vec), FuzzingError> { + let signer = fuzz_accounts.signer.get_or_create_account( + self.accounts.signer, + client, + 5 * solana_sdk::native_token::LAMPORTS_PER_SOL, + ); + let signers = vec![signer.clone()]; + let acc_meta = caller::accounts::InitializeCaller { + signer: signer.pubkey(), + program: callee::ID, + } + .to_account_metas(None); + Ok((signers, acc_meta)) + } + } + #[doc = r" Use AccountsStorage where T can be one of:"] + #[doc = r" Keypair, PdaStore, TokenStore, MintStore, ProgramStore"] + #[derive(Default)] + pub struct FuzzAccounts { + _program: AccountsStorage, + signer: AccountsStorage, + } +} diff --git a/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs new file mode 100644 index 00000000..7afeed42 --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -0,0 +1,46 @@ +use callee::entry as entry_callee; +use caller::entry as entry_caller; + +use callee::ID as PROGRAM_ID_CALLEE; +use caller::ID as PROGRAM_ID_CALLER; +const PROGRAM_NAME_CALLEE: &str = "callee"; +const PROGRAM_NAME_CALLER: &str = "caller"; +use fuzz_instructions::caller_fuzz_instructions::FuzzInstruction as FuzzInstruction_caller; +use trident_client::fuzzing::*; +mod accounts_snapshots; +mod fuzz_instructions; + +pub type FuzzInstruction = FuzzInstruction_caller; + +struct MyFuzzData; + +impl FuzzDataBuilder for MyFuzzData {} + +fn main() { + loop { + fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_CALLER, + &PROGRAM_ID_CALLER, + processor!(convert_entry!(entry_caller)) + ); + + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program2 = FuzzingProgram::new( + PROGRAM_NAME_CALLEE, + &PROGRAM_ID_CALLEE, + processor!(convert_entry!(entry_callee)) + ); + + let mut client = + ProgramTestClientBlocking::new(&[fuzzing_program1,fuzzing_program2]) + .unwrap(); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_CALLER, &mut client); + }); + } +} diff --git a/examples/fuzz-tests/simple-cpi-6/tsconfig.json b/examples/fuzz-tests/simple-cpi-6/tsconfig.json new file mode 100644 index 00000000..cd5d2e3d --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} diff --git a/examples/fuzz-tests/simple-cpi-6/yarn.lock b/examples/fuzz-tests/simple-cpi-6/yarn.lock new file mode 100644 index 00000000..d009586c --- /dev/null +++ b/examples/fuzz-tests/simple-cpi-6/yarn.lock @@ -0,0 +1,1181 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.8.tgz#5d958c3827b13cc6d05e038c07fb2e5e3420d82e" + integrity sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA== + dependencies: + regenerator-runtime "^0.14.0" + +"@coral-xyz/anchor-errors@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" + integrity sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ== + +"@coral-xyz/anchor@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" + integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== + dependencies: + "@coral-xyz/anchor-errors" "^0.30.1" + "@coral-xyz/borsh" "^0.30.1" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.68.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + +"@coral-xyz/borsh@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" + integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + +"@noble/curves@^1.4.2": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@solana/buffer-layout@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" + integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== + dependencies: + buffer "~6.0.3" + +"@solana/web3.js@^1.68.0": + version "1.95.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.0.tgz#9cf08383e7dcba212a73d78349cf9b25bc34764f" + integrity sha512-iHwJ/HcWrF9qbnI1ctwI1UXHJ0vZXRpnt+lI5UcQIk8WvJNuQ5gV06icxzM6B7ojUES85Q1/FM4jZ49UQ8yZZQ== + dependencies: + "@babel/runtime" "^7.24.7" + "@noble/curves" "^1.4.2" + "@noble/hashes" "^1.4.0" + "@solana/buffer-layout" "^4.0.1" + agentkeepalive "^4.5.0" + bigint-buffer "^1.1.5" + bn.js "^5.2.1" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.7.0" + rpc-websockets "^9.0.2" + superstruct "^2.0.2" + +"@swc/helpers@^0.5.11": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== + dependencies: + tslib "^2.4.0" + +"@types/bn.js@^5.1.0": + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" + integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== + dependencies: + "@types/node" "*" + +"@types/chai@^4.3.0": + version "4.3.16" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" + integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== + +"@types/connect@^3.4.33": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== + +"@types/node@*": + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + dependencies: + undici-types "~5.26.4" + +"@types/node@^12.12.54": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + +"@types/uuid@^8.3.4": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + +"@types/ws@^7.4.4": + version "7.4.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" + integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== + dependencies: + "@types/node" "*" + +"@types/ws@^8.2.2": + version "8.5.11" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.11.tgz#90ad17b3df7719ce3e6bc32f83ff954d38656508" + integrity sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w== + dependencies: + "@types/node" "*" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +agentkeepalive@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bigint-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" + integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== + dependencies: + bindings "^1.3.0" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bindings@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== + +borsh@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" + integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== + dependencies: + bn.js "^5.2.0" + bs58 "^4.0.0" + text-encoding-utf-8 "^1.0.2" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-layout@^1.2.0, buffer-layout@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" + integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== + +buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +camelcase@^6.0.0, camelcase@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + +crypto-hash@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" + integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== + +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +delay@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" + integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== + dependencies: + es6-promise "^4.0.3" + +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +eyes@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== + +fast-stable-stringify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" + integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +jayson@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" + integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== + dependencies: + "@types/connect" "^3.4.33" + "@types/node" "^12.12.54" + "@types/ws" "^7.4.4" + JSONStream "^1.3.5" + commander "^2.20.3" + delay "^5.0.0" + es6-promisify "^5.0.0" + eyes "^0.1.8" + isomorphic-ws "^4.0.1" + json-stringify-safe "^5.0.1" + uuid "^8.3.2" + ws "^7.5.10" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@^9.0.3: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.3" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "4.2.1" + ms "2.1.3" + nanoid "3.3.1" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + workerpool "6.2.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@^2.6.12, node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.3.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" + integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +pako@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prettier@^2.6.2: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +rpc-websockets@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" + integrity sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/uuid" "^8.3.4" + "@types/ws" "^8.2.2" + buffer "^6.0.3" + eventemitter3 "^5.0.1" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +superstruct@^0.15.4: + version "0.15.5" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" + integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== + +superstruct@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" + integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +text-encoding-utf-8@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + +"through@>=2.2.7 <3": + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + +type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^4.3.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^7.5.10: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.5.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock index be9f2937..50e953f9 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Cargo.lock +++ b/examples/fuzz-tests/unauthorized-access-2/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -267,19 +266,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" -dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1089,7 +1075,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1128,6 +1114,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1222,6 +1217,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1589,6 +1605,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2055,13 +2077,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2271,6 +2293,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2476,6 +2509,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3076,6 +3118,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -3974,7 +4030,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4004,7 +4060,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4139,7 +4195,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4325,7 +4381,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4692,7 +4748,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -4736,7 +4792,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4812,7 +4868,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -4998,7 +5054,7 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5170,7 +5226,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5256,20 +5312,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5299,28 +5341,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5340,7 +5360,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5372,22 +5392,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5400,7 +5404,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.2", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5600,6 +5604,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5976,7 +5991,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5989,13 +6003,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6003,15 +6015,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6019,12 +6025,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6052,12 +6070,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/unauthorized-access-2/Trident.toml b/examples/fuzz-tests/unauthorized-access-2/Trident.toml index e05d7801..a398402c 100644 --- a/examples/fuzz-tests/unauthorized-access-2/Trident.toml +++ b/examples/fuzz-tests/unauthorized-access-2/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml index ffffdf00..67a84955 100644 --- a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/Cargo.toml @@ -9,13 +9,12 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.unauthorized-access-2] path = "../../programs/unauthorized-access-2" diff --git a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index fe4c5d1e..2690db9c 100644 --- a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,6 +1,5 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; -use unauthorized_access_2::ID as PROGRAM_ID; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub author: Signer<'info>, pub escrow: Option>, @@ -13,6 +12,7 @@ pub struct WithdrawSnapshot<'info> { } impl<'info> InitializeSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -30,7 +30,7 @@ impl<'info> InitializeSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) } else { @@ -59,6 +59,7 @@ impl<'info> InitializeSnapshot<'info> { } impl<'info> WithdrawSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -76,7 +77,7 @@ impl<'info> WithdrawSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("escrow".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("escrow".to_string())) } else { diff --git a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index 3ef7fdac..b1c3bbea 100644 --- a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,8 @@ pub mod unauthorized_access_2_fuzz_instructions { use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; use unauthorized_access_2::ESCROW_SEED; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { diff --git a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index 2d8eef58..f1a1ec49 100644 --- a/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/unauthorized-access-2/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,12 +1,13 @@ -use fuzz_instructions::unauthorized_access_2_fuzz_instructions::FuzzInstruction; use fuzz_instructions::unauthorized_access_2_fuzz_instructions::Initialize; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; -use unauthorized_access_2::entry; -use unauthorized_access_2::ID as PROGRAM_ID; +use unauthorized_access_2::entry as entry_unauthorized_access_2; +use unauthorized_access_2::ID as PROGRAM_ID_UNAUTHORIZED_ACCESS_2; +const PROGRAM_NAME_UNAUTHORIZED_ACCESS_2: &str = "unauthorized_access_2"; +use fuzz_instructions::unauthorized_access_2_fuzz_instructions::FuzzInstruction as FuzzInstruction_unauthorized_access_2; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "unauthorized_access_2"; +pub type FuzzInstruction = FuzzInstruction_unauthorized_access_2; struct MyFuzzData; @@ -21,10 +22,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_UNAUTHORIZED_ACCESS_2, + &PROGRAM_ID_UNAUTHORIZED_ACCESS_2, + processor!(convert_entry!(entry_unauthorized_access_2)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_UNAUTHORIZED_ACCESS_2, &mut client); }); } } diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock index 45fac246..040175d6 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Cargo.lock @@ -256,7 +256,6 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", - "anchor-syn", "arrayref", "base64 0.13.1", "bincode", @@ -267,19 +266,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "anchor-spl" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4fd6e43b2ca6220d2ef1641539e678bfc31b6cc393cf892b373b5997b6a39a" -dependencies = [ - "anchor-lang", - "solana-program", - "spl-associated-token-account", - "spl-token", - "spl-token-2022 0.9.0", -] - [[package]] name = "anchor-syn" version = "0.29.0" @@ -1089,7 +1075,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1128,6 +1114,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1222,6 +1217,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1589,6 +1605,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2055,13 +2077,13 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.55" +version = "0.5.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848e9c511092e0daa0a35a63e8e6e475a3e8f870741448b9f6028d69b142f18e" +checksum = "7c76b6234c13c9ea73946d1379d33186151148e0da231506b964b44f3d023505" dependencies = [ "arbitrary", "lazy_static", - "memmap2", + "memmap2 0.9.4", "rustc_version", ] @@ -2271,6 +2293,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2476,6 +2509,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.7.1" @@ -3076,6 +3118,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -3974,7 +4030,7 @@ dependencies = [ "solana-config-program", "solana-sdk", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", "thiserror", @@ -4004,7 +4060,7 @@ dependencies = [ "lazy_static", "log", "lz4", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num-derive 0.4.2", "num-traits", @@ -4139,7 +4195,7 @@ dependencies = [ "bv", "bytemuck", "log", - "memmap2", + "memmap2 0.5.10", "modular-bitfield", "num_enum 0.7.2", "rand 0.8.5", @@ -4325,7 +4381,7 @@ dependencies = [ "im", "lazy_static", "log", - "memmap2", + "memmap2 0.5.10", "rustc_version", "serde", "serde_bytes", @@ -4692,7 +4748,7 @@ dependencies = [ "solana-sdk", "solana-transaction-status", "solana-version", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -4736,7 +4792,7 @@ dependencies = [ "log", "lru", "lz4", - "memmap2", + "memmap2 0.5.10", "mockall", "modular-bitfield", "num-derive 0.4.2", @@ -4812,7 +4868,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "memmap2", + "memmap2 0.5.10", "num-derive 0.4.2", "num-traits", "num_enum 0.7.2", @@ -4998,7 +5054,7 @@ dependencies = [ "spl-associated-token-account", "spl-memo", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5170,7 +5226,7 @@ dependencies = [ "num-traits", "solana-program", "spl-token", - "spl-token-2022 1.0.0", + "spl-token-2022", "thiserror", ] @@ -5256,20 +5312,6 @@ dependencies = [ "syn 2.0.60", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062e148d3eab7b165582757453632ffeef490c02c86a48bfdb4988f63eefb3b9" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.5.2" @@ -5299,28 +5341,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4abf34a65ba420584a0c35f3903f8d727d1f13ababbdc3f714c6b065a686e86" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.2", - "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.3.0", - "spl-type-length-value", - "thiserror", -] - [[package]] name = "spl-token-2022" version = "1.0.0" @@ -5340,7 +5360,7 @@ dependencies = [ "spl-token", "spl-token-group-interface", "spl-token-metadata-interface", - "spl-transfer-hook-interface 0.4.1", + "spl-transfer-hook-interface", "spl-type-length-value", "thiserror", ] @@ -5372,22 +5392,6 @@ dependencies = [ "spl-type-length-value", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "051d31803f873cabe71aec3c1b849f35248beae5d19a347d93a5c9cccc5d5a9b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution 0.4.0", - "spl-type-length-value", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.4.1" @@ -5400,7 +5404,7 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-program-error", - "spl-tlv-account-resolution 0.5.2", + "spl-tlv-account-resolution", "spl-type-length-value", ] @@ -5600,6 +5604,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5976,7 +5991,6 @@ version = "0.6.0" dependencies = [ "anchor-client", "anchor-lang", - "anchor-spl", "anchor-syn", "anyhow", "arbitrary", @@ -5989,13 +6003,11 @@ dependencies = [ "heck 0.4.1", "honggfuzz", "indicatif", - "lazy_static", "log", "pathdiff", "proc-macro2", "quinn-proto", "quote", - "rand 0.8.5", "regex", "rstest", "serde", @@ -6003,15 +6015,9 @@ dependencies = [ "serial_test", "shellexpand", "solana-account-decoder", - "solana-banks-client", - "solana-bpf-loader-program", "solana-cli-output", - "solana-program", - "solana-program-runtime", "solana-program-test", "solana-sdk", - "solana-sdk-macro", - "solana-system-program", "solana-transaction-status", "spl-associated-token-account", "spl-token", @@ -6019,12 +6025,24 @@ dependencies = [ "thiserror", "tokio", "toml", + "trident-derive-accounts-snapshots", "trident-derive-displayix", "trident-derive-fuzz-deserialize", "trident-derive-fuzz-test-executor", + "trident-fuzz", "trident-test", ] +[[package]] +name = "trident-derive-accounts-snapshots" +version = "0.0.1" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "trident-derive-displayix" version = "0.0.1" @@ -6052,12 +6070,36 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "trident-fuzz" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-syn", + "arbitrary", + "convert_case", + "heck 0.4.1", + "prettytable", + "proc-macro2", + "quote", + "regex", + "serde", + "serde_json", + "solana-banks-client", + "solana-program-runtime", + "solana-program-test", + "solana-sdk", + "spl-token", + "syn 1.0.109", + "thiserror", + "tokio", +] + [[package]] name = "trident-test" version = "0.3.2" dependencies = [ "darling 0.13.4", - "proc-macro2", "quote", "syn 1.0.109", ] diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml index e05d7801..d0247eb7 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml +++ b/examples/fuzz-tests/unchecked-arithmetic-0/Trident.toml @@ -6,7 +6,7 @@ validator_startup_timeout = 15000 # Timeout in seconds (default: 10) timeout = 10 # Number of fuzzing iterations (default: 0 [no limit]) -iterations = 0 +iterations = 100 # Number of concurrent fuzzing threads (default: 0 [number of CPUs / 2]) threads = 0 # Don't close children's stdin, stdout, stderr; can be noisy (default: false) @@ -14,7 +14,7 @@ keep_output = false # Disable ANSI console; use simple log output (default: false) verbose = false # Exit upon seeing the first crash (default: false) -exit_upon_crash = false +exit_upon_crash = true # Maximal number of mutations per one run (default: 6) mutations_per_run = 6 # Target compilation directory, (default: "" ["trident-tests/fuzz_tests/fuzzing/hfuzz_target"]). @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = true diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml index 21b589bd..8da1ab85 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml +++ b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/Cargo.toml @@ -9,13 +9,12 @@ description = "Created with Trident" edition = "2021" [dependencies] -honggfuzz = "0.5.55" +honggfuzz = "0.5.56" arbitrary = "1.3.0" assert_matches = "1.4.0" [dependencies.trident-client] path = "../../../../../crates/client" -features = ["fuzzing"] [dependencies.unchecked-arithmetic-0] path = "../../programs/unchecked-arithmetic-0" diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs index 65448991..b53ed2ad 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs +++ b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/accounts_snapshots.rs @@ -1,6 +1,5 @@ -use trident_client::anchor_lang::{self, prelude::*}; -use trident_client::fuzzing::FuzzingError; -use unchecked_arithmetic_0::ID as PROGRAM_ID; +use anchor_lang::prelude::*; +use trident_client::fuzzing::{anchor_lang, FuzzingError}; pub struct InitializeSnapshot<'info> { pub counter: Option>, pub user: Signer<'info>, @@ -12,6 +11,7 @@ pub struct UpdateSnapshot<'info> { } impl<'info> InitializeSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); @@ -22,7 +22,7 @@ impl<'info> InitializeSnapshot<'info> { .ok_or(FuzzingError::NotEnoughAccounts("counter".to_string()))? .as_ref() .map(|acc| { - if acc.key() != PROGRAM_ID { + if acc.key() != *_program_id { anchor_lang::accounts::account::Account::try_from(acc) .map_err(|_| FuzzingError::CannotDeserializeAccount("counter".to_string())) } else { @@ -58,6 +58,7 @@ impl<'info> InitializeSnapshot<'info> { } impl<'info> UpdateSnapshot<'info> { pub fn deserialize_option( + _program_id: &anchor_lang::prelude::Pubkey, accounts: &'info mut [Option>], ) -> core::result::Result { let mut accounts_iter = accounts.iter(); diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs index 09d5583e..b4aa2c23 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs +++ b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/fuzz_instructions.rs @@ -1,6 +1,8 @@ pub mod unchecked_arithmetic_0_fuzz_instructions { use crate::accounts_snapshots::*; - use trident_client::{fuzzing::*, solana_sdk::native_token::LAMPORTS_PER_SOL}; + use solana_sdk::native_token::LAMPORTS_PER_SOL; + use solana_sdk::system_program::ID as SYSTEM_PROGRAM_ID; + use trident_client::fuzzing::*; #[derive(Arbitrary, DisplayIx, FuzzTestExecutor, FuzzDeserialize)] pub enum FuzzInstruction { Initialize(Initialize), diff --git a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs index d913c9e4..87ebeff7 100644 --- a/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs +++ b/examples/fuzz-tests/unchecked-arithmetic-0/trident-tests/fuzz_tests/fuzz_0/test_fuzz.rs @@ -1,12 +1,13 @@ -use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::FuzzInstruction; use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::Initialize; -use trident_client::{convert_entry, fuzz_trident, fuzzing::*}; -use unchecked_arithmetic_0::entry; -use unchecked_arithmetic_0::ID as PROGRAM_ID; +use unchecked_arithmetic_0::entry as entry_unchecked_arithmetic_0; +use unchecked_arithmetic_0::ID as PROGRAM_ID_UNCHECKED_ARITHMETIC_0; +const PROGRAM_NAME_UNCHECKED_ARITHMETIC_0: &str = "unchecked_arithmetic_0"; +use fuzz_instructions::unchecked_arithmetic_0_fuzz_instructions::FuzzInstruction as FuzzInstruction_unchecked_arithmetic_0; +use trident_client::fuzzing::*; mod accounts_snapshots; mod fuzz_instructions; -const PROGRAM_NAME: &str = "unchecked_arithmetic_0"; +pub type FuzzInstruction = FuzzInstruction_unchecked_arithmetic_0; struct MyFuzzData; @@ -20,10 +21,22 @@ impl FuzzDataBuilder for MyFuzzData { fn main() { loop { fuzz_trident!(fuzz_ix: FuzzInstruction, |fuzz_data: MyFuzzData| { + + // Specify programs you want to include in genesis + // Programs without an `entry_fn`` will be searched for within `trident-genesis` folder. + // `entry_fn`` example: processor!(convert_entry!(program_entry)) + let fuzzing_program1 = FuzzingProgram::new( + PROGRAM_NAME_UNCHECKED_ARITHMETIC_0, + &PROGRAM_ID_UNCHECKED_ARITHMETIC_0, + processor!(convert_entry!(entry_unchecked_arithmetic_0)) + ); + let mut client = - ProgramTestClientBlocking::new(PROGRAM_NAME, PROGRAM_ID, processor!(convert_entry!(entry))) + ProgramTestClientBlocking::new(&[fuzzing_program1]) .unwrap(); - let _ = fuzz_data.run_with_runtime(PROGRAM_ID, &mut client); + + // fill Program ID of program you are going to call + let _ = fuzz_data.run_with_runtime(PROGRAM_ID_UNCHECKED_ARITHMETIC_0, &mut client); }); } } diff --git a/examples/integration-tests/escrow/.program_client/src/lib.rs b/examples/integration-tests/escrow/.program_client/src/lib.rs index a3eac045..4e1defe5 100644 --- a/examples/integration-tests/escrow/.program_client/src/lib.rs +++ b/examples/integration-tests/escrow/.program_client/src/lib.rs @@ -1,6 +1,7 @@ // DO NOT EDIT - automatically generated file (except `use` statements inside the `*_instruction` module pub mod escrow_instruction { - use trident_client::*; + use trident_client::prelude::*; + use trident_client::test::*; pub static PROGRAM_ID: Pubkey = Pubkey::new_from_array([ 5u8, 214u8, 204u8, 101u8, 166u8, 163u8, 239u8, 244u8, 13u8, 110u8, 64u8, 106u8, 230u8, 81u8, 141u8, 186u8, 208u8, 155u8, 78u8, 83u8, 194u8, 215u8, 103u8, 17u8, 94u8, 15u8, 137u8, diff --git a/examples/integration-tests/escrow/Cargo.lock b/examples/integration-tests/escrow/Cargo.lock index d141ccde..d4f78ab3 100644 --- a/examples/integration-tests/escrow/Cargo.lock +++ b/examples/integration-tests/escrow/Cargo.lock @@ -1039,7 +1039,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1172,6 +1172,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1517,6 +1538,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2129,6 +2156,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2809,6 +2847,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4929,6 +4981,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5281,6 +5344,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quote", "rand 0.8.5", diff --git a/examples/integration-tests/escrow/Trident.toml b/examples/integration-tests/escrow/Trident.toml index e05d7801..a398402c 100644 --- a/examples/integration-tests/escrow/Trident.toml +++ b/examples/integration-tests/escrow/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/integration-tests/escrow/trident-tests/poc_tests/tests/test.rs b/examples/integration-tests/escrow/trident-tests/poc_tests/tests/test.rs index af382cb6..f98a6593 100644 --- a/examples/integration-tests/escrow/trident-tests/poc_tests/tests/test.rs +++ b/examples/integration-tests/escrow/trident-tests/poc_tests/tests/test.rs @@ -1,9 +1,9 @@ use anchor_spl::token; use fehler::throws; use program_client::*; -// use program_client::escrow_instruction; -use trident_client::{anyhow::Result, *}; +use trident_client::prelude::*; +use trident_client::test::*; #[throws] #[fixture] async fn init_fixture() -> Fixture { @@ -77,7 +77,7 @@ async fn test_happy_path1(#[future] init_fixture: Result) { fixture.alice_token_a_account, fixture.alice_token_b_account, fixture.escrow_account.pubkey(), - System::id(), + solana_sdk::system_program::ID, token::ID, [fixture.alice_wallet.clone(), fixture.escrow_account.clone()], ) @@ -150,7 +150,7 @@ async fn test_happy_path2(#[future] init_fixture: Result) { fixture.alice_token_a_account, fixture.alice_token_b_account, fixture.escrow_account.pubkey(), - System::id(), + solana_sdk::system_program::ID, token::ID, [fixture.alice_wallet.clone(), fixture.escrow_account.clone()], ) diff --git a/examples/integration-tests/turnstile/.program_client/src/lib.rs b/examples/integration-tests/turnstile/.program_client/src/lib.rs index cbad6c02..db57dde3 100644 --- a/examples/integration-tests/turnstile/.program_client/src/lib.rs +++ b/examples/integration-tests/turnstile/.program_client/src/lib.rs @@ -1,6 +1,7 @@ // DO NOT EDIT - automatically generated file (except `use` statements inside the `*_instruction` module pub mod turnstile_instruction { - use trident_client::*; + use trident_client::prelude::*; + use trident_client::test::*; pub static PROGRAM_ID: Pubkey = Pubkey::new_from_array([ 5u8, 214u8, 204u8, 101u8, 166u8, 163u8, 239u8, 244u8, 13u8, 110u8, 64u8, 106u8, 230u8, 81u8, 141u8, 186u8, 208u8, 155u8, 78u8, 83u8, 194u8, 215u8, 103u8, 17u8, 94u8, 15u8, 137u8, diff --git a/examples/integration-tests/turnstile/Cargo.lock b/examples/integration-tests/turnstile/Cargo.lock index aa7e1b51..765c78be 100644 --- a/examples/integration-tests/turnstile/Cargo.lock +++ b/examples/integration-tests/turnstile/Cargo.lock @@ -1039,7 +1039,7 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ - "encode_unicode", + "encode_unicode 0.3.6", "lazy_static", "libc", "unicode-width", @@ -1172,6 +1172,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + [[package]] name = "ctr" version = "0.8.0" @@ -1517,6 +1538,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "encoding_rs" version = "0.8.34" @@ -2121,6 +2148,17 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "itertools" version = "0.10.5" @@ -2800,6 +2838,20 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" +[[package]] +name = "prettytable" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46480520d1b77c9a3482d39939fcf96831537a250ec62d4fd8fbdf8e0302e781" +dependencies = [ + "csv", + "encode_unicode 1.0.0", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-crate" version = "0.1.5" @@ -4920,6 +4972,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -5272,6 +5335,7 @@ dependencies = [ "lazy_static", "log", "pathdiff", + "prettytable", "proc-macro2", "quote", "rand 0.8.5", diff --git a/examples/integration-tests/turnstile/Trident.toml b/examples/integration-tests/turnstile/Trident.toml index e05d7801..a398402c 100644 --- a/examples/integration-tests/turnstile/Trident.toml +++ b/examples/integration-tests/turnstile/Trident.toml @@ -36,3 +36,6 @@ save_all = false [fuzz] # Allow processing of duplicate transactions. Setting to true might speed up fuzzing but can cause false positive crashes (default: false) allow_duplicate_txs = false +# Trident will show statistics after the fuzzing session. This option forces use of honggfuzz parameter +# `keep_output` as true in order to be able to catch fuzzer stdout. (default: false) +fuzzing_with_stats = false diff --git a/examples/integration-tests/turnstile/trident-tests/poc_tests/tests/test.rs b/examples/integration-tests/turnstile/trident-tests/poc_tests/tests/test.rs index 599e8b32..09dd87a8 100644 --- a/examples/integration-tests/turnstile/trident-tests/poc_tests/tests/test.rs +++ b/examples/integration-tests/turnstile/trident-tests/poc_tests/tests/test.rs @@ -1,6 +1,7 @@ use fehler::throws; -use program_client::turnstile_instruction; -use trident_client::{anyhow::Result, *}; +use program_client::*; +use trident_client::prelude::*; +use trident_client::test::*; #[throws] #[fixture] @@ -35,7 +36,7 @@ async fn init_fixture() -> Fixture { &fixture.client, fixture.state.pubkey(), fixture.user_initializer.pubkey(), - System::id(), + solana_sdk::system_program::ID, [fixture.state.clone(), fixture.user_initializer.clone()], ) .await?;